@b3dotfun/sdk 0.1.68 → 0.1.69-alpha.0

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 (263) hide show
  1. package/dist/cjs/anyspend/platform/client.d.ts +35 -0
  2. package/dist/cjs/anyspend/platform/client.js +158 -0
  3. package/dist/cjs/anyspend/platform/errors.d.ts +38 -0
  4. package/dist/cjs/anyspend/platform/errors.js +77 -0
  5. package/dist/cjs/anyspend/platform/index.d.ts +87 -0
  6. package/dist/cjs/anyspend/platform/index.js +85 -0
  7. package/dist/cjs/anyspend/platform/resources/analytics.d.ts +7 -0
  8. package/dist/cjs/anyspend/platform/resources/analytics.js +12 -0
  9. package/dist/cjs/anyspend/platform/resources/checkout-sessions.d.ts +17 -0
  10. package/dist/cjs/anyspend/platform/resources/checkout-sessions.js +27 -0
  11. package/dist/cjs/anyspend/platform/resources/customers.d.ts +19 -0
  12. package/dist/cjs/anyspend/platform/resources/customers.js +34 -0
  13. package/dist/cjs/anyspend/platform/resources/discount-codes.d.ts +29 -0
  14. package/dist/cjs/anyspend/platform/resources/discount-codes.js +31 -0
  15. package/dist/cjs/anyspend/platform/resources/events.d.ts +14 -0
  16. package/dist/cjs/anyspend/platform/resources/events.js +16 -0
  17. package/dist/cjs/anyspend/platform/resources/notifications.d.ts +18 -0
  18. package/dist/cjs/anyspend/platform/resources/notifications.js +27 -0
  19. package/dist/cjs/anyspend/platform/resources/organization.d.ts +17 -0
  20. package/dist/cjs/anyspend/platform/resources/organization.js +15 -0
  21. package/dist/cjs/anyspend/platform/resources/payment-links.d.ts +21 -0
  22. package/dist/cjs/anyspend/platform/resources/payment-links.js +49 -0
  23. package/dist/cjs/anyspend/platform/resources/products.d.ts +27 -0
  24. package/dist/cjs/anyspend/platform/resources/products.js +31 -0
  25. package/dist/cjs/anyspend/platform/resources/transactions.d.ts +11 -0
  26. package/dist/cjs/anyspend/platform/resources/transactions.js +25 -0
  27. package/dist/cjs/anyspend/platform/resources/webhooks.d.ts +14 -0
  28. package/dist/cjs/anyspend/platform/resources/webhooks.js +33 -0
  29. package/dist/cjs/anyspend/platform/resources/widgets.d.ts +38 -0
  30. package/dist/cjs/anyspend/platform/resources/widgets.js +31 -0
  31. package/dist/cjs/anyspend/platform/types.d.ts +478 -0
  32. package/dist/cjs/anyspend/platform/types.js +5 -0
  33. package/dist/cjs/anyspend/platform/utils/idempotency.d.ts +4 -0
  34. package/dist/cjs/anyspend/platform/utils/idempotency.js +17 -0
  35. package/dist/cjs/anyspend/platform/utils/pagination.d.ts +12 -0
  36. package/dist/cjs/anyspend/platform/utils/pagination.js +22 -0
  37. package/dist/cjs/anyspend/react/components/AnySpend.d.ts +5 -1
  38. package/dist/cjs/anyspend/react/components/AnySpend.js +127 -16
  39. package/dist/cjs/anyspend/react/components/AnySpendCustom.js +4 -4
  40. package/dist/cjs/anyspend/react/components/AnySpendCustomExactIn.js +2 -2
  41. package/dist/cjs/anyspend/react/components/checkout/AnySpendCheckout.d.ts +14 -6
  42. package/dist/cjs/anyspend/react/components/checkout/AnySpendCheckout.js +55 -8
  43. package/dist/cjs/anyspend/react/components/checkout/AnySpendCheckoutTrigger.d.ts +3 -1
  44. package/dist/cjs/anyspend/react/components/checkout/AnySpendCheckoutTrigger.js +2 -2
  45. package/dist/cjs/anyspend/react/components/checkout/CheckoutPaymentPanel.d.ts +5 -1
  46. package/dist/cjs/anyspend/react/components/checkout/CheckoutPaymentPanel.js +2 -2
  47. package/dist/cjs/anyspend/react/components/checkout/CryptoPayPanel.js +1 -1
  48. package/dist/cjs/anyspend/react/components/checkout/FiatCheckoutPanel.d.ts +5 -1
  49. package/dist/cjs/anyspend/react/components/checkout/FiatCheckoutPanel.js +48 -16
  50. package/dist/cjs/anyspend/react/components/checkout/KycGate.d.ts +11 -0
  51. package/dist/cjs/anyspend/react/components/checkout/KycGate.js +203 -0
  52. package/dist/cjs/anyspend/react/components/checkout/VariablePricingInput.d.ts +17 -0
  53. package/dist/cjs/anyspend/react/components/checkout/VariablePricingInput.js +145 -0
  54. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +1 -1
  55. package/dist/cjs/anyspend/react/components/common/FeeDetailPanel.js +1 -1
  56. package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  57. package/dist/cjs/anyspend/react/components/common/OrderDetails.js +1 -1
  58. package/dist/cjs/anyspend/react/components/common/PointsDetailPanel.js +1 -1
  59. package/dist/cjs/anyspend/react/components/common/RecipientSelection.js +1 -1
  60. package/dist/cjs/anyspend/react/components/index.d.ts +1 -1
  61. package/dist/cjs/anyspend/react/hooks/index.d.ts +1 -0
  62. package/dist/cjs/anyspend/react/hooks/index.js +1 -0
  63. package/dist/cjs/anyspend/react/hooks/useAnyspendCreateOnrampOrder.d.ts +2 -0
  64. package/dist/cjs/anyspend/react/hooks/useAnyspendCreateOnrampOrder.js +14 -0
  65. package/dist/cjs/anyspend/react/hooks/useKycStatus.d.ts +47 -0
  66. package/dist/cjs/anyspend/react/hooks/useKycStatus.js +124 -0
  67. package/dist/cjs/anyspend/services/anyspend.d.ts +4 -1
  68. package/dist/cjs/anyspend/services/anyspend.js +3 -1
  69. package/dist/cjs/global-account/react/components/B3DynamicModal.js +1 -1
  70. package/dist/cjs/global-account/react/components/ManageAccount/BottomNavigation.js +3 -3
  71. package/dist/cjs/global-account/react/components/ManageAccount/HomeActions.js +1 -1
  72. package/dist/cjs/global-account/react/components/ManageAccount/channels/TelegramChannel.js +1 -1
  73. package/dist/cjs/global-account/react/components/SignInWithB3/SignIn.js +1 -1
  74. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +13 -5
  75. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Privy.js +1 -1
  76. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStep.d.ts +1 -1
  77. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStep.js +21 -24
  78. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStepCustom.js +1 -1
  79. package/dist/cjs/global-account/react/hooks/useAuth.js +1 -1
  80. package/dist/cjs/global-account/react/hooks/useAuthentication.d.ts +3 -1
  81. package/dist/cjs/global-account/react/hooks/useAuthentication.js +94 -24
  82. package/dist/cjs/global-account/react/hooks/useGetAllTWSigners.js +2 -1
  83. package/dist/cjs/global-account/react/stores/useModalStore.d.ts +4 -0
  84. package/dist/cjs/global-account/react/stores/useModalStore.js +2 -0
  85. package/dist/cjs/global-account/react/utils/createWagmiConfig.d.ts +18 -0
  86. package/dist/cjs/global-account/react/utils/createWagmiConfig.js +17 -0
  87. package/dist/esm/anyspend/platform/client.d.ts +35 -0
  88. package/dist/esm/anyspend/platform/client.js +153 -0
  89. package/dist/esm/anyspend/platform/errors.d.ts +38 -0
  90. package/dist/esm/anyspend/platform/errors.js +67 -0
  91. package/dist/esm/anyspend/platform/index.d.ts +87 -0
  92. package/dist/esm/anyspend/platform/index.js +75 -0
  93. package/dist/esm/anyspend/platform/resources/analytics.d.ts +7 -0
  94. package/dist/esm/anyspend/platform/resources/analytics.js +8 -0
  95. package/dist/esm/anyspend/platform/resources/checkout-sessions.d.ts +17 -0
  96. package/dist/esm/anyspend/platform/resources/checkout-sessions.js +23 -0
  97. package/dist/esm/anyspend/platform/resources/customers.d.ts +19 -0
  98. package/dist/esm/anyspend/platform/resources/customers.js +30 -0
  99. package/dist/esm/anyspend/platform/resources/discount-codes.d.ts +29 -0
  100. package/dist/esm/anyspend/platform/resources/discount-codes.js +27 -0
  101. package/dist/esm/anyspend/platform/resources/events.d.ts +14 -0
  102. package/dist/esm/anyspend/platform/resources/events.js +12 -0
  103. package/dist/esm/anyspend/platform/resources/notifications.d.ts +18 -0
  104. package/dist/esm/anyspend/platform/resources/notifications.js +23 -0
  105. package/dist/esm/anyspend/platform/resources/organization.d.ts +17 -0
  106. package/dist/esm/anyspend/platform/resources/organization.js +11 -0
  107. package/dist/esm/anyspend/platform/resources/payment-links.d.ts +21 -0
  108. package/dist/esm/anyspend/platform/resources/payment-links.js +45 -0
  109. package/dist/esm/anyspend/platform/resources/products.d.ts +27 -0
  110. package/dist/esm/anyspend/platform/resources/products.js +27 -0
  111. package/dist/esm/anyspend/platform/resources/transactions.d.ts +11 -0
  112. package/dist/esm/anyspend/platform/resources/transactions.js +21 -0
  113. package/dist/esm/anyspend/platform/resources/webhooks.d.ts +14 -0
  114. package/dist/esm/anyspend/platform/resources/webhooks.js +29 -0
  115. package/dist/esm/anyspend/platform/resources/widgets.d.ts +38 -0
  116. package/dist/esm/anyspend/platform/resources/widgets.js +27 -0
  117. package/dist/esm/anyspend/platform/types.d.ts +478 -0
  118. package/dist/esm/anyspend/platform/types.js +4 -0
  119. package/dist/esm/anyspend/platform/utils/idempotency.d.ts +4 -0
  120. package/dist/esm/anyspend/platform/utils/idempotency.js +14 -0
  121. package/dist/esm/anyspend/platform/utils/pagination.d.ts +12 -0
  122. package/dist/esm/anyspend/platform/utils/pagination.js +19 -0
  123. package/dist/esm/anyspend/react/components/AnySpend.d.ts +5 -1
  124. package/dist/esm/anyspend/react/components/AnySpend.js +128 -17
  125. package/dist/esm/anyspend/react/components/AnySpendCustom.js +4 -4
  126. package/dist/esm/anyspend/react/components/AnySpendCustomExactIn.js +2 -2
  127. package/dist/esm/anyspend/react/components/checkout/AnySpendCheckout.d.ts +14 -6
  128. package/dist/esm/anyspend/react/components/checkout/AnySpendCheckout.js +55 -8
  129. package/dist/esm/anyspend/react/components/checkout/AnySpendCheckoutTrigger.d.ts +3 -1
  130. package/dist/esm/anyspend/react/components/checkout/AnySpendCheckoutTrigger.js +2 -2
  131. package/dist/esm/anyspend/react/components/checkout/CheckoutPaymentPanel.d.ts +5 -1
  132. package/dist/esm/anyspend/react/components/checkout/CheckoutPaymentPanel.js +2 -2
  133. package/dist/esm/anyspend/react/components/checkout/CryptoPayPanel.js +1 -1
  134. package/dist/esm/anyspend/react/components/checkout/FiatCheckoutPanel.d.ts +5 -1
  135. package/dist/esm/anyspend/react/components/checkout/FiatCheckoutPanel.js +50 -18
  136. package/dist/esm/anyspend/react/components/checkout/KycGate.d.ts +11 -0
  137. package/dist/esm/anyspend/react/components/checkout/KycGate.js +167 -0
  138. package/dist/esm/anyspend/react/components/checkout/VariablePricingInput.d.ts +17 -0
  139. package/dist/esm/anyspend/react/components/checkout/VariablePricingInput.js +142 -0
  140. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +1 -1
  141. package/dist/esm/anyspend/react/components/common/FeeDetailPanel.js +1 -1
  142. package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.js +2 -2
  143. package/dist/esm/anyspend/react/components/common/OrderDetails.js +1 -1
  144. package/dist/esm/anyspend/react/components/common/PointsDetailPanel.js +1 -1
  145. package/dist/esm/anyspend/react/components/common/RecipientSelection.js +1 -1
  146. package/dist/esm/anyspend/react/components/index.d.ts +1 -1
  147. package/dist/esm/anyspend/react/hooks/index.d.ts +1 -0
  148. package/dist/esm/anyspend/react/hooks/index.js +1 -0
  149. package/dist/esm/anyspend/react/hooks/useAnyspendCreateOnrampOrder.d.ts +2 -0
  150. package/dist/esm/anyspend/react/hooks/useAnyspendCreateOnrampOrder.js +14 -0
  151. package/dist/esm/anyspend/react/hooks/useKycStatus.d.ts +47 -0
  152. package/dist/esm/anyspend/react/hooks/useKycStatus.js +117 -0
  153. package/dist/esm/anyspend/services/anyspend.d.ts +4 -1
  154. package/dist/esm/anyspend/services/anyspend.js +3 -1
  155. package/dist/esm/global-account/react/components/B3DynamicModal.js +1 -1
  156. package/dist/esm/global-account/react/components/ManageAccount/BottomNavigation.js +3 -3
  157. package/dist/esm/global-account/react/components/ManageAccount/HomeActions.js +1 -1
  158. package/dist/esm/global-account/react/components/ManageAccount/channels/TelegramChannel.js +1 -1
  159. package/dist/esm/global-account/react/components/SignInWithB3/SignIn.js +1 -1
  160. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +13 -5
  161. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Privy.js +1 -1
  162. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStep.d.ts +1 -1
  163. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStep.js +21 -24
  164. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStepCustom.js +1 -1
  165. package/dist/esm/global-account/react/hooks/useAuth.js +2 -2
  166. package/dist/esm/global-account/react/hooks/useAuthentication.d.ts +3 -1
  167. package/dist/esm/global-account/react/hooks/useAuthentication.js +94 -24
  168. package/dist/esm/global-account/react/hooks/useGetAllTWSigners.js +2 -1
  169. package/dist/esm/global-account/react/stores/useModalStore.d.ts +4 -0
  170. package/dist/esm/global-account/react/stores/useModalStore.js +2 -0
  171. package/dist/esm/global-account/react/utils/createWagmiConfig.d.ts +18 -0
  172. package/dist/esm/global-account/react/utils/createWagmiConfig.js +16 -0
  173. package/dist/styles/index.css +1 -1
  174. package/dist/types/anyspend/platform/client.d.ts +35 -0
  175. package/dist/types/anyspend/platform/errors.d.ts +38 -0
  176. package/dist/types/anyspend/platform/index.d.ts +87 -0
  177. package/dist/types/anyspend/platform/resources/analytics.d.ts +7 -0
  178. package/dist/types/anyspend/platform/resources/checkout-sessions.d.ts +17 -0
  179. package/dist/types/anyspend/platform/resources/customers.d.ts +19 -0
  180. package/dist/types/anyspend/platform/resources/discount-codes.d.ts +29 -0
  181. package/dist/types/anyspend/platform/resources/events.d.ts +14 -0
  182. package/dist/types/anyspend/platform/resources/notifications.d.ts +18 -0
  183. package/dist/types/anyspend/platform/resources/organization.d.ts +17 -0
  184. package/dist/types/anyspend/platform/resources/payment-links.d.ts +21 -0
  185. package/dist/types/anyspend/platform/resources/products.d.ts +27 -0
  186. package/dist/types/anyspend/platform/resources/transactions.d.ts +11 -0
  187. package/dist/types/anyspend/platform/resources/webhooks.d.ts +14 -0
  188. package/dist/types/anyspend/platform/resources/widgets.d.ts +38 -0
  189. package/dist/types/anyspend/platform/types.d.ts +478 -0
  190. package/dist/types/anyspend/platform/utils/idempotency.d.ts +4 -0
  191. package/dist/types/anyspend/platform/utils/pagination.d.ts +12 -0
  192. package/dist/types/anyspend/react/components/AnySpend.d.ts +5 -1
  193. package/dist/types/anyspend/react/components/checkout/AnySpendCheckout.d.ts +14 -6
  194. package/dist/types/anyspend/react/components/checkout/AnySpendCheckoutTrigger.d.ts +3 -1
  195. package/dist/types/anyspend/react/components/checkout/CheckoutPaymentPanel.d.ts +5 -1
  196. package/dist/types/anyspend/react/components/checkout/FiatCheckoutPanel.d.ts +5 -1
  197. package/dist/types/anyspend/react/components/checkout/KycGate.d.ts +11 -0
  198. package/dist/types/anyspend/react/components/checkout/VariablePricingInput.d.ts +17 -0
  199. package/dist/types/anyspend/react/components/index.d.ts +1 -1
  200. package/dist/types/anyspend/react/hooks/index.d.ts +1 -0
  201. package/dist/types/anyspend/react/hooks/useAnyspendCreateOnrampOrder.d.ts +2 -0
  202. package/dist/types/anyspend/react/hooks/useKycStatus.d.ts +47 -0
  203. package/dist/types/anyspend/services/anyspend.d.ts +4 -1
  204. package/dist/types/global-account/react/components/SignInWithB3/steps/LoginStep.d.ts +1 -1
  205. package/dist/types/global-account/react/hooks/useAuthentication.d.ts +3 -1
  206. package/dist/types/global-account/react/stores/useModalStore.d.ts +4 -0
  207. package/dist/types/global-account/react/utils/createWagmiConfig.d.ts +18 -0
  208. package/package.json +7 -1
  209. package/src/anyspend/docs/checkout-sessions.md +20 -3
  210. package/src/anyspend/platform/client.ts +198 -0
  211. package/src/anyspend/platform/errors.ts +92 -0
  212. package/src/anyspend/platform/index.ts +129 -0
  213. package/src/anyspend/platform/resources/analytics.ts +10 -0
  214. package/src/anyspend/platform/resources/checkout-sessions.ts +36 -0
  215. package/src/anyspend/platform/resources/customers.ts +54 -0
  216. package/src/anyspend/platform/resources/discount-codes.ts +63 -0
  217. package/src/anyspend/platform/resources/events.ts +22 -0
  218. package/src/anyspend/platform/resources/notifications.ts +37 -0
  219. package/src/anyspend/platform/resources/organization.ts +24 -0
  220. package/src/anyspend/platform/resources/payment-links.ts +74 -0
  221. package/src/anyspend/platform/resources/products.ts +59 -0
  222. package/src/anyspend/platform/resources/transactions.ts +33 -0
  223. package/src/anyspend/platform/resources/webhooks.ts +47 -0
  224. package/src/anyspend/platform/resources/widgets.ts +63 -0
  225. package/src/anyspend/platform/types.ts +532 -0
  226. package/src/anyspend/platform/utils/idempotency.ts +15 -0
  227. package/src/anyspend/platform/utils/pagination.ts +32 -0
  228. package/src/anyspend/react/components/AnySpend.tsx +152 -18
  229. package/src/anyspend/react/components/AnySpendCustom.tsx +4 -4
  230. package/src/anyspend/react/components/AnySpendCustomExactIn.tsx +2 -2
  231. package/src/anyspend/react/components/checkout/AnySpendCheckout.tsx +81 -18
  232. package/src/anyspend/react/components/checkout/AnySpendCheckoutTrigger.tsx +4 -0
  233. package/src/anyspend/react/components/checkout/CheckoutPaymentPanel.tsx +8 -0
  234. package/src/anyspend/react/components/checkout/CryptoPayPanel.tsx +4 -13
  235. package/src/anyspend/react/components/checkout/FiatCheckoutPanel.tsx +86 -17
  236. package/src/anyspend/react/components/checkout/KycGate.tsx +387 -0
  237. package/src/anyspend/react/components/checkout/VariablePricingInput.tsx +247 -0
  238. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +1 -1
  239. package/src/anyspend/react/components/common/FeeDetailPanel.tsx +1 -1
  240. package/src/anyspend/react/components/common/FiatPaymentMethod.tsx +2 -2
  241. package/src/anyspend/react/components/common/OrderDetails.tsx +1 -1
  242. package/src/anyspend/react/components/common/PointsDetailPanel.tsx +1 -1
  243. package/src/anyspend/react/components/common/RecipientSelection.tsx +1 -1
  244. package/src/anyspend/react/components/index.ts +1 -0
  245. package/src/anyspend/react/hooks/index.ts +1 -0
  246. package/src/anyspend/react/hooks/useAnyspendCreateOnrampOrder.ts +17 -0
  247. package/src/anyspend/react/hooks/useKycStatus.ts +150 -0
  248. package/src/anyspend/services/anyspend.ts +7 -0
  249. package/src/global-account/react/components/B3DynamicModal.tsx +0 -2
  250. package/src/global-account/react/components/ManageAccount/BottomNavigation.tsx +7 -7
  251. package/src/global-account/react/components/ManageAccount/HomeActions.tsx +2 -2
  252. package/src/global-account/react/components/ManageAccount/ManageAccount.tsx +7 -7
  253. package/src/global-account/react/components/ManageAccount/channels/TelegramChannel.tsx +1 -1
  254. package/src/global-account/react/components/SignInWithB3/SignIn.tsx +1 -1
  255. package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +13 -5
  256. package/src/global-account/react/components/SignInWithB3/SignInWithB3Privy.tsx +1 -1
  257. package/src/global-account/react/components/SignInWithB3/steps/LoginStep.tsx +35 -25
  258. package/src/global-account/react/components/SignInWithB3/steps/LoginStepCustom.tsx +1 -1
  259. package/src/global-account/react/hooks/useAuth.ts +2 -2
  260. package/src/global-account/react/hooks/useAuthentication.ts +92 -27
  261. package/src/global-account/react/hooks/useGetAllTWSigners.tsx +2 -1
  262. package/src/global-account/react/stores/useModalStore.ts +6 -0
  263. package/src/global-account/react/utils/createWagmiConfig.tsx +18 -0
