@dynamic-labs/sdk-react-core 4.91.2 → 4.91.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/package.cjs +1 -1
  3. package/package.js +1 -1
  4. package/package.json +12 -12
  5. package/src/lib/client/client.cjs +1 -1
  6. package/src/lib/client/client.js +1 -1
  7. package/src/lib/components/TransactionConfirmationPageLayout/TransactionConfirmationPageLayout.cjs +4 -1
  8. package/src/lib/components/TransactionConfirmationPageLayout/TransactionConfirmationPageLayout.js +4 -1
  9. package/src/lib/components/TransactionStatusLayout/TransactionStatusLayout.cjs +3 -0
  10. package/src/lib/components/TransactionStatusLayout/TransactionStatusLayout.js +3 -0
  11. package/src/lib/context/DynamicContext/hooks/useRemoveWallet/useRemoveWallet.cjs +1 -1
  12. package/src/lib/context/DynamicContext/hooks/useRemoveWallet/useRemoveWallet.js +1 -1
  13. package/src/lib/context/DynamicContext/types/SettingsOverrides.d.ts +13 -1
  14. package/src/lib/context/ErrorContext/ErrorContext.cjs +48 -28
  15. package/src/lib/context/ErrorContext/ErrorContext.js +49 -29
  16. package/src/lib/context/OnrampContext/OnrampContext.cjs +21 -16
  17. package/src/lib/context/OnrampContext/OnrampContext.js +21 -16
  18. package/src/lib/context/SendBalanceContext/SendBalanceContext.errors.cjs +2 -2
  19. package/src/lib/context/SendBalanceContext/SendBalanceContext.errors.js +2 -2
  20. package/src/lib/context/SocialRedirectContext/hooks/useRedirectSocialHandler/useRedirectSocialHandler.cjs +3 -3
  21. package/src/lib/context/SocialRedirectContext/hooks/useRedirectSocialHandler/useRedirectSocialHandler.js +3 -3
  22. package/src/lib/data/api/email/email.cjs +6 -3
  23. package/src/lib/data/api/email/email.js +6 -3
  24. package/src/lib/data/api/embeddedWallets/embeddedWallets.cjs +15 -14
  25. package/src/lib/data/api/embeddedWallets/embeddedWallets.js +8 -7
  26. package/src/lib/data/api/exchangeAccounts/exchangeAccounts.cjs +3 -3
  27. package/src/lib/data/api/exchangeAccounts/exchangeAccounts.js +3 -3
  28. package/src/lib/data/api/oauth/oauth.cjs +3 -2
  29. package/src/lib/data/api/oauth/oauth.js +3 -2
  30. package/src/lib/data/api/session/session.cjs +3 -3
  31. package/src/lib/data/api/session/session.js +3 -3
  32. package/src/lib/data/api/sms/sms.cjs +4 -1
  33. package/src/lib/data/api/sms/sms.js +4 -1
  34. package/src/lib/data/api/user/user.cjs +5 -5
  35. package/src/lib/data/api/user/user.js +6 -6
  36. package/src/lib/data/api/utils.cjs +6 -1
  37. package/src/lib/data/api/utils.d.ts +1 -0
  38. package/src/lib/data/api/utils.js +6 -2
  39. package/src/lib/data/api/wallets/wallets.cjs +17 -15
  40. package/src/lib/data/api/wallets/wallets.js +18 -16
  41. package/src/lib/events/auth.d.ts +3 -2
  42. package/src/lib/shared/types/dynamicEventsCallbacks.d.ts +2 -1
  43. package/src/lib/store/state/nonce/nonce.cjs +1 -1
  44. package/src/lib/store/state/nonce/nonce.js +1 -1
  45. package/src/lib/utils/functions/generateMessages/index.cjs +3 -3
  46. package/src/lib/utils/functions/generateMessages/index.js +3 -3
  47. package/src/lib/utils/functions/getEmbeddedWalletAuthHandler/getEmbeddedWalletAuthHandler.cjs +1 -1
  48. package/src/lib/utils/functions/getEmbeddedWalletAuthHandler/getEmbeddedWalletAuthHandler.js +1 -1
  49. package/src/lib/utils/functions/getTransactionLink/blockExplorerPatterns.cjs +30 -0
  50. package/src/lib/utils/functions/getTransactionLink/blockExplorerPatterns.d.ts +17 -0
  51. package/src/lib/utils/functions/getTransactionLink/blockExplorerPatterns.js +29 -1
  52. package/src/lib/utils/functions/getTransactionLink/getTransactionLink.cjs +13 -1
  53. package/src/lib/utils/functions/getTransactionLink/getTransactionLink.d.ts +2 -1
  54. package/src/lib/utils/functions/getTransactionLink/getTransactionLink.js +14 -2
  55. package/src/lib/utils/functions/getVerifyArgs/getVerifyArgs.cjs +4 -0
  56. package/src/lib/utils/functions/getVerifyArgs/getVerifyArgs.js +5 -1
  57. package/src/lib/utils/hooks/authenticationHooks/useConnectAndSign/useConnectAndSign.cjs +1 -1
  58. package/src/lib/utils/hooks/authenticationHooks/useConnectAndSign/useConnectAndSign.js +2 -2
  59. package/src/lib/utils/hooks/authenticationHooks/useOtpVerificationRequest/useOtpVerificationRequest.cjs +2 -2
  60. package/src/lib/utils/hooks/authenticationHooks/useOtpVerificationRequest/useOtpVerificationRequest.js +2 -2
  61. package/src/lib/utils/hooks/useAuthenticateConnectedUser/useAuthenticateConnectedUser.cjs +2 -2
  62. package/src/lib/utils/hooks/useAuthenticateConnectedUser/useAuthenticateConnectedUser.js +2 -2
  63. package/src/lib/utils/hooks/useConfirmationPortal/useConfirmationPortal.cjs +1 -1
  64. package/src/lib/utils/hooks/useConfirmationPortal/useConfirmationPortal.js +1 -1
  65. package/src/lib/utils/hooks/useConnectExchangeForFunding/useConnectExchangeForFunding.cjs +1 -1
  66. package/src/lib/utils/hooks/useConnectExchangeForFunding/useConnectExchangeForFunding.js +1 -1
  67. package/src/lib/utils/hooks/useConnectUnifiedForFunding/useConnectUnifiedForFunding.cjs +2 -2
  68. package/src/lib/utils/hooks/useConnectUnifiedForFunding/useConnectUnifiedForFunding.js +2 -2
  69. package/src/lib/utils/hooks/useConnectWallet/HandleConnectWalletRejectionError.cjs +1 -1
  70. package/src/lib/utils/hooks/useConnectWallet/HandleConnectWalletRejectionError.js +1 -1
  71. package/src/lib/utils/hooks/useCreateDynamicEmbeddedWalletMutation/useCreateDynamicEmbeddedWalletMutation.cjs +1 -1
  72. package/src/lib/utils/hooks/useCreateDynamicEmbeddedWalletMutation/useCreateDynamicEmbeddedWalletMutation.js +1 -1
  73. package/src/lib/utils/hooks/useCreateWalletConnectorOptions/utils/errors/ConnectorSetupError.cjs +1 -1
  74. package/src/lib/utils/hooks/useCreateWalletConnectorOptions/utils/errors/ConnectorSetupError.js +1 -1
  75. package/src/lib/utils/hooks/useDynamicWaas/useDynamicWaas.cjs +8 -8
  76. package/src/lib/utils/hooks/useDynamicWaas/useDynamicWaas.js +8 -8
  77. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.cjs +4 -4
  78. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.js +4 -4
  79. package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.cjs +9 -9
  80. package/src/lib/utils/hooks/useEmbeddedWallet/useSecureEnclaveEmbeddedWallet/useSecureEnclaveEmbeddedWallet.js +9 -9
  81. package/src/lib/utils/hooks/useFundWithWallet/useConnectWalletForFunding/useConnectWalletForFunding.cjs +2 -2
  82. package/src/lib/utils/hooks/useFundWithWallet/useConnectWalletForFunding/useConnectWalletForFunding.js +2 -2
  83. package/src/lib/utils/hooks/useFundingHelpers/useFundingHelpers.cjs +2 -2
  84. package/src/lib/utils/hooks/useFundingHelpers/useFundingHelpers.js +2 -2
  85. package/src/lib/utils/hooks/useGetMfaToken/useGetMfaToken.cjs +1 -1
  86. package/src/lib/utils/hooks/useGetMfaToken/useGetMfaToken.js +1 -1
  87. package/src/lib/utils/hooks/useSignEip7702Authorization/useSignEip7702Authorization.cjs +2 -2
  88. package/src/lib/utils/hooks/useSignEip7702Authorization/useSignEip7702Authorization.js +2 -2
  89. package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.cjs +2 -2
  90. package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.js +2 -2
  91. package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.cjs +2 -2
  92. package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.js +2 -2
  93. package/src/lib/utils/hooks/useTransferWallet/useTransferWallet.cjs +2 -2
  94. package/src/lib/utils/hooks/useTransferWallet/useTransferWallet.js +2 -2
  95. package/src/lib/utils/hooks/useUpgradeEmbeddedWallet/useUpgradeEmbeddedWallet.cjs +3 -3
  96. package/src/lib/utils/hooks/useUpgradeEmbeddedWallet/useUpgradeEmbeddedWallet.js +3 -3
  97. package/src/lib/utils/hooks/useUserAuth/useUserAuth.cjs +1 -1
  98. package/src/lib/utils/hooks/useUserAuth/useUserAuth.js +1 -1
  99. package/src/lib/utils/hooks/useUserDataForm/useUserDataForm.cjs +1 -1
  100. package/src/lib/utils/hooks/useUserDataForm/useUserDataForm.js +1 -1
  101. package/src/lib/utils/hooks/useUserUpdateRequest/unlinkUserEmail/unlinkUserEmail.cjs +3 -3
  102. package/src/lib/utils/hooks/useUserUpdateRequest/unlinkUserEmail/unlinkUserEmail.js +3 -3
  103. package/src/lib/utils/hooks/useUserUpdateRequest/useUpdateUserWithModal/useUpdateUserWithModal.cjs +1 -1
  104. package/src/lib/utils/hooks/useUserUpdateRequest/useUpdateUserWithModal/useUpdateUserWithModal.js +1 -1
  105. package/src/lib/utils/hooks/useVerifyWallet/useVerifyWallet.cjs +2 -2
  106. package/src/lib/utils/hooks/useVerifyWallet/useVerifyWallet.js +2 -2
  107. package/src/lib/utils/hooks/useViewSettings/useViewSettings.d.ts +5 -1
  108. package/src/lib/utils/hooks/useWalletConnectors/useWalletConnectors.cjs +1 -1
  109. package/src/lib/utils/hooks/useWalletConnectors/useWalletConnectors.js +1 -1
  110. package/src/lib/utils/hooks/useWalletOptions/useWalletOptions.cjs +1 -1
  111. package/src/lib/utils/hooks/useWalletOptions/useWalletOptions.js +1 -1
  112. package/src/lib/views/BridgeNextWalletConnectionView/BridgeNextWalletConnectionView.cjs +1 -1
  113. package/src/lib/views/BridgeNextWalletConnectionView/BridgeNextWalletConnectionView.js +1 -1
  114. package/src/lib/views/EmailVerification/EmailVerification.cjs +4 -4
  115. package/src/lib/views/EmailVerification/EmailVerification.js +4 -4
  116. package/src/lib/views/EmailWalletOTPVerificationView/EmailWalletOTPVerificationView.cjs +2 -2
  117. package/src/lib/views/EmailWalletOTPVerificationView/EmailWalletOTPVerificationView.js +2 -2
  118. package/src/lib/views/EmbeddedReveal/utils/turnkeyExport/turnkeyExport.cjs +2 -2
  119. package/src/lib/views/EmbeddedReveal/utils/turnkeyExport/turnkeyExport.js +2 -2
  120. package/src/lib/views/EmbeddedReveal/utils/waasExport/waasExport.cjs +2 -2
  121. package/src/lib/views/EmbeddedReveal/utils/waasExport/waasExport.js +2 -2
  122. package/src/lib/views/ExportSharesView/ExportSharesView.cjs +2 -2
  123. package/src/lib/views/ExportSharesView/ExportSharesView.js +2 -2
  124. package/src/lib/views/LoginView/sections/SocialSignInSection/DynamicSocialSignIn/DynamicSocialSignIn.cjs +2 -2
  125. package/src/lib/views/LoginView/sections/SocialSignInSection/DynamicSocialSignIn/DynamicSocialSignIn.js +2 -2
  126. package/src/lib/views/LoginView/useLoginView/useLoginView.cjs +1 -1
  127. package/src/lib/views/LoginView/useLoginView/useLoginView.js +1 -1
  128. package/src/lib/views/MergeUserAccountsWithSameEmailView/MergeUserAccountsWithSameEmailView.cjs +1 -1
  129. package/src/lib/views/MergeUserAccountsWithSameEmailView/MergeUserAccountsWithSameEmailView.js +1 -1
  130. package/src/lib/views/MfaVerificationView/MfaVerificationView.cjs +2 -2
  131. package/src/lib/views/MfaVerificationView/MfaVerificationView.js +2 -2
  132. package/src/lib/views/Passkey/PasskeyRecovery/BundleValidation/PasskeyBundleRecovery.cjs +1 -1
  133. package/src/lib/views/Passkey/PasskeyRecovery/BundleValidation/PasskeyBundleRecovery.js +1 -1
  134. package/src/lib/views/Passkey/PasskeyRecovery/CompleteRecovery/PasskeyCompleteRecovery.cjs +1 -1
  135. package/src/lib/views/Passkey/PasskeyRecovery/CompleteRecovery/PasskeyCompleteRecovery.js +1 -1
  136. package/src/lib/views/Passkey/utils/createEmbeddedWalletRequest/createEmbeddedWalletRequest.cjs +3 -3
  137. package/src/lib/views/Passkey/utils/createEmbeddedWalletRequest/createEmbeddedWalletRequest.js +3 -3
  138. package/src/lib/views/Passkey/utils/passkeyRecovery/passkeyRecovery.cjs +14 -14
  139. package/src/lib/views/Passkey/utils/passkeyRecovery/passkeyRecovery.js +14 -14
  140. package/src/lib/views/SendBalanceView/SendBalanceView.cjs +2 -2
  141. package/src/lib/views/SendBalanceView/SendBalanceView.js +2 -2
  142. package/src/lib/views/SmsVerification/useSmsVerification/useSmsVerification.cjs +2 -2
  143. package/src/lib/views/SmsVerification/useSmsVerification/useSmsVerification.js +2 -2
  144. package/src/lib/views/WalletDelegation/WalletDelegationView/WalletDelegationView.cjs +1 -1
  145. package/src/lib/views/WalletDelegation/WalletDelegationView/WalletDelegationView.js +1 -1
  146. package/src/lib/views/WalletUpgradeFlowView/WalletUpgradeFlowView.cjs +1 -1
  147. package/src/lib/views/WalletUpgradeFlowView/WalletUpgradeFlowView.js +1 -1
  148. package/src/lib/widgets/DynamicWidget/views/ChooseWalletFundingMethod/useFundingMethods/getPromptAmountParams/getPromptAmountParams.cjs +1 -1
  149. package/src/lib/widgets/DynamicWidget/views/ChooseWalletFundingMethod/useFundingMethods/getPromptAmountParams/getPromptAmountParams.js +1 -1
  150. package/src/lib/widgets/DynamicWidget/views/ReceiveWalletFunds/utils/useSubmitWalletFunding/useSubmitWalletFunding.cjs +10 -1
  151. package/src/lib/widgets/DynamicWidget/views/ReceiveWalletFunds/utils/useSubmitWalletFunding/useSubmitWalletFunding.js +10 -1
