@dynamic-labs/sdk-react-core 2.1.0-alpha.10 → 2.1.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/package.cjs +2 -2
  3. package/package.js +2 -2
  4. package/package.json +13 -13
  5. package/src/index.cjs +2 -0
  6. package/src/index.d.ts +1 -1
  7. package/src/index.js +1 -0
  8. package/src/lib/components/CopyButton/CopyButton.cjs +3 -3
  9. package/src/lib/components/CopyButton/CopyButton.d.ts +1 -1
  10. package/src/lib/components/CopyButton/CopyButton.js +3 -3
  11. package/src/lib/components/LoadingQrCode/LoadingQrCode.cjs +11 -0
  12. package/src/lib/components/LoadingQrCode/LoadingQrCode.d.ts +8 -0
  13. package/src/lib/components/LoadingQrCode/LoadingQrCode.js +7 -0
  14. package/src/lib/components/LoadingQrCode/index.d.ts +1 -0
  15. package/src/lib/components/QrCodeWrapper/QrCodeContainer/QrCodeContainer.cjs +2 -1
  16. package/src/lib/components/QrCodeWrapper/QrCodeContainer/QrCodeContainer.js +2 -1
  17. package/src/lib/components/QrCodeWrapper/QrCodeWrapper.cjs +5 -1
  18. package/src/lib/components/QrCodeWrapper/QrCodeWrapper.js +5 -1
  19. package/src/lib/data/api/chains/balances.cjs +38 -0
  20. package/src/lib/data/api/chains/balances.d.ts +8 -0
  21. package/src/lib/data/api/chains/balances.js +34 -0
  22. package/src/lib/data/api/chains/index.d.ts +1 -0
  23. package/src/lib/shared/types/general.d.ts +1 -0
  24. package/src/lib/utils/constants/errors.cjs +2 -0
  25. package/src/lib/utils/constants/errors.d.ts +1 -0
  26. package/src/lib/utils/constants/errors.js +2 -1
  27. package/src/lib/utils/hooks/index.d.ts +1 -0
  28. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.cjs +34 -3
  29. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.d.ts +18 -9
  30. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.js +34 -3
  31. package/src/lib/utils/hooks/useEmbeddedWallet/useMPCEmbeddedWallet/useMPCEmbeddedWallet.cjs +5 -1
  32. package/src/lib/utils/hooks/useEmbeddedWallet/useMPCEmbeddedWallet/useMPCEmbeddedWallet.d.ts +1 -0
  33. package/src/lib/utils/hooks/useEmbeddedWallet/useMPCEmbeddedWallet/useMPCEmbeddedWallet.js +5 -1
  34. package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.cjs +4 -0
  35. package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.d.ts +2 -0
  36. package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.js +3 -1
  37. package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.cjs +68 -28
  38. package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.d.ts +11 -6
  39. package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.js +70 -30
  40. package/src/lib/utils/hooks/useTokenBalances/index.d.ts +1 -0
  41. package/src/lib/utils/hooks/useTokenBalances/useTokenBalances.cjs +141 -0
  42. package/src/lib/utils/hooks/useTokenBalances/useTokenBalances.d.ts +12 -0
  43. package/src/lib/utils/hooks/useTokenBalances/useTokenBalances.js +137 -0
  44. package/src/lib/views/EmbeddedReveal/EmbeddedRevealView/EmbeddedRevealView.cjs +1 -1
  45. package/src/lib/views/EmbeddedReveal/EmbeddedRevealView/EmbeddedRevealView.js +1 -1
  46. package/src/lib/views/EmbeddedReveal/utils/turnkeyExport/turnkeyExport.cjs +5 -4
  47. package/src/lib/views/EmbeddedReveal/utils/turnkeyExport/turnkeyExport.js +5 -4
  48. package/src/lib/views/FarcasterQrCodeView/FarcasterQrCodeView.cjs +103 -0
  49. package/src/lib/views/FarcasterQrCodeView/FarcasterQrCodeView.d.ts +6 -0
  50. package/src/lib/views/FarcasterQrCodeView/FarcasterQrCodeView.js +99 -0
  51. package/src/lib/views/FarcasterQrCodeView/index.d.ts +1 -0
  52. package/src/lib/views/LoginView/LoginView.cjs +9 -1
  53. package/src/lib/views/LoginView/LoginView.js +9 -1
  54. package/src/lib/views/LoginView/utils/showFarcasterQrCodeView/index.d.ts +1 -0
  55. package/src/lib/views/LoginView/utils/showFarcasterQrCodeView/showFarcasterQrCodeView.cjs +14 -0
  56. package/src/lib/views/LoginView/utils/showFarcasterQrCodeView/showFarcasterQrCodeView.d.ts +2 -0
  57. package/src/lib/views/LoginView/utils/showFarcasterQrCodeView/showFarcasterQrCodeView.js +10 -0