@@ -17,8 +17,8 @@ type TabValue = "home" | "tokens" | "nfts" | "apps" | "settings" | "swap";
17
17
  // return (
18
18
  // <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
19
19
  // <path
20
- // fill-rule="evenodd"
21
- // clip-rule="evenodd"
20
+ // fillRule="evenodd"
21
+ // clipRule="evenodd"
22
22
  // d="M12.5227 1.33636C12.1804 1.24368 11.8196 1.24368 11.4773 1.33636C11.08 1.44395 10.7454 1.7066 10.4784 1.91623L10.4038 1.97465L3.54376 7.31012C3.16713 7.6024 2.83532 7.85991 2.58806 8.19421C2.37107 8.48759 2.20942 8.8181 2.11106 9.1695C1.99898 9.56992 1.99943 9.98993 1.99995 10.4667L2.00002 17.8385C2 18.3657 1.99998 18.8204 2.03059 19.195C2.06289 19.5904 2.1342 19.9836 2.327 20.362C2.61462 20.9264 3.07356 21.3854 3.63805 21.673C4.01643 21.8658 4.40964 21.9371 4.80499 21.9694C5.17956 22 5.63431 22 6.16145 22H17.8386C18.3657 22 18.8205 22 19.195 21.9694C19.5904 21.9371 19.9836 21.8658 20.362 21.673C20.9265 21.3854 21.3854 20.9264 21.673 20.362C21.8658 19.9836 21.9371 19.5904 21.9694 19.195C22.0001 18.8204 22 18.3657 22 17.8386L22.0001 10.4667C22.0006 9.98993 22.0011 9.56992 21.889 9.1695C21.7906 8.8181 21.629 8.48759 21.412 8.19421C21.1647 7.8599 20.8329 7.6024 20.4563 7.31011L13.5963 1.97465L13.5216 1.91623C13.2546 1.7066 12.9201 1.44395 12.5227 1.33636ZM8.00003 16C7.44775 16 7.00003 16.4477 7.00003 17C7.00003 17.5523 7.44775 18 8.00003 18H16C16.5523 18 17 17.5523 17 17C17 16.4477 16.5523 16 16 16H8.00003Z"
