@b3dotfun/sdk 0.0.62 → 0.0.63-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 (150) hide show
  1. package/dist/cjs/anyspend/react/components/AnySpend.js +61 -23
  2. package/dist/cjs/anyspend/react/components/AnySpendCustom.js +3 -0
  3. package/dist/cjs/anyspend/react/components/AnySpendCustomExactIn.d.ts +34 -0
  4. package/dist/cjs/anyspend/react/components/AnySpendCustomExactIn.js +275 -0
  5. package/dist/cjs/anyspend/react/components/AnySpendStakeB3.js +5 -4
  6. package/dist/cjs/anyspend/react/components/AnySpendStakeB3ExactIn.d.ts +9 -0
  7. package/dist/cjs/anyspend/react/components/AnySpendStakeB3ExactIn.js +288 -0
  8. package/dist/cjs/anyspend/react/components/AnySpendStakeUpsideExactIn.d.ts +11 -0
  9. package/dist/cjs/anyspend/react/components/AnySpendStakeUpsideExactIn.js +33 -0
  10. package/dist/cjs/anyspend/react/components/AnyspendDepositHype.js +4 -4
  11. package/dist/cjs/anyspend/react/components/common/CryptoPaySection.js +4 -6
  12. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +9 -17
  13. package/dist/cjs/anyspend/react/components/common/CryptoReceiveSection.d.ts +6 -1
  14. package/dist/cjs/anyspend/react/components/common/CryptoReceiveSection.js +11 -1
  15. package/dist/cjs/anyspend/react/components/common/OrderDetails.js +66 -147
  16. package/dist/cjs/anyspend/react/components/common/OrderDetailsCollapsible.js +2 -3
  17. package/dist/cjs/anyspend/react/components/common/OrderTokenAmount.d.ts +2 -1
  18. package/dist/cjs/anyspend/react/components/common/OrderTokenAmount.js +39 -15
  19. package/dist/cjs/anyspend/react/components/common/PaySection.js +1 -1
  20. package/dist/cjs/anyspend/react/components/common/TokenBalance.js +1 -1
  21. package/dist/cjs/anyspend/react/components/index.d.ts +5 -1
  22. package/dist/cjs/anyspend/react/components/index.js +11 -3
  23. package/dist/cjs/anyspend/react/hooks/useAnyspendFlow.d.ts +25 -3
  24. package/dist/cjs/anyspend/react/hooks/useAnyspendFlow.js +42 -19
  25. package/dist/cjs/anyspend/react/hooks/useAnyspendOrderHistory.d.ts +116 -0
  26. package/dist/cjs/anyspend/react/hooks/useAnyspendQuote.js +1 -1
  27. package/dist/cjs/anyspend/react/hooks/useAutoSelectCryptoPaymentMethod.d.ts +26 -0
  28. package/dist/cjs/anyspend/react/hooks/useAutoSelectCryptoPaymentMethod.js +56 -0
  29. package/dist/cjs/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.d.ts +10 -0
  30. package/dist/cjs/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.js +73 -0
  31. package/dist/cjs/anyspend/react/hooks/useConnectedWalletDisplay.d.ts +14 -0
  32. package/dist/cjs/anyspend/react/hooks/useConnectedWalletDisplay.js +57 -0
  33. package/dist/cjs/anyspend/react/hooks/usePhantomTransfer.d.ts +36 -0
  34. package/dist/cjs/anyspend/react/hooks/usePhantomTransfer.js +211 -0
  35. package/dist/cjs/anyspend/types/api.d.ts +665 -3
  36. package/dist/cjs/anyspend/utils/orderPayload.js +4 -0
  37. package/dist/cjs/global-account/react/components/B3DynamicModal.js +10 -1
  38. package/dist/cjs/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +3 -1
  39. package/dist/cjs/global-account/react/components/SignInWithB3/steps/LoginStep.js +2 -2
  40. package/dist/cjs/global-account/react/hooks/index.d.ts +2 -1
  41. package/dist/cjs/global-account/react/hooks/index.js +5 -3
  42. package/dist/cjs/global-account/react/hooks/useAuthentication.d.ts +2 -2
  43. package/dist/cjs/global-account/react/hooks/useAuthentication.js +7 -2
  44. package/dist/cjs/global-account/react/hooks/useSimBalance.d.ts +1 -1
  45. package/dist/cjs/global-account/react/hooks/useSimBalance.js +6 -5
  46. package/dist/cjs/global-account/react/hooks/useTokenBalanceDirect.d.ts +12 -0
  47. package/dist/cjs/global-account/react/hooks/useTokenBalanceDirect.js +62 -0
  48. package/dist/cjs/global-account/react/hooks/useTokenFromUrl.js +4 -3
  49. package/dist/cjs/global-account/react/stores/useModalStore.d.ts +31 -1
  50. package/dist/esm/anyspend/react/components/AnySpend.js +62 -24
  51. package/dist/esm/anyspend/react/components/AnySpendCustom.js +3 -0
  52. package/dist/esm/anyspend/react/components/AnySpendCustomExactIn.d.ts +34 -0
  53. package/dist/esm/anyspend/react/components/AnySpendCustomExactIn.js +269 -0
  54. package/dist/esm/anyspend/react/components/AnySpendStakeB3.js +7 -6
  55. package/dist/esm/anyspend/react/components/AnySpendStakeB3ExactIn.d.ts +9 -0
  56. package/dist/esm/anyspend/react/components/AnySpendStakeB3ExactIn.js +285 -0
  57. package/dist/esm/anyspend/react/components/AnySpendStakeUpsideExactIn.d.ts +11 -0
  58. package/dist/esm/anyspend/react/components/AnySpendStakeUpsideExactIn.js +30 -0
  59. package/dist/esm/anyspend/react/components/AnyspendDepositHype.js +4 -4
  60. package/dist/esm/anyspend/react/components/common/CryptoPaySection.js +5 -7
  61. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +9 -17
  62. package/dist/esm/anyspend/react/components/common/CryptoReceiveSection.d.ts +6 -1
  63. package/dist/esm/anyspend/react/components/common/CryptoReceiveSection.js +11 -1
  64. package/dist/esm/anyspend/react/components/common/OrderDetails.js +67 -148
  65. package/dist/esm/anyspend/react/components/common/OrderDetailsCollapsible.js +2 -3
  66. package/dist/esm/anyspend/react/components/common/OrderTokenAmount.d.ts +2 -1
  67. package/dist/esm/anyspend/react/components/common/OrderTokenAmount.js +40 -16
  68. package/dist/esm/anyspend/react/components/common/PaySection.js +1 -1
  69. package/dist/esm/anyspend/react/components/common/TokenBalance.js +2 -2
  70. package/dist/esm/anyspend/react/components/index.d.ts +5 -1
  71. package/dist/esm/anyspend/react/components/index.js +5 -1
  72. package/dist/esm/anyspend/react/hooks/useAnyspendFlow.d.ts +25 -3
  73. package/dist/esm/anyspend/react/hooks/useAnyspendFlow.js +42 -19
  74. package/dist/esm/anyspend/react/hooks/useAnyspendOrderHistory.d.ts +116 -0
  75. package/dist/esm/anyspend/react/hooks/useAnyspendQuote.js +1 -1
  76. package/dist/esm/anyspend/react/hooks/useAutoSelectCryptoPaymentMethod.d.ts +26 -0
  77. package/dist/esm/anyspend/react/hooks/useAutoSelectCryptoPaymentMethod.js +53 -0
  78. package/dist/esm/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.d.ts +10 -0
  79. package/dist/esm/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.js +70 -0
  80. package/dist/esm/anyspend/react/hooks/useConnectedWalletDisplay.d.ts +14 -0
  81. package/dist/esm/anyspend/react/hooks/useConnectedWalletDisplay.js +54 -0
  82. package/dist/esm/anyspend/react/hooks/usePhantomTransfer.d.ts +36 -0
  83. package/dist/esm/anyspend/react/hooks/usePhantomTransfer.js +208 -0
  84. package/dist/esm/anyspend/types/api.d.ts +665 -3
  85. package/dist/esm/anyspend/utils/orderPayload.js +4 -0
  86. package/dist/esm/global-account/react/components/B3DynamicModal.js +11 -2
  87. package/dist/esm/global-account/react/components/SignInWithB3/SignInWithB3Flow.js +3 -1
  88. package/dist/esm/global-account/react/components/SignInWithB3/steps/LoginStep.js +2 -2
  89. package/dist/esm/global-account/react/hooks/index.d.ts +2 -1
  90. package/dist/esm/global-account/react/hooks/index.js +2 -1
  91. package/dist/esm/global-account/react/hooks/useAuthentication.d.ts +2 -2
  92. package/dist/esm/global-account/react/hooks/useAuthentication.js +7 -2
  93. package/dist/esm/global-account/react/hooks/useSimBalance.d.ts +1 -1
  94. package/dist/esm/global-account/react/hooks/useSimBalance.js +6 -5
  95. package/dist/esm/global-account/react/hooks/useTokenBalanceDirect.d.ts +12 -0
  96. package/dist/esm/global-account/react/hooks/useTokenBalanceDirect.js +59 -0
  97. package/dist/esm/global-account/react/hooks/useTokenFromUrl.js +4 -3
  98. package/dist/esm/global-account/react/stores/useModalStore.d.ts +31 -1
  99. package/dist/types/anyspend/react/components/AnySpendCustomExactIn.d.ts +34 -0
  100. package/dist/types/anyspend/react/components/AnySpendStakeB3ExactIn.d.ts +9 -0
  101. package/dist/types/anyspend/react/components/AnySpendStakeUpsideExactIn.d.ts +11 -0
  102. package/dist/types/anyspend/react/components/common/CryptoReceiveSection.d.ts +6 -1
  103. package/dist/types/anyspend/react/components/common/OrderTokenAmount.d.ts +2 -1
  104. package/dist/types/anyspend/react/components/index.d.ts +5 -1
  105. package/dist/types/anyspend/react/hooks/useAnyspendFlow.d.ts +25 -3
  106. package/dist/types/anyspend/react/hooks/useAnyspendOrderHistory.d.ts +116 -0
  107. package/dist/types/anyspend/react/hooks/useAutoSelectCryptoPaymentMethod.d.ts +26 -0
  108. package/dist/types/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.d.ts +10 -0
  109. package/dist/types/anyspend/react/hooks/useConnectedWalletDisplay.d.ts +14 -0
  110. package/dist/types/anyspend/react/hooks/usePhantomTransfer.d.ts +36 -0
  111. package/dist/types/anyspend/types/api.d.ts +665 -3
  112. package/dist/types/global-account/react/hooks/index.d.ts +2 -1
  113. package/dist/types/global-account/react/hooks/useAuthentication.d.ts +2 -2
  114. package/dist/types/global-account/react/hooks/useSimBalance.d.ts +1 -1
  115. package/dist/types/global-account/react/hooks/useTokenBalanceDirect.d.ts +12 -0
  116. package/dist/types/global-account/react/stores/useModalStore.d.ts +31 -1
  117. package/package.json +3 -2
  118. package/src/anyspend/react/components/AnySpend.tsx +73 -22
  119. package/src/anyspend/react/components/AnySpendCustom.tsx +4 -0
  120. package/src/anyspend/react/components/AnySpendCustomExactIn.tsx +595 -0
  121. package/src/anyspend/react/components/AnySpendStakeB3.tsx +8 -11
  122. package/src/anyspend/react/components/AnySpendStakeB3ExactIn.tsx +522 -0
  123. package/src/anyspend/react/components/AnySpendStakeUpsideExactIn.tsx +73 -0
  124. package/src/anyspend/react/components/AnyspendDepositHype.tsx +7 -3
  125. package/src/anyspend/react/components/common/CryptoPaySection.tsx +5 -7
  126. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +9 -18
  127. package/src/anyspend/react/components/common/CryptoReceiveSection.tsx +22 -0
  128. package/src/anyspend/react/components/common/OrderDetails.tsx +76 -190
  129. package/src/anyspend/react/components/common/OrderDetailsCollapsible.tsx +2 -3
  130. package/src/anyspend/react/components/common/OrderTokenAmount.tsx +48 -17
  131. package/src/anyspend/react/components/common/PaySection.tsx +1 -0
  132. package/src/anyspend/react/components/common/TokenBalance.tsx +2 -2
  133. package/src/anyspend/react/components/index.ts +5 -1
  134. package/src/anyspend/react/hooks/useAnyspendFlow.ts +51 -18
  135. package/src/anyspend/react/hooks/useAnyspendQuote.ts +1 -1
  136. package/src/anyspend/react/hooks/useAutoSelectCryptoPaymentMethod.ts +72 -0
  137. package/src/anyspend/react/hooks/useAutoSetActiveWalletFromWagmi.ts +80 -0
  138. package/src/anyspend/react/hooks/useConnectedWalletDisplay.ts +69 -0
  139. package/src/anyspend/react/hooks/usePhantomTransfer.ts +301 -0
  140. package/src/anyspend/types/api.ts +669 -1
  141. package/src/anyspend/utils/orderPayload.ts +5 -1
  142. package/src/global-account/react/components/B3DynamicModal.tsx +11 -1
  143. package/src/global-account/react/components/SignInWithB3/SignInWithB3Flow.tsx +3 -1
  144. package/src/global-account/react/components/SignInWithB3/steps/LoginStep.tsx +2 -2
  145. package/src/global-account/react/hooks/index.ts +2 -1
  146. package/src/global-account/react/hooks/useAuthentication.ts +10 -2
  147. package/src/global-account/react/hooks/useSimBalance.ts +6 -5
  148. package/src/global-account/react/hooks/useTokenBalanceDirect.tsx +84 -0
  149. package/src/global-account/react/hooks/useTokenFromUrl.tsx +6 -5
  150. package/src/global-account/react/stores/useModalStore.ts +34 -0