@@ -31,6 +31,7 @@ import '../../../context/UserWalletsContext/UserWalletsContext.js';
31
31
  import '../../../context/VerificationContext/VerificationContext.js';
32
32
  import 'react-dom';
33
33
  import { useWalletContext } from '../../../context/WalletContext/WalletContext.js';
34
+ import { useIsTurnkeyWallet } from '../useIsTurnkeyWallet/useIsTurnkeyWallet.js';
34
35
  import { useSecureEnclaveEmbeddedWallet } from './useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.js';
35
36
  import { useMPCEmbeddedWallet } from './useMPCEmbeddedWallet/useMPCEmbeddedWallet.js';
36
37
  import '../../../context/ThemeContext/ThemeContext.js';
@@ -78,21 +79,33 @@ import { useInternalDynamicContext } from '../../../context/DynamicContext/useDy
78
79
  /**
79
80
  * @returns {
80
81
  * createEmbeddedWallet, - creates Dynamic embedded wallet according to the settings
82
+ * createOrRestoreSession, - creates or restores session for the embedded wallet
83
+ * createPasskey, - creates passkey for the embedded wallet
81
84
  * createPassword, - creates MPC embedded wallet password
85
+ * getPasskeys, - gets passkeys for the embedded wallet
82
86
  * isLoadingEmbeddedWallet, - loading state of the embedded wallet
87
+ * isSessionActive, - checks if the session is active for the embedded wallet
88
+ * revealWalletKey, - reveals the private key or recovery phrase for the embedded wallet
89
+ * sendOneTimeCode, - sends one time code for the embedded wallet
83
90
  * userHasEmbeddedWallet, - checks if the user has an embedded wallet
84
91
  * }
85
92
  */
86
93
  const useEmbeddedWallet = () => {
87
- const { onboardingOnlyJwt } = useInternalDynamicContext();
88
- const { createEmbeddedWallet: createCoinbaseMPCWallet, canCreateMPCWallet, createPassword, } = useMPCEmbeddedWallet();
89
- const { createEmbeddedWallet: createTurnkeyEmbeddedWallet, createOrRestoreSession, createPasskey, getPasskeys, isSessionActive, sendOneTimeCode, } = useSecureEnclaveEmbeddedWallet();
94
+ const { onboardingOnlyJwt, user } = useInternalDynamicContext();
95
+ const { isTurnkeyWallet } = useIsTurnkeyWallet();
96
+ const { createEmbeddedWallet: createCoinbaseMPCWallet, canCreateMPCWallet, createPassword, revealEmbeddedWalletKey: reveaCoinbaseMPCEmbeddedWalletKey, } = useMPCEmbeddedWallet();
97
+ const { createEmbeddedWallet: createTurnkeyEmbeddedWallet, createOrRestoreSession, createPasskey, revealEmbeddedWalletKey: revealTurnkeyEmbeddedWalletKey, getPasskeys, isSessionActive, sendOneTimeCode, } = useSecureEnclaveEmbeddedWallet();
90
98
  const { isLoadingEmbeddedWallet } = useWalletContext();
99
+ /**
100
+ * Checks if user has some embedded wallet
101
+ * @returns boolean - true if the user has an embedded wallet
102
+ */
91
103
  const userHasEmbeddedWallet = () => hasEmbeddedWallet(getAuthToken() || onboardingOnlyJwt);
92
104
  /**
93
105
  * Creates Dynamic embedded wallet according to the settings
94
106
  * @param chains - array of chains to create the wallet for
95
107
  * @param options - options for the wallet creation
108
+ * @returns Promise<Wallet | undefined> - created wallet object
96
109
  */
97
110
  const createEmbeddedWallet = useCallback((chains, options) => __awaiter(void 0, void 0, void 0, function* () {
98
111
  if (yield canCreateMPCWallet(chains)) {
@@ -102,6 +115,23 @@ const useEmbeddedWallet = () => {
102
115
  const wallet = yield createTurnkeyEmbeddedWallet(chains, options);
103
116
  return wallet;
104
117
  }), [canCreateMPCWallet, createCoinbaseMPCWallet, createTurnkeyEmbeddedWallet]);
118
+ /**
119
+ * Reveals the private key or recovery phrase for the embedded wallet
120
+ * @param options - options for revealing the wallet key
121
+ * @returns Promise<boolean> - true if the key was revealed successfully
122
+ */
123
+ const revealWalletKey = (options) => __awaiter(void 0, void 0, void 0, function* () {
124
+ if (!user) {
125
+ throw new Error('User is not logged in');
126
+ }
127
+ if (!userHasEmbeddedWallet()) {
128
+ throw new Error('Embedded wallet not found');
129
+ }
130
+ if (isTurnkeyWallet) {
131
+ return revealTurnkeyEmbeddedWalletKey(options);
132
+ }
133
+ return reveaCoinbaseMPCEmbeddedWalletKey();
134
+ });
105
135
  return {
106
136
  createEmbeddedWallet,
107
137
  createOrRestoreSession,
@@ -110,6 +140,7 @@ const useEmbeddedWallet = () => {
110
140
  getPasskeys,
111
141
  isLoadingEmbeddedWallet,
112
142
  isSessionActive,
143
+ revealWalletKey,
113
144
  sendOneTimeCode,
114
145
  userHasEmbeddedWallet,
115
146
  };
@@ -6,6 +6,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
6
6
  var _tslib = require('../../../../../../_virtual/_tslib.cjs');
7
7
  var React = require('react');
8
8
  var walletConnectorCore = require('@dynamic-labs/wallet-connector-core');
9
+ var utils = require('@dynamic-labs/utils');
9
10
  require('../../../../context/DynamicContext/DynamicContext.cjs');
10
11
  require('@dynamic-labs/sdk-api-core');
11
12
  require('../../../../shared/logger.cjs');
@@ -16,7 +17,6 @@ require('@dynamic-labs/wallet-book');
16
17
  require('../../../constants/colors.cjs');
17
18
  require('../../../constants/values.cjs');
18
19
  require('../../../../shared/utils/classes/storage/localStorage.cjs');
19
- require('@dynamic-labs/utils');
20
20
  require('../../../../shared/consts/index.cjs');
21
21
  require('../../../../events/dynamicEvents.cjs');
22
22
  require('../../../../context/CaptchaContext/CaptchaContext.cjs');
@@ -153,11 +153,15 @@ const useMPCEmbeddedWallet = () => {
153
153
  projectSettings,
154
154
  setIsLoadingEmbeddedWallet,
155
155
  ]);
156
+ const revealEmbeddedWalletKey = () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
157
+ throw new utils.DynamicError('Coinbase MPC wallet does not support headless reveal yet');
158
+ });
156
159
  return {
157
160
  canCreateMPCWallet,
158
161
  createEmbeddedWallet,
159
162
  createPassword,
160
163
  isLoadingEmbeddedWallet,
164
+ revealEmbeddedWalletKey,
161
165
  userHasEmbeddedWallet,
162
166
  };
163
167
  };