@@ -22,7 +22,7 @@ import '../../../store/state/nonce/nonce.js';
22
22
  import '@dynamic-labs-wallet/browser-wallet-client';
23
23
  import { sdkApi } from '../api.js';
24
24
  import { ELEVATED_ACCESS_TOKEN_HEADER } from '../constants.js';
25
- import { logResponseError } from '../utils.js';
25
+ import { logResponseError, isResponseLike } from '../utils.js';
26
26
  import '@dynamic-labs/locale';
27
27
  import '../../../store/state/dynamicContextProps/dynamicContextProps.js';
28
28
  import '../../../store/state/primaryWalletId/primaryWalletId.js';
@@ -42,22 +42,22 @@ const updateUserProfileFields = (environmentId, fields) => __awaiter(void 0, voi
42
42
  }
43
43
  catch (e) {
44
44
  const error = yield logResponseError(e, 'Error updateUserProfileFields');
45
- if (e instanceof Response) {
45
+ if (isResponseLike(e)) {
46
46
  if (error.code === 'email_already_exists') {
47
- throw new EmailAlreadyExistsError();
47
+ throw new EmailAlreadyExistsError(error.error, error.code);
48
48
  }
49
49
  else if (error.code === 'custom_field_data_not_unique') {
50
50
  throw new CustomFieldNotUniqueError();
51
51
  }
52
52
  else if (error.code === 'username_already_exists') {
53
- throw new UsernameAlreadyExistsError();
53
+ throw new UsernameAlreadyExistsError(error.error, error.code);
54
54
  }
55
55
  else if (error.code === 'too_many_verification_attempts') {
56
- throw new TooManyEmailVerificationsError();
56
+ throw new TooManyEmailVerificationsError(error.error, error.code);
57
57
  }
58
58
  else if (error.code === 'invalid_phone' ||
59
59
  error.code === 'invalid_sms_verification') {
60
- throw new InvalidPhoneNumberError(error.error);
60
+ throw new InvalidPhoneNumberError(error.error, error.code);
61
61
  }
62
62
  }
63
63
  throw e;
@@ -20,9 +20,13 @@ var api = require('./api.cjs');
20
20
 
21
21
  const RATE_LIMIT_MESSAGE = 'Too many requests. Please try again later.';
22
22
  const NETWORK_ERROR_MESSAGE = 'Request failed. You may be sending too many requests — please wait a moment and try again.';
23
+ // expo/fetch returns response objects that aren't the same class as global Response,
24
+ // so instanceof checks fail on React Native / Expo SDK 56+. Duck-type instead.
25
+ const isResponseLike = (e) => typeof (e === null || e === void 0 ? void 0 : e.json) === 'function' &&
26
+ typeof (e === null || e === void 0 ? void 0 : e.status) === 'number';
23
27
  const logResponseError = (e_1, message_1, ...args_1) => _tslib.__awaiter(void 0, [e_1, message_1, ...args_1], void 0, function* (e, message, logLevel = 'error') {
24
28
  var _a, _b, _c, _d, _e, _f, _g;
25
- if (e instanceof Response) {
29
+ if (isResponseLike(e)) {
26
30
  const requestId = (_b = (_a = e.headers) === null || _a === void 0 ? void 0 : _a.get('x-dyn-request-id')) !== null && _b !== void 0 ? _b : undefined;
27
31
  const cfRay = (_d = (_c = e.headers) === null || _c === void 0 ? void 0 : _c.get('cf-ray')) !== null && _d !== void 0 ? _d : undefined;
28
32
  let data;
@@ -68,4 +72,5 @@ const getNonce = (environmentId) => _tslib.__awaiter(void 0, void 0, void 0, fun
68
72
  });
69
73
 
70
74
  exports.getNonce = getNonce;
75
+ exports.isResponseLike = isResponseLike;
71
76
  exports.logResponseError = logResponseError;
@@ -1,2 +1,3 @@
1
+ export declare const isResponseLike: (e: unknown) => e is Response;
1
2
  export declare const logResponseError: (e: any, message: string, logLevel?: 'error' | 'warn') => Promise<any>;
2
3
  export declare const getNonce: (environmentId: string) => Promise<string | undefined>;
@@ -16,9 +16,13 @@ import { sdkApi } from './api.js';
16
16
 
17
17
  const RATE_LIMIT_MESSAGE = 'Too many requests. Please try again later.';
18
18
  const NETWORK_ERROR_MESSAGE = 'Request failed. You may be sending too many requests — please wait a moment and try again.';
19
+ // expo/fetch returns response objects that aren't the same class as global Response,
20
+ // so instanceof checks fail on React Native / Expo SDK 56+. Duck-type instead.
21
+ const isResponseLike = (e) => typeof (e === null || e === void 0 ? void 0 : e.json) === 'function' &&
22
+ typeof (e === null || e === void 0 ? void 0 : e.status) === 'number';
19
23
  const logResponseError = (e_1, message_1, ...args_1) => __awaiter(void 0, [e_1, message_1, ...args_1], void 0, function* (e, message, logLevel = 'error') {
20
24
  var _a, _b, _c, _d, _e, _f, _g;
21
- if (e instanceof Response) {
25
+ if (isResponseLike(e)) {
22
26
  const requestId = (_b = (_a = e.headers) === null || _a === void 0 ? void 0 : _a.get('x-dyn-request-id')) !== null && _b !== void 0 ? _b : undefined;
23
27
  const cfRay = (_d = (_c = e.headers) === null || _c === void 0 ? void 0 : _c.get('cf-ray')) !== null && _d !== void 0 ? _d : undefined;
24
28
  let data;
@@ -63,4 +67,4 @@ const getNonce = (environmentId) => __awaiter(void 0, void 0, void 0, function*
63
67
  }
64
68
  });
65
69
 
66
- export { getNonce, logResponseError };
70
+ export { getNonce, isResponseLike, logResponseError };
@@ -47,7 +47,7 @@ const storeSelectedWallet = (_a) => _tslib.__awaiter(void 0, [_a], void 0, funct
47
47
  }
48
48
  catch (e) {
49
49
  const data = yield utils.logResponseError(e, 'Error transfering wallet');
50
- throw new utils$1.DynamicError(data.error);
50
+ throw new utils$1.DynamicError(data.error, data.code);
51
51
  }
52
52
  });
53
53
  const linkWallet = (environmentId_1, _b) => _tslib.__awaiter(void 0, [environmentId_1, _b], void 0, function* (environmentId, { messageToSign, network, signedMessage, publicWalletAddress, chain, walletName, walletProvider, additionalWalletAddresses, backup, }) {
@@ -97,7 +97,7 @@ const linkWallet = (environmentId_1, _b) => _tslib.__awaiter(void 0, [environmen
97
97
  if (((_c = data.error) === null || _c === void 0 ? void 0 : _c.code) === 'sandbox_maximum_threshold_reached') {
98
98
  throw new utils$1.SandboxMaximumThresholdReachedError(data.error.message);
99
99
  }
100
- throw new utils$1.DynamicError(data.error);
100
+ throw new utils$1.DynamicError(data.error, data.code);
101
101
  }
102
102
  });
103
103
  const unlinkWallet = (_d) => _tslib.__awaiter(void 0, [_d], void 0, function* ({ environmentId, primaryWalletId, walletId, onSuccess, }) {
@@ -124,7 +124,7 @@ const unlinkWallet = (_d) => _tslib.__awaiter(void 0, [_d], void 0, function* ({
124
124
  }
125
125
  catch (e) {
126
126
  const data = yield utils.logResponseError(e, 'Error transfering wallet');
127
- throw new utils$1.DynamicError(data.error);
127
+ throw new utils$1.DynamicError(data.error, data.code);
128
128
  }
129
129
  });
130
130
  const transferWallet = (environmentId_2, _e) => _tslib.__awaiter(void 0, [environmentId_2, _e], void 0, function* (environmentId, { network, messageToSign, signedMessage, publicWalletAddress, chain, walletName, walletProvider, skipEmptyAccountCheck = false, }) {
@@ -149,7 +149,7 @@ const transferWallet = (environmentId_2, _e) => _tslib.__awaiter(void 0, [enviro
149
149
  }
150
150
  catch (e) {
151
151
  const data = yield utils.logResponseError(e, 'Error transfering wallet');
152
- throw new utils$1.DynamicError(data.error);
152
+ throw new utils$1.DynamicError(data.error, data.code);
153
153
  }
154
154
  });
155
155
  const verifyWallet = (environmentId_3, _f) => _tslib.__awaiter(void 0, [environmentId_3, _f], void 0, function* (environmentId, { messageToSign, signedMessage, publicWalletAddress, chain, walletName, walletProvider, captchaToken, network, oauth, additionalWalletAddresses, sessionPublicKey, }) {
@@ -176,17 +176,18 @@ const verifyWallet = (environmentId_3, _f) => _tslib.__awaiter(void 0, [environm
176
176
  }
177
177
  catch (e) {
178
178
  const data = yield utils.logResponseError(e, 'Error verifyWallet');
179
- if (data.code === 'wallet_not_deployed') {
179
+ if (data.code === utils$1.SdkErrorCode.WALLET_NOT_DEPLOYED) {
180
180
  throw new utils$1.WalletNotDeployedError();
181
181
  }
182
182
  if (((_g = data.error) === null || _g === void 0 ? void 0 : _g.code) === 'chainalysis_blocked_wallet') {
183
- throw new utils$1.ChainalysisError(data.payload.walletPublicKey);
183
+ throw new utils$1.ChainalysisError(data.payload.walletPublicKey, data.error.code);
184
184
  }
185
185
  if (((_h = data.error) === null || _h === void 0 ? void 0 : _h.code) === 'gate_blocked') {
186
186
  throw new utils$1.GateBlockedError(data.payload.walletPublicKey);
187
187
  }
188
188
  if (((_j = data.error) === null || _j === void 0 ? void 0 : _j.code) === 'missing_from_list') {
189
189
  throw new utils$1.NoAccessError({
190
+ code: data.error.code,
190
191
  walletPublicKey: data.payload.walletPublicKey,
191
192
  });
192
193
  }
@@ -194,12 +195,12 @@ const verifyWallet = (environmentId_3, _f) => _tslib.__awaiter(void 0, [environm
194
195
  throw new utils$1.DynamicError(data.error, utils$1.ErrorCode.CREDENTIAL_NOT_ENABLED_FOR_SIGN_IN);
195
196
  }
196
197
  if (data.code === 'email_associated_with_different_provider') {
197
- throw new utils$1.AccountExistsError(data.error, data.payload);
198
+ throw new utils$1.AccountExistsError(data.error, data.payload, data.code);
198
199
  }
199
200
  if (((_k = data.error) === null || _k === void 0 ? void 0 : _k.code) === 'sandbox_maximum_threshold_reached') {
200
201
  throw new utils$1.SandboxMaximumThresholdReachedError(data.error.message);
201
202
  }
202
- throw new utils$1.DynamicError(data.error);
203
+ throw new utils$1.DynamicError(data.error, data.code);
203
204
  }
204
205
  });
205
206
  const walletsVerify = (environmentId_4, _l) => _tslib.__awaiter(void 0, [environmentId_4, _l], void 0, function* (environmentId, { messageToSign, signedMessage, publicWalletAddress, chain, walletName, walletProvider, captchaToken, network, oauth, requestedScopes, additionalWalletAddresses, sessionPublicKey, }) {
@@ -227,17 +228,18 @@ const walletsVerify = (environmentId_4, _l) => _tslib.__awaiter(void 0, [environ
227
228
  }
228
229
  catch (e) {
229
230
  const data = yield utils.logResponseError(e, 'Error walletsVerify');
230
- if (data.code === 'wallet_not_deployed') {
231
+ if (data.code === utils$1.SdkErrorCode.WALLET_NOT_DEPLOYED) {
231
232
  throw new utils$1.WalletNotDeployedError();
232
233
  }
233
234
  if (((_m = data.error) === null || _m === void 0 ? void 0 : _m.code) === 'chainalysis_blocked_wallet') {
234
- throw new utils$1.ChainalysisError(data.payload.walletPublicKey);
235
+ throw new utils$1.ChainalysisError(data.payload.walletPublicKey, data.error.code);
235
236
  }
236
237
  if (((_o = data.error) === null || _o === void 0 ? void 0 : _o.code) === 'gate_blocked') {
237
238
  throw new utils$1.GateBlockedError(data.payload.walletPublicKey);
238
239
  }
239
240
  if (((_p = data.error) === null || _p === void 0 ? void 0 : _p.code) === 'missing_from_list') {
240
241
  throw new utils$1.NoAccessError({
242
+ code: data.error.code,
241
243
  walletPublicKey: data.payload.walletPublicKey,
242
244
  });
243
245
  }
@@ -245,12 +247,12 @@ const walletsVerify = (environmentId_4, _l) => _tslib.__awaiter(void 0, [environ
245
247
  throw new utils$1.DynamicError(data.error, utils$1.ErrorCode.CREDENTIAL_NOT_ENABLED_FOR_SIGN_IN);
246
248
  }
247
249
  if (data.code === 'email_associated_with_different_provider') {
248
- throw new utils$1.AccountExistsError(data.error, data.payload);
250
+ throw new utils$1.AccountExistsError(data.error, data.payload, data.code);
249
251
  }
250
252
  if (((_q = data.error) === null || _q === void 0 ? void 0 : _q.code) === 'sandbox_maximum_threshold_reached') {
251
253
  throw new utils$1.SandboxMaximumThresholdReachedError(data.error.message);
252
254
  }
253
- throw new utils$1.DynamicError(data.error);
255
+ throw new utils$1.DynamicError(data.error, data.code);
254
256
  }
255
257
  });
256
258
  const upgradeEmbeddedWalletToV2 = (_r) => _tslib.__awaiter(void 0, [_r], void 0, function* ({ environmentId, sessionPublicKey, }) {
@@ -263,7 +265,7 @@ const upgradeEmbeddedWalletToV2 = (_r) => _tslib.__awaiter(void 0, [_r], void 0,
263
265
  }
264
266
  catch (e) {
265
267
  const data = yield utils.logResponseError(e, 'Error upgradeEmbeddedWalletToV2');
266
- throw new utils$1.DynamicError(data.error);
268
+ throw new utils$1.DynamicError(data.error, data.code);
267
269
  }
268
270
  });
269
271
  const softDeleteEmbeddedWallet = (_s) => _tslib.__awaiter(void 0, [_s], void 0, function* ({ environmentId, walletId, }) {
@@ -275,7 +277,7 @@ const softDeleteEmbeddedWallet = (_s) => _tslib.__awaiter(void 0, [_s], void 0,
275
277
  }
276
278
  catch (e) {
277
279
  const data = yield utils.logResponseError(e, `Error softDeleteEmbeddedWallet for ${walletId} in ${environmentId}`);
278
- throw new utils$1.DynamicError(data.error);
280
+ throw new utils$1.DynamicError(data.error, data.code);
279
281
  }
280
282
  });
281
283
  const restoreEmbeddedWallet = (_t) => _tslib.__awaiter(void 0, [_t], void 0, function* ({ environmentId, walletId, }) {
@@ -287,7 +289,7 @@ const restoreEmbeddedWallet = (_t) => _tslib.__awaiter(void 0, [_t], void 0, fun
287
289
  }
288
290
  catch (e) {
289
291
  const data = yield utils.logResponseError(e, `Error restoreEmbeddedWallet for ${walletId} in ${environmentId}`);
290
- throw new utils$1.DynamicError(data.error);
292
+ throw new utils$1.DynamicError(data.error, data.code);
291
293
  }
292
294
  });
293
295
 
@@ -2,7 +2,7 @@
2
2
  import { __awaiter } from '../../../../../_virtual/_tslib.js';
3
3
  import { getElevatedAccessToken } from '@dynamic-labs-sdk/client';
4
4
  import { TokenScope, VerifyRequestFromJSON } from '@dynamic-labs/sdk-api-core';
5
- import { DynamicError, EmbeddedWalletExistsError, WalletUsedError, MergeAccountsConfirmationError, SandboxMaximumThresholdReachedError, WalletNotDeployedError, ChainalysisError, GateBlockedError, NoAccessError, ErrorCode, AccountExistsError } from '@dynamic-labs/utils';
5
+ import { DynamicError, EmbeddedWalletExistsError, WalletUsedError, MergeAccountsConfirmationError, SandboxMaximumThresholdReachedError, SdkErrorCode, WalletNotDeployedError, ChainalysisError, GateBlockedError, NoAccessError, ErrorCode, AccountExistsError } from '@dynamic-labs/utils';
6
6
  import '@dynamic-labs-sdk/client/core';
7
7
  import 'react';
8
8
  import 'eventemitter3';
@@ -43,7 +43,7 @@ const storeSelectedWallet = (_a) => __awaiter(void 0, [_a], void 0, function* ({
43
43
  }
44
44
  catch (e) {
45
45
  const data = yield logResponseError(e, 'Error transfering wallet');
46
- throw new DynamicError(data.error);
46
+ throw new DynamicError(data.error, data.code);
47
47
  }
48
48
  });
49
49
  const linkWallet = (environmentId_1, _b) => __awaiter(void 0, [environmentId_1, _b], void 0, function* (environmentId, { messageToSign, network, signedMessage, publicWalletAddress, chain, walletName, walletProvider, additionalWalletAddresses, backup, }) {
@@ -93,7 +93,7 @@ const linkWallet = (environmentId_1, _b) => __awaiter(void 0, [environmentId_1,
93
93
  if (((_c = data.error) === null || _c === void 0 ? void 0 : _c.code) === 'sandbox_maximum_threshold_reached') {
94
94
  throw new SandboxMaximumThresholdReachedError(data.error.message);
95
95
  }
96
- throw new DynamicError(data.error);
96
+ throw new DynamicError(data.error, data.code);
97
97
  }
98
98
  });
99
99
  const unlinkWallet = (_d) => __awaiter(void 0, [_d], void 0, function* ({ environmentId, primaryWalletId, walletId, onSuccess, }) {
@@ -120,7 +120,7 @@ const unlinkWallet = (_d) => __awaiter(void 0, [_d], void 0, function* ({ enviro
120
120
  }
121
121
  catch (e) {
122
122
  const data = yield logResponseError(e, 'Error transfering wallet');
123
- throw new DynamicError(data.error);
123
+ throw new DynamicError(data.error, data.code);
124
124
  }
125
125
  });
126
126
  const transferWallet = (environmentId_2, _e) => __awaiter(void 0, [environmentId_2, _e], void 0, function* (environmentId, { network, messageToSign, signedMessage, publicWalletAddress, chain, walletName, walletProvider, skipEmptyAccountCheck = false, }) {
@@ -145,7 +145,7 @@ const transferWallet = (environmentId_2, _e) => __awaiter(void 0, [environmentId
145
145
  }
146
146
  catch (e) {
147
147
  const data = yield logResponseError(e, 'Error transfering wallet');
148
- throw new DynamicError(data.error);
148
+ throw new DynamicError(data.error, data.code);
149
149
  }
150
150
  });
151
151
  const verifyWallet = (environmentId_3, _f) => __awaiter(void 0, [environmentId_3, _f], void 0, function* (environmentId, { messageToSign, signedMessage, publicWalletAddress, chain, walletName, walletProvider, captchaToken, network, oauth, additionalWalletAddresses, sessionPublicKey, }) {
@@ -172,17 +172,18 @@ const verifyWallet = (environmentId_3, _f) => __awaiter(void 0, [environmentId_3
172
172
  }
173
173
  catch (e) {
174
174
  const data = yield logResponseError(e, 'Error verifyWallet');
175
- if (data.code === 'wallet_not_deployed') {
175
+ if (data.code === SdkErrorCode.WALLET_NOT_DEPLOYED) {
176
176
  throw new WalletNotDeployedError();
177
177
  }
178
178
  if (((_g = data.error) === null || _g === void 0 ? void 0 : _g.code) === 'chainalysis_blocked_wallet') {
179
- throw new ChainalysisError(data.payload.walletPublicKey);
179
+ throw new ChainalysisError(data.payload.walletPublicKey, data.error.code);
180
180
  }
181
181
  if (((_h = data.error) === null || _h === void 0 ? void 0 : _h.code) === 'gate_blocked') {
182
182
  throw new GateBlockedError(data.payload.walletPublicKey);
183
183
  }
184
184
  if (((_j = data.error) === null || _j === void 0 ? void 0 : _j.code) === 'missing_from_list') {
185
185
  throw new NoAccessError({
186
+ code: data.error.code,
186
187
  walletPublicKey: data.payload.walletPublicKey,
187
188
  });
188
189
  }
@@ -190,12 +191,12 @@ const verifyWallet = (environmentId_3, _f) => __awaiter(void 0, [environmentId_3
190
191
  throw new DynamicError(data.error, ErrorCode.CREDENTIAL_NOT_ENABLED_FOR_SIGN_IN);
191
192
  }
192
193
  if (data.code === 'email_associated_with_different_provider') {
193
- throw new AccountExistsError(data.error, data.payload);
194
+ throw new AccountExistsError(data.error, data.payload, data.code);
194
195
  }
195
196
  if (((_k = data.error) === null || _k === void 0 ? void 0 : _k.code) === 'sandbox_maximum_threshold_reached') {
196
197
  throw new SandboxMaximumThresholdReachedError(data.error.message);
197
198
  }
198
- throw new DynamicError(data.error);
199
+ throw new DynamicError(data.error, data.code);
199
200
  }
200
201
  });
201
202
  const walletsVerify = (environmentId_4, _l) => __awaiter(void 0, [environmentId_4, _l], void 0, function* (environmentId, { messageToSign, signedMessage, publicWalletAddress, chain, walletName, walletProvider, captchaToken, network, oauth, requestedScopes, additionalWalletAddresses, sessionPublicKey, }) {
@@ -223,17 +224,18 @@ const walletsVerify = (environmentId_4, _l) => __awaiter(void 0, [environmentId_
223
224
  }
224
225
  catch (e) {
225
226
  const data = yield logResponseError(e, 'Error walletsVerify');
226
- if (data.code === 'wallet_not_deployed') {
227
+ if (data.code === SdkErrorCode.WALLET_NOT_DEPLOYED) {
227
228
  throw new WalletNotDeployedError();
228
229
  }
229
230
  if (((_m = data.error) === null || _m === void 0 ? void 0 : _m.code) === 'chainalysis_blocked_wallet') {
230
- throw new ChainalysisError(data.payload.walletPublicKey);
231
+ throw new ChainalysisError(data.payload.walletPublicKey, data.error.code);
231
232
  }
232
233
  if (((_o = data.error) === null || _o === void 0 ? void 0 : _o.code) === 'gate_blocked') {
233
234
  throw new GateBlockedError(data.payload.walletPublicKey);
234
235
  }
235
236
  if (((_p = data.error) === null || _p === void 0 ? void 0 : _p.code) === 'missing_from_list') {
236
237
  throw new NoAccessError({
238
+ code: data.error.code,
237
239
  walletPublicKey: data.payload.walletPublicKey,
238
240
  });
239
241
  }
@@ -241,12 +243,12 @@ const walletsVerify = (environmentId_4, _l) => __awaiter(void 0, [environmentId_
241
243
  throw new DynamicError(data.error, ErrorCode.CREDENTIAL_NOT_ENABLED_FOR_SIGN_IN);
242
244
  }
243
245
  if (data.code === 'email_associated_with_different_provider') {
244
- throw new AccountExistsError(data.error, data.payload);
246
+ throw new AccountExistsError(data.error, data.payload, data.code);
245
247
  }
246
248
  if (((_q = data.error) === null || _q === void 0 ? void 0 : _q.code) === 'sandbox_maximum_threshold_reached') {
247
249
  throw new SandboxMaximumThresholdReachedError(data.error.message);
248
250
  }
249
- throw new DynamicError(data.error);
251
+ throw new DynamicError(data.error, data.code);
250
252
  }
251
253
  });
252
254
  const upgradeEmbeddedWalletToV2 = (_r) => __awaiter(void 0, [_r], void 0, function* ({ environmentId, sessionPublicKey, }) {
@@ -259,7 +261,7 @@ const upgradeEmbeddedWalletToV2 = (_r) => __awaiter(void 0, [_r], void 0, functi
259
261
  }
260
262
  catch (e) {
261
263
  const data = yield logResponseError(e, 'Error upgradeEmbeddedWalletToV2');
262
- throw new DynamicError(data.error);
264
+ throw new DynamicError(data.error, data.code);
263
265
  }
264
266
  });
265
267
  const softDeleteEmbeddedWallet = (_s) => __awaiter(void 0, [_s], void 0, function* ({ environmentId, walletId, }) {
@@ -271,7 +273,7 @@ const softDeleteEmbeddedWallet = (_s) => __awaiter(void 0, [_s], void 0, functio
271
273
  }
272
274
  catch (e) {
273
275
  const data = yield logResponseError(e, `Error softDeleteEmbeddedWallet for ${walletId} in ${environmentId}`);
274
- throw new DynamicError(data.error);
276
+ throw new DynamicError(data.error, data.code);
275
277
  }
276
278
  });
277
279
  const restoreEmbeddedWallet = (_t) => __awaiter(void 0, [_t], void 0, function* ({ environmentId, walletId, }) {
@@ -283,7 +285,7 @@ const restoreEmbeddedWallet = (_t) => __awaiter(void 0, [_t], void 0, function*
283
285
  }
284
286
  catch (e) {
285
287
  const data = yield logResponseError(e, `Error restoreEmbeddedWallet for ${walletId} in ${environmentId}`);
286
- throw new DynamicError(data.error);
288
+ throw new DynamicError(data.error, data.code);
287
289
  }
288
290
  });
289
291
 
@@ -1,5 +1,6 @@
1
1
  import type { LogoutEventMetadata } from '@dynamic-labs-sdk/client';
2
2
  import { AuthEventPayload } from '@dynamic-labs/types';
3
+ import { SdkErrorCode } from '@dynamic-labs/utils';
3
4
  import { SdkLogoutReason } from '../context/DynamicContext/hooks/useHandleLogout';
4
5
  export type AuthEvents = {
5
6
  /**
@@ -8,8 +9,8 @@ export type AuthEvents = {
8
9
  * For email/sms, specifically happens when users cancels the OTP verification.
9
10
  */
10
11
  authFailure: (method: AuthEventPayload,
11
- /** Will be 'user-cancelled' when cancelled, or the error when there is an error */
12
- reason: 'user-cancelled' | {
12
+ /** Will be SdkErrorCode.USER_CANCELLED when cancelled, or the error when there is an error */
13
+ reason: SdkErrorCode.USER_CANCELLED | {
13
14
  error: unknown;
14
15
  }) => void;
15
16
  /** Informs an auth attempt initialized, and provides insight into which auth option it is */
@@ -1,6 +1,7 @@
1
1
  import { JwtVerifiedCredential } from '@dynamic-labs/sdk-api-core';
2
2
  import { AuthEventPayload, OtpDestination, PhoneData, UserProfile } from '@dynamic-labs/types';
3
3
  import { WalletConnector } from '@dynamic-labs/wallet-connector-core';
4
+ import { SdkErrorCode } from '@dynamic-labs/utils';
4
5
  import { Wallet, WalletListViewTabItem } from './wallets';
5
6
  export type DynamicEventsCallbacks = {
6
7
  onSignedMessage?: (params: {
@@ -29,7 +30,7 @@ export type DynamicEventsCallbacks = {
29
30
  * In general triggered when an error occurs or when user cancels out.
30
31
  * For email/sms, specifically happens when users cancels the OTP verification.
31
32
  */
32
- onAuthFailure?: (data: AuthEventPayload, reason: 'user-cancelled' | {
33
+ onAuthFailure?: (data: AuthEventPayload, reason: SdkErrorCode.USER_CANCELLED | {
33
34
  error: unknown;
34
35
  }) => void;
35
36
  /** Informs an auth attempt initialized, and provides insight into which auth option it is */
@@ -167,7 +167,7 @@ const useFetchNonce = ({ shouldFetch = true, retries = 2, } = {}) => {
167
167
  const consumeNonce = () => {
168
168
  const nonce = getNonce();
169
169
  if (!nonce) {
170
- throw new utils.DynamicError('Nonce is not defined');
170
+ throw new utils.DynamicError('Nonce is not defined', 'nonce_is_not_defined');
171
171
  }
172
172
  setNonce({
173
173
  expiresAt: undefined,
@@ -163,7 +163,7 @@ const useFetchNonce = ({ shouldFetch = true, retries = 2, } = {}) => {
163
163
  const consumeNonce = () => {
164
164
  const nonce = getNonce();
165
165
  if (!nonce) {
166
- throw new DynamicError('Nonce is not defined');
166
+ throw new DynamicError('Nonce is not defined', 'nonce_is_not_defined');
167
167
  }
168
168
  setNonce({
169
169
  expiresAt: undefined,
@@ -31,10 +31,10 @@ const getChainIdForMessage = (walletConnector) => _tslib.__awaiter(void 0, void
31
31
  });
32
32
  const generateMessages = (publicWalletAddress, walletConnector, nonce, projectEnvironmentId, displaySiweStatement, siweStatement) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
33
33
  if (publicWalletAddress === undefined) {
34
- throw new utils.DynamicError('Unable to fetch the public address from the wallet');
34
+ throw new utils.DynamicError('Unable to fetch the public address from the wallet', 'missing_public_address');
35
35
  }
36
36
  if (!walletConnector.connectedChain) {
37
- throw new utils.DynamicError('Wallet is not connected');
37
+ throw new utils.DynamicError('Wallet is not connected', 'wallet_is_not_connected');
38
38
  }
39
39
  const chainId = yield getChainIdForMessage(walletConnector);
40
40
  const parsedAddress = walletConnector.parseAddress(publicWalletAddress);
@@ -70,7 +70,7 @@ const generateMessages = (publicWalletAddress, walletConnector, nonce, projectEn
70
70
  });
71
71
  const signedMessage = yield walletConnector.proveOwnership(parsedAddress, messageToSign);
72
72
  if (!signedMessage) {
73
- throw new utils.DynamicError('Unable to sign the message');
73
+ throw new utils.DynamicError('Unable to sign the message', 'sign_message_failed');
74
74
  }
75
75
  return { messageToSign, signedMessage };
76
76
  });
@@ -27,10 +27,10 @@ const getChainIdForMessage = (walletConnector) => __awaiter(void 0, void 0, void
27
27
  });
28
28
  const generateMessages = (publicWalletAddress, walletConnector, nonce, projectEnvironmentId, displaySiweStatement, siweStatement) => __awaiter(void 0, void 0, void 0, function* () {
29
29
  if (publicWalletAddress === undefined) {
30
- throw new DynamicError('Unable to fetch the public address from the wallet');
30
+ throw new DynamicError('Unable to fetch the public address from the wallet', 'missing_public_address');
31
31
  }
32
32
  if (!walletConnector.connectedChain) {
33
- throw new DynamicError('Wallet is not connected');
33
+ throw new DynamicError('Wallet is not connected', 'wallet_is_not_connected');
34
34
  }
35
35
  const chainId = yield getChainIdForMessage(walletConnector);
36
36
  const parsedAddress = walletConnector.parseAddress(publicWalletAddress);
@@ -66,7 +66,7 @@ const generateMessages = (publicWalletAddress, walletConnector, nonce, projectEn
66
66
  });
67
67
  const signedMessage = yield walletConnector.proveOwnership(parsedAddress, messageToSign);
68
68
  if (!signedMessage) {
69
- throw new DynamicError('Unable to sign the message');
69
+ throw new DynamicError('Unable to sign the message', 'sign_message_failed');
70
70
  }
71
71
  return { messageToSign, signedMessage };
72
72
  });
@@ -8,7 +8,7 @@ var utils = require('@dynamic-labs/utils');
8
8
  const getEmbeddedWalletAuthHandler = (walletConnector) => {
9
9
  if (!walletConnector ||
10
10
  'getAuthenticatorHandler' in walletConnector === false) {
11
- throw new utils.DynamicError('Invalid connector type');
11
+ throw new utils.DynamicError('Invalid connector type', 'invalid_connector_type');
12
12
  }
13
13
  const turnkeyAuthenticatorHandler = walletConnector.getAuthenticatorHandler();
14
14
  return turnkeyAuthenticatorHandler;
@@ -4,7 +4,7 @@ import { DynamicError } from '@dynamic-labs/utils';
4
4
  const getEmbeddedWalletAuthHandler = (walletConnector) => {
5
5
  if (!walletConnector ||
6
6
  'getAuthenticatorHandler' in walletConnector === false) {
7
- throw new DynamicError('Invalid connector type');
7
+ throw new DynamicError('Invalid connector type', 'invalid_connector_type');
8
8
  }
9
9
  const turnkeyAuthenticatorHandler = walletConnector.getAuthenticatorHandler();
10
10
  return turnkeyAuthenticatorHandler;
@@ -58,6 +58,34 @@ const DEFAULT_PATTERN = {
58
58
  return url.toString();
59
59
  },
60
60
  };
61
+ /**
62
+ * Block explorer domains known to support the /op/{userOpHash} route
63
+ * for ERC-4337 UserOperation lookups.
64
+ *
65
+ * Only Blockscout-based explorers are known to support this route.
66
+ * Etherscan-family explorers (etherscan.io, polygonscan.com, etc.)
67
+ * return 404 for /op/ paths. JiffyScan uses /userOpHash/ instead.
68
+ *
69
+ * Customers can extend this list via the transaction-confirmation view override.
70
+ */
71
+ const USER_OP_SUPPORTED_EXPLORER_DOMAINS = [
72
+ // Blockscout-hosted instances (covers *.blockscout.com subdomains)
73
+ 'blockscout.com',
74
+ // Blockscout instances on custom domains
75
+ 'scrollscan.com',
76
+ 'explorer.optimism.io',
77
+ ];
78
+ /**
79
+ * Check whether a block explorer URL supports the /op/{hash} route.
80
+ * Matches against the built-in list and any additional domains provided
81
+ * by the customer via the transaction-confirmation view override.
82
+ */
83
+ const supportsUserOpPath = (blockExplorerUrl, additionalDomains) => {
84
+ const allDomains = additionalDomains
85
+ ? [...USER_OP_SUPPORTED_EXPLORER_DOMAINS, ...additionalDomains]
86
+ : USER_OP_SUPPORTED_EXPLORER_DOMAINS;
87
+ return allDomains.some((domain) => blockExplorerUrl.includes(domain));
88
+ };
61
89
  /**
62
90
  * Find the appropriate pattern for a given block explorer URL
63
91
  */
@@ -68,4 +96,6 @@ const findBlockExplorerPattern = (blockExplorerUrl) => {
68
96
 
69
97
  exports.BLOCK_EXPLORER_PATTERNS = BLOCK_EXPLORER_PATTERNS;
70
98
  exports.DEFAULT_PATTERN = DEFAULT_PATTERN;
99
+ exports.USER_OP_SUPPORTED_EXPLORER_DOMAINS = USER_OP_SUPPORTED_EXPLORER_DOMAINS;
71
100
  exports.findBlockExplorerPattern = findBlockExplorerPattern;
101
+ exports.supportsUserOpPath = supportsUserOpPath;
@@ -20,6 +20,23 @@ export declare const BLOCK_EXPLORER_PATTERNS: BlockExplorerPattern[];
20
20
  * Used when no specific pattern matches
21
21
  */
22
22
  export declare const DEFAULT_PATTERN: BlockExplorerPattern;
23
+ /**
24
+ * Block explorer domains known to support the /op/{userOpHash} route
25
+ * for ERC-4337 UserOperation lookups.
26
+ *
27
+ * Only Blockscout-based explorers are known to support this route.
28
+ * Etherscan-family explorers (etherscan.io, polygonscan.com, etc.)
29
+ * return 404 for /op/ paths. JiffyScan uses /userOpHash/ instead.
30
+ *
31
+ * Customers can extend this list via the transaction-confirmation view override.
32
+ */
33
+ export declare const USER_OP_SUPPORTED_EXPLORER_DOMAINS: string[];
34
+ /**
35
+ * Check whether a block explorer URL supports the /op/{hash} route.
36
+ * Matches against the built-in list and any additional domains provided
37
+ * by the customer via the transaction-confirmation view override.
38
+ */
39
+ export declare const supportsUserOpPath: (blockExplorerUrl: string, additionalDomains?: string[]) => boolean;
23
40
  /**
24
41
  * Find the appropriate pattern for a given block explorer URL
25
42
  */
@@ -54,6 +54,34 @@ const DEFAULT_PATTERN = {
54
54
  return url.toString();
55
55
  },
56
56
  };
57
+ /**
58
+ * Block explorer domains known to support the /op/{userOpHash} route
59
+ * for ERC-4337 UserOperation lookups.
60
+ *
61
+ * Only Blockscout-based explorers are known to support this route.
62
+ * Etherscan-family explorers (etherscan.io, polygonscan.com, etc.)
63
+ * return 404 for /op/ paths. JiffyScan uses /userOpHash/ instead.
64
+ *
65
+ * Customers can extend this list via the transaction-confirmation view override.
66
+ */
67
+ const USER_OP_SUPPORTED_EXPLORER_DOMAINS = [
68
+ // Blockscout-hosted instances (covers *.blockscout.com subdomains)
69
+ 'blockscout.com',
70
+ // Blockscout instances on custom domains
71
+ 'scrollscan.com',
72
+ 'explorer.optimism.io',
73
+ ];
74
+ /**
75
+ * Check whether a block explorer URL supports the /op/{hash} route.
76
+ * Matches against the built-in list and any additional domains provided
77
+ * by the customer via the transaction-confirmation view override.
78
+ */
79
+ const supportsUserOpPath = (blockExplorerUrl, additionalDomains) => {
80
+ const allDomains = additionalDomains
81
+ ? [...USER_OP_SUPPORTED_EXPLORER_DOMAINS, ...additionalDomains]
82
+ : USER_OP_SUPPORTED_EXPLORER_DOMAINS;
83
+ return allDomains.some((domain) => blockExplorerUrl.includes(domain));
84
+ };
57
85
  /**
58
86
  * Find the appropriate pattern for a given block explorer URL
59
87
  */
@@ -62,4 +90,4 @@ const findBlockExplorerPattern = (blockExplorerUrl) => {
62
90
  return pattern || DEFAULT_PATTERN;
63
91
  };
64
92
 
65
- export { BLOCK_EXPLORER_PATTERNS, DEFAULT_PATTERN, findBlockExplorerPattern };
93
+ export { BLOCK_EXPLORER_PATTERNS, DEFAULT_PATTERN, USER_OP_SUPPORTED_EXPLORER_DOMAINS, findBlockExplorerPattern, supportsUserOpPath };
@@ -4,9 +4,11 @@
4
4
  Object.defineProperty(exports, '__esModule', { value: true });
5
5
 
6
6
  var _tslib = require('../../../../../_virtual/_tslib.cjs');
7
+ var walletConnectorCore = require('@dynamic-labs/wallet-connector-core');
7
8
  var blockExplorerPatterns = require('./blockExplorerPatterns.cjs');
8
9
 
9
- const getTransactionLink = (_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ walletConnector, transactionHash, }) {
10
+ const USER_OP_PATH_PREFIX = '/op/';
11
+ const getTransactionLink = (_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ walletConnector, transactionHash, userOpSupportedExplorers, }) {
10
12
  try {
11
13
  if (!walletConnector) {
12
14
  return undefined;
@@ -14,6 +16,16 @@ const getTransactionLink = (_a) => _tslib.__awaiter(void 0, [_a], void 0, functi
14
16
  const [blockExplorerUrl] = yield walletConnector.getBlockExplorerUrlsForCurrentNetwork();
15
17
  if (!blockExplorerUrl)
16
18
  return undefined;
19
+ // AA connectors (e.g. ZeroDev) return a userOp hash, which should
20
+ // link to /op/{hash} on supported block explorers instead of /tx/{hash}.
21
+ // Not all block explorers support the /op/ route, so we check against
22
+ // a known list plus any customer-provided overrides.
23
+ if (walletConnectorCore.isAccountAbstractionConnector(walletConnector) &&
24
+ blockExplorerPatterns.supportsUserOpPath(blockExplorerUrl, userOpSupportedExplorers)) {
25
+ const url = new URL(blockExplorerUrl);
26
+ url.pathname = `${USER_OP_PATH_PREFIX}${transactionHash}`;
27
+ return url.toString();
28
+ }
17
29
  // Find the appropriate pattern for this block explorer
18
30
  const pattern = blockExplorerPatterns.findBlockExplorerPattern(blockExplorerUrl);
19
31
  // Generate the transaction URL using the pattern
@@ -1,5 +1,6 @@
1
1
  import { WalletConnector } from '@dynamic-labs/wallet-connector-core';
2
- export declare const getTransactionLink: ({ walletConnector, transactionHash, }: {
2
+ export declare const getTransactionLink: ({ walletConnector, transactionHash, userOpSupportedExplorers, }: {
3
3
  walletConnector?: WalletConnector;
4
4
  transactionHash: string;
5
+ userOpSupportedExplorers?: string[];
5
6
  }) => Promise<string | undefined>;