23
23
  // fill="currentColor"
24
24
  // />
@@ -32,9 +32,9 @@ type TabValue = "home" | "tokens" | "nfts" | "apps" | "settings" | "swap";
32
32
  // <path
33
33
  // d="M20.4533 12.893C20.1755 15.5029 18.6968 17.9487 16.2498 19.3614C12.1843 21.7086 6.98576 20.3157 4.63855 16.2502L4.38855 15.8172M3.5465 11.107C3.8243 8.49711 5.30309 6.05138 7.75007 4.63862C11.8156 2.29141 17.0141 3.68434 19.3613 7.74983L19.6113 8.18285M3.49353 18.0661L4.22558 15.334L6.95763 16.0661M17.0428 7.93401L19.7748 8.66606L20.5069 5.93401"
34
34
  // stroke="currentColor"
35
- // stroke-width="2"
36
- // stroke-linecap="round"
37
- // stroke-linejoin="round"
35
+ // strokeWidth="2"
36
+ // strokeLinecap="round"
37
+ // strokeLinejoin="round"
38
38
  // />
39
39
  // </svg>
40
40
  // );
@@ -44,8 +44,8 @@ type TabValue = "home" | "tokens" | "nfts" | "apps" | "settings" | "swap";
44
44
  // return (
45
45
  // <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