@@ -13,5 +13,6 @@ export declare const useMPCEmbeddedWallet: () => {
13
13
  readonly createEmbeddedWallet: (chains?: ChainEnum[]) => Promise<Wallet | undefined>;
14
14
  readonly createPassword: (showIntro?: boolean) => Promise<string>;
15
15
  readonly isLoadingEmbeddedWallet: boolean;
16
+ readonly revealEmbeddedWalletKey: () => Promise<never>;
16
17
  readonly userHasEmbeddedWallet: () => boolean;
17
18
  };
@@ -2,6 +2,7 @@
2
2
  import { __awaiter } from '../../../../../../_virtual/_tslib.js';
3
3
  import { useCallback } from 'react';
4
4
  import { isCoinbaseMpcWalletConnector } from '@dynamic-labs/wallet-connector-core';
5
+ import { DynamicError } from '@dynamic-labs/utils';
5
6
  import '../../../../context/DynamicContext/DynamicContext.js';
6
7
  import '@dynamic-labs/sdk-api-core';
7
8
  import '../../../../shared/logger.js';
@@ -12,7 +13,6 @@ import '@dynamic-labs/wallet-book';
12
13
  import '../../../constants/colors.js';
13
14
  import '../../../constants/values.js';
14
15
  import '../../../../shared/utils/classes/storage/localStorage.js';
15
- import '@dynamic-labs/utils';
16
16
  import '../../../../shared/consts/index.js';
17
17
  import '../../../../events/dynamicEvents.js';
18
18
  import '../../../../context/CaptchaContext/CaptchaContext.js';
@@ -149,11 +149,15 @@ const useMPCEmbeddedWallet = () => {
149
149
  projectSettings,
150
150
  setIsLoadingEmbeddedWallet,
151
151
  ]);
152
+ const revealEmbeddedWalletKey = () => __awaiter(void 0, void 0, void 0, function* () {
153
+ throw new DynamicError('Coinbase MPC wallet does not support headless reveal yet');
154
+ });
152
155
  return {
153
156
  canCreateMPCWallet,
154
157
  createEmbeddedWallet,
155
158
  createPassword,
156
159
  isLoadingEmbeddedWallet,
160
+ revealEmbeddedWalletKey,
157
161
  userHasEmbeddedWallet,
158
162
  };
