@dynamic-labs/embedded-wallet 3.0.0-alpha.8

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 (53) hide show
  1. package/CHANGELOG.md +3494 -0
  2. package/LICENSE +21 -0
  3. package/README.md +7 -0
  4. package/_virtual/_tslib.cjs +36 -0
  5. package/_virtual/_tslib.js +32 -0
  6. package/package.json +39 -0
  7. package/src/index.cjs +23 -0
  8. package/src/index.d.ts +7 -0
  9. package/src/index.js +9 -0
  10. package/src/lib/AuthenticatorHandler/TurnkeyAuthenticatorRecoveryHandler.cjs +226 -0
  11. package/src/lib/AuthenticatorHandler/TurnkeyAuthenticatorRecoveryHandler.d.ts +1640 -0
  12. package/src/lib/AuthenticatorHandler/TurnkeyAuthenticatorRecoveryHandler.js +222 -0
  13. package/src/lib/AuthenticatorHandler/index.d.ts +1 -0
  14. package/src/lib/ExportHandler/ExportHandler.cjs +141 -0
  15. package/src/lib/ExportHandler/ExportHandler.d.ts +1630 -0
  16. package/src/lib/ExportHandler/ExportHandler.js +137 -0
  17. package/src/lib/ExportHandler/index.d.ts +1 -0
  18. package/src/lib/TurnkeyWalletConnectorBase/TurnkeyWalletConnectorBase.cjs +217 -0
  19. package/src/lib/TurnkeyWalletConnectorBase/TurnkeyWalletConnectorBase.d.ts +68 -0
  20. package/src/lib/TurnkeyWalletConnectorBase/TurnkeyWalletConnectorBase.js +213 -0
  21. package/src/lib/TurnkeyWalletConnectorBase/index.d.ts +1 -0
  22. package/src/lib/constants.cjs +8 -0
  23. package/src/lib/constants.d.ts +1 -0
  24. package/src/lib/constants.js +4 -0
  25. package/src/lib/utils/PasskeyService/PasskeyService.cjs +41 -0
  26. package/src/lib/utils/PasskeyService/PasskeyService.d.ts +23 -0
  27. package/src/lib/utils/PasskeyService/PasskeyService.js +37 -0
  28. package/src/lib/utils/PasskeyService/index.d.ts +2 -0
  29. package/src/lib/utils/PasskeyService/types.d.ts +6 -0
  30. package/src/lib/utils/PasskeyService/utils/createTurnkeyPasskeyService/createTurnkeyPasskeyService.cjs +14 -0
  31. package/src/lib/utils/PasskeyService/utils/createTurnkeyPasskeyService/createTurnkeyPasskeyService.d.ts +2 -0
  32. package/src/lib/utils/PasskeyService/utils/createTurnkeyPasskeyService/createTurnkeyPasskeyService.js +10 -0
  33. package/src/lib/utils/PasskeyService/utils/createTurnkeyPasskeyService/index.d.ts +1 -0
  34. package/src/lib/utils/base64UrlEncode/base64UrlEncode.cjs +12 -0
  35. package/src/lib/utils/base64UrlEncode/base64UrlEncode.d.ts +1 -0
  36. package/src/lib/utils/base64UrlEncode/base64UrlEncode.js +8 -0
  37. package/src/lib/utils/base64UrlEncode/index.d.ts +1 -0
  38. package/src/lib/utils/convertAttestationTransports/convertAttestationTransports.cjs +17 -0
  39. package/src/lib/utils/convertAttestationTransports/convertAttestationTransports.d.ts +4 -0
  40. package/src/lib/utils/convertAttestationTransports/convertAttestationTransports.js +13 -0
  41. package/src/lib/utils/convertAttestationTransports/index.d.ts +1 -0
  42. package/src/lib/utils/findTurnkeyVerifiedCredential/findTurnkeyVerifiedCredential.cjs +8 -0
  43. package/src/lib/utils/findTurnkeyVerifiedCredential/findTurnkeyVerifiedCredential.d.ts +2 -0
  44. package/src/lib/utils/findTurnkeyVerifiedCredential/findTurnkeyVerifiedCredential.js +4 -0
  45. package/src/lib/utils/findTurnkeyVerifiedCredential/index.d.ts +1 -0
  46. package/src/lib/utils/generateRandomBuffer/generateRandomBuffer.cjs +12 -0
  47. package/src/lib/utils/generateRandomBuffer/generateRandomBuffer.d.ts +1 -0
  48. package/src/lib/utils/generateRandomBuffer/generateRandomBuffer.js +8 -0
  49. package/src/lib/utils/generateRandomBuffer/index.d.ts +1 -0
  50. package/src/lib/utils/index.d.ts +4 -0
  51. package/src/types.cjs +17 -0
  52. package/src/types.d.ts +8 -0
  53. package/src/types.js +13 -0