46
46
  // <path
47
- // fill-rule="evenodd"
48
- // clip-rule="evenodd"
47
+ // fillRule="evenodd"
48
+ // clipRule="evenodd"
49
49
  // d="M19.286 15.9606C19.2272 15.6362 19.2669 15.3016 19.4 15C19.5268 14.7042 19.7372 14.452 20.0055 14.2743C20.2738 14.0966 20.5882 14.0013 20.91 14H21C21.5304 14 22.0391 13.7893 22.4142 13.4142C22.7893 13.0391 23 12.5304 23 12C23 11.4696 22.7893 10.9609 22.4142 10.5858C22.0391 10.2107 21.5304 10 21 10H20.83C20.5082 9.99872 20.1938 9.90337 19.9255 9.72569C19.6572 9.54802 19.4468 9.29577 19.32 9V8.92C19.1869 8.61838 19.1472 8.28381 19.206 7.95941C19.2648 7.63502 19.4195 7.33568 19.65 7.1L19.71 7.04C19.896 6.85425 20.0435 6.63368 20.1441 6.39088C20.2448 6.14808 20.2966 5.88783 20.2966 5.625C20.2966 5.36217 20.2448 5.10192 20.1441 4.85912C20.0435 4.61632 19.896 4.39575 19.71 4.21C19.5243 4.02405 19.3037 3.87653 19.0609 3.77588C18.8181 3.67523 18.5578 3.62343 18.295 3.62343C18.0322 3.62343 17.7719 3.67523 17.5291 3.77588C17.2863 3.87653 17.0657 4.02405 16.88 4.21L16.82 4.27C16.5843 4.50054 16.285 4.65519 15.9606 4.714C15.6362 4.77282 15.3016 4.73312 15 4.6C14.7042 4.47324 14.452 4.26276 14.2743 3.99447C14.0966 3.72618 14.0013 3.41179 14 3.09V3C14 2.46957 13.7893 1.96086 13.4142 1.58579C13.0391 1.21071 12.5304 1 12 1C11.4696 1 10.9609 1.21071 10.5858 1.58579C10.2107 1.96086 10 2.46957 10 3V3.17C9.99872 3.49179 9.90337 3.80618 9.72569 4.07447C9.54802 4.34276 9.29577 4.55324 9 4.68H8.92C8.61838 4.81312 8.28381 4.85282 7.95941 4.794C7.63502 4.73519 7.33568 4.58054 7.1 4.35L7.04 4.29C6.85425 4.10405 6.63368 3.95653 6.39088 3.85588C6.14808 3.75523 5.88783 3.70343 5.625 3.70343C5.36217 3.70343 5.10192 3.75523 4.85912 3.85588C4.61632 3.95653 4.39575 4.10405 4.21 4.29C4.02405 4.47575 3.87653 4.69632 3.77588 4.93912C3.67523 5.18192 3.62343 5.44217 3.62343 5.705C3.62343 5.96783 3.67523 6.22808 3.77588 6.47088C3.87653 6.71368 4.02405 6.93425 4.21 7.12L4.27 7.18C4.50054 7.41568 4.65519 7.71502 4.714 8.03941C4.77282 8.36381 4.73312 8.69838 4.6 9C4.48572 9.31074 4.28059 9.5799 4.0113 9.77251C3.742 9.96512 3.42099 10.0723 3.09 10.08H3C2.46957 10.08 1.96086 10.2907 1.58579 10.6658C1.21071 11.0409 1 11.5496 1 12.08C1 12.6104 1.21071 13.1191 1.58579 13.4942C1.96086 13.8693 2.46957 14.08 3 14.08H3.17C3.49179 14.0813 3.80618 14.1766 4.07447 14.3543C4.34276 14.532 4.55324 14.7842 4.68 15.08C4.81312 15.3816 4.85282 15.7162 4.794 16.0406C4.73519 16.365 4.58054 16.6643 4.35 16.9L4.29 16.96C4.10405 17.1457 3.95653 17.3663 3.85588 17.6091C3.75523 17.8519 3.70343 18.1122 3.70343 18.375C3.70343 18.6378 3.75523 18.8981 3.85588 19.1409C3.95653 19.3837 4.10405 19.6043 4.29 19.79C4.47575 19.976 4.69632 20.1235 4.93912 20.2241C5.18192 20.3248 5.44217 20.3766 5.705 20.3766C5.96783 20.3766 6.22808 20.3248 6.47088 20.2241C6.71368 20.1235 6.93425 19.976 7.12 19.79L7.18 19.73C7.41568 19.4995 7.71502 19.3448 8.03941 19.286C8.36381 19.2272 8.69838 19.2669 9 19.4C9.31074 19.5143 9.5799 19.7194 9.77251 19.9887C9.96512 20.258 10.0723 20.579 10.08 20.91V21C10.08 21.5304 10.2907 22.0391 10.6658 22.4142C11.0409 22.7893 11.5496 23 12.08 23C12.6104 23 13.1191 22.7893 13.4942 22.4142C13.8693 22.0391 14.08 21.5304 14.08 21V20.83C14.0813 20.5082 14.1766 20.1938 14.3543 19.9255C14.532 19.6572 14.7842 19.4468 15.08 19.32C15.3816 19.1869 15.7162 19.1472 16.0406 19.206C16.365 19.2648 16.6643 19.4195 16.9 19.65L16.96 19.71C17.1457 19.896 17.3663 20.0435 17.6091 20.1441C17.8519 20.2448 18.1122 20.2966 18.375 20.2966C18.6378 20.2966 18.8981 20.2448 19.1409 20.1441C19.3837 20.0435 19.6043 19.896 19.79 19.71C19.976 19.5243 20.1235 19.3037 20.2241 19.0609C20.3248 18.8181 20.3766 18.5578 20.3766 18.295C20.3766 18.0322 20.3248 17.7719 20.2241 17.5291C20.1235 17.2863 19.976 17.0657 19.79 16.88L19.73 16.82C19.4995 16.5843 19.3448 16.285 19.286 15.9606ZM15 12C15 13.6569 13.6569 15 12 15C10.3431 15 9 13.6569 9 12C9 10.3431 10.3431 9 12 9C13.6569 9 15 10.3431 15 12Z"