159
163
  };
@@ -5,6 +5,10 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
 
6
6
  const iframeContainerId = 'dyn-secure-enclave-container-id';
7
7
  const iframeElementId = 'dyn-secure-enclave-element-id';
8
+ const revealIframeContainerId = 'dyn-secure-enclave-export-container-id';
9
+ const revealIframeElementId = 'dyn-secure-enclave-export-element-id';
8
10
 
9
11
  exports.iframeContainerId = iframeContainerId;
10
12
  exports.iframeElementId = iframeElementId;
13
+ exports.revealIframeContainerId = revealIframeContainerId;
14
+ exports.revealIframeElementId = revealIframeElementId;
@@ -1,2 +1,4 @@
1
1
  export declare const iframeContainerId = "dyn-secure-enclave-container-id";
2
2
  export declare const iframeElementId = "dyn-secure-enclave-element-id";
3
+ export declare const revealIframeContainerId = "dyn-secure-enclave-export-container-id";
4
+ export declare const revealIframeElementId = "dyn-secure-enclave-export-element-id";
@@ -1,5 +1,7 @@
1
1
  'use client'
2
2
  const iframeContainerId = 'dyn-secure-enclave-container-id';
3
3
  const iframeElementId = 'dyn-secure-enclave-element-id';
4
+ const revealIframeContainerId = 'dyn-secure-enclave-export-container-id';
5
+ const revealIframeElementId = 'dyn-secure-enclave-export-element-id';
4
6
 
5
- export { iframeContainerId, iframeElementId };
7
+ export { iframeContainerId, iframeElementId, revealIframeContainerId, revealIframeElementId };
@@ -47,11 +47,12 @@ require('../../../../context/VerificationContext/VerificationContext.cjs');
47
47
  require('react-dom');
48
48
  var useElementById = require('../../useElementById/useElementById.cjs');
49
49
  var WalletContext = require('../../../../context/WalletContext/WalletContext.cjs');
50
+ var useIsTurnkeyWallet = require('../../useIsTurnkeyWallet/useIsTurnkeyWallet.cjs');
50
51
  var validateUserIsLoggedIn = require('../../../validations/validateUserIsLoggedIn/validateUserIsLoggedIn.cjs');
51
52
  var validateTurnkeyProviderEnabled = require('../../../validations/validateTurnkeyProviderEnabled/validateTurnkeyProviderEnabled.cjs');
52
53
  var errors = require('../../../constants/errors.cjs');
53
- var useIsTurnkeyWallet = require('../../useIsTurnkeyWallet/useIsTurnkeyWallet.cjs');
54
54
  var passkeyRecovery = require('../../../../views/Passkey/utils/passkeyRecovery/passkeyRecovery.cjs');
55
+ var turnkeyExport = require('../../../../views/EmbeddedReveal/utils/turnkeyExport/turnkeyExport.cjs');
55
56
  var useTurnkey = require('./useTurnkey/useTurnkey.cjs');
56
57
  var constants = require('./constants.cjs');
57
58
  require('../../../../context/ThemeContext/ThemeContext.cjs');
@@ -105,20 +106,21 @@ var useInternalDynamicContext = require('../../../../context/DynamicContext/useD
105
106
  * getPasskeys, - gets all passkeys for the user
106
107
  * isLoadingEmbeddedWallet, - loading state of the embedded wallet
107
108
  * isSessionActive, - checks if the embedded wallet session is active
109
+ * revealEmbeddedWalletKey - export the recovery phrase or private key of the embedded wallet
108
110
  * sendOneTimeCode, - sends a one-time code to the user so they can create a session or add a new passkey
109
111
  * userHasEmbeddedWallet, - checks if the user has an embedded wallet
110
112
  * }
111
113
  */
