@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.
- package/CHANGELOG.md +20 -0
- package/package.cjs +2 -2
- package/package.js +2 -2
- package/package.json +13 -13
- package/src/index.cjs +2 -0
- package/src/index.d.ts +1 -1
- package/src/index.js +1 -0
- package/src/lib/components/CopyButton/CopyButton.cjs +3 -3
- package/src/lib/components/CopyButton/CopyButton.d.ts +1 -1
- package/src/lib/components/CopyButton/CopyButton.js +3 -3
- package/src/lib/components/LoadingQrCode/LoadingQrCode.cjs +11 -0
- package/src/lib/components/LoadingQrCode/LoadingQrCode.d.ts +8 -0
- package/src/lib/components/LoadingQrCode/LoadingQrCode.js +7 -0
- package/src/lib/components/LoadingQrCode/index.d.ts +1 -0
- package/src/lib/components/QrCodeWrapper/QrCodeContainer/QrCodeContainer.cjs +2 -1
- package/src/lib/components/QrCodeWrapper/QrCodeContainer/QrCodeContainer.js +2 -1
- package/src/lib/components/QrCodeWrapper/QrCodeWrapper.cjs +5 -1
- package/src/lib/components/QrCodeWrapper/QrCodeWrapper.js +5 -1
- package/src/lib/data/api/chains/balances.cjs +38 -0
- package/src/lib/data/api/chains/balances.d.ts +8 -0
- package/src/lib/data/api/chains/balances.js +34 -0
- package/src/lib/data/api/chains/index.d.ts +1 -0
- package/src/lib/shared/types/general.d.ts +1 -0
- package/src/lib/utils/constants/errors.cjs +2 -0
- package/src/lib/utils/constants/errors.d.ts +1 -0
- package/src/lib/utils/constants/errors.js +2 -1
- package/src/lib/utils/hooks/index.d.ts +1 -0
- package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.cjs +34 -3
- package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.d.ts +18 -9
- package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.js +34 -3
- package/src/lib/utils/hooks/useEmbeddedWallet/useMPCEmbeddedWallet/useMPCEmbeddedWallet.cjs +5 -1
- package/src/lib/utils/hooks/useEmbeddedWallet/useMPCEmbeddedWallet/useMPCEmbeddedWallet.d.ts +1 -0
- package/src/lib/utils/hooks/useEmbeddedWallet/useMPCEmbeddedWallet/useMPCEmbeddedWallet.js +5 -1
- package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.cjs +4 -0
- package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.d.ts +2 -0
- package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/constants.js +3 -1
- package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.cjs +68 -28
- package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.d.ts +11 -6
- package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.js +70 -30
- package/src/lib/utils/hooks/useTokenBalances/index.d.ts +1 -0
- package/src/lib/utils/hooks/useTokenBalances/useTokenBalances.cjs +141 -0
- package/src/lib/utils/hooks/useTokenBalances/useTokenBalances.d.ts +12 -0
- package/src/lib/utils/hooks/useTokenBalances/useTokenBalances.js +137 -0
- package/src/lib/views/EmbeddedReveal/EmbeddedRevealView/EmbeddedRevealView.cjs +1 -1
- package/src/lib/views/EmbeddedReveal/EmbeddedRevealView/EmbeddedRevealView.js +1 -1
- package/src/lib/views/EmbeddedReveal/utils/turnkeyExport/turnkeyExport.cjs +5 -4
- package/src/lib/views/EmbeddedReveal/utils/turnkeyExport/turnkeyExport.js +5 -4
- package/src/lib/views/FarcasterQrCodeView/FarcasterQrCodeView.cjs +103 -0
- package/src/lib/views/FarcasterQrCodeView/FarcasterQrCodeView.d.ts +6 -0
- package/src/lib/views/FarcasterQrCodeView/FarcasterQrCodeView.js +99 -0
- package/src/lib/views/FarcasterQrCodeView/index.d.ts +1 -0
- package/src/lib/views/LoginView/LoginView.cjs +9 -1
- package/src/lib/views/LoginView/LoginView.js +9 -1
- package/src/lib/views/LoginView/utils/showFarcasterQrCodeView/index.d.ts +1 -0
- package/src/lib/views/LoginView/utils/showFarcasterQrCodeView/showFarcasterQrCodeView.cjs +14 -0
- package/src/lib/views/LoginView/utils/showFarcasterQrCodeView/showFarcasterQrCodeView.d.ts +2 -0
- 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 {
|
|
89
|
-
const { createEmbeddedWallet:
|
|
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
|
};
|
package/src/lib/utils/hooks/useEmbeddedWallet/useMPCEmbeddedWallet/useMPCEmbeddedWallet.d.ts
CHANGED
|
@@ -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
|
|
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((
|
|
163
|
-
var _h, _j, _k, _l, _m, _o
|
|
164
|
-
const jwt = (
|
|
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((
|
|
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((
|
|
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 = (
|
|
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
|
|
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((
|
|
221
|
-
var
|
|
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, (
|
|
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 = (
|
|
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(
|
|
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
|
|
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
|
|
279
|
-
const { jwt } = validateUserIsLoggedIn.validateUserIsLoggedIn((
|
|
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
|
|
299
|
-
const { jwt, decodedJwt } = validateUserIsLoggedIn.validateUserIsLoggedIn((
|
|
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, (
|
|
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((
|
|
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: (
|
|
22
|
-
oneTimeCode
|
|
23
|
-
}) => Promise<string>;
|
|
24
|
-
readonly createPasskey: (
|
|
25
|
-
oneTimeCode
|
|
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
|
};
|