@@ -0,0 +1,137 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../_virtual/_tslib.js';
3
+ import { IframeStamper, KeyFormat } from '@turnkey/iframe-stamper';
4
+ import { TurnkeyClient } from '@turnkey/http';
5
+ import { getTLD, PlatformService, DynamicError } from '@dynamic-labs/utils';
6
+ import { logger } from '@dynamic-labs/wallet-connector-core';
7
+ import { turnkeyAuthenticatorRecoveryHandler } from '../AuthenticatorHandler/TurnkeyAuthenticatorRecoveryHandler.js';
8
+ import { PasskeyService } from '../utils/PasskeyService/PasskeyService.js';
9
+
10
+ const turnkeyBaseUrl = 'https://api.turnkey.com';
11
+ const turnkeyExportUrl = 'https://export.turnkey.com';
12
+ class ExportHandler {
13
+ get publicKey() {
14
+ return this.__publicKey;
15
+ }
16
+ clear() {
17
+ var _a;
18
+ (_a = this.__iframeStamper) === null || _a === void 0 ? void 0 : _a.clear();
19
+ this.__iframeStamper = undefined;
20
+ this.__publicKey = undefined;
21
+ this.__turnkeyClient = undefined;
22
+ }
23
+ initExport(iframeContainer, iframeElementId) {
24
+ return __awaiter(this, void 0, void 0, function* () {
25
+ this.__iframeStamper = new IframeStamper({
26
+ iframeContainer,
27
+ iframeElementId,
28
+ iframeUrl: turnkeyExportUrl,
29
+ });
30
+ yield this.__iframeStamper.init();
31
+ this.__publicKey = this.__iframeStamper.publicKey();
32
+ if (turnkeyAuthenticatorRecoveryHandler.isSessionActive()) {
33
+ this.__turnkeyClient = turnkeyAuthenticatorRecoveryHandler.client;
34
+ }
35
+ else {
36
+ let rpId = getTLD();
37
+ if (!rpId) {
38
+ rpId = PlatformService.getHostname();
39
+ }
40
+ const passkeyStamper = PasskeyService.createWebauthnStamper({
41
+ rpId,
42
+ });
43
+ const apiKeyStamper = ExportHandler === null || ExportHandler === void 0 ? void 0 : ExportHandler.apiKeyStamper;
44
+ const stamper = apiKeyStamper !== null && apiKeyStamper !== void 0 ? apiKeyStamper : passkeyStamper;
45
+ this.__turnkeyClient = new TurnkeyClient({
46
+ baseUrl: turnkeyBaseUrl,
47
+ }, stamper);
48
+ }
49
+ return this.__publicKey;
50
+ });
51
+ }
52
+ verifyExportWallet(_a) {
53
+ return __awaiter(this, arguments, void 0, function* ({ exportBundle, organizationId, }) {
54
+ if (!this.__iframeStamper) {
55
+ throw new DynamicError('Cannot proceed with your request');
56
+ }
57
+ try {
58
+ return yield this.__iframeStamper.injectWalletExportBundle(exportBundle, organizationId);
59
+ }
60
+ catch (err) {
61
+ logger.error('Error while verifying export wallet', err);
62
+ throw err;
63
+ }
64
+ });
65
+ }
66
+ verifyExportPrivateKey(_a) {
67
+ return __awaiter(this, arguments, void 0, function* ({ exportBundle, organizationId, chain, }) {
68
+ if (!this.__iframeStamper) {
69
+ throw new DynamicError('Cannot proceed with your request');
70
+ }
71
+ try {
72
+ return yield this.__iframeStamper.injectKeyExportBundle(exportBundle, organizationId, chain === 'solana' ? KeyFormat.Solana : KeyFormat.Hexadecimal);
73
+ }
74
+ catch (err) {
75
+ logger.error('Error while verifying export private key', err);
76
+ throw err;
77
+ }
78
+ });
79
+ }
80
+ exportPrivateKey(_a) {
81
+ return __awaiter(this, arguments, void 0, function* ({ privateKeyId, organizationId, }) {
82
+ if (!this.__iframeStamper ||
83
+ !this.__publicKey ||
84
+ !this.__turnkeyClient ||
85
+ !privateKeyId) {
86
+ throw new DynamicError('Cannot proceed with your request');
87
+ }
88
+ try {
89
+ const newActivity = yield this.__turnkeyClient.exportPrivateKey({
90
+ organizationId,
91
+ parameters: { privateKeyId, targetPublicKey: this.__publicKey },
92
+ timestampMs: String(Date.now()),
93
+ type: 'ACTIVITY_TYPE_EXPORT_PRIVATE_KEY',
94
+ });
95
+ return newActivity.activity;
96
+ }
97
+ catch (err) {
98
+ logger.error('Error while completing export private key process', err);
99
+ throw err;
100
+ }
101
+ });
102
+ }
103
+ exportWallet(_a) {
104
+ return __awaiter(this, arguments, void 0, function* ({ walletId, organizationId, address, }) {
105
+ if (!this.__iframeStamper ||
106
+ !this.__publicKey ||
107
+ !this.__turnkeyClient ||
108
+ !walletId) {
109
+ throw new DynamicError('Cannot proceed with your request');
110
+ }
111
+ try {
112
+ if (address) {
113
+ const newActivity = yield this.__turnkeyClient.exportWalletAccount({
114
+ organizationId,
115
+ parameters: { address, targetPublicKey: this.__publicKey },
116
+ timestampMs: String(Date.now()),
117
+ type: 'ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT',
118
+ });
119
+ return newActivity.activity;
120
+ }
121
+ const newActivity = yield this.__turnkeyClient.exportWallet({
122
+ organizationId,
123
+ parameters: { targetPublicKey: this.__publicKey, walletId },
124
+ timestampMs: String(Date.now()),
125
+ type: 'ACTIVITY_TYPE_EXPORT_WALLET',
126
+ });
127
+ return newActivity.activity;
128
+ }
129
+ catch (err) {
130
+ logger.error('Error while completing export wallet process', err);
131
+ throw err;
132
+ }
133
+ });
134
+ }
135
+ }
136
+
137
+ export { ExportHandler };
@@ -0,0 +1 @@
1
+ export { ExportHandler } from './ExportHandler';
@@ -0,0 +1,217 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var _tslib = require('../../../_virtual/_tslib.cjs');
7
+ var apiKeyStamper = require('@turnkey/api-key-stamper');
8
+ var walletConnectorCore = require('@dynamic-labs/wallet-connector-core');
9
+ var utils = require('@dynamic-labs/utils');
10
+ var base64UrlEncode = require('../utils/base64UrlEncode/base64UrlEncode.cjs');
11
+ var generateRandomBuffer = require('../utils/generateRandomBuffer/generateRandomBuffer.cjs');
12
+ var convertAttestationTransports = require('../utils/convertAttestationTransports/convertAttestationTransports.cjs');
13
+ var TurnkeyAuthenticatorRecoveryHandler = require('../AuthenticatorHandler/TurnkeyAuthenticatorRecoveryHandler.cjs');
14
+ var ExportHandler = require('../ExportHandler/ExportHandler.cjs');
15
+ var PasskeyService = require('../utils/PasskeyService/PasskeyService.cjs');
16
+
17
+ class TurnkeyWalletConnectorBase extends walletConnectorCore.WalletConnectorBase {
18
+ constructor(nameAndKey, props) {
19
+ super(props);
20
+ // Public fields
21
+ this.requiresNonDynamicEmailOtp = false;
22
+ this.isEmbeddedWallet = true;
23
+ this.removeSessionKeys = () => _tslib.__awaiter(this, void 0, void 0, function* () {
24
+ TurnkeyWalletConnectorBase.sessionKeys = undefined;
25
+ TurnkeyWalletConnectorBase.apiKeyStamper = undefined;
26
+ ExportHandler.ExportHandler.apiKeyStamper = undefined;
27
+ if (typeof (this === null || this === void 0 ? void 0 : this.removeSessionKeysFunction) === 'function') {
28
+ this.removeSessionKeysFunction();
29
+ }
30
+ });
31
+ if (!props.appName) {
32
+ throw new Error('appName not set');
33
+ }
34
+ this.name = nameAndKey.name;
35
+ this.overrideKey = nameAndKey.key;
36
+ this.appName = props.appName;
37
+ this.__authenticatorMethodHandler = TurnkeyAuthenticatorRecoveryHandler.turnkeyAuthenticatorRecoveryHandler;
38
+ this.__exportHandler = new ExportHandler.ExportHandler();
39
+ }
40
+ getWebAuthnAttestation() {
41
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
42
+ const challenge = generateRandomBuffer.generateRandomBuffer();
43
+ const authenticatorUserId = generateRandomBuffer.generateRandomBuffer();
44
+ const { email, passkeyIdentifier } = this;
45
+ if (!email && !passkeyIdentifier) {
46
+ throw new Error('Email or passkeyIdentifier must be set to register a webauthn credential.');
47
+ }
48
+ const displayName = email || `${this.appName} - ${passkeyIdentifier}`;
49
+ const webAuthnCreateParams = {
50
+ publicKey: {
51
+ authenticatorSelection: {
52
+ authenticatorAttachment: undefined,
53
+ requireResidentKey: false,
54
+ residentKey: 'preferred',
55
+ userVerification: 'discouraged',
56
+ },
57
+ challenge,
58
+ pubKeyCredParams: [
59
+ {
60
+ alg: -7,
61
+ type: 'public-key',
62
+ },
63
+ ],
64
+ rp: {
65
+ id: utils.getTLD(),
66
+ name: this.appName,
67
+ },
68
+ user: {
69
+ displayName,
70
+ id: authenticatorUserId,
71
+ name: email || `${this.appName} - ${passkeyIdentifier}`,
72
+ },
73
+ },
74
+ };
75
+ let attestation;
76
+ try {
77
+ attestation = yield PasskeyService.PasskeyService.getWebAuthnAttestation(webAuthnCreateParams);
78
+ }
79
+ catch (error) {
80
+ walletConnectorCore.logger.warn(`Unable to register webauthn credential on the current page's TLD ${utils.getTLD()}. Falling back to using hostname. ${utils.PlatformService.getHostname()}`, error);
81
+ // Create the passkey on the hostname instead.
82
+ webAuthnCreateParams.publicKey.rp.id = utils.PlatformService.getHostname();
83
+ attestation = yield PasskeyService.PasskeyService.getWebAuthnAttestation(webAuthnCreateParams);
84
+ }
85
+ return {
86
+ attestation: {
87
+ attestationObject: attestation.attestationObject,
88
+ clientDataJson: attestation.clientDataJson,
89
+ credentialId: attestation.credentialId,
90
+ transports: convertAttestationTransports.convertAttestationTransports(attestation.transports),
91
+ },
92
+ challenge: base64UrlEncode.base64UrlEncode(challenge),
93
+ displayName,
94
+ };
95
+ });
96
+ }
97
+ getAuthenticatorHandler() {
98
+ return this.__authenticatorMethodHandler;
99
+ }
100
+ getExportHandler() {
101
+ return this.__exportHandler;
102
+ }
103
+ // Public methods
104
+ get email() {
105
+ return this._email;
106
+ }
107
+ setEmail(email) {
108
+ this._email = email;
109
+ }
110
+ get phone() {
111
+ return this._phone;
112
+ }
113
+ setPhone(phone) {
114
+ this._phone = phone;
115
+ }
116
+ get passkeyIdentifier() {
117
+ return this._passkeyIdentifier;
118
+ }
119
+ setPasskeyIdentifier(passkeyIdentifier) {
120
+ this._passkeyIdentifier = passkeyIdentifier;
121
+ }
122
+ clearEmail() {
123
+ this._email = null;
124
+ }
125
+ getAddress() {
126
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
127
+ var _a;
128
+ return (_a = this.verifiedCredential) === null || _a === void 0 ? void 0 : _a.address;
129
+ });
130
+ }
131
+ getConnectedAccounts() {
132
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
133
+ var _a;
134
+ const address = (_a = this.verifiedCredential) === null || _a === void 0 ? void 0 : _a.address;
135
+ if (!address) {
136
+ return [];
137
+ }
138
+ return [address];
139
+ });
140
+ }
141
+ getMobileOrInstalledWallet() {
142
+ return this;
143
+ }
144
+ get turnkeyAddress() {
145
+ var _a;
146
+ const { address } = (_a = this.verifiedCredential) !== null && _a !== void 0 ? _a : {};
147
+ return address;
148
+ }
149
+ get walletProperties() {
150
+ const { walletProperties } = this.verifiedCredential || {};
151
+ return walletProperties;
152
+ }
153
+ // Private methods
154
+ set verifiedCredential(verifiedCredential) {
155
+ this._verifiedCredential = verifiedCredential;
156
+ }
157
+ get verifiedCredential() {
158
+ return this._verifiedCredential;
159
+ }
160
+ setSessionKeyFetcher(func) {
161
+ this.createOrRestoreSessionFetcherFunction = func;
162
+ }
163
+ setSessionKeyRemoveFunction(func) {
164
+ this.removeSessionKeysFunction = func;
165
+ }
166
+ createOrRestoreSession() {
167
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
168
+ var _a;
169
+ if (!this.createOrRestoreSessionFetcherFunction) {
170
+ throw new utils.DynamicError('Cannot register session key to init provider');
171
+ }
172
+ if (TurnkeyWalletConnectorBase.isLoadingSession) {
173
+ return;
174
+ }
175
+ if ((_a = TurnkeyWalletConnectorBase.sessionKeys) === null || _a === void 0 ? void 0 : _a.publicKey) {
176
+ return TurnkeyWalletConnectorBase.sessionKeys.publicKey;
177
+ }
178
+ try {
179
+ TurnkeyWalletConnectorBase.isLoadingSession = true;
180
+ const sessionKeys = yield this.createOrRestoreSessionFetcherFunction();
181
+ TurnkeyWalletConnectorBase.sessionKeys = sessionKeys;
182
+ TurnkeyWalletConnectorBase.apiKeyStamper = new apiKeyStamper.ApiKeyStamper({
183
+ apiPrivateKey: sessionKeys.privateKey,
184
+ apiPublicKey: sessionKeys.publicKey,
185
+ });
186
+ ExportHandler.ExportHandler.apiKeyStamper = TurnkeyWalletConnectorBase.apiKeyStamper;
187
+ return sessionKeys.publicKey;
188
+ }
189
+ catch (error) {
190
+ throw new utils.DynamicError('Failed to create or restore session');
191
+ }
192
+ finally {
193
+ TurnkeyWalletConnectorBase.isLoadingSession = false;
194
+ }
195
+ });
196
+ }
197
+ isSessionKeyCompatible() {
198
+ var _a;
199
+ const walletProperties = (_a = this.verifiedCredential) === null || _a === void 0 ? void 0 : _a.walletProperties;
200
+ const isSessionKeyCompatible = walletProperties === null || walletProperties === void 0 ? void 0 : walletProperties.isSessionKeyCompatible;
201
+ return Boolean(isSessionKeyCompatible);
202
+ }
203
+ isSessionActive() {
204
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
205
+ const hasWallet = yield this.getAddress();
206
+ return Boolean(hasWallet &&
207
+ TurnkeyWalletConnectorBase.sessionKeys &&
208
+ TurnkeyWalletConnectorBase.apiKeyStamper);
209
+ });
210
+ }
211
+ get sessionKeys() {
212
+ return TurnkeyWalletConnectorBase.sessionKeys;
213
+ }
214
+ }
215
+ TurnkeyWalletConnectorBase.isLoadingSession = false;
216
+
217
+ exports.TurnkeyWalletConnectorBase = TurnkeyWalletConnectorBase;
@@ -0,0 +1,68 @@
1
+ import { ApiKeyStamper } from '@turnkey/api-key-stamper';
2
+ import { JwtVerifiedCredential, TurnkeyWalletProperties } from '@dynamic-labs/sdk-api-core';
3
+ import { WalletBookSchema } from '@dynamic-labs/wallet-book';
4
+ import { WalletConnectorBase } from '@dynamic-labs/wallet-connector-core';
5
+ import type { AuthenticatorRecoveryHandler, IEmailWalletConnector, IPasskeyWalletConnector, ISMSWalletConnector, WalletConnector } from '@dynamic-labs/wallet-connector-core';
6
+ import { TurnkeyWalletConnectorNameAndKey } from '../../types';
7
+ import { ExportHandler } from '../ExportHandler';
8
+ export type TurnkeyConnectorBaseProps = {
9
+ walletBook: WalletBookSchema;
10
+ appName?: string;
11
+ };
12
+ export type SessionKeys = {
13
+ publicKey: string;
14
+ privateKey: string;
15
+ };
16
+ type ITurnkeyWalletConnector = IEmailWalletConnector & IPasskeyWalletConnector & ISMSWalletConnector;
17
+ export declare abstract class TurnkeyWalletConnectorBase extends WalletConnectorBase implements ITurnkeyWalletConnector {
18
+ requiresNonDynamicEmailOtp: boolean;
19
+ name: string;
20
+ isEmbeddedWallet: boolean;
21
+ static isLoadingSession: boolean;
22
+ private appName;
23
+ private _email;
24
+ private _phone;
25
+ private _passkeyIdentifier;
26
+ private _verifiedCredential;
27
+ private __authenticatorMethodHandler;
28
+ private __exportHandler;
29
+ static sessionKeys: SessionKeys | undefined;
30
+ static apiKeyStamper: ApiKeyStamper | undefined;
31
+ createOrRestoreSessionFetcherFunction: (() => Promise<SessionKeys>) | undefined;
32
+ removeSessionKeysFunction: (() => Promise<void>) | undefined;
33
+ constructor(nameAndKey: TurnkeyWalletConnectorNameAndKey, props: TurnkeyConnectorBaseProps);
34
+ getWebAuthnAttestation(): Promise<{
35
+ attestation: {
36
+ attestationObject: string;
37
+ clientDataJson: string;
38
+ credentialId: string;
39
+ transports: import("@dynamic-labs/sdk-api-core").AuthenticatorTransportProtocol[];
40
+ };
41
+ challenge: string;
42
+ displayName: string;
43
+ }>;
44
+ getAuthenticatorHandler(): AuthenticatorRecoveryHandler;
45
+ getExportHandler(): ExportHandler;
46
+ get email(): string | null | undefined;
47
+ setEmail(email: string | null | undefined): void;
48
+ get phone(): string | null | undefined;
49
+ setPhone(phone: string | null | undefined): void;
50
+ get passkeyIdentifier(): string | null | undefined;
51
+ setPasskeyIdentifier(passkeyIdentifier: string | null | undefined): void;
52
+ clearEmail(): void;
53
+ getAddress(): Promise<string | undefined>;
54
+ getConnectedAccounts(): Promise<string[]>;
55
+ getMobileOrInstalledWallet(): WalletConnector;
56
+ get turnkeyAddress(): string | undefined;
57
+ get walletProperties(): TurnkeyWalletProperties | undefined;
58
+ set verifiedCredential(verifiedCredential: JwtVerifiedCredential | undefined);
59
+ get verifiedCredential(): JwtVerifiedCredential | undefined;
60
+ setSessionKeyFetcher(func: () => Promise<SessionKeys>): void;
61
+ setSessionKeyRemoveFunction(func: () => Promise<void>): void;
62
+ removeSessionKeys: () => Promise<void>;
63
+ createOrRestoreSession(): Promise<string | undefined>;
64
+ isSessionKeyCompatible(): boolean;
65
+ isSessionActive(): Promise<boolean>;
66
+ get sessionKeys(): SessionKeys | undefined;
67
+ }
68
+ export {};
@@ -0,0 +1,213 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../../_virtual/_tslib.js';
3
+ import { ApiKeyStamper } from '@turnkey/api-key-stamper';
4
+ import { WalletConnectorBase, logger } from '@dynamic-labs/wallet-connector-core';
5
+ import { getTLD, PlatformService, DynamicError } from '@dynamic-labs/utils';
6
+ import { base64UrlEncode } from '../utils/base64UrlEncode/base64UrlEncode.js';
7
+ import { generateRandomBuffer } from '../utils/generateRandomBuffer/generateRandomBuffer.js';
8
+ import { convertAttestationTransports } from '../utils/convertAttestationTransports/convertAttestationTransports.js';
9
+ import { turnkeyAuthenticatorRecoveryHandler } from '../AuthenticatorHandler/TurnkeyAuthenticatorRecoveryHandler.js';
10
+ import { ExportHandler } from '../ExportHandler/ExportHandler.js';
11
+ import { PasskeyService } from '../utils/PasskeyService/PasskeyService.js';
12
+
13
+ class TurnkeyWalletConnectorBase extends WalletConnectorBase {
14
+ constructor(nameAndKey, props) {
15
+ super(props);
16
+ // Public fields
17
+ this.requiresNonDynamicEmailOtp = false;
18
+ this.isEmbeddedWallet = true;
19
+ this.removeSessionKeys = () => __awaiter(this, void 0, void 0, function* () {
20
+ TurnkeyWalletConnectorBase.sessionKeys = undefined;
21
+ TurnkeyWalletConnectorBase.apiKeyStamper = undefined;
22
+ ExportHandler.apiKeyStamper = undefined;
23
+ if (typeof (this === null || this === void 0 ? void 0 : this.removeSessionKeysFunction) === 'function') {
24
+ this.removeSessionKeysFunction();
25
+ }
26
+ });
27
+ if (!props.appName) {
28
+ throw new Error('appName not set');
29
+ }
30
+ this.name = nameAndKey.name;
31
+ this.overrideKey = nameAndKey.key;
32
+ this.appName = props.appName;
33
+ this.__authenticatorMethodHandler = turnkeyAuthenticatorRecoveryHandler;
34
+ this.__exportHandler = new ExportHandler();
35
+ }
36
+ getWebAuthnAttestation() {
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ const challenge = generateRandomBuffer();
39
+ const authenticatorUserId = generateRandomBuffer();
40
+ const { email, passkeyIdentifier } = this;
41
+ if (!email && !passkeyIdentifier) {
42
+ throw new Error('Email or passkeyIdentifier must be set to register a webauthn credential.');
43
+ }
44
+ const displayName = email || `${this.appName} - ${passkeyIdentifier}`;
45
+ const webAuthnCreateParams = {
46
+ publicKey: {
47
+ authenticatorSelection: {
48
+ authenticatorAttachment: undefined,
49
+ requireResidentKey: false,
50
+ residentKey: 'preferred',
51
+ userVerification: 'discouraged',
52
+ },
53
+ challenge,
54
+ pubKeyCredParams: [
55
+ {
56
+ alg: -7,
57
+ type: 'public-key',
58
+ },
59
+ ],
60
+ rp: {
61
+ id: getTLD(),
62
+ name: this.appName,
63
+ },
64
+ user: {
65
+ displayName,
66
+ id: authenticatorUserId,
67
+ name: email || `${this.appName} - ${passkeyIdentifier}`,
68
+ },
69
+ },
70
+ };
71
+ let attestation;
72
+ try {
73
+ attestation = yield PasskeyService.getWebAuthnAttestation(webAuthnCreateParams);
74
+ }
75
+ catch (error) {
76
+ logger.warn(`Unable to register webauthn credential on the current page's TLD ${getTLD()}. Falling back to using hostname. ${PlatformService.getHostname()}`, error);
77
+ // Create the passkey on the hostname instead.
78
+ webAuthnCreateParams.publicKey.rp.id = PlatformService.getHostname();
79
+ attestation = yield PasskeyService.getWebAuthnAttestation(webAuthnCreateParams);
80
+ }
81
+ return {
82
+ attestation: {
83
+ attestationObject: attestation.attestationObject,
84
+ clientDataJson: attestation.clientDataJson,
85
+ credentialId: attestation.credentialId,
86
+ transports: convertAttestationTransports(attestation.transports),
87
+ },
88
+ challenge: base64UrlEncode(challenge),
89
+ displayName,
90
+ };
91
+ });
92
+ }
93
+ getAuthenticatorHandler() {
94
+ return this.__authenticatorMethodHandler;
95
+ }
96
+ getExportHandler() {
97
+ return this.__exportHandler;
98
+ }
99
+ // Public methods
100
+ get email() {
101
+ return this._email;
102
+ }
103
+ setEmail(email) {
104
+ this._email = email;
105
+ }
106
+ get phone() {
107
+ return this._phone;
108
+ }
109
+ setPhone(phone) {
110
+ this._phone = phone;
111
+ }
112
+ get passkeyIdentifier() {
113
+ return this._passkeyIdentifier;
114
+ }
115
+ setPasskeyIdentifier(passkeyIdentifier) {
116
+ this._passkeyIdentifier = passkeyIdentifier;
117
+ }
118
+ clearEmail() {
119
+ this._email = null;
120
+ }
121
+ getAddress() {
122
+ return __awaiter(this, void 0, void 0, function* () {
123
+ var _a;
124
+ return (_a = this.verifiedCredential) === null || _a === void 0 ? void 0 : _a.address;
125
+ });
126
+ }
127
+ getConnectedAccounts() {
128
+ return __awaiter(this, void 0, void 0, function* () {
129
+ var _a;
130
+ const address = (_a = this.verifiedCredential) === null || _a === void 0 ? void 0 : _a.address;
131
+ if (!address) {
132
+ return [];
133
+ }
134
+ return [address];
135
+ });
136
+ }
137
+ getMobileOrInstalledWallet() {
138
+ return this;
139
+ }
140
+ get turnkeyAddress() {
141
+ var _a;
142
+ const { address } = (_a = this.verifiedCredential) !== null && _a !== void 0 ? _a : {};
143
+ return address;
144
+ }
145
+ get walletProperties() {
146
+ const { walletProperties } = this.verifiedCredential || {};
147
+ return walletProperties;
148
+ }
149
+ // Private methods
150
+ set verifiedCredential(verifiedCredential) {
151
+ this._verifiedCredential = verifiedCredential;
152
+ }
153
+ get verifiedCredential() {
154
+ return this._verifiedCredential;
155
+ }
156
+ setSessionKeyFetcher(func) {
157
+ this.createOrRestoreSessionFetcherFunction = func;
158
+ }
159
+ setSessionKeyRemoveFunction(func) {
160
+ this.removeSessionKeysFunction = func;
161
+ }
162
+ createOrRestoreSession() {
163
+ return __awaiter(this, void 0, void 0, function* () {
164
+ var _a;
165
+ if (!this.createOrRestoreSessionFetcherFunction) {
166
+ throw new DynamicError('Cannot register session key to init provider');
167
+ }
168
+ if (TurnkeyWalletConnectorBase.isLoadingSession) {
169
+ return;
170
+ }
171
+ if ((_a = TurnkeyWalletConnectorBase.sessionKeys) === null || _a === void 0 ? void 0 : _a.publicKey) {
172
+ return TurnkeyWalletConnectorBase.sessionKeys.publicKey;
173
+ }
174
+ try {
175
+ TurnkeyWalletConnectorBase.isLoadingSession = true;
176
+ const sessionKeys = yield this.createOrRestoreSessionFetcherFunction();
177
+ TurnkeyWalletConnectorBase.sessionKeys = sessionKeys;
178
+ TurnkeyWalletConnectorBase.apiKeyStamper = new ApiKeyStamper({
179
+ apiPrivateKey: sessionKeys.privateKey,
180
+ apiPublicKey: sessionKeys.publicKey,
181
+ });
182
+ ExportHandler.apiKeyStamper = TurnkeyWalletConnectorBase.apiKeyStamper;
183
+ return sessionKeys.publicKey;
184
+ }
185
+ catch (error) {
186
+ throw new DynamicError('Failed to create or restore session');
187
+ }
188
+ finally {
189
+ TurnkeyWalletConnectorBase.isLoadingSession = false;
190
+ }
191
+ });
192
+ }
193
+ isSessionKeyCompatible() {
194
+ var _a;
195
+ const walletProperties = (_a = this.verifiedCredential) === null || _a === void 0 ? void 0 : _a.walletProperties;
196
+ const isSessionKeyCompatible = walletProperties === null || walletProperties === void 0 ? void 0 : walletProperties.isSessionKeyCompatible;
197
+ return Boolean(isSessionKeyCompatible);
198
+ }
199
+ isSessionActive() {
200
+ return __awaiter(this, void 0, void 0, function* () {
201
+ const hasWallet = yield this.getAddress();
202
+ return Boolean(hasWallet &&
203
+ TurnkeyWalletConnectorBase.sessionKeys &&
204
+ TurnkeyWalletConnectorBase.apiKeyStamper);
205
+ });
206
+ }
207
+ get sessionKeys() {
208
+ return TurnkeyWalletConnectorBase.sessionKeys;
209
+ }
210
+ }
211
+ TurnkeyWalletConnectorBase.isLoadingSession = false;
212
+
213
+ export { TurnkeyWalletConnectorBase };
@@ -0,0 +1 @@
1
+ export * from './TurnkeyWalletConnectorBase';
@@ -0,0 +1,8 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ const TURNKEY_API_BASE_URL = 'https://api.turnkey.com';
7
+
8
+ exports.TURNKEY_API_BASE_URL = TURNKEY_API_BASE_URL;
@@ -0,0 +1 @@
1
+ export declare const TURNKEY_API_BASE_URL = "https://api.turnkey.com";
@@ -0,0 +1,4 @@
1
+ 'use client'
2
+ const TURNKEY_API_BASE_URL = 'https://api.turnkey.com';
3
+
4
+ export { TURNKEY_API_BASE_URL };