@dynamic-labs-sdk/client 1.20.0 → 1.21.1
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/dist/{updateAuthFromVerifyResponse-DGrmo9MJ.native.esm.js → NativeModuleNotLinkedError-DsfdAti9.native.esm.js} +33 -4
- package/dist/NativeModuleNotLinkedError-DsfdAti9.native.esm.js.map +1 -0
- package/dist/client/createDynamicClient/assertClientProps/assertClientProps.d.ts +16 -0
- package/dist/client/createDynamicClient/assertClientProps/assertClientProps.d.ts.map +1 -0
- package/dist/client/createDynamicClient/assertClientProps/index.d.ts +2 -0
- package/dist/client/createDynamicClient/assertClientProps/index.d.ts.map +1 -0
- package/dist/client/createDynamicClient/createDynamicClient.d.ts.map +1 -1
- package/dist/client/types/DynamicClientConfig.d.ts +35 -0
- package/dist/client/types/DynamicClientConfig.d.ts.map +1 -1
- package/dist/consumeMfaTokenIfRequiredForAction-CblIF3QS.esm.js +12 -0
- package/dist/consumeMfaTokenIfRequiredForAction-CblIF3QS.esm.js.map +1 -0
- package/dist/consumeMfaTokenIfRequiredForAction-CrdEGCJs.cjs +17 -0
- package/dist/consumeMfaTokenIfRequiredForAction-CrdEGCJs.cjs.map +1 -0
- package/dist/core.cjs +9 -8
- package/dist/core.cjs.map +1 -1
- package/dist/core.esm.js +6 -5
- package/dist/core.esm.js.map +1 -1
- package/dist/core.native.esm.js +5 -5
- package/dist/errors/WaasLoadFailedError.d.ts +45 -0
- package/dist/errors/WaasLoadFailedError.d.ts.map +1 -0
- package/dist/exports/index.d.ts +1 -0
- package/dist/exports/index.d.ts.map +1 -1
- package/dist/exports/waas.d.ts +10 -0
- package/dist/exports/waas.d.ts.map +1 -1
- package/dist/{getNetworkProviderFromNetworkId-xmoBE1cZ.native.esm.js → getNetworkProviderFromNetworkId-CA5-rcb9.native.esm.js} +2 -3
- package/dist/{getNetworkProviderFromNetworkId-xmoBE1cZ.native.esm.js.map → getNetworkProviderFromNetworkId-CA5-rcb9.native.esm.js.map} +1 -1
- package/dist/{getNetworkProviderFromNetworkId-DaVOUpiF.cjs → getNetworkProviderFromNetworkId-DksFqRIB.cjs} +48 -13
- package/dist/getNetworkProviderFromNetworkId-DksFqRIB.cjs.map +1 -0
- package/dist/{getNetworkProviderFromNetworkId-BlBx4Zh2.esm.js → getNetworkProviderFromNetworkId-DlOQ94mF.esm.js} +48 -13
- package/dist/getNetworkProviderFromNetworkId-DlOQ94mF.esm.js.map +1 -0
- package/dist/{getSignedSessionId-BVc-sgeN.esm.js → getSignedSessionId-BHGXB2ZS.native.esm.js} +3 -3
- package/dist/{getSignedSessionId-DlmNVy-g.native.esm.js.map → getSignedSessionId-BHGXB2ZS.native.esm.js.map} +1 -1
- package/dist/{getSignedSessionId-3L_aMxVD.cjs → getSignedSessionId-BWTQMtk6.cjs} +2 -17
- package/dist/getSignedSessionId-BWTQMtk6.cjs.map +1 -0
- package/dist/{getSignedSessionId-DlmNVy-g.native.esm.js → getSignedSessionId-C4igTuKk.esm.js} +3 -12
- package/dist/getSignedSessionId-C4igTuKk.esm.js.map +1 -0
- package/dist/{getWalletProviderByKey-BilyW5Jr.cjs → getWalletProviderByKey--ChkWHSF.cjs} +2 -2
- package/dist/{getWalletProviderByKey-BilyW5Jr.cjs.map → getWalletProviderByKey--ChkWHSF.cjs.map} +1 -1
- package/dist/{getWalletProviderByKey-PIO1ygzj.esm.js → getWalletProviderByKey-CXC1EXpO.esm.js} +2 -2
- package/dist/{getWalletProviderByKey-PIO1ygzj.esm.js.map → getWalletProviderByKey-CXC1EXpO.esm.js.map} +1 -1
- package/dist/{getWalletProviderByKey-Ccx26JsF.native.esm.js → getWalletProviderByKey-CeY5t5tY.native.esm.js} +2 -2
- package/dist/{getWalletProviderByKey-Ccx26JsF.native.esm.js.map → getWalletProviderByKey-CeY5t5tY.native.esm.js.map} +1 -1
- package/dist/index.cjs +48 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +34 -7
- package/dist/index.esm.js.map +1 -1
- package/dist/index.native.esm.js +34 -7
- package/dist/index.native.esm.js.map +1 -1
- package/dist/{isDynamicWaasEnabled-C4oPJ0fw.native.esm.js → isDynamicWaasEnabled-CsNM4kzO.native.esm.js} +2 -2
- package/dist/{isDynamicWaasEnabled-C4oPJ0fw.native.esm.js.map → isDynamicWaasEnabled-CsNM4kzO.native.esm.js.map} +1 -1
- package/dist/{isDynamicWaasEnabled-JpnXC0f7.esm.js → isDynamicWaasEnabled-DwY38pjA.esm.js} +2 -2
- package/dist/{isDynamicWaasEnabled-JpnXC0f7.esm.js.map → isDynamicWaasEnabled-DwY38pjA.esm.js.map} +1 -1
- package/dist/{isDynamicWaasEnabled-DXVcXa66.cjs → isDynamicWaasEnabled-v7x1B-0g.cjs} +2 -2
- package/dist/{isDynamicWaasEnabled-DXVcXa66.cjs.map → isDynamicWaasEnabled-v7x1B-0g.cjs.map} +1 -1
- package/dist/{isMfaRequiredForAction-D6rt_Tzn.native.esm.js → isMfaRequiredForAction-C-wDmRZj.native.esm.js} +3 -32
- package/dist/isMfaRequiredForAction-C-wDmRZj.native.esm.js.map +1 -0
- package/dist/isMfaRequiredForAction-C_a46AcW.esm.js +77 -0
- package/dist/isMfaRequiredForAction-C_a46AcW.esm.js.map +1 -0
- package/dist/isMfaRequiredForAction-m43LQlLi.cjs +94 -0
- package/dist/isMfaRequiredForAction-m43LQlLi.cjs.map +1 -0
- package/dist/{isUserOnboardingComplete-diGA1wlX.esm.js → isUserOnboardingComplete-CUZO4avc.esm.js} +44 -4
- package/dist/isUserOnboardingComplete-CUZO4avc.esm.js.map +1 -0
- package/dist/{isUserOnboardingComplete-DnExOJu7.native.esm.js → isUserOnboardingComplete-CzyupoSE.native.esm.js} +44 -4
- package/dist/{isUserOnboardingComplete-CsoV3ae7.cjs.map → isUserOnboardingComplete-CzyupoSE.native.esm.js.map} +1 -1
- package/dist/{isUserOnboardingComplete-CsoV3ae7.cjs → isUserOnboardingComplete-D_O53a98.cjs} +49 -3
- package/dist/isUserOnboardingComplete-D_O53a98.cjs.map +1 -0
- package/dist/{migrateFromFireblocks-BrWXstt8.cjs → migrateFromFireblocks-BbRj_YOv.cjs} +54 -3
- package/dist/migrateFromFireblocks-BbRj_YOv.cjs.map +1 -0
- package/dist/{migrateFromFireblocks-CqL5l58Q.native.esm.js → migrateFromFireblocks-Vic3tb61.esm.js} +43 -4
- package/dist/migrateFromFireblocks-Vic3tb61.esm.js.map +1 -0
- package/dist/migrateFromFireblocks-hfh_j7wm.native.esm.js +321 -0
- package/dist/migrateFromFireblocks-hfh_j7wm.native.esm.js.map +1 -0
- package/dist/modules/waas/businessAccounts/addBusinessAccountMember/addBusinessAccountMember.d.ts +25 -0
- package/dist/modules/waas/businessAccounts/addBusinessAccountMember/addBusinessAccountMember.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/addBusinessAccountMember/index.d.ts +2 -0
- package/dist/modules/waas/businessAccounts/addBusinessAccountMember/index.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/addBusinessAccountSigner/addBusinessAccountSigner.d.ts +35 -0
- package/dist/modules/waas/businessAccounts/addBusinessAccountSigner/addBusinessAccountSigner.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/addBusinessAccountSigner/index.d.ts +2 -0
- package/dist/modules/waas/businessAccounts/addBusinessAccountSigner/index.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/addWalletToBusinessAccount/addWalletToBusinessAccount.d.ts +19 -0
- package/dist/modules/waas/businessAccounts/addWalletToBusinessAccount/addWalletToBusinessAccount.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/addWalletToBusinessAccount/index.d.ts +2 -0
- package/dist/modules/waas/businessAccounts/addWalletToBusinessAccount/index.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/businessAccounts.types.d.ts +184 -0
- package/dist/modules/waas/businessAccounts/businessAccounts.types.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/createBusinessAccount/createBusinessAccount.d.ts +16 -0
- package/dist/modules/waas/businessAccounts/createBusinessAccount/createBusinessAccount.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/createBusinessAccount/index.d.ts +2 -0
- package/dist/modules/waas/businessAccounts/createBusinessAccount/index.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/createWalletForBusinessAccount/createWalletForBusinessAccount.d.ts +36 -0
- package/dist/modules/waas/businessAccounts/createWalletForBusinessAccount/createWalletForBusinessAccount.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/createWalletForBusinessAccount/index.d.ts +2 -0
- package/dist/modules/waas/businessAccounts/createWalletForBusinessAccount/index.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/getBusinessAccount/getBusinessAccount.d.ts +15 -0
- package/dist/modules/waas/businessAccounts/getBusinessAccount/getBusinessAccount.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/getBusinessAccount/index.d.ts +2 -0
- package/dist/modules/waas/businessAccounts/getBusinessAccount/index.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/getBusinessAccountsClient/getBusinessAccountsClient.d.ts +12 -0
- package/dist/modules/waas/businessAccounts/getBusinessAccountsClient/getBusinessAccountsClient.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/getBusinessAccountsClient/index.d.ts +2 -0
- package/dist/modules/waas/businessAccounts/getBusinessAccountsClient/index.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/listBusinessAccounts/index.d.ts +2 -0
- package/dist/modules/waas/businessAccounts/listBusinessAccounts/index.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/listBusinessAccounts/listBusinessAccounts.d.ts +10 -0
- package/dist/modules/waas/businessAccounts/listBusinessAccounts/listBusinessAccounts.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/removeBusinessAccountMember/index.d.ts +2 -0
- package/dist/modules/waas/businessAccounts/removeBusinessAccountMember/index.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/removeBusinessAccountMember/removeBusinessAccountMember.d.ts +33 -0
- package/dist/modules/waas/businessAccounts/removeBusinessAccountMember/removeBusinessAccountMember.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/removeBusinessAccountSigner/index.d.ts +2 -0
- package/dist/modules/waas/businessAccounts/removeBusinessAccountSigner/index.d.ts.map +1 -0
- package/dist/modules/waas/businessAccounts/removeBusinessAccountSigner/removeBusinessAccountSigner.d.ts +37 -0
- package/dist/modules/waas/businessAccounts/removeBusinessAccountSigner/removeBusinessAccountSigner.d.ts.map +1 -0
- package/dist/modules/waas/createWaasClient/createWaasClient.d.ts.map +1 -1
- package/dist/modules/waas/createWaasProvider/createWaasProvider.d.ts.map +1 -1
- package/dist/modules/waas/createWaasProvider/isWaasLoadExhaustionError.d.ts +11 -0
- package/dist/modules/waas/createWaasProvider/isWaasLoadExhaustionError.d.ts.map +1 -0
- package/dist/modules/waas/waas.types.d.ts +11 -0
- package/dist/modules/waas/waas.types.d.ts.map +1 -1
- package/dist/services/keychain/createKeychainService/utils/openDatabase.d.ts +9 -1
- package/dist/services/keychain/createKeychainService/utils/openDatabase.d.ts.map +1 -1
- package/dist/services/keychain/createKeychainService/utils/withDatabase/withDatabase.d.ts +2 -1
- package/dist/services/keychain/createKeychainService/utils/withDatabase/withDatabase.d.ts.map +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/{updateAuthFromVerifyResponse-CVDQVEQM.esm.js → updateAuthFromVerifyResponse-BEoc7f0m.esm.js} +262 -4
- package/dist/updateAuthFromVerifyResponse-BEoc7f0m.esm.js.map +1 -0
- package/dist/{updateAuthFromVerifyResponse-B0K1VJ8b.cjs → updateAuthFromVerifyResponse-Dg8THxkT.cjs} +289 -19
- package/dist/updateAuthFromVerifyResponse-Dg8THxkT.cjs.map +1 -0
- package/dist/utils/createTranslateRejection/createTranslateRejection.d.ts +29 -0
- package/dist/utils/createTranslateRejection/createTranslateRejection.d.ts.map +1 -0
- package/dist/utils/createTranslateRejection/index.d.ts +3 -0
- package/dist/utils/createTranslateRejection/index.d.ts.map +1 -0
- package/dist/waas.cjs +281 -17
- package/dist/waas.cjs.map +1 -1
- package/dist/waas.esm.js +273 -18
- package/dist/waas.esm.js.map +1 -1
- package/dist/waas.native.esm.js +272 -18
- package/dist/waas.native.esm.js.map +1 -1
- package/dist/waasCore.cjs +291 -170
- package/dist/waasCore.cjs.map +1 -1
- package/dist/waasCore.esm.js +285 -164
- package/dist/waasCore.esm.js.map +1 -1
- package/dist/waasCore.native.esm.js +273 -371
- package/dist/waasCore.native.esm.js.map +1 -1
- package/ios/DynamicClientScreenshotProtection.mm +70 -32
- package/package.json +4 -4
- package/dist/getNetworkProviderFromNetworkId-BlBx4Zh2.esm.js.map +0 -1
- package/dist/getNetworkProviderFromNetworkId-DaVOUpiF.cjs.map +0 -1
- package/dist/getSignedSessionId-3L_aMxVD.cjs.map +0 -1
- package/dist/getSignedSessionId-BVc-sgeN.esm.js.map +0 -1
- package/dist/isMfaRequiredForAction-20E6GsSc.esm.js +0 -336
- package/dist/isMfaRequiredForAction-20E6GsSc.esm.js.map +0 -1
- package/dist/isMfaRequiredForAction-9bYtZcve.cjs +0 -384
- package/dist/isMfaRequiredForAction-9bYtZcve.cjs.map +0 -1
- package/dist/isMfaRequiredForAction-D6rt_Tzn.native.esm.js.map +0 -1
- package/dist/isUserOnboardingComplete-DnExOJu7.native.esm.js.map +0 -1
- package/dist/isUserOnboardingComplete-diGA1wlX.esm.js.map +0 -1
- package/dist/migrateFromFireblocks--G-432sl.esm.js +0 -65
- package/dist/migrateFromFireblocks--G-432sl.esm.js.map +0 -1
- package/dist/migrateFromFireblocks-BrWXstt8.cjs.map +0 -1
- package/dist/migrateFromFireblocks-CqL5l58Q.native.esm.js.map +0 -1
- package/dist/updateAuthFromVerifyResponse-B0K1VJ8b.cjs.map +0 -1
- package/dist/updateAuthFromVerifyResponse-CVDQVEQM.esm.js.map +0 -1
- package/dist/updateAuthFromVerifyResponse-DGrmo9MJ.native.esm.js.map +0 -1
package/dist/{isUserOnboardingComplete-CsoV3ae7.cjs → isUserOnboardingComplete-D_O53a98.cjs}
RENAMED
|
@@ -1,8 +1,48 @@
|
|
|
1
|
-
const require_updateAuthFromVerifyResponse = require('./updateAuthFromVerifyResponse-
|
|
2
|
-
const require_isDynamicWaasEnabled = require('./isDynamicWaasEnabled-
|
|
1
|
+
const require_updateAuthFromVerifyResponse = require('./updateAuthFromVerifyResponse-Dg8THxkT.cjs');
|
|
2
|
+
const require_isDynamicWaasEnabled = require('./isDynamicWaasEnabled-v7x1B-0g.cjs');
|
|
3
3
|
let _dynamic_labs_sdk_api_core = require("@dynamic-labs/sdk-api-core");
|
|
4
4
|
let _dynamic_labs_wallet_browser_wallet_client = require("@dynamic-labs-wallet/browser-wallet-client");
|
|
5
5
|
|
|
6
|
+
//#region src/errors/WaasLoadFailedError.ts
|
|
7
|
+
/**
|
|
8
|
+
* Thrown when the embedded (WaaS) wallet's secure container failed to load
|
|
9
|
+
* after exhausting all of its internal retry attempts.
|
|
10
|
+
*
|
|
11
|
+
* This failure is transient: the next wallet operation triggers a fresh load
|
|
12
|
+
* cycle, so hosts can catch this error and re-attempt the operation at their
|
|
13
|
+
* own cadence (for example, when connectivity returns or the app is
|
|
14
|
+
* foregrounded). Other load failures (for example, a CSP block) are not
|
|
15
|
+
* wrapped by this error and their shape is not guaranteed.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* try {
|
|
20
|
+
* await signMessage({ message, walletAccount });
|
|
21
|
+
* } catch (error) {
|
|
22
|
+
* if (error instanceof WaasLoadFailedError) {
|
|
23
|
+
* // transient — retry the operation at your own cadence
|
|
24
|
+
* await signMessage({ message, walletAccount });
|
|
25
|
+
* }
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
* @see WaasLoadFailedErrorReason
|
|
29
|
+
* @see signMessage
|
|
30
|
+
*/
|
|
31
|
+
var WaasLoadFailedError = class extends require_updateAuthFromVerifyResponse.BaseError {
|
|
32
|
+
reason;
|
|
33
|
+
constructor({ cause }) {
|
|
34
|
+
super({
|
|
35
|
+
cause,
|
|
36
|
+
code: "waas_load_failed",
|
|
37
|
+
docsUrl: null,
|
|
38
|
+
name: "WaasLoadFailedError",
|
|
39
|
+
shortMessage: "The embedded wallet failed to load after exhausting its retry attempts. Retrying the wallet operation triggers a fresh load."
|
|
40
|
+
});
|
|
41
|
+
this.reason = "load_attempts_exhausted";
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
//#endregion
|
|
6
46
|
//#region src/errors/WaasOnboardingIncompleteError.ts
|
|
7
47
|
/**
|
|
8
48
|
* Thrown when the embedded (WaaS) wallet client is requested before the user
|
|
@@ -127,6 +167,12 @@ const isUserOnboardingComplete = (client = require_updateAuthFromVerifyResponse.
|
|
|
127
167
|
};
|
|
128
168
|
|
|
129
169
|
//#endregion
|
|
170
|
+
Object.defineProperty(exports, 'WaasLoadFailedError', {
|
|
171
|
+
enumerable: true,
|
|
172
|
+
get: function () {
|
|
173
|
+
return WaasLoadFailedError;
|
|
174
|
+
}
|
|
175
|
+
});
|
|
130
176
|
Object.defineProperty(exports, 'WaasOnboardingIncompleteError', {
|
|
131
177
|
enumerable: true,
|
|
132
178
|
get: function () {
|
|
@@ -157,4 +203,4 @@ Object.defineProperty(exports, 'preconnectWaasIframe', {
|
|
|
157
203
|
return preconnectWaasIframe;
|
|
158
204
|
}
|
|
159
205
|
});
|
|
160
|
-
//# sourceMappingURL=isUserOnboardingComplete-
|
|
206
|
+
//# sourceMappingURL=isUserOnboardingComplete-D_O53a98.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isUserOnboardingComplete-D_O53a98.cjs","names":["BaseError","BaseError","getCore","isDynamicWaasEnabled","isCookieEnabled","DEFAULT_WAAS_BASE_API_URL","getDefaultClient","MfaBackupCodeAcknowledgement","getDefaultClient","isUserMissingMfaAuth"],"sources":["../src/errors/WaasLoadFailedError.ts","../src/errors/WaasOnboardingIncompleteError.ts","../src/modules/waas/preconnectWaasIframe/preconnectWaasIframe.ts","../src/modules/deviceRegistration/isDeviceRegistrationRequired/isDeviceRegistrationRequired.ts","../src/modules/mfa/isPendingRecoveryCodesAcknowledgment/isPendingRecoveryCodesAcknowledgment.ts","../src/modules/user/isUserOnboardingComplete/isUserOnboardingComplete.ts"],"sourcesContent":["import { BaseError } from './base';\n\n/**\n * Why the embedded wallet load failed. Currently only retry exhaustion is\n * reported; the union exists so new reasons can be added without a breaking\n * change to consumer `instanceof` handling.\n *\n * @example\n * ```ts\n * const reason: WaasLoadFailedErrorReason = 'load_attempts_exhausted';\n * ```\n * @see WaasLoadFailedError\n * @see signMessage\n */\nexport type WaasLoadFailedErrorReason = 'load_attempts_exhausted';\n\n/**\n * Thrown when the embedded (WaaS) wallet's secure container failed to load\n * after exhausting all of its internal retry attempts.\n *\n * This failure is transient: the next wallet operation triggers a fresh load\n * cycle, so hosts can catch this error and re-attempt the operation at their\n * own cadence (for example, when connectivity returns or the app is\n * foregrounded). Other load failures (for example, a CSP block) are not\n * wrapped by this error and their shape is not guaranteed.\n *\n * @example\n * ```ts\n * try {\n * await signMessage({ message, walletAccount });\n * } catch (error) {\n * if (error instanceof WaasLoadFailedError) {\n * // transient — retry the operation at your own cadence\n * await signMessage({ message, walletAccount });\n * }\n * }\n * ```\n * @see WaasLoadFailedErrorReason\n * @see signMessage\n */\nexport class WaasLoadFailedError extends BaseError {\n readonly reason: WaasLoadFailedErrorReason;\n\n constructor({ cause }: { cause: Error }) {\n super({\n cause,\n code: 'waas_load_failed',\n docsUrl: null,\n name: 'WaasLoadFailedError',\n shortMessage:\n 'The embedded wallet failed to load after exhausting its retry attempts. Retrying the wallet operation triggers a fresh load.',\n });\n this.reason = 'load_attempts_exhausted';\n }\n}\n","import { BaseError } from './base';\n\n/**\n * Thrown when the embedded (WaaS) wallet client is requested before the user\n * has completed onboarding — i.e. the JWT has not upgraded to `user:basic`\n * because MFA, KYC, recovery-codes acknowledgment, or device registration is\n * still pending.\n *\n * The WaaS iframe's init-time room-cache pre-warm fires `createRooms` using the\n * token captured at client construction (before any per-operation token\n * resync). Building the client during this window lets that pre-warm fire with\n * a pre-`user:basic` token, get a 401, and the iframe's unauthorized handler\n * force-logs-out the user. Throwing here surfaces a clear, recoverable reason\n * instead — wait for onboarding to complete and retry.\n */\nexport class WaasOnboardingIncompleteError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'waas_onboarding_incomplete',\n docsUrl: null,\n name: 'WaasOnboardingIncompleteError',\n shortMessage:\n 'Cannot create or access the embedded wallet until onboarding is complete (pending MFA, KYC, recovery-codes acknowledgment, or device registration).',\n });\n }\n}\n","import type { AuthMode } from '@dynamic-labs-wallet/browser-wallet-client';\nimport { preconnectWaasIframe as preconnectWaasIframeOrigin } from '@dynamic-labs-wallet/browser-wallet-client';\n\nimport { getCore } from '../../../client/core/getCore';\nimport type { DynamicClient } from '../../../client/types';\nimport { isCookieEnabled } from '../../projectSettings/isCookieEnabled';\nimport { DEFAULT_WAAS_BASE_API_URL } from '../constants';\nimport { isDynamicWaasEnabled } from '../isDynamicWaasEnabled';\n\n/**\n * Warms the browser's connection (DNS + TCP + TLS) to the embedded-wallet\n * iframe origin so the iframe mounted after authentication completes loads on\n * a hot connection. Called when an auth flow starts (OTP send/verify, social\n * callback). Safe to call repeatedly; no-op on React Native / SSR and when\n * Dynamic WaaS is not enabled.\n *\n * @param client - The Dynamic client instance.\n * @notInstrumented\n */\nexport const preconnectWaasIframe = (client: DynamicClient): void => {\n const core = getCore(client);\n try {\n if (!isDynamicWaasEnabled(client)) return;\n\n preconnectWaasIframeOrigin({\n authMode: (isCookieEnabled(client) ? 'cookie' : 'header') as AuthMode,\n baseApiUrl: (core.apiBaseUrl || DEFAULT_WAAS_BASE_API_URL).replace(\n '/api/v0',\n ''\n ),\n });\n } catch (error) {\n // Best-effort: never break the auth flow (also swallows the assertion\n // from isDynamicWaasEnabled when project settings are not loaded yet).\n core.logger.warn('[preconnectWaasIframe] skipped', error);\n }\n};\n","import type { User } from '../../user/user.types';\n\n/**\n * Checks if device registration is required for the given user.\n *\n * This function determines if the user has the deviceRegistration\n * scope, indicating that device registration is required.\n *\n * @param user - The user to check.\n * @returns True if device registration is required, false otherwise.\n * @notInstrumented\n * @hook Exposed as a hook so consumers reactively know when this device must be registered, updated when the user changes.\n */\nexport const isDeviceRegistrationRequired = (user: User) =>\n Boolean(user.scope?.includes('device:register'));\n","import { MfaBackupCodeAcknowledgement } from '@dynamic-labs/sdk-api-core';\n\nimport { getDefaultClient } from '../../../client/defaultClient';\nimport { assertDefined } from '../../../utils/assertDefined';\n\n/**\n * Checks if the user is still pending acknowledgment of their MFA recovery codes.\n *\n * This function determines whether the user has been presented with recovery\n * codes that they have not yet acknowledged as saved or backed up.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns True if recovery codes are pending acknowledgment, false otherwise.\n * @notInstrumented\n * @hook Exposed as a hook so consumers reactively know when recovery codes await acknowledgment, updated when the user changes.\n */\nexport const isPendingRecoveryCodesAcknowledgment = (\n client = getDefaultClient()\n) => {\n const user = client.user;\n\n assertDefined(user, 'User not logged in');\n\n return (\n user.mfaBackupCodeAcknowledgement === MfaBackupCodeAcknowledgement.Pending\n );\n};\n","import { getDefaultClient } from '../../../client/defaultClient';\nimport { assertDefined } from '../../../utils/assertDefined';\nimport { isDeviceRegistrationRequired } from '../../deviceRegistration/isDeviceRegistrationRequired';\nimport { isPendingRecoveryCodesAcknowledgment } from '../../mfa/isPendingRecoveryCodesAcknowledgment';\nimport { isUserMissingMfaAuth } from '../../mfa/isUserMissingMfaAuth';\n\n/**\n * Checks if the user has completed all onboarding requirements.\n *\n * This function verifies whether a user has fulfilled all necessary requirements\n * including KYC fields (Know Your Customer information), MFA setup\n * (Multi-Factor Authentication including recovery codes acknowledgment), and\n * device registration.\n *\n * A `false` result means the user still has an outstanding onboarding step, so\n * any feature that requires a fully onboarded (`user:basic`) user should hold\n * off until it returns `true`. Creating or accessing an embedded (WaaS) wallet\n * is one such feature — its backend calls reject a pre-`user:basic` token — but\n * this predicate is general and not specific to embedded wallets.\n *\n * @deprecated Use {@link checkUserScopes} instead. This function conflates\n * Dynamic-controlled requirements (MFA, device registration, required fields)\n * with the concept of \"onboarding complete\", which is app-specific. Replace\n * with `checkUserScopes({ user, scopes: ['user:basic'] })` to check whether\n * Dynamic's requirements are satisfied, and compose your own logic on top for\n * any app-specific onboarding steps.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns True if onboarding is complete (no pending requirements), false if there are pending requirements.\n * @notInstrumented\n * @hook Exposed as a hook so consumers reactively know when onboarding is complete, updated when the user changes.\n */\nexport const isUserOnboardingComplete = (client = getDefaultClient()) => {\n const user = client.user;\n\n assertDefined(user, 'User not logged in');\n\n const hasMissingKycFields = Boolean(user.missingFields?.length);\n const hasPendingMfaAuth = isUserMissingMfaAuth(client);\n const hasPendingRecoveryCodes = isPendingRecoveryCodesAcknowledgment(client);\n const hasPendingDeviceRegistration = isDeviceRegistrationRequired(user);\n\n const userOnboardingComplete =\n !hasMissingKycFields &&\n !hasPendingMfaAuth &&\n !hasPendingRecoveryCodes &&\n !hasPendingDeviceRegistration;\n\n return userOnboardingComplete;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,IAAa,sBAAb,cAAyCA,+CAAU;CACjD,AAAS;CAET,YAAY,EAAE,SAA2B;AACvC,QAAM;GACJ;GACA,MAAM;GACN,SAAS;GACT,MAAM;GACN,cACE;GACH,CAAC;AACF,OAAK,SAAS;;;;;;;;;;;;;;;;;;;ACrClB,IAAa,gCAAb,cAAmDC,+CAAU;CAC3D,cAAc;AACZ,QAAM;GACJ,OAAO;GACP,MAAM;GACN,SAAS;GACT,MAAM;GACN,cACE;GACH,CAAC;;;;;;;;;;;;;;;;ACLN,MAAa,wBAAwB,WAAgC;CACnE,MAAM,OAAOC,6CAAQ,OAAO;AAC5B,KAAI;AACF,MAAI,CAACC,kDAAqB,OAAO,CAAE;AAEnC,uEAA2B;GACzB,UAAWC,qDAAgB,OAAO,GAAG,WAAW;GAChD,aAAa,KAAK,cAAcC,gEAA2B,QACzD,WACA,GACD;GACF,CAAC;UACK,OAAO;AAGd,OAAK,OAAO,KAAK,kCAAkC,MAAM;;;;;;;;;;;;;;;;;ACrB7D,MAAa,gCAAgC,SAC3C,QAAQ,KAAK,OAAO,SAAS,kBAAkB,CAAC;;;;;;;;;;;;;;;ACElD,MAAa,wCACX,SAASC,uDAAkB,KACxB;CACH,MAAM,OAAO,OAAO;AAEpB,oDAAc,MAAM,qBAAqB;AAEzC,QACE,KAAK,iCAAiCC,wDAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACQvE,MAAa,4BAA4B,SAASC,uDAAkB,KAAK;CACvE,MAAM,OAAO,OAAO;AAEpB,oDAAc,MAAM,qBAAqB;CAEzC,MAAM,sBAAsB,QAAQ,KAAK,eAAe,OAAO;CAC/D,MAAM,oBAAoBC,0DAAqB,OAAO;CACtD,MAAM,0BAA0B,qCAAqC,OAAO;CAC5E,MAAM,+BAA+B,6BAA6B,KAAK;AAQvE,QALE,CAAC,uBACD,CAAC,qBACD,CAAC,2BACD,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
const require_updateAuthFromVerifyResponse = require('./updateAuthFromVerifyResponse-
|
|
2
|
-
const require_isDynamicWaasEnabled = require('./isDynamicWaasEnabled-
|
|
1
|
+
const require_updateAuthFromVerifyResponse = require('./updateAuthFromVerifyResponse-Dg8THxkT.cjs');
|
|
2
|
+
const require_isDynamicWaasEnabled = require('./isDynamicWaasEnabled-v7x1B-0g.cjs');
|
|
3
|
+
const require_getSignedSessionId = require('./getSignedSessionId-BWTQMtk6.cjs');
|
|
4
|
+
let _dynamic_labs_wallet_browser_wallet_client = require("@dynamic-labs-wallet/browser-wallet-client");
|
|
3
5
|
|
|
4
6
|
//#region src/errors/NotWaasWalletProviderError.ts
|
|
5
7
|
var NotWaasWalletProviderError = class extends require_updateAuthFromVerifyResponse.BaseError {
|
|
@@ -14,6 +16,43 @@ var NotWaasWalletProviderError = class extends require_updateAuthFromVerifyRespo
|
|
|
14
16
|
}
|
|
15
17
|
};
|
|
16
18
|
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/modules/waas/createWaasClient/createWaasClient.ts
|
|
21
|
+
/** @notInstrumented */
|
|
22
|
+
const createWaasClient = ({ chainName }, client) => {
|
|
23
|
+
const core = require_updateAuthFromVerifyResponse.getCore(client);
|
|
24
|
+
const additionalTrustedOrigins = core.waas?.additionalTrustedOrigins;
|
|
25
|
+
const baseClientKeysharesRelayApiUrl = client.projectSettings?.sdk.waas?.customKeyshareRelayBaseUrl;
|
|
26
|
+
return new _dynamic_labs_wallet_browser_wallet_client.DynamicWalletClient({
|
|
27
|
+
authMode: require_updateAuthFromVerifyResponse.isCookieEnabled(client) ? "cookie" : "header",
|
|
28
|
+
authToken: client.token || "",
|
|
29
|
+
baseApiUrl: (core.apiBaseUrl || require_updateAuthFromVerifyResponse.DEFAULT_WAAS_BASE_API_URL).replace("/api/v0", ""),
|
|
30
|
+
baseMPCRelayApiUrl: client.projectSettings?.sdk.waas?.relayUrl || require_updateAuthFromVerifyResponse.DEFAULT_WAAS_BASE_MPC_RELAY_API_URL,
|
|
31
|
+
chainName,
|
|
32
|
+
eagerlyRecoverKeyShares: true,
|
|
33
|
+
environmentId: core.environmentId,
|
|
34
|
+
sdkVersion: `${require_updateAuthFromVerifyResponse.CLIENT_SDK_NAME}/${core.version}`,
|
|
35
|
+
...additionalTrustedOrigins == void 0 ? {} : { additionalTrustedOrigins },
|
|
36
|
+
...baseClientKeysharesRelayApiUrl == void 0 ? {} : { baseClientKeysharesRelayApiUrl },
|
|
37
|
+
...core.waas?.loadTimeoutMs == void 0 ? {} : { iframeLoadTimeout: core.waas.loadTimeoutMs },
|
|
38
|
+
...core.waas?.maxLoadRetries == void 0 ? {} : { maxRetryAttempts: core.waas.maxLoadRetries }
|
|
39
|
+
}, {
|
|
40
|
+
getSignedSessionId: () => require_getSignedSessionId.getSignedSessionId(client).then(({ signature }) => signature),
|
|
41
|
+
onUnauthorized: () => {
|
|
42
|
+
require_updateAuthFromVerifyResponse.__logoutWithReason_wrapped({ reason: "session-refresh-unauthorized" }, client).catch((error) => {
|
|
43
|
+
core.logger.error("Failed to log out after WaaS unauthorized response", error);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/modules/waas/getWaasChainNameFromChain/getWaasChainNameFromChain.ts
|
|
51
|
+
/** @notInstrumented */
|
|
52
|
+
const getWaasChainNameFromChain = (chain) => {
|
|
53
|
+
return require_updateAuthFromVerifyResponse.CHAINS_INFO_MAP[chain].waasChainNameOverride || chain;
|
|
54
|
+
};
|
|
55
|
+
|
|
17
56
|
//#endregion
|
|
18
57
|
//#region src/modules/waas/getWaasWalletProviderFromWalletAccount/getWaasWalletProviderFromWalletAccount.ts
|
|
19
58
|
/** @notInstrumented */
|
|
@@ -67,6 +106,18 @@ Object.defineProperty(exports, 'NotWaasWalletProviderError', {
|
|
|
67
106
|
return NotWaasWalletProviderError;
|
|
68
107
|
}
|
|
69
108
|
});
|
|
109
|
+
Object.defineProperty(exports, 'createWaasClient', {
|
|
110
|
+
enumerable: true,
|
|
111
|
+
get: function () {
|
|
112
|
+
return createWaasClient;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
Object.defineProperty(exports, 'getWaasChainNameFromChain', {
|
|
116
|
+
enumerable: true,
|
|
117
|
+
get: function () {
|
|
118
|
+
return getWaasChainNameFromChain;
|
|
119
|
+
}
|
|
120
|
+
});
|
|
70
121
|
Object.defineProperty(exports, 'getWaasWalletProviderFromWalletAccount', {
|
|
71
122
|
enumerable: true,
|
|
72
123
|
get: function () {
|
|
@@ -79,4 +130,4 @@ Object.defineProperty(exports, 'migrateFromFireblocks', {
|
|
|
79
130
|
return migrateFromFireblocks;
|
|
80
131
|
}
|
|
81
132
|
});
|
|
82
|
-
//# sourceMappingURL=migrateFromFireblocks-
|
|
133
|
+
//# sourceMappingURL=migrateFromFireblocks-BbRj_YOv.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrateFromFireblocks-BbRj_YOv.cjs","names":["BaseError","createWaasClient: CreateWaasClient","getCore","DynamicWalletClient","isCookieEnabled","DEFAULT_WAAS_BASE_API_URL","DEFAULT_WAAS_BASE_MPC_RELAY_API_URL","CLIENT_SDK_NAME","getSignedSessionId","logoutWithReason","CHAINS_INFO_MAP","getWalletProviderFromWalletAccount","isWaasWalletProvider","NotWaasWalletAccountError","getDefaultClient","getWalletProviders","NoWalletProviderFoundError","DYNAMIC_WAAS_METADATA","isWaasWalletProvider","refreshAuth"],"sources":["../src/errors/NotWaasWalletProviderError.ts","../src/modules/waas/createWaasClient/createWaasClient.ts","../src/modules/waas/getWaasChainNameFromChain/getWaasChainNameFromChain.ts","../src/modules/waas/getWaasWalletProviderFromWalletAccount/getWaasWalletProviderFromWalletAccount.ts","../src/modules/waas/migrateFromFireblocks/migrateFromFireblocks.ts"],"sourcesContent":["import { BaseError } from './base';\n\ntype NotWaasWalletProviderErrorParams = {\n walletProviderKey: string;\n};\n\nexport class NotWaasWalletProviderError extends BaseError {\n constructor({ walletProviderKey }: NotWaasWalletProviderErrorParams) {\n super({\n cause: null,\n code: 'not_waas_wallet_provider_error',\n docsUrl: null,\n name: 'NotWaasWalletProviderError',\n shortMessage: `Wallet provider ${walletProviderKey} is not a Dynamic WaaS wallet provider`,\n });\n }\n}\n","import type { AuthMode } from '@dynamic-labs-wallet/browser-wallet-client';\nimport { DynamicWalletClient } from '@dynamic-labs-wallet/browser-wallet-client';\n\nimport { getCore } from '../../../client/core/getCore';\nimport { CLIENT_SDK_NAME } from '../../apiClient/constants';\nimport { logoutWithReason } from '../../auth/logoutWithReason';\nimport { isCookieEnabled } from '../../projectSettings/isCookieEnabled';\nimport { getSignedSessionId } from '../../sessionKeys/getSignedSessionId';\nimport type { CreateWaasClient } from './createWaasClient.types';\nimport {\n DEFAULT_WAAS_BASE_API_URL,\n DEFAULT_WAAS_BASE_MPC_RELAY_API_URL,\n} from '../constants';\n\n/** @notInstrumented */\nexport const createWaasClient: CreateWaasClient = ({ chainName }, client) => {\n const core = getCore(client);\n\n const additionalTrustedOrigins = core.waas?.additionalTrustedOrigins;\n\n const baseClientKeysharesRelayApiUrl =\n client.projectSettings?.sdk.waas?.customKeyshareRelayBaseUrl;\n\n return new DynamicWalletClient(\n {\n authMode: (isCookieEnabled(client) ? 'cookie' : 'header') as AuthMode,\n authToken: client.token || '',\n baseApiUrl: (core.apiBaseUrl || DEFAULT_WAAS_BASE_API_URL).replace(\n '/api/v0',\n ''\n ),\n baseMPCRelayApiUrl:\n client.projectSettings?.sdk.waas?.relayUrl ||\n DEFAULT_WAAS_BASE_MPC_RELAY_API_URL,\n chainName,\n // Opt into the SDK self-driving eager key-share recovery on auth-token\n // arrival, so the client no longer restores shares itself on login.\n eagerlyRecoverKeyShares: true,\n environmentId: core.environmentId,\n sdkVersion: `${CLIENT_SDK_NAME}/${core.version}`,\n ...(additionalTrustedOrigins == undefined\n ? {}\n : { additionalTrustedOrigins }),\n ...(baseClientKeysharesRelayApiUrl == undefined\n ? {}\n : { baseClientKeysharesRelayApiUrl }),\n ...(core.waas?.loadTimeoutMs == undefined\n ? {}\n : { iframeLoadTimeout: core.waas.loadTimeoutMs }),\n ...(core.waas?.maxLoadRetries == undefined\n ? {}\n : { maxRetryAttempts: core.waas.maxLoadRetries }),\n },\n {\n // Lets the iframe mint a fresh signed session id over the reverse channel,\n // which the SDK's eager key-share recovery needs.\n getSignedSessionId: () =>\n getSignedSessionId(client).then(({ signature }) => signature),\n // When the WaaS iframe's own backend call returns 401 (e.g. a forcibly\n // revoked token), the iframe notifies the host via the reverse channel\n // and this fires — log the user out. Mirrors the session-expiry\n // middleware that covers the SDK's own direct API 401s.\n onUnauthorized: () => {\n void logoutWithReason(\n { reason: 'session-refresh-unauthorized' },\n client\n ).catch((error) => {\n core.logger.error(\n 'Failed to log out after WaaS unauthorized response',\n error\n );\n });\n },\n }\n );\n};\n","import type { Chain } from '../../chain';\nimport { CHAINS_INFO_MAP } from '../../wallets/constants';\n\n/** @notInstrumented */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const getWaasChainNameFromChain = (chain: Chain): string => {\n return CHAINS_INFO_MAP[chain].waasChainNameOverride || chain;\n};\n","import type { DynamicClient } from '../../../client/types/DynamicClient';\nimport { NotWaasWalletAccountError } from '../../../errors/NotWaasWalletAccountError';\nimport { getWalletProviderFromWalletAccount } from '../../wallets/utils/getWalletProviderFromWalletAccount';\nimport type { WalletAccount } from '../../wallets/walletAccount';\nimport { isWaasWalletProvider } from '../isWaasWalletProvider';\nimport type { WaasWalletProvider } from '../waas.types';\n\ntype GetWalletProviderFromWalletAccountParams = {\n walletAccount: WalletAccount;\n};\n\n/** @notInstrumented */\nexport const getWaasWalletProviderFromWalletAccount = (\n { walletAccount }: GetWalletProviderFromWalletAccountParams,\n client: DynamicClient\n): WaasWalletProvider => {\n const walletProvider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isWaasWalletProvider(walletProvider)) {\n throw new NotWaasWalletAccountError({\n walletAddress: walletAccount.address,\n });\n }\n\n return walletProvider;\n};\n","import type { MigrateFromFireblocksResponse } from '@dynamic-labs-wallet/browser-wallet-client';\n\nimport { getDefaultClient } from '../../../client/defaultClient';\nimport { NoWalletProviderFoundError } from '../../../errors/NoWalletProviderFoundError';\nimport { NotWaasWalletProviderError } from '../../../errors/NotWaasWalletProviderError';\nimport { refreshAuth } from '../../user/refreshAuth';\nimport { getWalletProviders } from '../../wallets/getWalletProviders';\nimport { DYNAMIC_WAAS_METADATA } from '../constants';\nimport { isWaasWalletProvider } from '../isWaasWalletProvider';\n\ntype MigrateFromFireblocksParams = {\n /**\n * Optional SLIP-0044 coin types per chain name for BIP44 derivation off the\n * Fireblocks takeover xprv (e.g. `{ EVM: 1 }` for Sepolia).\n */\n coinTypes?: Record<string, number>;\n /**\n * The Fireblocks NCW device id whose key material is being migrated.\n */\n deviceId: string;\n /**\n * Required per-chain expected wallet address (the address Fireblocks held). Its\n * keys are the chains migration runs on, and the migration iframe verifies each\n * imported Dynamic address matches the value, so a wrong derivation fails loudly\n * instead of producing an unusable wallet.\n */\n expectedAddresses: Record<string, string>;\n /**\n * The Fireblocks-issued JWT authorizing the takeover.\n */\n jwt: string;\n /**\n * The password that encrypted the legacy Fireblocks NCW device storage.\n */\n password: string;\n /**\n * The serialized Fireblocks NCW device storage (the local key share backup).\n */\n storage: Record<string, string>;\n};\n\n/**\n * Migrates an existing Fireblocks NCW wallet into Dynamic's WaaS infrastructure.\n *\n * Migration is a single cross-chain operation: one call takes over the Fireblocks\n * key material and provisions Dynamic WaaS wallet accounts for every supported\n * chain. Because it is not per-chain, this resolves a single WaaS wallet provider\n * (any registered chain) and delegates the takeover to it.\n *\n * @param params.deviceId - The Fireblocks NCW device id being migrated.\n * @param params.jwt - The Fireblocks-issued JWT authorizing the takeover.\n * @param params.storage - The serialized Fireblocks NCW device storage.\n * @param params.password - The password that encrypted the legacy device storage.\n * @param params.expectedAddresses - Required per-chain expected address; its keys are the chains migration runs on, and each imported address is verified against it.\n * @param [params.coinTypes] - Optional SLIP-0044 coin types per chain name.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise resolving to the per-chain migration results.\n * @notInstrumented\n */\nexport const migrateFromFireblocks = async (\n {\n coinTypes,\n deviceId,\n expectedAddresses,\n jwt,\n password,\n storage,\n }: MigrateFromFireblocksParams,\n client = getDefaultClient()\n): Promise<MigrateFromFireblocksResponse> => {\n const providers = getWalletProviders(client);\n\n if (providers.length === 0) {\n throw new NoWalletProviderFoundError({\n walletProviderKey: DYNAMIC_WAAS_METADATA.displayName,\n });\n }\n\n // Migration is cross-chain, so any registered WaaS provider can drive the\n // takeover. Resolve the first one rather than iterating per chain.\n const waasProvider = providers.find(isWaasWalletProvider);\n\n if (!waasProvider) {\n throw new NotWaasWalletProviderError({\n walletProviderKey: providers[0].key,\n });\n }\n\n const result = await waasProvider.migrateFromFireblocks({\n coinTypes,\n deviceId,\n expectedAddresses,\n jwt,\n password,\n storage,\n });\n\n await refreshAuth(client);\n\n return result;\n};\n"],"mappings":";;;;;;AAMA,IAAa,6BAAb,cAAgDA,+CAAU;CACxD,YAAY,EAAE,qBAAuD;AACnE,QAAM;GACJ,OAAO;GACP,MAAM;GACN,SAAS;GACT,MAAM;GACN,cAAc,mBAAmB,kBAAkB;GACpD,CAAC;;;;;;;ACCN,MAAaC,oBAAsC,EAAE,aAAa,WAAW;CAC3E,MAAM,OAAOC,6CAAQ,OAAO;CAE5B,MAAM,2BAA2B,KAAK,MAAM;CAE5C,MAAM,iCACJ,OAAO,iBAAiB,IAAI,MAAM;AAEpC,QAAO,IAAIC,+DACT;EACE,UAAWC,qDAAgB,OAAO,GAAG,WAAW;EAChD,WAAW,OAAO,SAAS;EAC3B,aAAa,KAAK,cAAcC,gEAA2B,QACzD,WACA,GACD;EACD,oBACE,OAAO,iBAAiB,IAAI,MAAM,YAClCC;EACF;EAGA,yBAAyB;EACzB,eAAe,KAAK;EACpB,YAAY,GAAGC,qDAAgB,GAAG,KAAK;EACvC,GAAI,4BAA4B,SAC5B,EAAE,GACF,EAAE,0BAA0B;EAChC,GAAI,kCAAkC,SAClC,EAAE,GACF,EAAE,gCAAgC;EACtC,GAAI,KAAK,MAAM,iBAAiB,SAC5B,EAAE,GACF,EAAE,mBAAmB,KAAK,KAAK,eAAe;EAClD,GAAI,KAAK,MAAM,kBAAkB,SAC7B,EAAE,GACF,EAAE,kBAAkB,KAAK,KAAK,gBAAgB;EACnD,EACD;EAGE,0BACEC,8CAAmB,OAAO,CAAC,MAAM,EAAE,gBAAgB,UAAU;EAK/D,sBAAsB;AACpB,GAAKC,gEACH,EAAE,QAAQ,gCAAgC,EAC1C,OACD,CAAC,OAAO,UAAU;AACjB,SAAK,OAAO,MACV,sDACA,MACD;KACD;;EAEL,CACF;;;;;;ACrEH,MAAa,6BAA6B,UAAyB;AACjE,QAAOC,qDAAgB,OAAO,yBAAyB;;;;;;ACMzD,MAAa,0CACX,EAAE,iBACF,WACuB;CACvB,MAAM,iBAAiBC,wEACrB,EAAE,eAAe,EACjB,OACD;AAED,KAAI,CAACC,0DAAqB,eAAe,CACvC,OAAM,IAAIC,uDAA0B,EAClC,eAAe,cAAc,SAC9B,CAAC;AAGJ,QAAO;;;;;;;;;;;;;;;;;;;;;;;ACgCT,MAAa,wBAAwB,OACnC,EACE,WACA,UACA,mBACA,KACA,UACA,WAEF,SAASC,uDAAkB,KACgB;CAC3C,MAAM,YAAYC,wDAAmB,OAAO;AAE5C,KAAI,UAAU,WAAW,EACvB,OAAM,IAAIC,gEAA2B,EACnC,mBAAmBC,2DAAsB,aAC1C,CAAC;CAKJ,MAAM,eAAe,UAAU,KAAKC,0DAAqB;AAEzD,KAAI,CAAC,aACH,OAAM,IAAI,2BAA2B,EACnC,mBAAmB,UAAU,GAAG,KACjC,CAAC;CAGJ,MAAM,SAAS,MAAM,aAAa,sBAAsB;EACtD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,OAAMC,mDAAY,OAAO;AAEzB,QAAO"}
|
package/dist/{migrateFromFireblocks-CqL5l58Q.native.esm.js → migrateFromFireblocks-Vic3tb61.esm.js}
RENAMED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as NotWaasWalletAccountError, r as __refreshAuth_wrapped } from "./isDynamicWaasEnabled-
|
|
1
|
+
import { L as CHAINS_INFO_MAP, St as getCore, T as getWalletProviderFromWalletAccount, c as isWaasWalletProvider, d as DYNAMIC_WAAS_METADATA, f as getWalletProviders, ht as CLIENT_SDK_NAME, k as NoWalletProviderFoundError, l as DEFAULT_WAAS_BASE_API_URL, lt as isCookieEnabled, u as DEFAULT_WAAS_BASE_MPC_RELAY_API_URL, v as __logoutWithReason_wrapped, vt as getDefaultClient, xt as BaseError } from "./updateAuthFromVerifyResponse-BEoc7f0m.esm.js";
|
|
2
|
+
import { n as NotWaasWalletAccountError, r as __refreshAuth_wrapped } from "./isDynamicWaasEnabled-DwY38pjA.esm.js";
|
|
3
|
+
import { t as getSignedSessionId } from "./getSignedSessionId-C4igTuKk.esm.js";
|
|
4
|
+
import { DynamicWalletClient } from "@dynamic-labs-wallet/browser-wallet-client";
|
|
3
5
|
|
|
4
6
|
//#region src/errors/NotWaasWalletProviderError.ts
|
|
5
7
|
var NotWaasWalletProviderError = class extends BaseError {
|
|
@@ -14,6 +16,43 @@ var NotWaasWalletProviderError = class extends BaseError {
|
|
|
14
16
|
}
|
|
15
17
|
};
|
|
16
18
|
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/modules/waas/createWaasClient/createWaasClient.ts
|
|
21
|
+
/** @notInstrumented */
|
|
22
|
+
const createWaasClient = ({ chainName }, client) => {
|
|
23
|
+
const core = getCore(client);
|
|
24
|
+
const additionalTrustedOrigins = core.waas?.additionalTrustedOrigins;
|
|
25
|
+
const baseClientKeysharesRelayApiUrl = client.projectSettings?.sdk.waas?.customKeyshareRelayBaseUrl;
|
|
26
|
+
return new DynamicWalletClient({
|
|
27
|
+
authMode: isCookieEnabled(client) ? "cookie" : "header",
|
|
28
|
+
authToken: client.token || "",
|
|
29
|
+
baseApiUrl: (core.apiBaseUrl || DEFAULT_WAAS_BASE_API_URL).replace("/api/v0", ""),
|
|
30
|
+
baseMPCRelayApiUrl: client.projectSettings?.sdk.waas?.relayUrl || DEFAULT_WAAS_BASE_MPC_RELAY_API_URL,
|
|
31
|
+
chainName,
|
|
32
|
+
eagerlyRecoverKeyShares: true,
|
|
33
|
+
environmentId: core.environmentId,
|
|
34
|
+
sdkVersion: `${CLIENT_SDK_NAME}/${core.version}`,
|
|
35
|
+
...additionalTrustedOrigins == void 0 ? {} : { additionalTrustedOrigins },
|
|
36
|
+
...baseClientKeysharesRelayApiUrl == void 0 ? {} : { baseClientKeysharesRelayApiUrl },
|
|
37
|
+
...core.waas?.loadTimeoutMs == void 0 ? {} : { iframeLoadTimeout: core.waas.loadTimeoutMs },
|
|
38
|
+
...core.waas?.maxLoadRetries == void 0 ? {} : { maxRetryAttempts: core.waas.maxLoadRetries }
|
|
39
|
+
}, {
|
|
40
|
+
getSignedSessionId: () => getSignedSessionId(client).then(({ signature }) => signature),
|
|
41
|
+
onUnauthorized: () => {
|
|
42
|
+
__logoutWithReason_wrapped({ reason: "session-refresh-unauthorized" }, client).catch((error) => {
|
|
43
|
+
core.logger.error("Failed to log out after WaaS unauthorized response", error);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/modules/waas/getWaasChainNameFromChain/getWaasChainNameFromChain.ts
|
|
51
|
+
/** @notInstrumented */
|
|
52
|
+
const getWaasChainNameFromChain = (chain) => {
|
|
53
|
+
return CHAINS_INFO_MAP[chain].waasChainNameOverride || chain;
|
|
54
|
+
};
|
|
55
|
+
|
|
17
56
|
//#endregion
|
|
18
57
|
//#region src/modules/waas/getWaasWalletProviderFromWalletAccount/getWaasWalletProviderFromWalletAccount.ts
|
|
19
58
|
/** @notInstrumented */
|
|
@@ -61,5 +100,5 @@ const migrateFromFireblocks = async ({ coinTypes, deviceId, expectedAddresses, j
|
|
|
61
100
|
};
|
|
62
101
|
|
|
63
102
|
//#endregion
|
|
64
|
-
export { getWaasWalletProviderFromWalletAccount as n,
|
|
65
|
-
//# sourceMappingURL=migrateFromFireblocks-
|
|
103
|
+
export { NotWaasWalletProviderError as a, createWaasClient as i, getWaasWalletProviderFromWalletAccount as n, getWaasChainNameFromChain as r, migrateFromFireblocks as t };
|
|
104
|
+
//# sourceMappingURL=migrateFromFireblocks-Vic3tb61.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrateFromFireblocks-Vic3tb61.esm.js","names":["createWaasClient: CreateWaasClient","logoutWithReason","refreshAuth"],"sources":["../src/errors/NotWaasWalletProviderError.ts","../src/modules/waas/createWaasClient/createWaasClient.ts","../src/modules/waas/getWaasChainNameFromChain/getWaasChainNameFromChain.ts","../src/modules/waas/getWaasWalletProviderFromWalletAccount/getWaasWalletProviderFromWalletAccount.ts","../src/modules/waas/migrateFromFireblocks/migrateFromFireblocks.ts"],"sourcesContent":["import { BaseError } from './base';\n\ntype NotWaasWalletProviderErrorParams = {\n walletProviderKey: string;\n};\n\nexport class NotWaasWalletProviderError extends BaseError {\n constructor({ walletProviderKey }: NotWaasWalletProviderErrorParams) {\n super({\n cause: null,\n code: 'not_waas_wallet_provider_error',\n docsUrl: null,\n name: 'NotWaasWalletProviderError',\n shortMessage: `Wallet provider ${walletProviderKey} is not a Dynamic WaaS wallet provider`,\n });\n }\n}\n","import type { AuthMode } from '@dynamic-labs-wallet/browser-wallet-client';\nimport { DynamicWalletClient } from '@dynamic-labs-wallet/browser-wallet-client';\n\nimport { getCore } from '../../../client/core/getCore';\nimport { CLIENT_SDK_NAME } from '../../apiClient/constants';\nimport { logoutWithReason } from '../../auth/logoutWithReason';\nimport { isCookieEnabled } from '../../projectSettings/isCookieEnabled';\nimport { getSignedSessionId } from '../../sessionKeys/getSignedSessionId';\nimport type { CreateWaasClient } from './createWaasClient.types';\nimport {\n DEFAULT_WAAS_BASE_API_URL,\n DEFAULT_WAAS_BASE_MPC_RELAY_API_URL,\n} from '../constants';\n\n/** @notInstrumented */\nexport const createWaasClient: CreateWaasClient = ({ chainName }, client) => {\n const core = getCore(client);\n\n const additionalTrustedOrigins = core.waas?.additionalTrustedOrigins;\n\n const baseClientKeysharesRelayApiUrl =\n client.projectSettings?.sdk.waas?.customKeyshareRelayBaseUrl;\n\n return new DynamicWalletClient(\n {\n authMode: (isCookieEnabled(client) ? 'cookie' : 'header') as AuthMode,\n authToken: client.token || '',\n baseApiUrl: (core.apiBaseUrl || DEFAULT_WAAS_BASE_API_URL).replace(\n '/api/v0',\n ''\n ),\n baseMPCRelayApiUrl:\n client.projectSettings?.sdk.waas?.relayUrl ||\n DEFAULT_WAAS_BASE_MPC_RELAY_API_URL,\n chainName,\n // Opt into the SDK self-driving eager key-share recovery on auth-token\n // arrival, so the client no longer restores shares itself on login.\n eagerlyRecoverKeyShares: true,\n environmentId: core.environmentId,\n sdkVersion: `${CLIENT_SDK_NAME}/${core.version}`,\n ...(additionalTrustedOrigins == undefined\n ? {}\n : { additionalTrustedOrigins }),\n ...(baseClientKeysharesRelayApiUrl == undefined\n ? {}\n : { baseClientKeysharesRelayApiUrl }),\n ...(core.waas?.loadTimeoutMs == undefined\n ? {}\n : { iframeLoadTimeout: core.waas.loadTimeoutMs }),\n ...(core.waas?.maxLoadRetries == undefined\n ? {}\n : { maxRetryAttempts: core.waas.maxLoadRetries }),\n },\n {\n // Lets the iframe mint a fresh signed session id over the reverse channel,\n // which the SDK's eager key-share recovery needs.\n getSignedSessionId: () =>\n getSignedSessionId(client).then(({ signature }) => signature),\n // When the WaaS iframe's own backend call returns 401 (e.g. a forcibly\n // revoked token), the iframe notifies the host via the reverse channel\n // and this fires — log the user out. Mirrors the session-expiry\n // middleware that covers the SDK's own direct API 401s.\n onUnauthorized: () => {\n void logoutWithReason(\n { reason: 'session-refresh-unauthorized' },\n client\n ).catch((error) => {\n core.logger.error(\n 'Failed to log out after WaaS unauthorized response',\n error\n );\n });\n },\n }\n );\n};\n","import type { Chain } from '../../chain';\nimport { CHAINS_INFO_MAP } from '../../wallets/constants';\n\n/** @notInstrumented */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const getWaasChainNameFromChain = (chain: Chain): string => {\n return CHAINS_INFO_MAP[chain].waasChainNameOverride || chain;\n};\n","import type { DynamicClient } from '../../../client/types/DynamicClient';\nimport { NotWaasWalletAccountError } from '../../../errors/NotWaasWalletAccountError';\nimport { getWalletProviderFromWalletAccount } from '../../wallets/utils/getWalletProviderFromWalletAccount';\nimport type { WalletAccount } from '../../wallets/walletAccount';\nimport { isWaasWalletProvider } from '../isWaasWalletProvider';\nimport type { WaasWalletProvider } from '../waas.types';\n\ntype GetWalletProviderFromWalletAccountParams = {\n walletAccount: WalletAccount;\n};\n\n/** @notInstrumented */\nexport const getWaasWalletProviderFromWalletAccount = (\n { walletAccount }: GetWalletProviderFromWalletAccountParams,\n client: DynamicClient\n): WaasWalletProvider => {\n const walletProvider = getWalletProviderFromWalletAccount(\n { walletAccount },\n client\n );\n\n if (!isWaasWalletProvider(walletProvider)) {\n throw new NotWaasWalletAccountError({\n walletAddress: walletAccount.address,\n });\n }\n\n return walletProvider;\n};\n","import type { MigrateFromFireblocksResponse } from '@dynamic-labs-wallet/browser-wallet-client';\n\nimport { getDefaultClient } from '../../../client/defaultClient';\nimport { NoWalletProviderFoundError } from '../../../errors/NoWalletProviderFoundError';\nimport { NotWaasWalletProviderError } from '../../../errors/NotWaasWalletProviderError';\nimport { refreshAuth } from '../../user/refreshAuth';\nimport { getWalletProviders } from '../../wallets/getWalletProviders';\nimport { DYNAMIC_WAAS_METADATA } from '../constants';\nimport { isWaasWalletProvider } from '../isWaasWalletProvider';\n\ntype MigrateFromFireblocksParams = {\n /**\n * Optional SLIP-0044 coin types per chain name for BIP44 derivation off the\n * Fireblocks takeover xprv (e.g. `{ EVM: 1 }` for Sepolia).\n */\n coinTypes?: Record<string, number>;\n /**\n * The Fireblocks NCW device id whose key material is being migrated.\n */\n deviceId: string;\n /**\n * Required per-chain expected wallet address (the address Fireblocks held). Its\n * keys are the chains migration runs on, and the migration iframe verifies each\n * imported Dynamic address matches the value, so a wrong derivation fails loudly\n * instead of producing an unusable wallet.\n */\n expectedAddresses: Record<string, string>;\n /**\n * The Fireblocks-issued JWT authorizing the takeover.\n */\n jwt: string;\n /**\n * The password that encrypted the legacy Fireblocks NCW device storage.\n */\n password: string;\n /**\n * The serialized Fireblocks NCW device storage (the local key share backup).\n */\n storage: Record<string, string>;\n};\n\n/**\n * Migrates an existing Fireblocks NCW wallet into Dynamic's WaaS infrastructure.\n *\n * Migration is a single cross-chain operation: one call takes over the Fireblocks\n * key material and provisions Dynamic WaaS wallet accounts for every supported\n * chain. Because it is not per-chain, this resolves a single WaaS wallet provider\n * (any registered chain) and delegates the takeover to it.\n *\n * @param params.deviceId - The Fireblocks NCW device id being migrated.\n * @param params.jwt - The Fireblocks-issued JWT authorizing the takeover.\n * @param params.storage - The serialized Fireblocks NCW device storage.\n * @param params.password - The password that encrypted the legacy device storage.\n * @param params.expectedAddresses - Required per-chain expected address; its keys are the chains migration runs on, and each imported address is verified against it.\n * @param [params.coinTypes] - Optional SLIP-0044 coin types per chain name.\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @returns A promise resolving to the per-chain migration results.\n * @notInstrumented\n */\nexport const migrateFromFireblocks = async (\n {\n coinTypes,\n deviceId,\n expectedAddresses,\n jwt,\n password,\n storage,\n }: MigrateFromFireblocksParams,\n client = getDefaultClient()\n): Promise<MigrateFromFireblocksResponse> => {\n const providers = getWalletProviders(client);\n\n if (providers.length === 0) {\n throw new NoWalletProviderFoundError({\n walletProviderKey: DYNAMIC_WAAS_METADATA.displayName,\n });\n }\n\n // Migration is cross-chain, so any registered WaaS provider can drive the\n // takeover. Resolve the first one rather than iterating per chain.\n const waasProvider = providers.find(isWaasWalletProvider);\n\n if (!waasProvider) {\n throw new NotWaasWalletProviderError({\n walletProviderKey: providers[0].key,\n });\n }\n\n const result = await waasProvider.migrateFromFireblocks({\n coinTypes,\n deviceId,\n expectedAddresses,\n jwt,\n password,\n storage,\n });\n\n await refreshAuth(client);\n\n return result;\n};\n"],"mappings":";;;;;;AAMA,IAAa,6BAAb,cAAgD,UAAU;CACxD,YAAY,EAAE,qBAAuD;AACnE,QAAM;GACJ,OAAO;GACP,MAAM;GACN,SAAS;GACT,MAAM;GACN,cAAc,mBAAmB,kBAAkB;GACpD,CAAC;;;;;;;ACCN,MAAaA,oBAAsC,EAAE,aAAa,WAAW;CAC3E,MAAM,OAAO,QAAQ,OAAO;CAE5B,MAAM,2BAA2B,KAAK,MAAM;CAE5C,MAAM,iCACJ,OAAO,iBAAiB,IAAI,MAAM;AAEpC,QAAO,IAAI,oBACT;EACE,UAAW,gBAAgB,OAAO,GAAG,WAAW;EAChD,WAAW,OAAO,SAAS;EAC3B,aAAa,KAAK,cAAc,2BAA2B,QACzD,WACA,GACD;EACD,oBACE,OAAO,iBAAiB,IAAI,MAAM,YAClC;EACF;EAGA,yBAAyB;EACzB,eAAe,KAAK;EACpB,YAAY,GAAG,gBAAgB,GAAG,KAAK;EACvC,GAAI,4BAA4B,SAC5B,EAAE,GACF,EAAE,0BAA0B;EAChC,GAAI,kCAAkC,SAClC,EAAE,GACF,EAAE,gCAAgC;EACtC,GAAI,KAAK,MAAM,iBAAiB,SAC5B,EAAE,GACF,EAAE,mBAAmB,KAAK,KAAK,eAAe;EAClD,GAAI,KAAK,MAAM,kBAAkB,SAC7B,EAAE,GACF,EAAE,kBAAkB,KAAK,KAAK,gBAAgB;EACnD,EACD;EAGE,0BACE,mBAAmB,OAAO,CAAC,MAAM,EAAE,gBAAgB,UAAU;EAK/D,sBAAsB;AACpB,GAAKC,2BACH,EAAE,QAAQ,gCAAgC,EAC1C,OACD,CAAC,OAAO,UAAU;AACjB,SAAK,OAAO,MACV,sDACA,MACD;KACD;;EAEL,CACF;;;;;;ACrEH,MAAa,6BAA6B,UAAyB;AACjE,QAAO,gBAAgB,OAAO,yBAAyB;;;;;;ACMzD,MAAa,0CACX,EAAE,iBACF,WACuB;CACvB,MAAM,iBAAiB,mCACrB,EAAE,eAAe,EACjB,OACD;AAED,KAAI,CAAC,qBAAqB,eAAe,CACvC,OAAM,IAAI,0BAA0B,EAClC,eAAe,cAAc,SAC9B,CAAC;AAGJ,QAAO;;;;;;;;;;;;;;;;;;;;;;;ACgCT,MAAa,wBAAwB,OACnC,EACE,WACA,UACA,mBACA,KACA,UACA,WAEF,SAAS,kBAAkB,KACgB;CAC3C,MAAM,YAAY,mBAAmB,OAAO;AAE5C,KAAI,UAAU,WAAW,EACvB,OAAM,IAAI,2BAA2B,EACnC,mBAAmB,sBAAsB,aAC1C,CAAC;CAKJ,MAAM,eAAe,UAAU,KAAK,qBAAqB;AAEzD,KAAI,CAAC,aACH,OAAM,IAAI,2BAA2B,EACnC,mBAAmB,UAAU,GAAG,KACjC,CAAC;CAGJ,MAAM,SAAS,MAAM,aAAa,sBAAsB;EACtD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,OAAMC,sBAAY,OAAO;AAEzB,QAAO"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { A as NoWalletProviderFoundError, E as getWalletProviderFromWalletAccount, F as CHAINS_INFO_MAP, St as getCore, d as DEFAULT_WAAS_BASE_MPC_RELAY_API_URL, f as DYNAMIC_WAAS_METADATA, ht as CLIENT_SDK_NAME, l as isWaasWalletProvider, lt as isCookieEnabled, p as getWalletProviders, t as NativeModuleNotLinkedError, u as DEFAULT_WAAS_BASE_API_URL, vt as getDefaultClient, xt as BaseError } from "./NativeModuleNotLinkedError-DsfdAti9.native.esm.js";
|
|
2
|
+
import { n as NotWaasWalletAccountError, r as __refreshAuth_wrapped } from "./isDynamicWaasEnabled-CsNM4kzO.native.esm.js";
|
|
3
|
+
import { ACCESSIBLE, getGenericPassword, resetGenericPassword, setGenericPassword } from "react-native-keychain";
|
|
4
|
+
import { NativeEventEmitter, TurboModuleRegistry } from "react-native";
|
|
5
|
+
import { DynamicWalletClient } from "@dynamic-labs-wallet/browser-wallet-client";
|
|
6
|
+
|
|
7
|
+
//#region src/errors/NotWaasWalletProviderError.ts
|
|
8
|
+
var NotWaasWalletProviderError = class extends BaseError {
|
|
9
|
+
constructor({ walletProviderKey }) {
|
|
10
|
+
super({
|
|
11
|
+
cause: null,
|
|
12
|
+
code: "not_waas_wallet_provider_error",
|
|
13
|
+
docsUrl: null,
|
|
14
|
+
name: "NotWaasWalletProviderError",
|
|
15
|
+
shortMessage: `Wallet provider ${walletProviderKey} is not a Dynamic WaaS wallet provider`
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/errors/CorruptedKeyShareError.ts
|
|
22
|
+
/**
|
|
23
|
+
* Thrown when a persisted client key share cannot be parsed back into its
|
|
24
|
+
* structured form (e.g. a partially-written or corrupted keychain entry).
|
|
25
|
+
*
|
|
26
|
+
* Surfaced as a typed error rather than swallowed so callers can distinguish
|
|
27
|
+
* "no key share stored" (empty result) from "key share exists but is
|
|
28
|
+
* unreadable" — the latter must never be silently treated as the former,
|
|
29
|
+
* which could trigger an unintended re-keygen that overwrites recoverable
|
|
30
|
+
* material.
|
|
31
|
+
*/
|
|
32
|
+
var CorruptedKeyShareError = class extends BaseError {
|
|
33
|
+
constructor({ cause = null } = {}) {
|
|
34
|
+
super({
|
|
35
|
+
cause,
|
|
36
|
+
code: "corrupted_key_share_error",
|
|
37
|
+
details: "The stored client key share could not be parsed. The secure storage entry may be partially written or corrupted.",
|
|
38
|
+
docsUrl: null,
|
|
39
|
+
name: "CorruptedKeyShareError",
|
|
40
|
+
shortMessage: "Stored client key share is corrupted and cannot be read."
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region src/turboModules/NativeDynamicWebView.ts
|
|
47
|
+
var NativeDynamicWebView_default = TurboModuleRegistry.get("DynamicClientWebView");
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region src/errors/WebViewLoadFailedError.ts
|
|
51
|
+
/**
|
|
52
|
+
* Thrown when `DynamicWebView.open()` (via the WaaS transport provider)
|
|
53
|
+
* fails to establish a usable load. Inspect `reason` to distinguish the
|
|
54
|
+
* failure mode; `statusCode` and `underlyingError` provide structured
|
|
55
|
+
* metadata for the cases that have it.
|
|
56
|
+
*/
|
|
57
|
+
var WebViewLoadFailedError = class extends BaseError {
|
|
58
|
+
reason;
|
|
59
|
+
statusCode;
|
|
60
|
+
underlyingError;
|
|
61
|
+
constructor({ reason, shortMessage, cause = null, statusCode, underlyingError }) {
|
|
62
|
+
super({
|
|
63
|
+
cause,
|
|
64
|
+
code: "webview_load_failed_error",
|
|
65
|
+
details: underlyingError,
|
|
66
|
+
docsUrl: null,
|
|
67
|
+
name: "WebViewLoadFailedError",
|
|
68
|
+
shortMessage
|
|
69
|
+
});
|
|
70
|
+
this.reason = reason;
|
|
71
|
+
this.statusCode = statusCode;
|
|
72
|
+
this.underlyingError = underlyingError;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region src/modules/waas/createWaasClient/translateNativeOpenError.ts
|
|
78
|
+
const REASON_BY_NATIVE_CODE = {
|
|
79
|
+
webview_cancelled: "cancelled",
|
|
80
|
+
webview_content_process_terminated: "content_process_terminated",
|
|
81
|
+
webview_http_error: "http_error",
|
|
82
|
+
webview_instance_busy: "instance_busy",
|
|
83
|
+
webview_invalid_url: "invalid_url",
|
|
84
|
+
webview_navigation_failed: "navigation_failed",
|
|
85
|
+
webview_no_host_view: "no_host_view",
|
|
86
|
+
webview_unsupported: "unsupported"
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Translates a native `DynamicWebView.open()` rejection into a typed
|
|
90
|
+
* `WebViewLoadFailedError`. Maps the native RCT reject code to the JS-level
|
|
91
|
+
* `WebViewLoadFailureReason` discriminator (falling back to
|
|
92
|
+
* `navigation_failed` for unrecognized codes) and carries through the
|
|
93
|
+
* structured `statusCode` / `underlyingError` metadata.
|
|
94
|
+
*
|
|
95
|
+
* The `reason` it produces is the contract `createWaasSDKContainer` branches
|
|
96
|
+
* on — notably `emitError` swallows `cancelled` because that code is only ever
|
|
97
|
+
* produced by our own `close()` teardown (verified on both the iOS and Android
|
|
98
|
+
* native sides). Keep `REASON_BY_NATIVE_CODE` in sync with the native reject
|
|
99
|
+
* codes so that branching stays correct.
|
|
100
|
+
*
|
|
101
|
+
* @notInstrumented
|
|
102
|
+
*/
|
|
103
|
+
const translateNativeOpenError = (err) => {
|
|
104
|
+
const rejection = err ?? {};
|
|
105
|
+
const isNativeRejectionCode = (code) => code != void 0 && code in REASON_BY_NATIVE_CODE;
|
|
106
|
+
const reason = isNativeRejectionCode(rejection.code) ? REASON_BY_NATIVE_CODE[rejection.code] : "navigation_failed";
|
|
107
|
+
return new WebViewLoadFailedError({
|
|
108
|
+
cause: err instanceof Error ? err : null,
|
|
109
|
+
reason,
|
|
110
|
+
shortMessage: rejection.message ?? `DynamicWebView open failed (${reason}).`,
|
|
111
|
+
statusCode: rejection.userInfo?.DynamicWebViewStatusCode,
|
|
112
|
+
underlyingError: rejection.userInfo?.DynamicWebViewUnderlying
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
//#endregion
|
|
117
|
+
//#region src/modules/waas/createWaasClient/createNativeWaasSDKContainer.native.ts
|
|
118
|
+
const NATIVE_MODULE_NAME = "DynamicClientWebView";
|
|
119
|
+
const MESSAGE_EVENT_NAME = "dynamicBridgeMessage";
|
|
120
|
+
const generateInstanceId = () => `${Date.now().toString(36)}-${crypto.randomUUID()}`;
|
|
121
|
+
/**
|
|
122
|
+
* Creates a React Native `WaasSDKContainer` backed by a hidden, headless native
|
|
123
|
+
* WebView (WKWebView on iOS, `android.webkit.WebView` on Android) hosted by the
|
|
124
|
+
* `DynamicClientWebView` TurboModule. Each invocation returns an isolated
|
|
125
|
+
* container with its own instance ID, native WebView, and message routing.
|
|
126
|
+
*
|
|
127
|
+
* Used for MPC operations (signing, key-share management) where there is
|
|
128
|
+
* nothing for the user to see. The VISIBLE private-key export display is no
|
|
129
|
+
* longer a native overlay — it is rendered by the `ExportPrivateKey` component
|
|
130
|
+
* (`@dynamic-labs-sdk/react-native-embedded-wallet-export`) on top of
|
|
131
|
+
* `react-native-webview`, so it scrolls and positions like any RN view.
|
|
132
|
+
*
|
|
133
|
+
* @notInstrumented
|
|
134
|
+
*/
|
|
135
|
+
const createNativeWaasSDKContainer = () => {
|
|
136
|
+
if (!NativeDynamicWebView_default) throw new NativeModuleNotLinkedError({ moduleName: NATIVE_MODULE_NAME });
|
|
137
|
+
const nativeModule = NativeDynamicWebView_default;
|
|
138
|
+
const instanceId = generateInstanceId();
|
|
139
|
+
const emitter = new NativeEventEmitter(nativeModule);
|
|
140
|
+
const messageHandlers = [];
|
|
141
|
+
const errorHandlers = [];
|
|
142
|
+
let subscription = null;
|
|
143
|
+
let destroyed = false;
|
|
144
|
+
const emitError = (err) => {
|
|
145
|
+
if (destroyed) return;
|
|
146
|
+
const translated = translateNativeOpenError(err);
|
|
147
|
+
if (translated.reason === "cancelled") return;
|
|
148
|
+
for (const handler of errorHandlers) handler(translated);
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
destroy() {
|
|
152
|
+
if (destroyed) return;
|
|
153
|
+
destroyed = true;
|
|
154
|
+
subscription?.remove();
|
|
155
|
+
subscription = null;
|
|
156
|
+
messageHandlers.length = 0;
|
|
157
|
+
errorHandlers.length = 0;
|
|
158
|
+
nativeModule.close(instanceId);
|
|
159
|
+
},
|
|
160
|
+
isAlive: () => !destroyed,
|
|
161
|
+
onError(handler) {
|
|
162
|
+
errorHandlers.push(handler);
|
|
163
|
+
return () => {
|
|
164
|
+
const index = errorHandlers.indexOf(handler);
|
|
165
|
+
if (index !== -1) errorHandlers.splice(index, 1);
|
|
166
|
+
};
|
|
167
|
+
},
|
|
168
|
+
onMessage(handler) {
|
|
169
|
+
messageHandlers.push(handler);
|
|
170
|
+
subscription ??= emitter.addListener(MESSAGE_EVENT_NAME, (payload) => {
|
|
171
|
+
if (payload.instanceId !== instanceId) return;
|
|
172
|
+
for (const fn of messageHandlers) fn(payload.data);
|
|
173
|
+
});
|
|
174
|
+
return () => {
|
|
175
|
+
const index = messageHandlers.indexOf(handler);
|
|
176
|
+
if (index !== -1) messageHandlers.splice(index, 1);
|
|
177
|
+
if (messageHandlers.length === 0) {
|
|
178
|
+
subscription?.remove();
|
|
179
|
+
subscription = null;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
},
|
|
183
|
+
sendMessage(data) {
|
|
184
|
+
nativeModule.sendMessage(instanceId, data);
|
|
185
|
+
},
|
|
186
|
+
async setUrl(url) {
|
|
187
|
+
nativeModule.open(instanceId, url).catch(emitError);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
//#endregion
|
|
193
|
+
//#region src/modules/waas/createWaasClient/createWaasSDKContainer.native.ts
|
|
194
|
+
/**
|
|
195
|
+
* Creates a React Native `WaasSDKContainer` backed by a hidden, headless native
|
|
196
|
+
* WebView (WKWebView on iOS, `android.webkit.WebView` on Android) hosted by the
|
|
197
|
+
* `DynamicClientWebView` TurboModule. Used for MPC operations (signing, key-share
|
|
198
|
+
* management) where there is nothing for the user to see.
|
|
199
|
+
*
|
|
200
|
+
* For the private-key export display — where the hosted page must render the
|
|
201
|
+
* key for the user — use the `ExportPrivateKey` component from
|
|
202
|
+
* `@dynamic-labs-sdk/react-native-embedded-wallet-export`, which renders the
|
|
203
|
+
* key inside a `react-native-webview` instead of a native overlay.
|
|
204
|
+
*
|
|
205
|
+
* @notInstrumented
|
|
206
|
+
*/
|
|
207
|
+
const createWaasSDKContainer = () => createNativeWaasSDKContainer();
|
|
208
|
+
|
|
209
|
+
//#endregion
|
|
210
|
+
//#region src/modules/waas/createWaasClient/createWaasClient.native.ts
|
|
211
|
+
/**
|
|
212
|
+
* Keychain security options for the client key share. The share is wallet
|
|
213
|
+
* key material that cannot be re-derived locally, so the options are pinned
|
|
214
|
+
* explicitly rather than inherited from `react-native-keychain` defaults
|
|
215
|
+
* (which vary across versions and platforms).
|
|
216
|
+
*
|
|
217
|
+
* `WHEN_UNLOCKED_THIS_DEVICE_ONLY` keeps the share readable only while the
|
|
218
|
+
* device is unlocked, excludes it from iCloud Keychain sync, and prevents it
|
|
219
|
+
* migrating to a new device on encrypted-backup restore. It deliberately does
|
|
220
|
+
* NOT set `accessControl` (e.g. biometry) — reads must not surface a Face ID /
|
|
221
|
+
* passcode prompt, since the share is read on routine wallet operations.
|
|
222
|
+
*/
|
|
223
|
+
const KEY_SHARE_KEYCHAIN_OPTIONS = { accessible: ACCESSIBLE.WHEN_UNLOCKED_THIS_DEVICE_ONLY };
|
|
224
|
+
/** @notInstrumented */
|
|
225
|
+
const createWaasClient = ({ chainName }, client) => {
|
|
226
|
+
const core = getCore(client);
|
|
227
|
+
const additionalTrustedOrigins = core.waas?.additionalTrustedOrigins;
|
|
228
|
+
const getKeyShareService = (accountAddress) => `${core.environmentId}:${accountAddress}`;
|
|
229
|
+
return new DynamicWalletClient({
|
|
230
|
+
authMode: isCookieEnabled(client) ? "cookie" : "header",
|
|
231
|
+
authToken: client.token || "",
|
|
232
|
+
baseApiUrl: (core.apiBaseUrl || DEFAULT_WAAS_BASE_API_URL).replace("/api/v0", ""),
|
|
233
|
+
baseMPCRelayApiUrl: client.projectSettings?.sdk.waas?.relayUrl || DEFAULT_WAAS_BASE_MPC_RELAY_API_URL,
|
|
234
|
+
chainName,
|
|
235
|
+
environmentId: core.environmentId,
|
|
236
|
+
hostOrigin: core.metadata?.universalLink,
|
|
237
|
+
sdkVersion: `${CLIENT_SDK_NAME}/${core.version}`,
|
|
238
|
+
...additionalTrustedOrigins == void 0 ? {} : { additionalTrustedOrigins },
|
|
239
|
+
...core.waas?.loadTimeoutMs == void 0 ? {} : { iframeLoadTimeout: core.waas.loadTimeoutMs },
|
|
240
|
+
...core.waas?.maxLoadRetries == void 0 ? {} : { maxRetryAttempts: core.waas.maxLoadRetries }
|
|
241
|
+
}, {
|
|
242
|
+
createWaasSDKContainer,
|
|
243
|
+
secureStorage: {
|
|
244
|
+
getClientKeyShare: async (accountAddress) => {
|
|
245
|
+
const result = await getGenericPassword({ service: getKeyShareService(accountAddress) });
|
|
246
|
+
if (!result) return [];
|
|
247
|
+
try {
|
|
248
|
+
return JSON.parse(result.password);
|
|
249
|
+
} catch (cause) {
|
|
250
|
+
throw new CorruptedKeyShareError({ cause: cause instanceof Error ? cause : null });
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
removeClientKeyShare: async (accountAddress) => {
|
|
254
|
+
await resetGenericPassword({ service: getKeyShareService(accountAddress) });
|
|
255
|
+
},
|
|
256
|
+
setClientKeyShare: async (accountAddress, shares) => {
|
|
257
|
+
await setGenericPassword(accountAddress, JSON.stringify(shares), {
|
|
258
|
+
...KEY_SHARE_KEYCHAIN_OPTIONS,
|
|
259
|
+
service: getKeyShareService(accountAddress)
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
//#endregion
|
|
267
|
+
//#region src/modules/waas/getWaasChainNameFromChain/getWaasChainNameFromChain.ts
|
|
268
|
+
/** @notInstrumented */
|
|
269
|
+
const getWaasChainNameFromChain = (chain) => {
|
|
270
|
+
return CHAINS_INFO_MAP[chain].waasChainNameOverride || chain;
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
//#endregion
|
|
274
|
+
//#region src/modules/waas/getWaasWalletProviderFromWalletAccount/getWaasWalletProviderFromWalletAccount.ts
|
|
275
|
+
/** @notInstrumented */
|
|
276
|
+
const getWaasWalletProviderFromWalletAccount = ({ walletAccount }, client) => {
|
|
277
|
+
const walletProvider = getWalletProviderFromWalletAccount({ walletAccount }, client);
|
|
278
|
+
if (!isWaasWalletProvider(walletProvider)) throw new NotWaasWalletAccountError({ walletAddress: walletAccount.address });
|
|
279
|
+
return walletProvider;
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
//#endregion
|
|
283
|
+
//#region src/modules/waas/migrateFromFireblocks/migrateFromFireblocks.ts
|
|
284
|
+
/**
|
|
285
|
+
* Migrates an existing Fireblocks NCW wallet into Dynamic's WaaS infrastructure.
|
|
286
|
+
*
|
|
287
|
+
* Migration is a single cross-chain operation: one call takes over the Fireblocks
|
|
288
|
+
* key material and provisions Dynamic WaaS wallet accounts for every supported
|
|
289
|
+
* chain. Because it is not per-chain, this resolves a single WaaS wallet provider
|
|
290
|
+
* (any registered chain) and delegates the takeover to it.
|
|
291
|
+
*
|
|
292
|
+
* @param params.deviceId - The Fireblocks NCW device id being migrated.
|
|
293
|
+
* @param params.jwt - The Fireblocks-issued JWT authorizing the takeover.
|
|
294
|
+
* @param params.storage - The serialized Fireblocks NCW device storage.
|
|
295
|
+
* @param params.password - The password that encrypted the legacy device storage.
|
|
296
|
+
* @param params.expectedAddresses - Required per-chain expected address; its keys are the chains migration runs on, and each imported address is verified against it.
|
|
297
|
+
* @param [params.coinTypes] - Optional SLIP-0044 coin types per chain name.
|
|
298
|
+
* @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
|
|
299
|
+
* @returns A promise resolving to the per-chain migration results.
|
|
300
|
+
* @notInstrumented
|
|
301
|
+
*/
|
|
302
|
+
const migrateFromFireblocks = async ({ coinTypes, deviceId, expectedAddresses, jwt, password, storage }, client = getDefaultClient()) => {
|
|
303
|
+
const providers = getWalletProviders(client);
|
|
304
|
+
if (providers.length === 0) throw new NoWalletProviderFoundError({ walletProviderKey: DYNAMIC_WAAS_METADATA.displayName });
|
|
305
|
+
const waasProvider = providers.find(isWaasWalletProvider);
|
|
306
|
+
if (!waasProvider) throw new NotWaasWalletProviderError({ walletProviderKey: providers[0].key });
|
|
307
|
+
const result = await waasProvider.migrateFromFireblocks({
|
|
308
|
+
coinTypes,
|
|
309
|
+
deviceId,
|
|
310
|
+
expectedAddresses,
|
|
311
|
+
jwt,
|
|
312
|
+
password,
|
|
313
|
+
storage
|
|
314
|
+
});
|
|
315
|
+
await __refreshAuth_wrapped(client);
|
|
316
|
+
return result;
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
//#endregion
|
|
320
|
+
export { NotWaasWalletProviderError as a, createWaasClient as i, getWaasWalletProviderFromWalletAccount as n, getWaasChainNameFromChain as r, migrateFromFireblocks as t };
|
|
321
|
+
//# sourceMappingURL=migrateFromFireblocks-hfh_j7wm.native.esm.js.map
|