@b3dotfun/sdk 0.0.83-test.0 → 0.0.83

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 (68) hide show
  1. package/dist/cjs/anyspend/react/components/AnySpend.js +0 -3
  2. package/dist/cjs/anyspend/react/components/AnySpendCollectorClubPurchase.js +1 -1
  3. package/dist/cjs/anyspend/react/components/AnySpendCustom.js +0 -3
  4. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +47 -177
  5. package/dist/cjs/anyspend/react/hooks/useAnyspendFlow.js +0 -3
  6. package/dist/cjs/anyspend/utils/chain.d.ts +38 -0
  7. package/dist/cjs/anyspend/utils/chain.js +22 -1
  8. package/dist/cjs/anyspend/utils/token.d.ts +3 -0
  9. package/dist/cjs/anyspend/utils/token.js +17 -1
  10. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +12 -57
  11. package/dist/cjs/global-account/react/hooks/index.d.ts +0 -1
  12. package/dist/cjs/global-account/react/hooks/index.js +1 -3
  13. package/dist/cjs/global-account/react/hooks/useAuthentication.d.ts +2 -2
  14. package/dist/cjs/global-account/react/hooks/useAuthentication.js +63 -72
  15. package/dist/cjs/global-account/react/hooks/useTWAuth.d.ts +0 -3
  16. package/dist/cjs/global-account/react/hooks/useTWAuth.js +0 -8
  17. package/dist/cjs/global-account/react/hooks/useTurnkeyAuth.js +24 -54
  18. package/dist/cjs/global-account/react/hooks/useUserQuery.d.ts +1 -1
  19. package/dist/esm/anyspend/react/components/AnySpend.js +0 -3
  20. package/dist/esm/anyspend/react/components/AnySpendCollectorClubPurchase.js +1 -1
  21. package/dist/esm/anyspend/react/components/AnySpendCustom.js +0 -3
  22. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +45 -175
  23. package/dist/esm/anyspend/react/hooks/useAnyspendFlow.js +0 -3
  24. package/dist/esm/anyspend/utils/chain.d.ts +38 -0
  25. package/dist/esm/anyspend/utils/chain.js +22 -1
  26. package/dist/esm/anyspend/utils/token.d.ts +3 -0
  27. package/dist/esm/anyspend/utils/token.js +15 -1
  28. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +12 -57
  29. package/dist/esm/global-account/react/hooks/index.d.ts +0 -1
  30. package/dist/esm/global-account/react/hooks/index.js +0 -1
  31. package/dist/esm/global-account/react/hooks/useAuthentication.d.ts +2 -2
  32. package/dist/esm/global-account/react/hooks/useAuthentication.js +63 -72
  33. package/dist/esm/global-account/react/hooks/useTWAuth.d.ts +0 -3
  34. package/dist/esm/global-account/react/hooks/useTWAuth.js +0 -8
  35. package/dist/esm/global-account/react/hooks/useTurnkeyAuth.js +24 -54
  36. package/dist/esm/global-account/react/hooks/useUserQuery.d.ts +1 -1
  37. package/dist/styles/index.css +1 -1
  38. package/dist/types/anyspend/utils/chain.d.ts +38 -0
  39. package/dist/types/anyspend/utils/token.d.ts +3 -0
  40. package/dist/types/global-account/react/hooks/index.d.ts +0 -1
  41. package/dist/types/global-account/react/hooks/useAuthentication.d.ts +2 -2
  42. package/dist/types/global-account/react/hooks/useTWAuth.d.ts +0 -3
  43. package/dist/types/global-account/react/hooks/useUserQuery.d.ts +1 -1
  44. package/package.json +1 -1
  45. package/src/anyspend/react/components/AnySpend.tsx +0 -4
  46. package/src/anyspend/react/components/AnySpendCollectorClubPurchase.tsx +1 -1
  47. package/src/anyspend/react/components/AnySpendCustom.tsx +0 -4
  48. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +22 -253
  49. package/src/anyspend/react/hooks/useAnyspendFlow.ts +0 -4
  50. package/src/anyspend/utils/chain.ts +31 -1
  51. package/src/anyspend/utils/token.ts +17 -1
  52. package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +22 -77
  53. package/src/global-account/react/hooks/index.ts +0 -1
  54. package/src/global-account/react/hooks/useAuthentication.ts +85 -88
  55. package/src/global-account/react/hooks/useTWAuth.tsx +0 -10
  56. package/src/global-account/react/hooks/useTurnkeyAuth.ts +26 -59
  57. package/dist/cjs/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.d.ts +0 -10
  58. package/dist/cjs/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.js +0 -73
  59. package/dist/cjs/global-account/react/hooks/useAuth.d.ts +0 -76
  60. package/dist/cjs/global-account/react/hooks/useAuth.js +0 -338
  61. package/dist/esm/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.d.ts +0 -10
  62. package/dist/esm/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.js +0 -70
  63. package/dist/esm/global-account/react/hooks/useAuth.d.ts +0 -76
  64. package/dist/esm/global-account/react/hooks/useAuth.js +0 -332
  65. package/dist/types/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.d.ts +0 -10
  66. package/dist/types/global-account/react/hooks/useAuth.d.ts +0 -76
  67. package/src/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.ts +0 -80
  68. package/src/global-account/react/hooks/useAuth.ts +0 -380