50
50
  // fill="currentColor"
51
51
  // />
@@ -93,7 +93,7 @@ export const TelegramChannel = ({
93
93
 
94
94
  const icon = (
95
95
  <svg width="1000px" height="1000px" viewBox="0 0 1000 1000" version="1.1" xmlns="http://www.w3.org/2000/svg">
96
- <g id="Telegram" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
96
+ <g id="Telegram" stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
97
97
  <path
98
98
  d="M226.328419,494.722069 C372.088573,431.216685 469.284839,389.350049 517.917216,369.122161 C656.772535,311.36743 685.625481,301.334815 704.431427,301.003532 C708.567621,300.93067 717.815839,301.955743 723.806446,306.816707 C728.864797,310.92121 730.256552,316.46581 730.922551,320.357329 C731.588551,324.248848 732.417879,333.113828 731.758626,340.040666 C724.234007,419.102486 691.675104,610.964674 675.110982,699.515267 C668.10208,736.984342 654.301336,749.547532 640.940618,750.777006 C611.904684,753.448938 589.856115,731.588035 561.733393,713.153237 C517.726886,684.306416 492.866009,666.349181 450.150074,638.200013 C400.78442,605.66878 432.786119,587.789048 460.919462,558.568563 C468.282091,550.921423 596.21508,434.556479 598.691227,424.000355 C599.00091,422.680135 599.288312,417.758981 596.36474,415.160431 C593.441168,412.561881 589.126229,413.450484 586.012448,414.157198 C581.598758,415.158943 511.297793,461.625274 375.109553,553.556189 C355.154858,567.258623 337.080515,573.934908 320.886524,573.585046 C303.033948,573.199351 268.692754,563.490928 243.163606,555.192408 C211.851067,545.013936 186.964484,539.632504 189.131547,522.346309 C190.260287,513.342589 202.659244,504.134509 226.328419,494.722069 Z"
99
99
  id="Path-3"
@@ -44,7 +44,7 @@ export function SignIn(props: SignInWithB3Props) {
44
44
  const { data: walletImage } = useWalletImage(connectedEOAWallet?.id);
45
45
 
46
46
  const isMobile = useIsMobile();
47
- const { logout } = useAuthentication(partnerId);
47
+ const { logout } = useAuthentication(partnerId, { skipAutoConnect: true });
48
48
  const onDisconnect = async (): Promise<void> => {
49
49
  await logout();
50
50
  };
@@ -35,16 +35,23 @@ export function SignInWithB3Flow({
35
35
  signersEnabled = false,
36
36
  }: SignInWithB3ModalProps) {
37
37
  const { automaticallySetFirstEoa } = useB3Config();
38
- const { user, logout } = useAuthentication(partnerId);
38
+ // skipAutoConnect: this component intentionally logs out on mount to show a fresh login screen.
39
+ // AuthenticationProvider is the sole owner of useAutoConnect to avoid competing auth cycles.
40
+ const { user, logout } = useAuthentication(partnerId, { skipAutoConnect: true });
39
41
 
40
- // FIXME Logout before login to ensure a clean state
42
+ // Tracks whether the pre-login logout has finished.
43
+ // We must not render ConnectEmbed until logout (wallet disconnect) completes,
44
+ // otherwise the wallet state disrupts ConnectEmbed causing a blank modal.
45
+ const [readyToShowLogin, setReadyToShowLogin] = useState(source === "requestPermissions");
41
46
  const hasLoggedOutRef = useRef(false);
42
47
  useEffect(() => {
43
48
  if (hasLoggedOutRef.current) return;
44
49
  if (source !== "requestPermissions") {
45
50
  debug("Logging out before login");
46
- logout();
47
51
  hasLoggedOutRef.current = true;
52
+ logout().finally(() => {
53
+ setReadyToShowLogin(true);
54
+ });
48
55
  }
49
56
  }, [source, logout]);
50
57
 
@@ -275,8 +282,9 @@ export function SignInWithB3Flow({
275
282
  </LoginStepContainer>
276
283
  );
277
284
  } else if (step === "login") {
278
- // Show loading spinner
279
- if (isAuthenticating || (isFetchingSigners && step === "login") || source === "requestPermissions") {
285
+ // Show loading spinner while: authenticating, waiting for pre-login logout to finish,
286
+ // or fetching signers.
287
+ if (!readyToShowLogin || isAuthenticating || isFetchingSigners) {
280
288
  content = (
281
289
  <LoginStepContainer partnerId={partnerId}>
282
290
  <div className="my-8 flex min-h-[350px] items-center justify-center">
@@ -23,7 +23,7 @@ export function SignInWithB3Privy({ onSuccess, onError, chain }: SignInWithB3Pri
23
23
  const { isLoading, connectTw, fullToken } = useHandleConnectWithPrivy(chain, onSuccess);
24
24
  const setIsAuthenticating = useAuthStore(state => state.setIsAuthenticating);
25
25
  const setIsAuthenticated = useAuthStore(state => state.setIsAuthenticated);
26
- const { logout } = useAuthentication(partnerId);
26
+ const { logout } = useAuthentication(partnerId, { skipAutoConnect: true });
27
27
 
28
28
  debug("@@SignInWithB3Privy", {
29
29
  isLoading,
@@ -3,6 +3,7 @@ import { ecosystemWalletId } from "@b3dotfun/sdk/shared/constants";
3
3
  import { client } from "@b3dotfun/sdk/shared/utils/thirdweb";
4
4
  import { Chain } from "thirdweb";
5
5
  import { ConnectEmbed, darkTheme, lightTheme } from "thirdweb/react";
6
+ import { useMemo } from "react";
6
7
  import { Account, ecosystemWallet, SingleStepAuthArgsType } from "thirdweb/wallets";
7
8
  /**
8
9
  * Props for the LoginStep component
@@ -49,42 +50,40 @@ export function LoginStepContainer({ children, partnerId }: LoginStepContainerPr
49
50
  );
50
51
  }
51
52
 
52
- export function LoginStep({ onSuccess, chain }: LoginStepProps) {
53
- const { partnerId, theme } = useB3Config();
54
- const wallet = ecosystemWallet(ecosystemWalletId, {
55
- partnerId: partnerId,
56
- });
57
- const { onConnect } = useAuthentication(partnerId);
53
+ /** Inner component that only mounts when partnerId is a non-empty string.
54
+ * Keeps all hooks unconditional without calling useAuthentication(""). */
55
+ function LoginStepContent({
56
+ onSuccess,
57
+ chain,
58
+ partnerId,
59
+ theme,
60
+ }: {
61
+ onSuccess: (account: Account) => Promise<void>;
62
+ chain: Chain;
63
+ partnerId: string;
64
+ theme: string;
65
+ }) {
66
+ const wallet = useMemo(() => ecosystemWallet(ecosystemWalletId, { partnerId }), [partnerId]);
67
+ // skipAutoConnect: AuthenticationProvider already owns the auto-connect instance.
68
+ // Creating another here would cause a second authentication cycle (another 401 attempt)
69
+ // that makes the modal flash between spinner and blank before finally showing the login form.
70
+ const { onConnect } = useAuthentication(partnerId, { skipAutoConnect: true });
58
71
 
59
72
  return (
60
73
  <LoginStepContainer partnerId={partnerId}>
61
74
  <ConnectEmbed
62
75
  showThirdwebBranding={false}
76
+ autoConnect={false}
63
77
  client={client}
64
78
  chain={chain}
65
79
  wallets={[wallet]}
66
80
  theme={
67
81
  theme === "light"
68
- ? lightTheme({
69
- colors: {
70
- modalBg: "hsl(var(--b3-react-background))",
71
- },
72
- })
73
- : darkTheme({
74
- colors: {
75
- modalBg: "hsl(var(--b3-react-background))",
76
- },
77
- })
82
+ ? lightTheme({ colors: { modalBg: "hsl(var(--b3-react-background))" } })
83
+ : darkTheme({ colors: { modalBg: "hsl(var(--b3-react-background))" } })
78
84
  }
79
- style={{
80
- width: "100%",
81
- height: "100%",
82
- border: 0,
83
- }}
84
- header={{
85
- title: "Sign in with B3",
86
- titleIcon: "https://cdn.b3.fun/b3_logo.svg",
87
- }}
85
+ style={{ width: "100%", height: "100%", border: 0 }}
86
+ header={{ title: "Sign in with B3", titleIcon: "https://cdn.b3.fun/b3_logo.svg" }}
88
87
  className="b3-login-step"
89
88
  onConnect={async (wallet, allConnectedWallets) => {
90
89
  await onConnect(wallet, allConnectedWallets);
@@ -96,3 +95,14 @@ export function LoginStep({ onSuccess, chain }: LoginStepProps) {
96
95
  </LoginStepContainer>
97
96
  );
98
97
  }
98
+
99
+ export function LoginStep({ onSuccess, chain }: LoginStepProps) {
100
+ const { partnerId, theme } = useB3Config();
101
+
102
+ // partnerId may be undefined during the brief B3Provider hydration window.
103
+ // Return null rather than rendering ConnectEmbed with an invalid ecosystem
104
+ // wallet config (which causes a blank screen).
105
+ if (!partnerId) return null;
106
+
107
+ return <LoginStepContent onSuccess={onSuccess} chain={chain} partnerId={partnerId} theme={theme} />;
108
+ }
@@ -43,7 +43,7 @@ export function LoginStepCustom({
43
43
  const { connect } = useConnect(partnerId, chain);
44
44
  const setIsAuthenticating = useAuthStore(state => state.setIsAuthenticating);
45
45
  const setIsAuthenticated = useAuthStore(state => state.setIsAuthenticated);
46
- const { logout } = useAuthentication(partnerId);
46
+ const { logout } = useAuthentication(partnerId, { skipAutoConnect: true });
47
47
  const { connect: connectTW } = useConnectTW();
48
48
 
49
49
  // Split strategies into auth and wallet types
@@ -18,7 +18,7 @@ import { Wallet, ecosystemWallet } from "thirdweb/wallets";
18
18
  import { preAuthenticate } from "thirdweb/wallets/in-app";
19
19
  import { useAccount, useConnect, useSwitchAccount } from "wagmi";
20
20
  import { LocalSDKContext } from "../components/B3Provider/LocalSDKProvider";
21
- import { createWagmiConfig } from "../utils/createWagmiConfig";
21
+ import { getCachedWagmiConfig } from "../utils/createWagmiConfig";
22
22
  import { useSearchParam } from "./useSearchParamsSSR";
23
23
  import { useUserQuery } from "./useUserQuery";
24
24
 
@@ -47,7 +47,7 @@ export function useAuth() {
47
47
  const useAutoConnectLoadingPrevious = useRef(false);
48
48
  const referralCode = useSearchParam("referralCode");
49
49
  const { partnerId } = useB3Config();
50
- const wagmiConfig = createWagmiConfig({ partnerId });
50
+ const wagmiConfig = getCachedWagmiConfig({ partnerId });
51
51
  const { connect } = useConnect();
52
52
  const activeWagmiAccount = useAccount();
53
53
  const { switchAccount } = useSwitchAccount();
@@ -24,11 +24,26 @@ import { useUserQuery } from "./useUserQuery";
24
24
 
25
25
  const debug = debugB3React("useAuthentication");
26
26
 
27
- export function useAuthentication(partnerId: string) {
27
+ export function useAuthentication(partnerId: string, { skipAutoConnect = false }: { skipAutoConnect?: boolean } = {}) {
28
28
  const { onConnectCallback, onLogoutCallback } = useContext(LocalSDKContext);
29
29
  const { disconnect } = useDisconnect();
30
30
  const wallets = useConnectedWallets();
31
+ // Keep refs so logout() always disconnects current wallets, not stale closure values.
32
+ // autoConnectCore captures onConnect (and thus logout) from the first render before wallets
33
+ // are populated — without these refs, logout() would capture wallets=[] and disconnect nothing.
34
+ const walletsRef = useRef(wallets);
35
+ useEffect(() => {
36
+ walletsRef.current = wallets;
37
+ }, [wallets]);
31
38
  const activeWallet = useActiveWallet();
39
+ // Track the active wallet by ref so logout() can disconnect the exact reference
40
+ // stored in thirdweb's activeWalletStore. walletsRef.current (from useConnectedWallets)
41
+ // may hold a different object reference than what thirdweb considers "active",
42
+ // causing the identity check in onWalletDisconnect to fail silently.
43
+ const activeWalletRef = useRef(activeWallet);
44
+ useEffect(() => {
45
+ activeWalletRef.current = activeWallet;
46
+ }, [activeWallet]);
32
47
  const isAuthenticated = useAuthStore(state => state.isAuthenticated);
33
48
  const setIsAuthenticated = useAuthStore(state => state.setIsAuthenticated);
34
49
  const setIsConnected = useAuthStore(state => state.setIsConnected);
@@ -153,23 +168,39 @@ export function useAuthentication(partnerId: string) {
153
168
 
154
169
  const logout = useCallback(
155
170
  async (callback?: () => void) => {
156
- if (activeWallet) {
157
- debug("@@logout:activeWallet", activeWallet);
158
- disconnect(activeWallet);
159
- debug("@@logout:activeWallet", activeWallet);
160
- }
161
-
162
- // Log out of each wallet
163
- wallets.forEach(wallet => {
164
- console.log("@@logging out", wallet);
165
- disconnect(wallet);
171
+ // Disconnect ecosystem/smart wallets from the connected wallets list.
172
+ // EOA wallets (MetaMask, Coinbase Wallet) are left in the list so they can
173
+ // auto-reconnect on next login without requiring a new approval popup.
174
+ // Use walletsRef.current (not the stale closure value) so we always get current wallets —
175
+ // autoConnectCore captures logout from the first render when wallets is still [].
176
+ walletsRef.current.forEach(wallet => {
177
+ debug("@@logout:wallet", wallet.id);
178
+ if (wallet.id.startsWith("ecosystem.") || wallet.id === "smart") {
179
+ disconnect(wallet);
180
+ }
166
181
  });
167
182
 
168
- // Delete localStorage thirdweb:connected-wallet-ids
169
- // https://npc-labs.slack.com/archives/C070E6HNG85/p1750185115273099
183
+ // Unconditionally disconnect the active wallet to clear thirdweb's activeAccountStore.
184
+ // This is separate from the loop above: even if the active wallet is an EOA (e.g.
185
+ // Coinbase Wallet), we must disconnect it so activeAccount becomes undefined.
186
+ // Without this, ConnectEmbed renders show=false (blank modal) because it checks
187
+ // show = !activeAccount. Note: thirdweb's disconnect() is idempotent — calling it
188
+ // on an already-disconnected wallet (from the loop above) is a no-op.
189
+ // We use the exact reference from activeWalletRef because thirdweb's
190
+ // onWalletDisconnect uses strict identity (===) to decide whether to clear
191
+ // activeAccountStore.
192
+ // Tradeoff: EOA wallets (MetaMask, Coinbase Wallet) will be removed from
193
+ // connectedWallets and require a new approval popup on next login.
194
+ // This is acceptable because a working login form is more critical than
195
+ // skipping one wallet approval step.
196
+ if (activeWalletRef.current) {
197
+ debug("@@logout:disconnecting active wallet", activeWalletRef.current.id);
198
+ disconnect(activeWalletRef.current);
199
+ }
200
+
201
+ // Clear user-specific storage (auth tokens, cached user data).
202
+ // Thirdweb's wallet connection state is managed separately via disconnect() above.
170
203
  if (typeof localStorage !== "undefined") {
171
- localStorage.removeItem("thirdweb:connected-wallet-ids");
172
- localStorage.removeItem("wagmi.store");
173
204
  localStorage.removeItem("lastAuthProvider");
174
205
  localStorage.removeItem("b3-user");
175
206
  }
@@ -179,6 +210,9 @@ export function useAuthentication(partnerId: string) {
179
210
 
180
211
  setIsAuthenticated(false);
181
212
  setIsConnected(false);
213
+ // Reset isAuthenticating so any in-flight page-load auto-connect that set it true
214
+ // does not keep the login modal spinner stuck after logout() is called.
215
+ setIsAuthenticating(false);
182
216
  setUser();
183
217
  callback?.();
184
218
 
@@ -186,34 +220,57 @@ export function useAuthentication(partnerId: string) {
186
220
  await onLogoutCallback();
187
221
  }
188
222
  },
189
- [activeWallet, disconnect, wallets, setIsAuthenticated, setUser, setIsConnected, onLogoutCallback],
223
+ // wallets intentionally omitted we use walletsRef.current so this callback stays stable
224
+ // and always operates on current wallets even when captured in stale closures.
225
+ // eslint-disable-next-line react-hooks/exhaustive-deps
226
+ [disconnect, setIsAuthenticated, setIsAuthenticating, setUser, setIsConnected, onLogoutCallback],
190
227
  );
191
228
 
192
229
  const onConnect = useCallback(
193
230
  async (_walleAutoConnectedWith: Wallet, allConnectedWallets: Wallet[]) => {
194
231
  debug("@@useAuthentication:onConnect", { _walleAutoConnectedWith, allConnectedWallets });
232
+ const connectedEcosystemWallet = allConnectedWallets.find(w => w.id.startsWith("ecosystem."));
195
233
  try {
196
- const wallet = allConnectedWallets.find(wallet => wallet.id.startsWith("ecosystem."));
197
-
198
- if (!wallet) {
234
+ if (!connectedEcosystemWallet) {
199
235
  throw new Error("No smart wallet found during auto-connect");
200
236
  }
201
237
 
202
- debug("@@useAuthentication:onConnect", { wallet });
238
+ debug("@@useAuthentication:onConnect", { wallet: connectedEcosystemWallet });
203
239
  setHasStartedConnecting(true);
204
240
  setIsConnected(true);
205
241
  setIsAuthenticating(true);
206
- await setActiveWallet(wallet);
207
- const userAuth = await authenticateUser(wallet);
242
+ await setActiveWallet(connectedEcosystemWallet);
243
+ const userAuth = await authenticateUser(connectedEcosystemWallet);
208
244
 
209
245
  if (userAuth && onConnectCallback) {
210
- await onConnectCallback(wallet, userAuth.accessToken);
246
+ await onConnectCallback(connectedEcosystemWallet, userAuth.accessToken);
211
247
  }
212
248
  } catch (error) {
213
249
  debug("@@useAuthentication:onConnect:failed", { error });
214
250
  setIsAuthenticated(false);
215
251
  setUser(undefined);
216
-
252
+ // Directly disconnect the ecosystem wallet we set active above.
253
+ // We can't rely on logout()'s activeWalletRef here because it's updated
254
+ // via useEffect (deferred until after paint), but this callback may run
255
+ // entirely within a single React commit cycle — before the ref updates.
256
+ // Note: logout() below may also call disconnect() on the same wallet via
257
+ // activeWalletRef — thirdweb's disconnect() is idempotent so this is safe.
258
+ if (connectedEcosystemWallet) {
259
+ debug("@@useAuthentication:onConnect:disconnecting ecosystem wallet", connectedEcosystemWallet.id);
260
+ disconnect(connectedEcosystemWallet);
261
+ }
262
+ // Also disconnect the wallet that autoConnectCore set as active.
263
+ // When only a non-ecosystem wallet (e.g. MetaMask) auto-reconnects,
264
+ // connectedEcosystemWallet is undefined, so the block above is skipped.
265
+ // But autoConnectCore already set this wallet as thirdweb's activeWallet,
266
+ // leaving activeAccount set. ConnectEmbed checks show = !activeAccount,
267
+ // so if we don't clear it, the login form renders blank.
268
+ // Uses object identity (===) which is safe because thirdweb returns
269
+ // stable references for connected wallet instances.
270
+ if (_walleAutoConnectedWith && _walleAutoConnectedWith !== connectedEcosystemWallet) {
271
+ debug("@@useAuthentication:onConnect:disconnecting auto-connected wallet", _walleAutoConnectedWith.id);
272
+ disconnect(_walleAutoConnectedWith);
273
+ }
217
274
  await logout();
218
275
  } finally {
219
276
  setIsAuthenticating(false);
@@ -229,6 +286,7 @@ export function useAuthentication(partnerId: string) {
229
286
  isAuthenticated,
230
287
  isAuthenticating,
231
288
  isConnected,
289
+ disconnect,
232
290
  setHasStartedConnecting,
233
291
  setIsConnected,
234
292
  setIsAuthenticating,
@@ -243,9 +301,13 @@ export function useAuthentication(partnerId: string) {
243
301
 
244
302
  const { isLoading: useAutoConnectLoading } = useAutoConnect({
245
303
  client,
246
- wallets: [wallet],
304
+ // When skipAutoConnect is true (e.g. LoginStepContent, SignInWithB3Flow), pass an empty
305
+ // wallets array so useAutoConnect completes immediately without firing onConnect.
306
+ // Only AuthenticationProvider (the primary instance) should own auto-connect.
307
+ wallets: skipAutoConnect ? [] : [wallet],
247
308
  onConnect,
248
309
  onTimeout: () => {
310
+ if (skipAutoConnect) return;
249
311
  logout().catch(error => {
250
312
  debug("@@useAuthentication:logout on timeout failed", { error });
251
313
  });
@@ -253,14 +315,17 @@ export function useAuthentication(partnerId: string) {
253
315
  });
254
316
 
255
317
  /**
256
- * useAutoConnectLoading starts as false
318
+ * useAutoConnectLoading starts as false.
319
+ * Only the primary (non-skip) instance manages isAuthenticating via this effect
320
+ * to avoid race conditions when multiple useAuthentication instances are mounted.
257
321
  */
258
322
  useEffect(() => {
323
+ if (skipAutoConnect) return;
259
324
  if (!useAutoConnectLoading && useAutoConnectLoadingPrevious.current && !hasStartedConnecting) {
260
325
  setIsAuthenticating(false);
261
326
  }
262
327
  useAutoConnectLoadingPrevious.current = useAutoConnectLoading;
263
- }, [useAutoConnectLoading, hasStartedConnecting, setIsAuthenticating]);
328
+ }, [useAutoConnectLoading, hasStartedConnecting, setIsAuthenticating, skipAutoConnect]);
264
329
 
265
330
  const isReady = isAuthenticated && !isAuthenticating;
266
331
 
@@ -130,7 +130,8 @@ export function useGetAllTWSigners({ chain, accountAddress, queryOptions }: UseG
130
130
  });
131
131
  return result;
132
132
  },
133
- enabled: Boolean(chain && accountAddress),
133
+ // Respect queryOptions.enabled if explicitly set (e.g. signersEnabled=false from SignInWithB3Flow)
134
+ enabled: queryOptions?.enabled !== false && Boolean(chain && accountAddress),
134
135
  refetchOnMount: true,
135
136
  refetchOnWindowFocus: true,
136
137
  refetchOnReconnect: true,
@@ -712,6 +712,10 @@ interface ModalState {
712
712
  setLinkingState: (isLinking: boolean, method?: string | null) => void;
713
713
  /** Function to update closable property of current content without adding to history */
714
714
  setClosable: (closable: boolean) => void;
715
+ /** Whether a third-party iframe (e.g. Persona KYC) is currently active over the modal */
716
+ personaActive: boolean;
717
+ /** Function to mark a third-party iframe as active/inactive */
718
+ setPersonaActive: (active: boolean) => void;
715
719
  }
716
720
 
717
721
  /**
@@ -755,4 +759,6 @@ export const useModalStore = create<ModalState>(set => ({
755
759
  set(state => ({
756
760
  contentType: state.contentType ? { ...state.contentType, closable } : null,
757
761
  })),
762
+ personaActive: false,
763
+ setPersonaActive: (active: boolean) => set({ personaActive: active }),
758
764
  }));
@@ -38,3 +38,21 @@ export function createWagmiConfig(options: CreateWagmiConfigOptions) {
38
38
  connectors: finalConnectors,
39
39
  });
40
40
  }
41
+
42
+ /** Module-level cache — wagmi configs must not be recreated on every render. */
43
+ const wagmiConfigCache = new Map<string, ReturnType<typeof createWagmiConfig>>();
44
+
45
+ /**
46
+ * Returns a cached wagmi config for the given partnerId.
47
+ * Use this instead of calling createWagmiConfig() directly inside React components or hooks
48
+ * to avoid registering duplicate EventEmitter listeners on every render.
49
+ */
50
+ export function getCachedWagmiConfig(options: CreateWagmiConfigOptions) {
51
+ const key = options.partnerId;
52
+ let config = wagmiConfigCache.get(key);
53
+ if (!config) {
54
+ config = createWagmiConfig(options);
55
+ wagmiConfigCache.set(key, config);
56
+ }
57
+ return config;
58
+ }