@@ -41,6 +41,8 @@ const buildPayload = (orderType, params) => {
41
41
  };
42
42
  case "custom":
43
43
  return { ...payload };
44
+ case "custom_exact_in":
45
+ return { ...payload, expectedDstAmount };
44
46
  case "hype_duel":
45
47
  return {
46
48
  expectedDstAmount,
@@ -66,6 +68,8 @@ const buildMetadata = (orderType, params) => {
66
68
  return { ...baseMetadata, tournament };
67
69
  case "custom":
68
70
  return { ...baseMetadata, action: payload.action };
71
+ case "custom_exact_in":
72
+ return { ...baseMetadata, action: payload.action };
69
73
  case "hype_duel":
70
74
  return { ...baseMetadata };
71
75
  default:
@@ -5,11 +5,13 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("../../../anyspend/react");
6
6
  const AnyspendDepositHype_1 = require("../../../anyspend/react/components/AnyspendDepositHype");
7
7
  const AnySpendStakeUpside_1 = require("../../../anyspend/react/components/AnySpendStakeUpside");
8
+ const AnySpendStakeUpsideExactIn_1 = require("../../../anyspend/react/components/AnySpendStakeUpsideExactIn");
8
9
  const utils_1 = require("../../../anyspend/utils");
9
10
  const react_2 = require("../../../global-account/react");
10
11
  const cn_1 = require("../../../shared/utils/cn");
11
12
  const debug_1 = require("../../../shared/utils/debug");
12
13
  const react_3 = require("react");
14
+ const react_4 = require("thirdweb/react");
13
15
  const AvatarEditor_1 = require("./AvatarEditor/AvatarEditor");
14
16
  const useB3_1 = require("./B3Provider/useB3");
15
17
  const LinkAccount_1 = require("./LinkAccount/LinkAccount");
@@ -18,7 +20,6 @@ const RequestPermissions_1 = require("./RequestPermissions/RequestPermissions");
18
20
  const SignInWithB3Flow_1 = require("./SignInWithB3/SignInWithB3Flow");
19
21
  const dialog_1 = require("./ui/dialog");
20
22
  const drawer_1 = require("./ui/drawer");
21
- const react_4 = require("thirdweb/react");
22
23
  const debug = (0, debug_1.debugB3React)("B3DynamicModal");
23
24
  function B3DynamicModal() {
24
25
  const { isOpen, setB3ModalOpen, contentType, history, navigateBack } = (0, react_2.useModalStore)();
@@ -45,7 +46,9 @@ function B3DynamicModal() {
45
46
  "anySpendJoinTournament",
46
47
  "anySpendFundTournament",
47
48
  "anySpendStakeB3",
49
+ "anySpendStakeB3ExactIn",
48
50
  "anySpendStakeUpside",
51
+ "anySpendStakeUpsideExactIn",
49
52
  "anySpendBuySpin",
50
53
  "anySpendOrderHistory",
51
54
  "signInWithB3",
@@ -59,7 +62,9 @@ function B3DynamicModal() {
59
62
  "anySpendJoinTournament",
60
63
  "anySpendFundTournament",
61
64
  "anySpendStakeB3",
65
+ "anySpendStakeB3ExactIn",
62
66
  "anySpendStakeUpside",
67
+ "anySpendStakeUpsideExactIn",
63
68
  "anySpendBuySpin",
64
69
  "anySpendSignatureMint",
65
70
  "anySpendBondKit",
@@ -95,8 +100,12 @@ function B3DynamicModal() {
95
100
  return (0, jsx_runtime_1.jsx)(react_1.OrderHistory, { onBack: () => { }, mode: "modal" });
96
101
  case "anySpendStakeB3":
97
102
  return (0, jsx_runtime_1.jsx)(react_1.AnySpendStakeB3, { ...contentType, mode: "modal" });
103
+ case "anySpendStakeB3ExactIn":
104
+ return (0, jsx_runtime_1.jsx)(react_1.AnySpendStakeB3ExactIn, { ...contentType, mode: "modal" });
98
105
  case "anySpendStakeUpside":
99
106
  return (0, jsx_runtime_1.jsx)(AnySpendStakeUpside_1.AnySpendStakeUpside, { ...contentType, mode: "modal" });
107
+ case "anySpendStakeUpsideExactIn":
108
+ return (0, jsx_runtime_1.jsx)(AnySpendStakeUpsideExactIn_1.AnySpendStakeUpsideExactIn, { ...contentType, mode: "modal" });
100
109
  case "anySpendBuySpin":
101
110
  return (0, jsx_runtime_1.jsx)(react_1.AnySpendBuySpin, { ...contentType, mode: "modal" });
102
111
  case "anySpendSignatureMint":
@@ -22,6 +22,7 @@ function SignInWithB3Flow({ strategies, onLoginSuccess, onSessionKeySuccess, onE
22
22
  const { setB3ModalContentType, setB3ModalOpen, isOpen } = (0, react_1.useModalStore)();
23
23
  const account = (0, react_3.useActiveAccount)();
24
24
  const isAuthenticating = (0, react_1.useAuthStore)(state => state.isAuthenticating);
25
+ const isAuthenticated = (0, react_1.useAuthStore)(state => state.isAuthenticated);
25
26
  const isConnected = (0, react_1.useAuthStore)(state => state.isConnected);
26
27
  const [refetchCount, setRefetchCount] = (0, react_2.useState)(0);
27
28
  const [refetchError, setRefetchError] = (0, react_2.useState)(null);
@@ -64,7 +65,7 @@ function SignInWithB3Flow({ strategies, onLoginSuccess, onSessionKeySuccess, onE
64
65
  isOpen,
65
66
  source,
66
67
  });
67
- if (isConnected) {
68
+ if (isConnected && isAuthenticated) {
68
69
  // Check if we already have a signer for this partner
69
70
  const hasExistingSigner = signers?.some(signer => signer.partner.id === partnerId);
70
71
  if (hasExistingSigner) {
@@ -114,6 +115,7 @@ function SignInWithB3Flow({ strategies, onLoginSuccess, onSessionKeySuccess, onE
114
115
  signersEnabled,
115
116
  isConnected,
116
117
  isAuthenticating,
118
+ isAuthenticated,
117
119
  isOpen,
118
120
  ]);
119
121
  debug("render", {
@@ -41,8 +41,8 @@ function LoginStep({ onSuccess, chain }) {
41
41
  }, header: {
42
42
  title: "Sign in with B3",
43
43
  titleIcon: "https://cdn.b3.fun/b3_logo.svg",
44
- }, className: "b3-login-step", onConnect: async (wallet) => {
45
- await onConnect(wallet);
44
+ }, className: "b3-login-step", onConnect: async (wallet, allConnectedWallets) => {
45
+ await onConnect(wallet, allConnectedWallets);
46
46
  const account = wallet.getAccount();
47
47
  if (!account)
48
48
  throw new Error("No account found");
@@ -32,11 +32,12 @@ export { useSearchParamsSSR } from "./useSearchParamsSSR";
32
32
  export { useSimBalance } from "./useSimBalance";
33
33
  export { useSiwe } from "./useSiwe";
34
34
  export { useTokenBalance } from "./useTokenBalance";
35
+ export { useTokenBalanceDirect } from "./useTokenBalanceDirect";
35
36
  export { useTokenBalancesByChain } from "./useTokenBalancesByChain";
36
37
  export { useTokenData } from "./useTokenData";
37
38
  export { useTokenFromUrl } from "./useTokenFromUrl";
38
39
  export { useTokenPrice } from "./useTokenPrice";
39
40
  export { useTokenPriceWithFallback } from "./useTokenPriceWithFallback";
40
41
  export { useTokensFromAddress } from "./useTokensFromAddress";
41
- export { useUnifiedChainSwitchAndExecute } from "./useUnifiedChainSwitchAndExecute";
42
42
  export { useURLParams } from "./useURLParams";
43
+ export { useUnifiedChainSwitchAndExecute } from "./useUnifiedChainSwitchAndExecute";
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.useURLParams = exports.useUnifiedChainSwitchAndExecute = exports.useTokensFromAddress = exports.useTokenPriceWithFallback = exports.useTokenPrice = exports.useTokenFromUrl = exports.useTokenData = exports.useTokenBalancesByChain = exports.useTokenBalance = exports.useSiwe = exports.useSimBalance = exports.useSearchParamsSSR = exports.useRouter = exports.useRemoveSessionKey = exports.useQueryBSMNT = exports.useQueryB3 = exports.useProfilePreference = exports.useProfile = exports.useOneBalance = exports.useNativeBalanceFromRPC = exports.useNativeBalance = exports.useMediaQuery = exports.useIsomorphicLayoutEffect = exports.useIsMobile = exports.useHasMounted = exports.useHandleConnectWithPrivy = exports.useGlobalAccount = exports.useGetGeo = exports.useGetAllTWSigners = exports.useFirstEOA = exports.useExchangeRate = exports.useConnect = exports.useClient = exports.useChainSwitchWithAction = exports.useBestTransactionPath = exports.useB3EnsName = exports.useB3BalanceFromAddresses = exports.useAuthentication = exports.useAnalytics = exports.useAddTWSessionKey = exports.useAccountWallet = exports.useAccountAssets = exports.createWagmiConfig = void 0;
17
+ exports.useUnifiedChainSwitchAndExecute = exports.useURLParams = exports.useTokensFromAddress = exports.useTokenPriceWithFallback = exports.useTokenPrice = exports.useTokenFromUrl = exports.useTokenData = exports.useTokenBalancesByChain = exports.useTokenBalanceDirect = exports.useTokenBalance = exports.useSiwe = exports.useSimBalance = exports.useSearchParamsSSR = exports.useRouter = exports.useRemoveSessionKey = exports.useQueryBSMNT = exports.useQueryB3 = exports.useProfilePreference = exports.useProfile = exports.useOneBalance = exports.useNativeBalanceFromRPC = exports.useNativeBalance = exports.useMediaQuery = exports.useIsomorphicLayoutEffect = exports.useIsMobile = exports.useHasMounted = exports.useHandleConnectWithPrivy = exports.useGlobalAccount = exports.useGetGeo = exports.useGetAllTWSigners = exports.useFirstEOA = exports.useExchangeRate = exports.useConnect = exports.useClient = exports.useChainSwitchWithAction = exports.useBestTransactionPath = exports.useB3EnsName = exports.useB3BalanceFromAddresses = exports.useAuthentication = exports.useAnalytics = exports.useAddTWSessionKey = exports.useAccountWallet = exports.useAccountAssets = exports.createWagmiConfig = void 0;
18
18
  var createWagmiConfig_1 = require("../utils/createWagmiConfig");
19
19
  Object.defineProperty(exports, "createWagmiConfig", { enumerable: true, get: function () { return createWagmiConfig_1.createWagmiConfig; } });
20
20
  var useAccountAssets_1 = require("./useAccountAssets");
@@ -84,6 +84,8 @@ var useSiwe_1 = require("./useSiwe");
84
84
  Object.defineProperty(exports, "useSiwe", { enumerable: true, get: function () { return useSiwe_1.useSiwe; } });
85
85
  var useTokenBalance_1 = require("./useTokenBalance");
86
86
  Object.defineProperty(exports, "useTokenBalance", { enumerable: true, get: function () { return useTokenBalance_1.useTokenBalance; } });
87
+ var useTokenBalanceDirect_1 = require("./useTokenBalanceDirect");
88
+ Object.defineProperty(exports, "useTokenBalanceDirect", { enumerable: true, get: function () { return useTokenBalanceDirect_1.useTokenBalanceDirect; } });
87
89
  var useTokenBalancesByChain_1 = require("./useTokenBalancesByChain");
88
90
  Object.defineProperty(exports, "useTokenBalancesByChain", { enumerable: true, get: function () { return useTokenBalancesByChain_1.useTokenBalancesByChain; } });
89
91
  var useTokenData_1 = require("./useTokenData");
@@ -96,7 +98,7 @@ var useTokenPriceWithFallback_1 = require("./useTokenPriceWithFallback");
96
98
  Object.defineProperty(exports, "useTokenPriceWithFallback", { enumerable: true, get: function () { return useTokenPriceWithFallback_1.useTokenPriceWithFallback; } });
97
99
  var useTokensFromAddress_1 = require("./useTokensFromAddress");
98
100
  Object.defineProperty(exports, "useTokensFromAddress", { enumerable: true, get: function () { return useTokensFromAddress_1.useTokensFromAddress; } });
99
- var useUnifiedChainSwitchAndExecute_1 = require("./useUnifiedChainSwitchAndExecute");
100
- Object.defineProperty(exports, "useUnifiedChainSwitchAndExecute", { enumerable: true, get: function () { return useUnifiedChainSwitchAndExecute_1.useUnifiedChainSwitchAndExecute; } });
101
101
  var useURLParams_1 = require("./useURLParams");
102
102
  Object.defineProperty(exports, "useURLParams", { enumerable: true, get: function () { return useURLParams_1.useURLParams; } });
103
+ var useUnifiedChainSwitchAndExecute_1 = require("./useUnifiedChainSwitchAndExecute");
104
+ Object.defineProperty(exports, "useUnifiedChainSwitchAndExecute", { enumerable: true, get: function () { return useUnifiedChainSwitchAndExecute_1.useUnifiedChainSwitchAndExecute; } });
@@ -8,9 +8,9 @@ export declare function useAuthentication(partnerId: string): {
8
8
  isConnected: boolean;
9
9
  wallet: import("thirdweb/dist/types/wallets/in-app/core/wallet/types").EcosystemWallet;
10
10
  preAuthenticate: typeof preAuthenticate;
11
- connect: (wallet: Wallet) => Promise<void>;
11
+ connect: (_walleAutoConnectedWith: Wallet, allConnectedWallets: Wallet[]) => Promise<void>;
12
12
  isAuthenticating: boolean;
13
- onConnect: (wallet: Wallet) => Promise<void>;
13
+ onConnect: (_walleAutoConnectedWith: Wallet, allConnectedWallets: Wallet[]) => Promise<void>;
14
14
  user: {
15
15
  email?: string | undefined;
16
16
  username?: string | undefined;
@@ -142,7 +142,12 @@ function useAuthentication(partnerId) {
142
142
  return userAuth;
143
143
  }
144
144
  }, [activeWallet, partnerId, authenticate, setIsAuthenticated, setIsAuthenticating, setUser, setHasStartedConnecting]);
145
- const onConnect = (0, react_2.useCallback)(async (wallet) => {
145
+ const onConnect = (0, react_2.useCallback)(async (_walleAutoConnectedWith, allConnectedWallets) => {
146
+ debug("@@useAuthentication:onConnect", { _walleAutoConnectedWith, allConnectedWallets });
147
+ const wallet = allConnectedWallets.find(wallet => wallet.id.startsWith("ecosystem."));
148
+ if (!wallet) {
149
+ throw new Error("No smart wallet found during auto-connect");
150
+ }
146
151
  debug("@@useAuthentication:onConnect", { wallet });
147
152
  try {
148
153
  setHasStartedConnecting(true);
@@ -209,7 +214,7 @@ function useAuthentication(partnerId) {
209
214
  const { isLoading: useAutoConnectLoading } = (0, react_3.useAutoConnect)({
210
215
  client: thirdweb_1.client,
211
216
  wallets: [wallet],
212
- onConnect: onConnect,
217
+ onConnect,
213
218
  });
214
219
  /**
215
220
  * useAutoConnectLoading starts as false
@@ -21,4 +21,4 @@ export interface SimBalanceResponse {
21
21
  wallet_address: string;
22
22
  balances: SimBalanceItem[];
23
23
  }
24
- export declare function useSimBalance(address?: string): import("@tanstack/react-query").UseQueryResult<SimBalanceResponse, Error>;
24
+ export declare function useSimBalance(address?: string, chainIdsParam?: number[]): import("@tanstack/react-query").UseQueryResult<SimBalanceResponse, Error>;
@@ -2,10 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useSimBalance = useSimBalance;
4
4
  const react_query_1 = require("@tanstack/react-query");
5
- async function fetchSimBalance(address) {
5
+ async function fetchSimBalance(address, chainIdsParam) {
6
6
  if (!address)
7
7
  throw new Error("Address is required");
8
- let url = `https://simdune-api.sean-430.workers.dev/?url=https://api.sim.dune.com/v1/evm/balances/${address}?metadata=logo&chain_ids=mainnet`;
8
+ const chainIds = chainIdsParam.length === 0 ? "mainnet" : chainIdsParam.join(",");
9
+ let url = `https://simdune-api.sean-430.workers.dev/?url=https://api.sim.dune.com/v1/evm/balances/${address}?metadata=logo&chain_ids=${chainIds}`;
9
10
  if (process.env.NEXT_PUBLIC_LOCAL_KEY) {
10
11
  url += `&localkey=${process.env.NEXT_PUBLIC_LOCAL_KEY}`;
11
12
  }
@@ -16,13 +17,13 @@ async function fetchSimBalance(address) {
16
17
  const balanceData = await response.json();
17
18
  return balanceData;
18
19
  }
19
- function useSimBalance(address) {
20
+ function useSimBalance(address, chainIdsParam) {
20
21
  return (0, react_query_1.useQuery)({
21
- queryKey: ["simBalance", address],
22
+ queryKey: ["simBalance", address, chainIdsParam],
22
23
  queryFn: () => {
23
24
  if (!address)
24
25
  throw new Error("Address is required");
25
- return fetchSimBalance(address);
26
+ return fetchSimBalance(address, chainIdsParam || []);
26
27
  },
27
28
  enabled: Boolean(address),
28
29
  });
@@ -0,0 +1,12 @@
1
+ import { components } from "../../../anyspend/types/api";
2
+ interface UseTokenBalanceProps {
3
+ token: components["schemas"]["Token"];
4
+ address?: string;
5
+ }
6
+ export interface TokenBalanceResult {
7
+ rawBalance: bigint | null;
8
+ formattedBalance: string;
9
+ isLoading: boolean;
10
+ }
11
+ export declare function useTokenBalanceDirect({ token, address }: UseTokenBalanceProps): TokenBalanceResult;
12
+ export {};
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.useTokenBalanceDirect = useTokenBalanceDirect;
5
+ const anyspend_1 = require("../../../anyspend");
6
+ const react_1 = require("../../../global-account/react");
7
+ const number_1 = require("../../../shared/utils/number");
8
+ const thirdweb_insights_1 = require("../../../shared/utils/thirdweb-insights");
9
+ const react_query_1 = require("@tanstack/react-query");
10
+ const react_2 = require("react");
11
+ function useTokenBalanceDirect({ token, address }) {
12
+ const account = (0, react_1.useAccountWallet)();
13
+ const effectiveAddress = address || account?.address;
14
+ const { data: tokenBalance, isLoading, isFetching, refetch, } = (0, react_query_1.useQuery)({
15
+ queryKey: ["tokenBalance", effectiveAddress, token.chainId, token.address],
16
+ queryFn: async () => {
17
+ if (!effectiveAddress)
18
+ return { formatted: "0", raw: null };
19
+ if ((0, anyspend_1.isNativeToken)(token.address)) {
20
+ const nativeToken = await (0, thirdweb_insights_1.getNativeTokenBalance)(effectiveAddress, token.chainId);
21
+ if (nativeToken && nativeToken.balance) {
22
+ const rawBalance = nativeToken.balance;
23
+ return {
24
+ formatted: (0, number_1.formatTokenAmount)(BigInt(rawBalance), Number(nativeToken.decimals || 18)),
25
+ raw: BigInt(rawBalance),
26
+ };
27
+ }
28
+ return { formatted: "0", raw: null };
29
+ }
30
+ const response = await (0, thirdweb_insights_1.getERC20Balances)(effectiveAddress, {
31
+ chainIds: [token.chainId],
32
+ includeSpam: false,
33
+ });
34
+ const tokenBalance = response.data?.find(t => t.token_address === token.address);
35
+ if (tokenBalance?.balance) {
36
+ return {
37
+ formatted: (0, number_1.formatTokenAmount)(BigInt(tokenBalance.balance), Number(tokenBalance.decimals || 18)),
38
+ raw: BigInt(tokenBalance.balance),
39
+ };
40
+ }
41
+ return { formatted: "0", raw: null };
42
+ },
43
+ enabled: !!effectiveAddress,
44
+ staleTime: 30000,
45
+ gcTime: 5 * 60 * 1000,
46
+ retry: 2,
47
+ structuralSharing: false,
48
+ });
49
+ // Force a refetch when the wallet or token changes
50
+ (0, react_2.useEffect)(() => {
51
+ if (effectiveAddress) {
52
+ refetch();
53
+ }
54
+ }, [effectiveAddress, token.address, token.chainId, token.symbol, refetch]);
55
+ // Determine if we're actually loading
56
+ const isActuallyLoading = !effectiveAddress || isLoading || (isFetching && !tokenBalance);
57
+ return {
58
+ rawBalance: tokenBalance?.raw || BigInt(0),
59
+ formattedBalance: tokenBalance?.formatted || "0",
60
+ isLoading: isActuallyLoading,
61
+ };
62
+ }
@@ -32,10 +32,11 @@ function useTokenFromUrl({ defaultToken, prefix }) {
32
32
  // Get parameters from URL
33
33
  const currencyParam = searchParams.get(`${prefix}Currency`);
34
34
  const chainIdParam = searchParams.get(`${prefix}ChainId`);
35
- // Determine if we should fetch token info
36
- const shouldFetchToken = Boolean(currencyParam && chainIdParam && currencyParam.toLowerCase() !== defaultToken.address.toLowerCase());
37
35
  // Determine network based on chainId
38
- const network = chainIdParam ? (0, supported_1.getCoingeckoChainInfo)(Number(chainIdParam)).coingecko_id : "";
36
+ const chainInfo = chainIdParam ? (0, supported_1.getCoingeckoChainInfo)(Number(chainIdParam)) : null;
37
+ const network = chainInfo?.coingecko_id || "";
38
+ // Determine if we should fetch token info
39
+ const shouldFetchToken = Boolean(currencyParam && chainIdParam && chainInfo && currencyParam.toLowerCase() !== defaultToken.address.toLowerCase());
39
40
  const { data: tokenInfo, isError } = (0, react_query_1.useQuery)({
40
41
  queryKey: ["tokenInfo", network, currencyParam],
41
42
  queryFn: () => fetchTokenInfo(network, currencyParam || ""),
@@ -210,6 +210,20 @@ export interface AnySpendStakeB3Props extends BaseModalProps {
210
210
  /** Callback function called when the stake is successful */
211
211
  onSuccess?: () => void;
212
212
  }
213
+ /**
214
+ * Props for the AnySpend Stake B3 (Custom Exact In) modal
215
+ * Handles B3 token staking operations using the custom exact in flow
216
+ */
217
+ export interface AnySpendStakeB3ExactInProps extends BaseModalProps {
218
+ /** Modal type identifier */
219
+ type: "anySpendStakeB3ExactIn";
220
+ /** Recipient address to stake B3 for */
221
+ recipientAddress: string;
222
+ /** Stake amount */
223
+ stakeAmount?: string;
224
+ /** Callback function called when the stake is successful */
225
+ onSuccess?: () => void;
226
+ }
213
227
  /**
214
228
  * Props for the AnySpend Stake Contract modal
215
229
  * Handles token staking operations to a given contract
@@ -230,6 +244,22 @@ export interface AnySpendStakeUpsideProps extends BaseModalProps {
230
244
  /** Callback function called when the stake is successful */
231
245
  onSuccess?: () => void;
232
246
  }
247
+ /**
248
+ * Props for the AnySpend Stake Upside (Exact In) modal
249
+ * Handles token staking operations using the custom exact in flow
250
+ */
251
+ export interface AnySpendStakeUpsideExactInProps extends BaseModalProps {
252
+ /** Modal type identifier */
253
+ type: "anySpendStakeUpsideExactIn";
254
+ /** Recipient address to stake tokens for */
255
+ recipientAddress: string;
256
+ /** Staking contract address */
257
+ stakingContractAddress: string;
258
+ /** Token to stake */
259
+ token: components["schemas"]["Token"];
260
+ /** Callback function called when the stake is successful */
261
+ onSuccess?: () => void;
262
+ }
233
263
  /**
234
264
  * Props for the AnySpend Buy Spin modal
235
265
  * Handles spin wheel entry purchases
@@ -324,7 +354,7 @@ export interface AvatarEditorModalProps extends BaseModalProps {
324
354
  /**
325
355
  * Union type of all possible modal content types
326
356
  */
327
- export type ModalContentType = SignInWithB3ModalProps | RequestPermissionsModalProps | ManageAccountModalProps | AnySpendModalProps | AnyspendOrderDetailsProps | AnySpendNftProps | AnySpendJoinTournamentProps | AnySpendFundTournamentProps | AnySpendOrderHistoryProps | AnySpendStakeB3Props | AnySpendStakeUpsideProps | AnySpendBuySpinProps | AnySpendSignatureMintProps | AnySpendBondKitProps | LinkAccountModalProps | AnySpendDepositHypeProps | AvatarEditorModalProps;
357
+ export type ModalContentType = SignInWithB3ModalProps | RequestPermissionsModalProps | ManageAccountModalProps | AnySpendModalProps | AnyspendOrderDetailsProps | AnySpendNftProps | AnySpendJoinTournamentProps | AnySpendFundTournamentProps | AnySpendOrderHistoryProps | AnySpendStakeB3Props | AnySpendStakeB3ExactInProps | AnySpendStakeUpsideProps | AnySpendStakeUpsideExactInProps | AnySpendBuySpinProps | AnySpendSignatureMintProps | AnySpendBondKitProps | LinkAccountModalProps | AnySpendDepositHypeProps | AvatarEditorModalProps;
328
358
  /**
329
359
  * State interface for the modal store
330
360
  */
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { getDefaultToken, USDC_BASE } from "../../../anyspend/index.js";
4
4
  import { useAnyspendCreateOnrampOrder, useAnyspendCreateOrder, useAnyspendOrderAndTransactions, useAnyspendQuote, useGeoOnrampOptions, } from "../../../anyspend/react/index.js";
5
- import { Button, ShinyButton, StyleRoot, TransitionPanel, useAccountWallet, useProfile, useRouter, useSearchParamsSSR, useTokenData, useTokenFromUrl, } from "../../../global-account/react/index.js";
5
+ import { Button, ShinyButton, StyleRoot, TransitionPanel, useAccountWallet, useProfile, useRouter, useSearchParamsSSR, useTokenBalanceDirect, useTokenData, useTokenFromUrl, } from "../../../global-account/react/index.js";
6
6
  import { cn } from "../../../shared/utils/cn.js";
7
7
  import { formatTokenAmount } from "../../../shared/utils/number.js";
8
8
  import invariant from "invariant";
@@ -12,17 +12,19 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
12
12
  import { toast } from "sonner";
13
13
  import { parseUnits } from "viem";
14
14
  import { base, mainnet } from "viem/chains";
15
+ import { useAutoSelectCryptoPaymentMethod } from "../hooks/useAutoSelectCryptoPaymentMethod.js";
16
+ import { useAutoSetActiveWalletFromWagmi } from "../hooks/useAutoSetActiveWalletFromWagmi.js";
15
17
  import { AnySpendFingerprintWrapper, getFingerprintConfig } from "./AnySpendFingerprintWrapper.js";
16
18
  import { CryptoPaymentMethod, CryptoPaymentMethodType } from "./common/CryptoPaymentMethod.js";
17
19
  import { CryptoPaySection } from "./common/CryptoPaySection.js";
18
20
  import { CryptoReceiveSection } from "./common/CryptoReceiveSection.js";
21
+ import { FeeDetailPanel } from "./common/FeeDetailPanel.js";
19
22
  import { FiatPaymentMethod, FiatPaymentMethodComponent } from "./common/FiatPaymentMethod.js";
20
23
  import { OrderDetails, OrderDetailsLoadingView } from "./common/OrderDetails.js";
21
24
  import { OrderHistory } from "./common/OrderHistory.js";
22
25
  import { PanelOnramp } from "./common/PanelOnramp.js";
23
26
  import { PanelOnrampPayment } from "./common/PanelOnrampPayment.js";
24
27
  import { PointsDetailPanel } from "./common/PointsDetailPanel.js";
25
- import { FeeDetailPanel } from "./common/FeeDetailPanel.js";
26
28
  import { RecipientSelection } from "./common/RecipientSelection.js";
27
29
  import { TabSection } from "./common/TabSection.js";
28
30
  export var PanelView;
@@ -304,13 +306,36 @@ function AnySpendInner({ destinationTokenAddress, destinationTokenChainId, mode
304
306
  // );
305
307
  // State for recipient selection
306
308
  const [recipientAddress, setRecipientAddress] = useState();
307
- const { address: globalAddress, wallet: globalWallet } = useAccountWallet();
309
+ const { address: globalAddress, wallet: globalWallet, connectedEOAWallet } = useAccountWallet();
308
310
  const recipientProfile = useProfile({ address: recipientAddress, fresh: true });
309
311
  const recipientName = recipientProfile.data?.name;
310
- // Set default recipient address when wallet changes
311
- useEffect(() => {
312
- setRecipientAddress(recipientAddressFromProps || globalAddress);
313
- }, [recipientAddressFromProps, globalAddress]);
312
+ // Auto-set active wallet from wagmi
313
+ useAutoSetActiveWalletFromWagmi();
314
+ // Check token balance for crypto payments
315
+ const { rawBalance, isLoading: isBalanceLoading } = useTokenBalanceDirect({
316
+ token: selectedSrcToken,
317
+ address: connectedEOAWallet?.getAccount()?.address,
318
+ });
319
+ // Check if user has enough balanceuseAutoSetActiveWalletFromWagmi
320
+ const hasEnoughBalance = useMemo(() => {
321
+ if (!rawBalance || isBalanceLoading || activeTab !== "crypto")
322
+ return false;
323
+ try {
324
+ const requiredAmount = parseUnits(srcAmount.replace(/,/g, ""), selectedSrcToken.decimals);
325
+ return rawBalance >= requiredAmount;
326
+ }
327
+ catch {
328
+ return false;
329
+ }
330
+ }, [rawBalance, srcAmount, selectedSrcToken.decimals, isBalanceLoading, activeTab]);
331
+ // Auto-select crypto payment method based on available wallets and balance
332
+ useAutoSelectCryptoPaymentMethod({
333
+ paymentType: activeTab,
334
+ selectedCryptoPaymentMethod,
335
+ setSelectedCryptoPaymentMethod,
336
+ hasEnoughBalance,
337
+ isBalanceLoading,
338
+ });
314
339
  // Get geo-based onramp options for fiat payments
315
340
  const { geoData, coinbaseAvailablePaymentMethods, stripeWeb2Support } = useGeoOnrampOptions(srcAmountOnRamp);
316
341
  // Helper function to map payment method to onramp vendor
@@ -474,17 +499,30 @@ function AnySpendInner({ destinationTokenAddress, destinationTokenChainId, mode
474
499
  return { text: "Select a different token or chain", disable: true, error: false, loading: false };
475
500
  if (isLoadingAnyspendQuote)
476
501
  return { text: "Loading quote...", disable: true, error: false, loading: true };
477
- if (!recipientAddress)
478
- return { text: "Select recipient", disable: false, error: false, loading: false };
479
502
  if (isCreatingOrder || isCreatingOnrampOrder)
480
503
  return { text: "Creating order...", disable: true, error: false, loading: true };
481
504
  if (!anyspendQuote || !anyspendQuote.success)
482
505
  return { text: "No quote found", disable: true, error: false, loading: false };
506
+ if (activeTab === "fiat") {
507
+ // For fiat: check recipient first, then payment method
508
+ if (!recipientAddress)
509
+ return { text: "Select recipient", disable: false, error: false, loading: false };
510
+ // If no fiat payment method selected, show "Select payment method"
511
+ if (selectedFiatPaymentMethod === FiatPaymentMethod.NONE) {
512
+ return { text: "Select payment method", disable: false, error: false, loading: false };
513
+ }
514
+ // If payment method is selected, show "Buy"
515
+ return { text: "Buy", disable: false, error: false, loading: false };
516
+ }
483
517
  if (activeTab === "crypto") {
518
+ // For crypto: check payment method first, then recipient
484
519
  // If no payment method selected, show "Choose payment method"
485
520
  if (selectedCryptoPaymentMethod === CryptoPaymentMethodType.NONE) {
486
521
  return { text: "Choose payment method", disable: false, error: false, loading: false };
487
522
  }
523
+ // Check recipient after payment method
524
+ if (!recipientAddress)
525
+ return { text: "Select recipient", disable: false, error: false, loading: false };
488
526
  // If payment method selected, show appropriate action
489
527
  if (selectedCryptoPaymentMethod === CryptoPaymentMethodType.CONNECT_WALLET ||
490
528
  selectedCryptoPaymentMethod === CryptoPaymentMethodType.GLOBAL_WALLET) {
@@ -494,14 +532,6 @@ function AnySpendInner({ destinationTokenAddress, destinationTokenChainId, mode
494
532
  return { text: "Continue to payment", disable: false, error: false, loading: false };
495
533
  }
496
534
  }
497
- if (activeTab === "fiat") {
498
- // If no fiat payment method selected, show "Select payment method"
499
- if (selectedFiatPaymentMethod === FiatPaymentMethod.NONE) {
500
- return { text: "Select payment method", disable: false, error: false, loading: false };
501
- }
502
- // If payment method is selected, show "Buy"
503
- return { text: "Buy", disable: false, error: false, loading: false };
504
- }
505
535
  return { text: "Buy", disable: false, error: false, loading: false };
506
536
  }, [
507
537
  activeInputAmountInWei,
@@ -519,14 +549,15 @@ function AnySpendInner({ destinationTokenAddress, destinationTokenChainId, mode
519
549
  const onMainButtonClick = async () => {
520
550
  if (btnInfo.disable)
521
551
  return;
522
- if (!recipientAddress) {
523
- navigateToPanel(PanelView.RECIPIENT_SELECTION, "forward");
524
- return;
525
- }
526
552
  try {
527
553
  invariant(anyspendQuote, "Relay price is not found");
528
- invariant(recipientAddress, "Recipient address is not found");
529
554
  if (activeTab === "fiat") {
555
+ // For fiat: check recipient first
556
+ if (!recipientAddress) {
557
+ navigateToPanel(PanelView.RECIPIENT_SELECTION, "forward");
558
+ return;
559
+ }
560
+ invariant(recipientAddress, "Recipient address is not found");
530
561
  // If no fiat payment method selected, show payment method selection
531
562
  if (selectedFiatPaymentMethod === FiatPaymentMethod.NONE) {
532
563
  navigateToPanel(PanelView.FIAT_PAYMENT_METHOD, "forward");
@@ -537,12 +568,19 @@ function AnySpendInner({ destinationTokenAddress, destinationTokenChainId, mode
537
568
  return;
538
569
  }
539
570
  if (activeTab === "crypto") {
571
+ // For crypto: check payment method first, then recipient
540
572
  // If no payment method selected, show payment method selection
541
573
  if (selectedCryptoPaymentMethod === CryptoPaymentMethodType.NONE) {
542
574
  console.log("No payment method selected, showing selection panel");
543
575
  navigateToPanel(PanelView.CRYPTO_PAYMENT_METHOD, "forward");
544
576
  return;
545
577
  }
578
+ // Check recipient after payment method
579
+ if (!recipientAddress) {
580
+ navigateToPanel(PanelView.RECIPIENT_SELECTION, "forward");
581
+ return;
582
+ }
583
+ invariant(recipientAddress, "Recipient address is not found");
546
584
  // If payment method is selected, create order with payment method info
547
585
  if (selectedCryptoPaymentMethod === CryptoPaymentMethodType.CONNECT_WALLET ||
548
586
  selectedCryptoPaymentMethod === CryptoPaymentMethodType.GLOBAL_WALLET ||
@@ -755,10 +793,10 @@ function AnySpendInner({ destinationTokenAddress, destinationTokenChainId, mode
755
793
  const tempDstAmount = dstAmount;
756
794
  setSrcAmount(tempDstAmount);
757
795
  setDstAmount(tempSrcAmount);
758
- }, children: _jsx("div", { className: "relative flex items-center justify-center transition-opacity", children: _jsx(ArrowDown, { className: "text-as-primary/50 h-5 w-5" }) }) }), activeTab === "crypto" && (_jsx(CryptoReceiveSection, { isDepositMode: false, isBuyMode: isBuyMode, selectedRecipientAddress: recipientAddress, recipientName: recipientName || undefined, onSelectRecipient: () => navigateToPanel(PanelView.RECIPIENT_SELECTION, "forward"), dstAmount: dstAmount, dstToken: selectedDstToken, selectedDstChainId: selectedDstChainId, setSelectedDstChainId: setSelectedDstChainId, setSelectedDstToken: setSelectedDstToken, isSrcInputDirty: isSrcInputDirty, onChangeDstAmount: value => {
796
+ }, children: _jsx("div", { className: "relative flex items-center justify-center transition-opacity", children: _jsx(ArrowDown, { className: "text-as-primary/50 h-5 w-5" }) }) }), activeTab === "crypto" && (_jsx(CryptoReceiveSection, { isDepositMode: false, isBuyMode: isBuyMode, selectedRecipientAddress: recipientAddress, recipientName: recipientName || undefined, onSelectRecipient: () => navigateToPanel(PanelView.RECIPIENT_SELECTION, "forward"), setRecipientAddress: setRecipientAddress, recipientAddressFromProps: recipientAddressFromProps, globalAddress: globalAddress, dstAmount: dstAmount, dstToken: selectedDstToken, selectedDstChainId: selectedDstChainId, setSelectedDstChainId: setSelectedDstChainId, setSelectedDstToken: setSelectedDstToken, isSrcInputDirty: isSrcInputDirty, onChangeDstAmount: value => {
759
797
  setIsSrcInputDirty(false);
760
798
  setDstAmount(value);
761
- }, anyspendQuote: anyspendQuote, onShowPointsDetail: () => navigateToPanel(PanelView.POINTS_DETAIL, "forward"), onShowFeeDetail: () => navigateToPanel(PanelView.FEE_DETAIL, "forward") }))] }), _jsxs(motion.div, { initial: { opacity: 0, y: 20, filter: "blur(10px)" }, animate: { opacity: 1, y: 0, filter: "blur(0px)" }, transition: { duration: 0.3, delay: 0.2, ease: "easeInOut" }, className: cn("mt-4 flex w-full max-w-[460px] flex-col gap-2"), children: [_jsx(ShinyButton, { accentColor: "hsl(var(--as-brand))", disabled: btnInfo.disable, onClick: onMainButtonClick, className: cn("as-main-button relative w-full", btnInfo.error ? "!bg-as-red" : btnInfo.disable ? "!bg-as-on-surface-2" : "!bg-as-brand"), textClassName: cn(btnInfo.error ? "text-white" : btnInfo.disable ? "text-as-secondary" : "text-white"), children: _jsxs("div", { className: "flex items-center justify-center gap-2", children: [btnInfo.loading && _jsx(Loader2, { className: "h-4 w-4 animate-spin" }), btnInfo.text] }) }), !hideTransactionHistoryButton && (globalAddress || recipientAddress) ? (_jsxs(Button, { variant: "link", onClick: onClickHistory, className: "text-as-primary/50 hover:text-as-primary flex items-center gap-1 transition-colors", children: [_jsx(HistoryIcon, { className: "h-4 w-4" }), " ", _jsx("span", { className: "pr-4", children: "Transaction History" })] })) : null] })] }));
799
+ }, anyspendQuote: anyspendQuote, onShowPointsDetail: () => navigateToPanel(PanelView.POINTS_DETAIL, "forward"), onShowFeeDetail: () => navigateToPanel(PanelView.FEE_DETAIL, "forward"), selectedCryptoPaymentMethod: selectedCryptoPaymentMethod }))] }), _jsxs(motion.div, { initial: { opacity: 0, y: 20, filter: "blur(10px)" }, animate: { opacity: 1, y: 0, filter: "blur(0px)" }, transition: { duration: 0.3, delay: 0.2, ease: "easeInOut" }, className: cn("mt-4 flex w-full max-w-[460px] flex-col gap-2"), children: [_jsx(ShinyButton, { accentColor: "hsl(var(--as-brand))", disabled: btnInfo.disable, onClick: onMainButtonClick, className: cn("as-main-button relative w-full", btnInfo.error ? "!bg-as-red" : btnInfo.disable ? "!bg-as-on-surface-2" : "!bg-as-brand"), textClassName: cn(btnInfo.error ? "text-white" : btnInfo.disable ? "text-as-secondary" : "text-white"), children: _jsxs("div", { className: "flex items-center justify-center gap-2", children: [btnInfo.loading && _jsx(Loader2, { className: "h-4 w-4 animate-spin" }), btnInfo.text] }) }), !hideTransactionHistoryButton && (globalAddress || recipientAddress) ? (_jsxs(Button, { variant: "link", onClick: onClickHistory, className: "text-as-primary/50 hover:text-as-primary flex items-center gap-1 transition-colors", children: [_jsx(HistoryIcon, { className: "h-4 w-4" }), " ", _jsx("span", { className: "pr-4", children: "Transaction History" })] })) : null] })] }));
762
800
  const onrampPaymentView = (_jsx(PanelOnrampPayment, { srcAmountOnRamp: srcAmountOnRamp, recipientName: recipientName || undefined, recipientAddress: recipientAddress, isBuyMode: isBuyMode, destinationTokenChainId: destinationTokenChainId, destinationTokenAddress: destinationTokenAddress, selectedDstChainId: selectedDstChainId, selectedDstToken: selectedDstToken, orderType: "swap", anyspendQuote: anyspendQuote, globalAddress: globalAddress, onOrderCreated: orderId => {
763
801
  setOrderId(orderId);
764
802
  navigateToPanel(PanelView.ORDER_DETAILS, "forward");
@@ -14,6 +14,7 @@ import React, { useCallback, useEffect, useMemo, useState } from "react";
14
14
  import { toast } from "sonner";
15
15
  import { base } from "viem/chains";
16
16
  import { useFeatureFlags } from "../contexts/FeatureFlagsContext.js";
17
+ import { useAutoSetActiveWalletFromWagmi } from "../hooks/useAutoSetActiveWalletFromWagmi.js";
17
18
  import { AnySpendFingerprintWrapper, getFingerprintConfig } from "./AnySpendFingerprintWrapper.js";
18
19
  import { CryptoPaymentMethod, CryptoPaymentMethodType } from "./common/CryptoPaymentMethod.js";
19
20
  import { FeeBreakDown } from "./common/FeeBreakDown.js";
@@ -110,6 +111,8 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
110
111
  const featureFlags = useFeatureFlags();
111
112
  const searchParams = useSearchParamsSSR();
112
113
  const router = useRouter();
114
+ // Auto-set active wallet from wagmi
115
+ useAutoSetActiveWalletFromWagmi();
113
116
  const [activePanel, setActivePanel] = useState(loadOrder ? PanelView.ORDER_DETAILS : PanelView.CONFIRM_ORDER);
114
117
  const [activeTab, setActiveTab] = useState(activeTabProps);
115
118
  // Add state for selected payment methods
@@ -0,0 +1,34 @@
1
+ import { components } from "../../../anyspend/types/api";
2
+ import { GetQuoteResponse } from "../../../anyspend/types/api_req_res";
3
+ type CustomExactInConfig = {
4
+ functionAbi: string;
5
+ functionName: string;
6
+ functionArgs: string[];
7
+ to: string;
8
+ spenderAddress?: string;
9
+ action?: string;
10
+ };
11
+ export interface AnySpendCustomExactInProps {
12
+ loadOrder?: string;
13
+ mode?: "modal" | "page";
14
+ recipientAddress: string;
15
+ paymentType?: "crypto" | "fiat";
16
+ sourceTokenAddress?: string;
17
+ sourceTokenChainId?: number;
18
+ destinationToken: components["schemas"]["Token"];
19
+ destinationChainId: number;
20
+ onSuccess?: (amount: string) => void;
21
+ mainFooter?: React.ReactNode;
22
+ onTokenSelect?: (token: components["schemas"]["Token"], event: {
23
+ preventDefault: () => void;
24
+ }) => void;
25
+ customUsdInputValues?: string[];
26
+ preferEoa?: boolean;
27
+ customExactInConfig: CustomExactInConfig;
28
+ header?: ({ anyspendPrice, isLoadingAnyspendPrice, }: {
29
+ anyspendPrice: GetQuoteResponse | undefined;
30
+ isLoadingAnyspendPrice: boolean;
31
+ }) => React.JSX.Element;
32
+ }
33
+ export declare function AnySpendCustomExactIn(props: AnySpendCustomExactInProps): import("react/jsx-runtime").JSX.Element;
34
+ export {};