@@ -33,7 +33,7 @@ import { encodeFunctionData } from "viem";
33
33
  import { AnySpendCustom } from "./AnySpendCustom";
34
34
 
35
35
  // Collector Club Shop contract on Base
36
- const CC_SHOP_ADDRESS = "0x23887D10c81118A9a2E3Af59C423e2f4ee4Cc7Cf";
36
+ const CC_SHOP_ADDRESS = "0x47366E64E4917dd4DdC04Fb9DC507c1dD2b87294";
37
37
  const BASE_CHAIN_ID = 8453;
38
38
 
39
39
  // ABI for buyPacksFor function only
@@ -44,7 +44,6 @@ import { motion } from "motion/react";
44
44
  import React, { useCallback, useEffect, useMemo, useState } from "react";
45
45
 
46
46
  import { base } from "viem/chains";
47
- import { useAutoSetActiveWalletFromWagmi } from "../hooks/useAutoSetActiveWalletFromWagmi";
48
47
  import { useCryptoPaymentMethodState } from "../hooks/useCryptoPaymentMethodState";
49
48
  import { useRecipientAddressState } from "../hooks/useRecipientAddressState";
50
49
  import { AnySpendFingerprintWrapper, getFingerprintConfig } from "./AnySpendFingerprintWrapper";