112
114
  const useSecureEnclaveEmbeddedWallet = () => {
113
115
  var _a, _b, _c, _d;
114
- const { projectSettings, onboardingOnlyJwt, primaryWallet, user, environmentId, walletConnectorOptions, setUser, } = useInternalDynamicContext.useInternalDynamicContext();
116
+ const { projectSettings, authToken, onboardingOnlyJwt, primaryWallet, user, environmentId, walletConnectorOptions, setUser, } = useInternalDynamicContext.useInternalDynamicContext();
115
117
  const { createTurnkeyWallet } = useTurnkey.useTurnkey();
116
118
  const { hasRecoveryEmail } = useIsTurnkeyWallet.useIsTurnkeyWallet();
117
119
  const { createRootElement } = useElementById.useElementById();
118
120
  const { isLoadingEmbeddedWallet, setIsLoadingEmbeddedWallet } = WalletContext.useWalletContext();
119
121
  const wallet = getEOAWallet.getEOAWallet(primaryWallet, (user === null || user === void 0 ? void 0 : user.verifiedCredentials) || []);
120
122
  /**
121
- * Checks if the user has an embedded wallet or not
123
+ * Checks if the user has a secure enclave embedded wallet or not
122
124
  * @returns boolean
123
125
  */
124
126
  const userHasEmbeddedWallet = React.useCallback(() => hasEmbeddedWallet.hasEmbeddedWallet(getAuthToken.getAuthToken() || onboardingOnlyJwt, 'turnkey'), [onboardingOnlyJwt]);
@@ -159,9 +161,9 @@ const useSecureEnclaveEmbeddedWallet = () => {
159
161
  * @param oneTimeCode - optional one-time code parameter. If not informed it tries to restore a session
160
162
  * @returns Promise<'session_created' | 'session_restored'> - returns a string indicating the status of the session
161
163
  */
162
- const createOrRestoreSession = React.useCallback((_g) => _tslib.__awaiter(void 0, [_g], void 0, function* ({ oneTimeCode }) {
163
- var _h, _j, _k, _l, _m, _o, _p;
164
- const jwt = (_h = getAuthToken.getAuthToken()) !== null && _h !== void 0 ? _h : onboardingOnlyJwt;
164
+ const createOrRestoreSession = React.useCallback((options) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
165
+ var _g, _h, _j, _k, _l, _m, _o;
166
+ const jwt = (_g = getAuthToken.getAuthToken()) !== null && _g !== void 0 ? _g : onboardingOnlyJwt;
165
167
  const { decodedJwt } = validateUserIsLoggedIn.validateUserIsLoggedIn(jwt);
166
168
  const turnkeyRecoveryHandler = getEmbeddedWalletAuthHandler.getEmbeddedWalletAuthHandler(wallet === null || wallet === void 0 ? void 0 : wallet.connector);
167
169
  if (turnkeyRecoveryHandler.isSessionActive()) {
@@ -169,13 +171,13 @@ const useSecureEnclaveEmbeddedWallet = () => {
169
171
  }
170
172
  const turnkeyAuthIframeContainerRef = createRootElement(constants.iframeContainerId);
171
173
  // try to restore session if possible
172
- if (passkeyRecovery.canRestoreEmbeddedWalletSession((_j = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _j === void 0 ? void 0 : _j.sessionKeyDuration)) {
174
+ if (passkeyRecovery.canRestoreEmbeddedWalletSession((_h = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _h === void 0 ? void 0 : _h.sessionKeyDuration)) {
173
175
  try {
174
176
  const sessionRestored = yield passkeyRecovery.restoreEmbeddedWalletSession({
175
177
  authToken: jwt,
176
178
  iframeContainer: turnkeyAuthIframeContainerRef.current,
177
179
  iframeElementId: constants.iframeElementId,
178
- sessionExpiration: getEmbeddedWalletSessionExpiration.getEmbeddedWalletSessionExpiration((_l = (_k = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _k === void 0 ? void 0 : _k.embeddedWallets) === null || _l === void 0 ? void 0 : _l.sessionKeyDuration),
180
+ sessionExpiration: getEmbeddedWalletSessionExpiration.getEmbeddedWalletSessionExpiration((_k = (_j = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _j === void 0 ? void 0 : _j.embeddedWallets) === null || _k === void 0 ? void 0 : _k.sessionKeyDuration),
179
181
  wallet: primaryWallet,
180
182
  });
181
183
  if (sessionRestored)
@@ -185,7 +187,7 @@ const useSecureEnclaveEmbeddedWallet = () => {
185
187
  logger.logger.error('Failed to restore embedded wallet', err);
186
188
  }
187
189
  }
188
- if (!oneTimeCode) {
190
+ if (!(options === null || options === void 0 ? void 0 : options.oneTimeCode)) {
189
191
  throw new utils.DynamicError('One-time code is required to create a session.', errors.INVALID_REQUEST);
190
192
  }
191
193
  // tries to create a new session with the informed one-time code
@@ -193,11 +195,11 @@ const useSecureEnclaveEmbeddedWallet = () => {
193
195
  if (!userHasEmbeddedWallet() || !hasRecoveryEmail) {
194
196
  throw new utils.DynamicError('User does not have a secure enclave wallet or a verified email', errors.INVALID_WALLET_DATA);
195
197
  }
196
- const organizationId = (_p = (_o = (_m = decodedJwt.verifiedCredentials) === null || _m === void 0 ? void 0 : _m.find(({ walletName }) => walletName === null || walletName === void 0 ? void 0 : walletName.startsWith('turnkey'))) === null || _o === void 0 ? void 0 : _o.walletProperties) === null || _p === void 0 ? void 0 : _p.turnkeySubOrganizationId;
197
- yield turnkeyRecoveryHandler.verifyRecoveryCode(oneTimeCode, organizationId);
198
+ const organizationId = (_o = (_m = (_l = decodedJwt.verifiedCredentials) === null || _l === void 0 ? void 0 : _l.find(({ walletName }) => walletName === null || walletName === void 0 ? void 0 : walletName.startsWith('turnkey'))) === null || _m === void 0 ? void 0 : _m.walletProperties) === null || _o === void 0 ? void 0 : _o.turnkeySubOrganizationId;
199
+ yield turnkeyRecoveryHandler.verifyRecoveryCode(options.oneTimeCode, organizationId);
198
200
  const sessionSettings = {
199
201
  createdAt: new Date().getTime(),
200
- emailCode: oneTimeCode,
202
+ emailCode: options.oneTimeCode,
201
203
  userId: turnkeyRecoveryHandler.recoveryUserId,
202
204
  };
203
205
  localStorage.LocalStorage.setToLS(localStorage$1.EMBEDDED_WALLET_SESSION_SETTINGS, sessionSettings);
@@ -213,15 +215,14 @@ const useSecureEnclaveEmbeddedWallet = () => {
213
215
  ]);
214
216
  /**
215
217
  * Creates a new passkey both for an existing wallet or a wallet to be created
216
- * @param oneTimeCode: string | undefined,
217
- *
218
+ * @param options - optional parameter to inform a one-time code to create a session,
218
219
  * @returns Promise<WebAuthnAttestation>
219
220
  */
220
- const createPasskey = React.useCallback((_q) => _tslib.__awaiter(void 0, [_q], void 0, function* ({ oneTimeCode, }) {
221
- var _r, _s;
221
+ const createPasskey = React.useCallback((options) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
222
+ var _p, _q;
222
223
  const { decodedJwt, jwt } = validateUserIsLoggedIn.validateUserIsLoggedIn(getAuthToken.getAuthToken() || onboardingOnlyJwt);
223
224
  validateTurnkeyProviderEnabled.validateTurnkeyProviderEnabled(projectSettings);
224
- const turnkeyWallet = findTurnkeyWallet.findTurnkeyWalletByPrimaryChain(walletConnectorOptions, (_r = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _r === void 0 ? void 0 : _r.chainConfigurations, decodedJwt.verifiedCredentials);
225
+ const turnkeyWallet = findTurnkeyWallet.findTurnkeyWalletByPrimaryChain(walletConnectorOptions, (_p = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _p === void 0 ? void 0 : _p.chainConfigurations, decodedJwt.verifiedCredentials);
225
226
  if (!(turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.walletConnector)) {
226
227
  throw new utils.DynamicError('Wallet connector not found', errors.INVALID_WALLET_DATA);
227
228
  }
@@ -236,13 +237,13 @@ const useSecureEnclaveEmbeddedWallet = () => {
236
237
  if (!('id' in turnkeyWallet) || !hasEmailVC) {
237
238
  return walletConnector.getWebAuthnAttestation();
238
239
  }
239
- const organizationId = (_s = turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.walletProperties) === null || _s === void 0 ? void 0 : _s.turnkeySubOrganizationId;
240
+ const organizationId = (_q = turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.walletProperties) === null || _q === void 0 ? void 0 : _q.turnkeySubOrganizationId;
240
241
  if (!organizationId) {
241
242
  throw new utils.DynamicError('No sub organization id found for the wallet', errors.INVALID_WALLET_DATA);
242
243
  }
243
244
  const turnkAuthenticatorHandler = getEmbeddedWalletAuthHandler.getEmbeddedWalletAuthHandler(walletConnector);
244
245
  // add new passkey to the wallet through an active session
245
- yield createOrRestoreSession({ oneTimeCode });
246
+ yield createOrRestoreSession(options);
246
247
  const { attestation, challenge, displayName } = yield walletConnector.getWebAuthnAttestation();
247
248
  yield turnkAuthenticatorHandler.addPasskeyAuthenticator({
248
249
  attestation,
@@ -265,9 +266,7 @@ const useSecureEnclaveEmbeddedWallet = () => {
265
266
  onboardingOnlyJwt,
266
267
  projectSettings,
267
268
  setUser,
268
- user === null || user === void 0 ? void 0 : user.email,
269
- user === null || user === void 0 ? void 0 : user.phoneNumber,
270
- user === null || user === void 0 ? void 0 : user.verifiedCredentials,
269
+ user,
271
270
  walletConnectorOptions,
272
271
  ]);
273
272
  /**
@@ -275,8 +274,8 @@ const useSecureEnclaveEmbeddedWallet = () => {
275
274
  * @returns Promise<Passkey[]>
276
275
  */
277
276
  const getPasskeys = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
278
- var _t;
279
- const { jwt } = validateUserIsLoggedIn.validateUserIsLoggedIn((_t = getAuthToken.getAuthToken()) !== null && _t !== void 0 ? _t : onboardingOnlyJwt);
277
+ var _r;
278
+ const { jwt } = validateUserIsLoggedIn.validateUserIsLoggedIn((_r = getAuthToken.getAuthToken()) !== null && _r !== void 0 ? _r : onboardingOnlyJwt);
280
279
  const data = yield embeddedWallets.getUserPasskeys({
281
280
  environmentId: environmentId,
282
281
  userJwt: jwt,
@@ -290,15 +289,55 @@ const useSecureEnclaveEmbeddedWallet = () => {
290
289
  const isSessionActive = (_d = ((wallet === null || wallet === void 0 ? void 0 : wallet.connector) &&
291
290
  'getAuthenticatorHandler' in wallet.connector &&
292
291
  ((_c = getEmbeddedWalletAuthHandler.getEmbeddedWalletAuthHandler(wallet.connector)) === null || _c === void 0 ? void 0 : _c.isSessionActive()))) !== null && _d !== void 0 ? _d : false;
292
+ /**
293
+ * export the recovery phrase or private key of the embedded wallet
294
+ * @param options - optional parameter object containing the type of key to reveal 'recoveryPhrase' | 'privateKey'
295
+ * and the html container id to render the iframe into
296
+ * @returns Promise<string> - returns the embedded wallet recovery phrase or private key
297
+ */
298
+ const revealEmbeddedWalletKey = (_s) => _tslib.__awaiter(void 0, [_s], void 0, function* ({ type, htmlContainerId, }) {
299
+ var _t, _u;
300
+ if (!user) {
301
+ throw new utils.DynamicError('User is not logged in', errors.USER_NOT_LOGGED_IN);
302
+ }
303
+ yield turnkeyExport.cleanupExport({
304
+ wallet,
305
+ });
306
+ const turnkeyWallet = findTurnkeyWallet.findTurnkeyWalletByPrimaryChain(walletConnectorOptions, (_t = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _t === void 0 ? void 0 : _t.chainConfigurations, user === null || user === void 0 ? void 0 : user.verifiedCredentials);
307
+ const turnkeyHDWalletId = (_u = turnkeyWallet === null || turnkeyWallet === void 0 ? void 0 : turnkeyWallet.walletProperties) === null || _u === void 0 ? void 0 : _u.turnkeyHDWalletId;
308
+ if (type === 'recoveryPhrase' && !turnkeyHDWalletId) {
309
+ type = 'privateKey';
310
+ }
311
+ const iframeContainerElement = createRootElement(constants.revealIframeElementId, htmlContainerId || constants.revealIframeContainerId);
312
+ // hide the iframe container until the export is done
313
+ // since it will show unrelated turnkey content
314
+ iframeContainerElement.current.style.display = 'none';
315
+ yield turnkeyExport.initExport({
316
+ iframeContainer: iframeContainerElement.current,
317
+ iframeElementId: constants.revealIframeElementId,
318
+ wallet,
319
+ });
320
+ yield turnkeyExport.exportCredential({
321
+ address: type === 'privateKey' ? wallet === null || wallet === void 0 ? void 0 : wallet.address : undefined,
322
+ authToken,
323
+ environmentId,
324
+ userEmail: user === null || user === void 0 ? void 0 : user.email,
325
+ wallet,
326
+ });
327
+ // show the iframe container after the export is done
328
+ // to show the exported content only
329
+ iframeContainerElement.current.style.display = 'block';
330
+ return true;
331
+ });
293
332
  /**
294
333
  * Sends a one-time code to the user so they can create a session or add a new passkey
295
334
  * @returns Promise<'code_sent'>
296
335
  */
297
336
  const sendOneTimeCode = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
298
- var _u, _v, _w;
299
- const { jwt, decodedJwt } = validateUserIsLoggedIn.validateUserIsLoggedIn((_u = getAuthToken.getAuthToken()) !== null && _u !== void 0 ? _u : onboardingOnlyJwt);
337
+ var _v, _w, _x;
338
+ const { jwt, decodedJwt } = validateUserIsLoggedIn.validateUserIsLoggedIn((_v = getAuthToken.getAuthToken()) !== null && _v !== void 0 ? _v : onboardingOnlyJwt);
300
339
  validateTurnkeyProviderEnabled.validateTurnkeyProviderEnabled(projectSettings);
301
- const targetTurnkeyWallet = findTurnkeyWallet.findTurnkeyWalletByPrimaryChain(walletConnectorOptions, (_v = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _v === void 0 ? void 0 : _v.chainConfigurations, decodedJwt.verifiedCredentials);
340
+ const targetTurnkeyWallet = findTurnkeyWallet.findTurnkeyWalletByPrimaryChain(walletConnectorOptions, (_w = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _w === void 0 ? void 0 : _w.chainConfigurations, decodedJwt.verifiedCredentials);
302
341
  if (!targetTurnkeyWallet || !('id' in targetTurnkeyWallet)) {
303
342
  throw new utils.DynamicError('User does not have a valid secure enclave wallet', errors.INVALID_WALLET_DATA);
304
343
  }
@@ -309,7 +348,7 @@ const useSecureEnclaveEmbeddedWallet = () => {
309
348
  throw new utils.DynamicError('Session is active. No need to create a new one', errors.ACTIVE_SESSION);
310
349
  }
311
350
  const turnkeyAuthIframeContainerRef = createRootElement(constants.iframeContainerId);
312
- const publicKey = yield turnkeyAuthenticatorHandler.initRecovery('email', turnkeyAuthIframeContainerRef.current, constants.iframeElementId, getEmbeddedWalletSessionExpiration.getEmbeddedWalletSessionExpiration((_w = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _w === void 0 ? void 0 : _w.sessionKeyDuration));
351
+ const publicKey = yield turnkeyAuthenticatorHandler.initRecovery('email', turnkeyAuthIframeContainerRef.current, constants.iframeElementId, getEmbeddedWalletSessionExpiration.getEmbeddedWalletSessionExpiration((_x = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk.embeddedWallets) === null || _x === void 0 ? void 0 : _x.sessionKeyDuration));
313
352
  if (!publicKey) {
314
353
  throw new utils.DynamicError(errors.ERROR_SENDING_CODE);
315
354
  }
@@ -336,6 +375,7 @@ const useSecureEnclaveEmbeddedWallet = () => {
336
375
  getPasskeys,
337
376
  isLoadingEmbeddedWallet,
338
377
  isSessionActive,
378
+ revealEmbeddedWalletKey,
339
379
  sendOneTimeCode,
340
380
  userHasEmbeddedWallet,
341
381
  };
@@ -10,6 +10,7 @@ import { Wallet } from '../../../../shared';
10
10
  * getPasskeys, - gets all passkeys for the user
11
11
  * isLoadingEmbeddedWallet, - loading state of the embedded wallet
12
12
  * isSessionActive, - checks if the embedded wallet session is active
13
+ * revealEmbeddedWalletKey - export the recovery phrase or private key of the embedded wallet
13
14
  * sendOneTimeCode, - sends a one-time code to the user so they can create a session or add a new passkey
14
15
  * userHasEmbeddedWallet, - checks if the user has an embedded wallet
15
16
  * }
@@ -18,15 +19,19 @@ export declare const useSecureEnclaveEmbeddedWallet: () => {
18
19
  readonly createEmbeddedWallet: (chains?: ChainEnum[], options?: {
19
20
  webAuthnAttestation: WebAuthnAttestation;
20
21
  }) => Promise<Wallet | undefined>;
21
- readonly createOrRestoreSession: ({ oneTimeCode }: {
22
- oneTimeCode?: string;
23
- }) => Promise<string>;
24
- readonly createPasskey: ({ oneTimeCode, }: {
25
- oneTimeCode?: string;
26
- }) => Promise<WebAuthnAttestation>;
22
+ readonly createOrRestoreSession: (options: {
23
+ oneTimeCode: string;
24
+ } | undefined) => Promise<string>;
25
+ readonly createPasskey: (options: {
26
+ oneTimeCode: string;
27
+ } | undefined) => Promise<WebAuthnAttestation>;
27
28
  readonly getPasskeys: () => Promise<import("@dynamic-labs/sdk-api-core").UserPasskey[]>;
28
29
  readonly isLoadingEmbeddedWallet: boolean;
29
30
  readonly isSessionActive: boolean;
31
+ readonly revealEmbeddedWalletKey: ({ type, htmlContainerId, }: {
32
+ type: 'recoveryPhrase' | 'privateKey';
33
+ htmlContainerId?: string;
34
+ }) => Promise<boolean>;
30
35
  readonly sendOneTimeCode: () => Promise<string>;
31
36
  readonly userHasEmbeddedWallet: () => boolean;
32
37
  };