@@ -247,9 +246,6 @@ function AnySpendCustomInner({
247
246
  const searchParams = useSearchParamsSSR();
248
247
  const router = useRouter();
249
248
 
250
- // Auto-set active wallet from wagmi
251
- useAutoSetActiveWalletFromWagmi();
252
-
253
249
  const [activePanel, setActivePanel] = useState<PanelView>(
254
250
  loadOrder ? PanelView.ORDER_DETAILS : PanelView.CONFIRM_ORDER,
255
251
  );
@@ -4,13 +4,8 @@ import { toast, useAccountWallet, WalletImage } from "@b3dotfun/sdk/global-accou
4
4
  import { cn } from "@b3dotfun/sdk/shared/utils/cn";
5
5
  import { shortenAddress } from "@b3dotfun/sdk/shared/utils/formatAddress";
6
6
  import { client } from "@b3dotfun/sdk/shared/utils/thirdweb";
7
- import { WalletCoinbase, WalletMetamask, WalletRainbow, WalletWalletConnect } from "@web3icons/react";
8
7
  import { ChevronLeft, ChevronRightCircle, Wallet, X, ZapIcon } from "lucide-react";
9
- import { useState } from "react";
10
- import { createPortal } from "react-dom";
11
- import { useSetActiveWallet, useWalletInfo } from "thirdweb/react";
12
- import { createWallet, WalletId } from "thirdweb/wallets";
13
- import { useAccount, useConnect, useDisconnect, useWalletClient } from "wagmi";
8
+ import { useConnectModal, useDisconnect, useWalletInfo } from "thirdweb/react";
14
9
  import { useConnectedWalletDisplay } from "../../hooks/useConnectedWalletDisplay";
15
10
 
16
11
  export enum CryptoPaymentMethodType {
@@ -35,128 +30,32 @@ export function CryptoPaymentMethod({
35
30
  onBack,
36
31
  onSelectPaymentMethod,
37
32
  }: CryptoPaymentMethodProps) {
38
- const { connectedEOAWallet: connectedEOAWallet, connectedSmartWallet: connectedSmartWallet } = useAccountWallet();
39
- const { connector, address } = useAccount();
40
- const { connect, connectors, isPending } = useConnect();
33
+ const { connectedEOAWallet, connectedSmartWallet } = useAccountWallet();
41
34
  const { disconnect } = useDisconnect();
42
- const { data: walletClient } = useWalletClient();
43
- const [showWalletModal, setShowWalletModal] = useState(false);
44
- const setActiveWallet = useSetActiveWallet();
35
+ const { connect: openConnectModal } = useConnectModal();
45
36
  const { data: eoaWalletInfo } = useWalletInfo(connectedEOAWallet?.id);
46
37
 
47
- const isConnected = !!connectedEOAWallet;
48
38
  const globalAddress = connectedSmartWallet?.getAccount()?.address;
49
39
 
50
40
  // Use custom hook to determine wallet display logic
51
- const { shouldShowConnectedEOA, shouldShowWagmiWallet } = useConnectedWalletDisplay(selectedPaymentMethod);
52
- console.log("shouldShowWagmiWallet :", shouldShowWagmiWallet);
41
+ const { shouldShowConnectedEOA } = useConnectedWalletDisplay(selectedPaymentMethod);
53
42
 
54
- // Map wagmi connector names to thirdweb wallet IDs
55
- const getThirdwebWalletId = (connectorName: string): WalletId | null => {
56
- const walletMap: Record<string, WalletId> = {
57
- MetaMask: "io.metamask",
58
- "Coinbase Wallet": "com.coinbase.wallet",
59
- Rainbow: "me.rainbow",
60
- WalletConnect: "walletConnect",
61
- Phantom: "app.phantom",
62
- };
63
- return walletMap[connectorName] || null;
64
- };
65
-
66
- // Create thirdweb wallet from wagmi connector
67
- const createThirdwebWalletFromConnector = async (connectorName: string) => {
68
- const walletId = getThirdwebWalletId(connectorName);
69
- if (!walletId) {
70
- console.warn(`No thirdweb wallet ID found for connector: ${connectorName}`);
71
- return null;
72
- }
73
-
74
- try {
75
- const thirdwebWallet = createWallet(walletId);
76
- // Connect the wallet to sync with the existing wagmi connection
77
- await thirdwebWallet.connect({ client });
78
- return thirdwebWallet;
79
- } catch (error) {
80
- console.error(`Failed to create thirdweb wallet for ${connectorName}:`, error);
81
- return null;
82
- }
83
- };
84
-
85
- // Define available wallet connectors
86
- const availableConnectors = connectors.filter(connector =>
87
- ["MetaMask", "WalletConnect", "Coinbase Wallet", "Rainbow", "Phantom"].includes(connector.name),
88
- );
89
-
90
- // Define wallet options with icons and info
91
- const walletOptions = [
92
- {
93
- id: "metamask",
94
- name: "MetaMask",
95
- icon: <WalletMetamask size={48} />,
96
- description: "Connect using MetaMask browser extension",
97
- connector: availableConnectors.find(c => c.name === "MetaMask"),
98
- },
99
- {
100
- id: "coinbase",
101
- name: "Coinbase Wallet",
102
- icon: <WalletCoinbase size={48} />,
103
- description: "Connect using Coinbase Wallet",
104
- connector: availableConnectors.find(c => c.name === "Coinbase Wallet"),
105
- },
106
- {
107
- id: "rainbow",
108
- name: "Rainbow",
109
- icon: <WalletRainbow size={48} />,
110
- description: "Connect using Rainbow wallet",
111
- connector: availableConnectors.find(c => c.name === "Rainbow"),
112
- },
113
- {
114
- id: "walletconnect",
115
- name: "WalletConnect",
116
- icon: <WalletWalletConnect size={48} />,
117
- description: "Connect using WalletConnect protocol",
118
- connector: availableConnectors.find(c => c.name === "WalletConnect"),
119
- },
120
- ].filter(wallet => wallet.connector); // Only show wallets that have available connectors
121
-
122
- // Reset modal state when closing
123
- const handleCloseModal = () => {
124
- setShowWalletModal(false);
125
- };
126
-
127
- // Function to request wallet permissions for specific wallet
128
- const requestWalletPermissions = async (walletConnector?: any) => {
43
+ // Handle wallet connection using thirdweb modal
44
+ const handleConnectWallet = async () => {
129
45
  try {
130
- // If a specific wallet connector is provided and it's different from current
131
- if (walletConnector && connector?.name !== walletConnector.name) {
132
- // Disconnect current and connect to the selected wallet
133
- // if (isConnected) {
134
- // disconnect();
135
- // // Small delay to ensure disconnection
136
- // await new Promise(resolve => setTimeout(resolve, 100));
137
- // }
138
- await connect({ connector: walletConnector });
139
- setSelectedPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
140
- onSelectPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
141
- toast.success(`Connected to ${walletConnector.name}`);
142
- return;
46
+ // Disconnect current wallet before connecting a new one
47
+ if (connectedEOAWallet) {
48
+ await disconnect(connectedEOAWallet);
143
49
  }
144
-
145
- // If same wallet or no specific wallet, request permissions for account switching
146
- if (walletClient && "request" in walletClient) {
147
- await walletClient.request({
148
- method: "wallet_requestPermissions",
149
- params: [{ eth_accounts: {} }],
150
- });
151
- toast.success("Account selection completed");
50
+ const wallet = await openConnectModal({ client, setActive: false });
51
+ if (wallet) {
52
+ // setActiveWallet(wallet);
152
53
  setSelectedPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
153
54
  onSelectPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
154
- } else {
155
- // Fallback: show modal for manual wallet selection
156
- setShowWalletModal(true);
55
+ toast.success("Wallet connected");
157
56
  }
158
57
  } catch (error) {
159
- console.error("Failed to request wallet permissions:", error);
58
+ console.error("Failed to connect wallet:", error);
160
59
  if (error && typeof error === "object" && "message" in error) {
161
60
  const errorMessage = (error as any).message.toLowerCase();
162
61
  if (
@@ -164,12 +63,10 @@ export function CryptoPaymentMethod({
164
63
  errorMessage.includes("denied") ||
165
64
  errorMessage.includes("cancelled")
166
65
  ) {
167
- toast.error("Account selection cancelled");
66
+ // User cancelled - no toast needed
168
67
  } else {
169
- toast.error("Failed to open account selection");
68
+ toast.error("Failed to connect wallet");
170
69
  }
171
- } else {
172
- toast.error("Failed to open account selection");
173
70
  }
174
71
  }
175
72
  };
@@ -236,7 +133,7 @@ export function CryptoPaymentMethod({
236
133
  {/* Payment Methods */}
237
134
  <div className="crypto-payment-methods flex flex-col gap-4">
238
135
  {/* Installed Wallets Section */}
239
- {(shouldShowConnectedEOA || shouldShowWagmiWallet || globalAddress) && (
136
+ {(shouldShowConnectedEOA || globalAddress) && (
240
137
  <div className="installed-wallets">
241
138
  <h3 className="text-as-primary/80 mb-3 text-sm font-medium">Connected wallets</h3>
242
139
  <div className="space-y-2">
@@ -247,10 +144,7 @@ export function CryptoPaymentMethod({
247
144
  onClick={() => {
248
145
  setSelectedPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
249
146
  onSelectPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
250
- if (connectedEOAWallet) {
251
- setActiveWallet(connectedEOAWallet);
252
- }
253
- toast.success(`Selected ${eoaWalletInfo?.name || connector?.name || "wallet"}`);
147
+ toast.success(`Selected ${eoaWalletInfo?.name || "wallet"}`);
254
148
  }}
255
149
  className={cn(
256
150
  "crypto-payment-method-connect-wallet eoa-wallet w-full rounded-xl border p-4 text-left transition-all hover:shadow-md",
@@ -266,7 +160,7 @@ export function CryptoPaymentMethod({
266
160
  </div>
267
161
  <div className="flex flex-col">
268
162
  <span className="text-as-primary font-semibold">
269
- {eoaWalletInfo?.name || connector?.name || "Connected Wallet"}
163
+ {eoaWalletInfo?.name || "Connected Wallet"}
270
164
  </span>
271
165
  <span className="text-as-primary/60 text-sm">
272
166
  {shortenAddress(connectedEOAWallet?.getAccount()?.address || "")}
@@ -280,62 +174,9 @@ export function CryptoPaymentMethod({
280
174
  <button
281
175
  onClick={e => {
282
176
  e.stopPropagation();
283
- disconnect();
284
- toast.success("Wallet disconnected");
285
- if (selectedPaymentMethod === CryptoPaymentMethodType.CONNECT_WALLET) {
286
- setSelectedPaymentMethod(CryptoPaymentMethodType.NONE);
177
+ if (connectedEOAWallet) {
178
+ disconnect(connectedEOAWallet);
287
179
  }
288
- }}
289
- className="text-as-primary/60 hover:text-as-primary/80 rounded-lg p-1.5 transition-colors"
290
- >
291
- <X className="h-4 w-4" />
292
- </button>
293
- </div>
294
- </div>
295
- </button>
296
- )}
297
-
298
- {shouldShowWagmiWallet && (
299
- <button
300
- onClick={async () => {
301
- setSelectedPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
302
- onSelectPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
303
-
304
- // Create thirdweb wallet from wagmi connector
305
- if (connector?.name) {
306
- const thirdwebWallet = await createThirdwebWalletFromConnector(connector.name);
307
- if (thirdwebWallet) {
308
- setActiveWallet(thirdwebWallet);
309
- }
310
- }
311
-
312
- toast.success(`Selected ${connector?.name || "wallet"}`);
313
- }}
314
- className={cn(
315
- "crypto-payment-method-connect-wallet wagmi-wallet w-full rounded-xl border p-4 text-left transition-all hover:shadow-md",
316
- selectedPaymentMethod === CryptoPaymentMethodType.CONNECT_WALLET
317
- ? "connected-wallet border-as-brand bg-as-brand/5"
318
- : "border-as-border-secondary bg-as-surface-primary hover:border-as-secondary/80",
319
- )}
320
- >
321
- <div className="flex items-center justify-between">
322
- <div className="flex items-center gap-3">
323
- <div className="wallet-icon flex h-10 w-10 items-center justify-center rounded-full bg-blue-100">
324
- <Wallet className="h-5 w-5 text-blue-600" />
325
- </div>
326
- <div className="flex flex-col">
327
- <span className="text-as-primary font-semibold">{connector?.name || "Connected Wallet"}</span>
328
- <span className="text-as-primary/60 text-sm">{shortenAddress(address || "")}</span>
329
- </div>
330
- </div>
331
- <div className="flex items-center gap-2">
332
- {selectedPaymentMethod === CryptoPaymentMethodType.CONNECT_WALLET && (
333
- <div className="h-2 w-2 rounded-full bg-green-500"></div>
334
- )}
335
- <button
336
- onClick={e => {
337
- e.stopPropagation();
338
- disconnect();
339
180
  toast.success("Wallet disconnected");
340
181
  if (selectedPaymentMethod === CryptoPaymentMethodType.CONNECT_WALLET) {
341
182
  setSelectedPaymentMethod(CryptoPaymentMethodType.NONE);
@@ -398,10 +239,7 @@ export function CryptoPaymentMethod({
398
239
  <div className="space-y-3">
399
240
  {/* Connect Wallet Section */}
400
241
  <button
401
- onClick={() => {
402
- // Always show wallet selection modal first
403
- setShowWalletModal(true);
404
- }}
242
+ onClick={handleConnectWallet}
405
243
  className="crypto-payment-method-connect-wallet bg-as-surface-primary border-as-border-secondary hover:border-as-secondary/80 group flex w-full items-center justify-between gap-4 rounded-xl border px-4 py-3.5 transition-all duration-200 hover:shadow-md"
406
244
  >
407
245
  <div className="flex items-center gap-3">
@@ -438,75 +276,6 @@ export function CryptoPaymentMethod({
438
276
  </div>
439
277
  </div>
440
278
  </div>
441
-
442
- {/* Wallet Connection Modal */}
443
- {showWalletModal &&
444
- createPortal(
445
- <div className="wallet-connection-modal pointer-events-auto fixed inset-0 z-[9999] flex items-center justify-center bg-black/50">
446
- <div className="max-h-[80vh] w-[400px] max-w-[90vw] overflow-auto rounded-xl bg-white p-6 dark:bg-gray-900">
447
- <div className="mb-4 flex items-center justify-between">
448
- <h3 className="text-lg font-semibold text-gray-900 dark:text-white">
449
- {isConnected ? "Switch wallet or account" : "Choose wallet to connect"}
450
- </h3>
451
- <button
452
- onClick={handleCloseModal}
453
- className="text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200"
454
- >
455
- <X className="h-5 w-5" />
456
- </button>
457
- </div>
458
-
459
- <div className="space-y-4">
460
- {/* Custom wallet options */}
461
- <div className="space-y-3">
462
- {walletOptions.map(walletOption => {
463
- const isCurrentWallet = isConnected && connector?.name === walletOption.connector?.name;
464
-
465
- return (
466
- <button
467
- key={walletOption.id}
468
- onClick={async () => {
469
- handleCloseModal();
470
- await requestWalletPermissions(walletOption.connector);
471
- }}
472
- disabled={isPending}
473
- className={`wallet-option w-full rounded-xl border p-4 text-left transition-all hover:shadow-md disabled:opacity-50 ${
474
- isCurrentWallet
475
- ? "wallet-option--active border-blue-500 bg-blue-50 dark:bg-blue-900/20"
476
- : "border-gray-200 bg-white hover:border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:hover:border-gray-500"
477
- }`}
478
- >
479
- <div className="flex items-center justify-between">
480
- <div className="flex items-center gap-3">
481
- {walletOption.icon}
482
-
483
- <div>
484
- <div className="wallet-option-name flex items-center gap-2">
485
- <div className="text-sm font-semibold text-gray-900 dark:text-white">
486
- {walletOption.name}
487
- </div>
488
- {isCurrentWallet && (
489
- <span className="rounded-full bg-blue-100 px-2 py-0.5 text-xs font-medium text-blue-700 dark:bg-blue-800 dark:text-blue-200">
490
- Connected
491
- </span>
492
- )}
493
- </div>
494
- <div className="text-xs text-gray-500 dark:text-gray-400">
495
- {isCurrentWallet ? "Switch account or reconnect" : walletOption.description}
496
- </div>
497
- </div>
498
- </div>
499
- <ChevronRightCircle className="h-5 w-5 text-gray-400" />
500
- </div>
501
- </button>
502
- );
503
- })}
504
- </div>
505
- </div>
506
- </div>
507
- </div>,
508
- typeof window !== "undefined" ? document.getElementById("b3-root") || document.body : document.body,
509
- )}
510
279
  </div>
511
280
  );
512
281
  }
@@ -24,7 +24,6 @@ import { components } from "../../types/api";
24
24
  import { CryptoPaymentMethodType } from "../components/common/CryptoPaymentMethod";
25
25
  import { FiatPaymentMethod } from "../components/common/FiatPaymentMethod";
26
26
  import { useAutoSelectCryptoPaymentMethod } from "./useAutoSelectCryptoPaymentMethod";
27
- import { useAutoSetActiveWalletFromWagmi } from "./useAutoSetActiveWalletFromWagmi";
28
27
  import { useConnectedWalletDisplay } from "./useConnectedWalletDisplay";
29
28
  import { useCryptoPaymentMethodState } from "./useCryptoPaymentMethodState";
30
29
  import { useRecipientAddressState } from "./useRecipientAddressState";
@@ -111,9 +110,6 @@ export function useAnyspendFlow({
111
110
  const { address: globalAddress } = useAccountWallet();
112
111
  const { walletAddress } = useConnectedWalletDisplay(effectiveCryptoPaymentMethod);
113
112
 
114
- // Auto-set active wallet from wagmi
115
- useAutoSetActiveWalletFromWagmi();
116
-
117
113
  // Recipient address state - hook automatically manages priority: props > user selection > wallet/global
118
114
  const { setSelectedRecipientAddress, effectiveRecipientAddress } = useRecipientAddressState({
119
115
  recipientAddressFromProps: recipientAddress,
@@ -15,12 +15,28 @@ import {
15
15
  } from "viem";
16
16
  import { abstract, arbitrum, avalanche, b3, base, bsc, mainnet, optimism, polygon } from "viem/chains";
17
17
  import { ChainType, IBaseChain, IEVMChain, ISolanaChain } from "../types/chain";
18
- import { getAvaxToken, getBnbToken, getEthToken, getPolToken, getSolanaToken } from "./token";
18
+ import {
19
+ getAvaxToken,
20
+ getBnbToken,
21
+ getEthToken,
22
+ getHyperEVMNativeToken,
23
+ getPolToken,
24
+ getSolanaToken,
25
+ HYPEREVM_CHAIN_ID,
26
+ } from "./token";
19
27
 
20
28
  function getCustomEvmChain(chain: Chain, rpcUrl: string): Chain {
21
29
  return defineChain({ ...chain, rpcUrls: { default: { http: [rpcUrl] } } });
22
30
  }
23
31
 
32
+ export const hyperEVM = defineChain({
33
+ id: HYPEREVM_CHAIN_ID,
34
+ name: "HyperEVM",
35
+ nativeCurrency: { name: "HyperEVM", symbol: "HYPE", decimals: 18 },
36
+ rpcUrls: { default: { http: ["https://rpc.hyperliquid.xyz/evm"] } },
37
+ blockExplorers: { default: { name: "HyperEVM Explorer", url: "https://hyperevmscan.io/" } },
38
+ });
39
+
24
40
  // export const b4testnet = defineChain({
25
41
  // id: 19934,
26
42
  // name: "B4 Testnet",
@@ -189,6 +205,20 @@ export const EVM_MAINNET: Record<number, IEVMChain> = {
189
205
  coingeckoName: "abstract",
190
206
  wethAddress: "0x3439153eb7af838ad19d56e1571fbd09333c2809",
191
207
  },
208
+ [hyperEVM.id]: {
209
+ id: hyperEVM.id,
210
+ name: hyperEVM.name,
211
+ logoUrl: "https://s2.coinmarketcap.com/static/img/coins/64x64/32196.png",
212
+ type: ChainType.EVM,
213
+ nativeRequired: parseEther("0.01"),
214
+ canDepositNative: true,
215
+ defaultToken: getHyperEVMNativeToken(),
216
+ nativeToken: getHyperEVMNativeToken(),
217
+ viem: hyperEVM,
218
+ pollingInterval: 1000, // 1 second for Hyperliquid
219
+ coingeckoName: "hyperevm",
220
+ wethAddress: "0x5555555555555555555555555555555555555555",
221
+ },
192
222
  };
193
223
 
194
224
  export const EVM_TESTNET: Record<number, IEVMChain> = {
@@ -1,6 +1,9 @@
1
- import { avalanche, bsc, polygon } from "viem/chains";
2
1
  import { RELAY_ETH_ADDRESS, RELAY_SOL_ADDRESS, RELAY_SOLANA_MAINNET_CHAIN_ID } from "@b3dotfun/sdk/anyspend/constants";
3
2
  import { components } from "@b3dotfun/sdk/anyspend/types/api";
3
+ import { avalanche, bsc, polygon } from "viem/chains";
4
+
5
+ export const HYPERLIQUID_CHAIN_ID = 1337;
6
+ export const HYPEREVM_CHAIN_ID = 999;
4
7
 
5
8
  export function isNativeToken(address: string): boolean {
6
9
  return address.toLowerCase() === RELAY_ETH_ADDRESS || address.toLowerCase() === RELAY_SOL_ADDRESS;
@@ -70,3 +73,16 @@ export function getAvaxToken(): components["schemas"]["Token"] {
70
73
  },
71
74
  };
72
75
  }
76
+
77
+ export function getHyperEVMNativeToken(): components["schemas"]["Token"] {
78
+ return {
79
+ chainId: HYPEREVM_CHAIN_ID,
80
+ address: RELAY_ETH_ADDRESS,
81
+ symbol: "HYPE",
82
+ name: "HYPE",
83
+ decimals: 18,
84
+ metadata: {
85
+ logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/32196.png",
86
+ },
87
+ };
88
+ }
@@ -10,7 +10,6 @@ import { debugB3React } from "@b3dotfun/sdk/shared/utils/debug";
10
10
  import { useCallback, useEffect, useState } from "react";
11
11
  import { useActiveAccount } from "thirdweb/react";
12
12
  import { Account } from "thirdweb/wallets";
13
- import { TurnkeyAuthModal } from "../TurnkeyAuthModal";
14
13
  import { SignInWithB3Privy } from "./SignInWithB3Privy";
15
14
  import { LoginStep, LoginStepContainer } from "./steps/LoginStep";
16
15
  import { LoginStepCustom } from "./steps/LoginStepCustom";
@@ -41,9 +40,7 @@ export function SignInWithB3Flow({
41
40
  const account = useActiveAccount();
42
41
  const isAuthenticating = useAuthStore(state => state.isAuthenticating);
43
42
  const isAuthenticated = useAuthStore(state => state.isAuthenticated);
44
- const setIsAuthenticated = useAuthStore(state => state.setIsAuthenticated);
45
43
  const isConnected = useAuthStore(state => state.isConnected);
46
- const setIsConnected = useAuthStore(state => state.setIsConnected);
47
44
  const setJustCompletedLogin = useAuthStore(state => state.setJustCompletedLogin);
48
45
  const [refetchCount, setRefetchCount] = useState(0);
49
46
  const [refetchError, setRefetchError] = useState<string | null>(null);
@@ -157,11 +154,6 @@ export function SignInWithB3Flow({
157
154
  await refetchUser();
158
155
  debug("User refetched successfully");
159
156
 
160
- // Set authentication and connection state so UI updates properly
161
- setIsAuthenticated(true);
162
- setIsConnected(true);
163
- setJustCompletedLogin(true);
164
-
165
157
  // After user data is refreshed, close Turnkey modal and go back to sign-in flow
166
158
  debug("Switching back to signInWithB3 modal");
167
159
  setB3ModalContentType({
@@ -192,9 +184,6 @@ export function SignInWithB3Flow({
192
184
  closeAfterLogin,
193
185
  source,
194
186
  signersEnabled,
195
- setIsAuthenticated,
196
- setIsConnected,
197
- setJustCompletedLogin,
198
187
  ],
199
188
  );
200
189
 
@@ -351,76 +340,32 @@ export function SignInWithB3Flow({
351
340
  <div className="p-4 text-center text-red-500">{refetchError}</div>
352
341
  </LoginStepContainer>
353
342
  );
343
+ } else if (isAuthenticating || (isFetchingSigners && step === "login") || source === "requestPermissions") {
344
+ content = (
345
+ <LoginStepContainer partnerId={partnerId}>
346
+ <div className="my-8 flex min-h-[350px] items-center justify-center">
347
+ <Loading variant="white" size="lg" />
348
+ </div>
349
+ </LoginStepContainer>
350
+ );
354
351
  } else if (step === "login") {
355
- // PRIORITY: If Turnkey is enabled, show Turnkey modal FIRST as the primary authentication option
356
- // Show Turnkey when enabled and not already completed in this session
357
- const shouldShowTurnkeyFirst = enableTurnkey && !turnkeyAuthCompleted;
358
-
359
- if (shouldShowTurnkeyFirst) {
360
- // Don't show loading spinner for Turnkey - let the modal handle its own loading state
361
- // This prevents the infinite loop where isAuthenticating causes the modal to be replaced
362
- debug("Showing Turnkey as primary authentication option", {
363
- enableTurnkey,
364
- turnkeyAuthCompleted,
365
- isAuthenticated,
366
- });
367
- // Show Turnkey authentication as primary option
352
+ // Custom strategy
353
+ if (strategies?.[0] === "privy") {
354
+ content = <SignInWithB3Privy onSuccess={handleLoginSuccess} chain={chain} />;
355
+ } else if (strategies) {
356
+ // Strategies are explicitly provided
368
357
  content = (
369
- <LoginStepContainer partnerId={partnerId}>
370
- <TurnkeyAuthModal
371
- onSuccess={async (authenticatedUser: any) => {
372
- debug("Turnkey authentication successful in primary flow", { authenticatedUser });
373
- setTurnkeyAuthCompleted(true);
374
- // After Turnkey auth, refetch user to get the full user object
375
- await refetchUser();
376
- // User is now authenticated via Turnkey
377
- // Set both isAuthenticated and isConnected to true so UI updates properly
378
- // Wallet connection is optional and can happen later for signing transactions
379
- setIsAuthenticated(true);
380
- setIsConnected(true);
381
- setJustCompletedLogin(true);
382
- // Call the login success callback
383
- onLoginSuccess?.({} as Account);
384
- }}
385
- onClose={() => {
386
- // If user closes Turnkey modal, they can still use wallet connection as fallback
387
- setTurnkeyAuthCompleted(true);
388
- }}
389
- initialEmail=""
390
- skipToOtp={false}
391
- />
392
- </LoginStepContainer>
358
+ <LoginStepCustom
359
+ strategies={strategies}
360
+ chain={chain}
361
+ onSuccess={handleLoginSuccess}
362
+ onError={onError}
363
+ automaticallySetFirstEoa={!!automaticallySetFirstEoa}
364
+ />
393
365
  );
394
366
  } else {
395
- // Show loading spinner only if not in Turnkey flow
396
- if (isAuthenticating || (isFetchingSigners && step === "login") || source === "requestPermissions") {
397
- content = (
398
- <LoginStepContainer partnerId={partnerId}>
399
- <div className="my-8 flex min-h-[350px] items-center justify-center">
400
- <Loading variant="white" size="lg" />
401
- </div>
402
- </LoginStepContainer>
403
- );
404
- } else {
405
- // Custom strategy
406
- if (strategies?.[0] === "privy") {
407
- content = <SignInWithB3Privy onSuccess={handleLoginSuccess} chain={chain} />;
408
- } else if (strategies) {
409
- // Strategies are explicitly provided
410
- content = (
411
- <LoginStepCustom
412
- strategies={strategies}
413
- chain={chain}
414
- onSuccess={handleLoginSuccess}
415
- onError={onError}
416
- automaticallySetFirstEoa={!!automaticallySetFirstEoa}
417
- />
418
- );
419
- } else {
420
- // Default to handle all strategies we support
421
- content = <LoginStep chain={chain} onSuccess={handleLoginSuccess} onError={onError} />;
422
- }
423
- }
367
+ // Default to handle all strategies we support
368
+ content = <LoginStep chain={chain} onSuccess={handleLoginSuccess} onError={onError} />;
424
369
  }
425
370
  }
426
371
 
@@ -3,7 +3,6 @@ export { useAccountAssets } from "./useAccountAssets";
3
3
  export { useAccountWallet } from "./useAccountWallet";
4
4
  export { useAddTWSessionKey } from "./useAddTWSessionKey";
5
5
  export { useAnalytics } from "./useAnalytics";
6
- export { useAuth } from "./useAuth";
7
6
  export { useAuthentication } from "./useAuthentication";
8
7
  export { useB3BalanceFromAddresses } from "./useB3BalanceFromAddresses";
9
8
  export { useB3EnsName } from "./useB3EnsName";