@b3dotfun/sdk 0.0.16 → 0.0.17-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 (102) hide show
  1. package/dist/cjs/anyspend/react/components/AnySpend.d.ts +5 -2
  2. package/dist/cjs/anyspend/react/components/AnySpend.js +264 -55
  3. package/dist/cjs/anyspend/react/components/AnySpendCustom.js +25 -29
  4. package/dist/cjs/anyspend/react/components/common/ConnectWalletPayment.d.ts +15 -0
  5. package/dist/cjs/anyspend/react/components/common/ConnectWalletPayment.js +49 -0
  6. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.d.ts +20 -0
  7. package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +118 -0
  8. package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.d.ts +15 -0
  9. package/dist/cjs/anyspend/react/components/common/FiatPaymentMethod.js +71 -0
  10. package/dist/cjs/anyspend/react/components/common/OrderDetails.d.ts +2 -0
  11. package/dist/cjs/anyspend/react/components/common/OrderDetails.js +41 -60
  12. package/dist/cjs/anyspend/react/components/common/OrderDetailsCollapsible.d.ts +18 -0
  13. package/dist/cjs/anyspend/react/components/common/OrderDetailsCollapsible.js +42 -0
  14. package/dist/cjs/anyspend/react/components/common/OrderStatus.js +28 -5
  15. package/dist/cjs/anyspend/react/components/common/OrderTokenAmountFiat.d.ts +13 -0
  16. package/dist/cjs/anyspend/react/components/common/OrderTokenAmountFiat.js +50 -0
  17. package/dist/cjs/anyspend/react/components/common/OrderTokenAmountNew.d.ts +16 -0
  18. package/dist/cjs/anyspend/react/components/common/OrderTokenAmountNew.js +63 -0
  19. package/dist/cjs/anyspend/react/components/common/PanelOnramp.d.ts +11 -1
  20. package/dist/cjs/anyspend/react/components/common/PanelOnramp.js +53 -15
  21. package/dist/cjs/anyspend/react/components/common/PanelOnrampPayment.js +1 -12
  22. package/dist/cjs/anyspend/react/components/common/PaymentStripeWeb2.js +4 -12
  23. package/dist/cjs/anyspend/react/components/common/StepProgress.d.ts +11 -0
  24. package/dist/cjs/anyspend/react/components/common/StepProgress.js +22 -0
  25. package/dist/cjs/anyspend/react/components/common/TransferCryptoDetails.d.ts +16 -0
  26. package/dist/cjs/anyspend/react/components/common/TransferCryptoDetails.js +73 -0
  27. package/dist/cjs/anyspend/react/components/index.d.ts +3 -0
  28. package/dist/cjs/anyspend/react/components/index.js +7 -1
  29. package/dist/cjs/anyspend/react/components/webview/WebviewOnrampPayment.js +1 -10
  30. package/dist/cjs/anyspend/utils/format.d.ts +1 -0
  31. package/dist/cjs/anyspend/utils/format.js +23 -10
  32. package/dist/cjs/anyspend/utils/number.d.ts +7 -0
  33. package/dist/cjs/anyspend/utils/number.js +18 -0
  34. package/dist/esm/anyspend/react/components/AnySpend.d.ts +5 -2
  35. package/dist/esm/anyspend/react/components/AnySpend.js +266 -57
  36. package/dist/esm/anyspend/react/components/AnySpendCustom.js +27 -31
  37. package/dist/esm/anyspend/react/components/common/ConnectWalletPayment.d.ts +15 -0
  38. package/dist/esm/anyspend/react/components/common/ConnectWalletPayment.js +46 -0
  39. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.d.ts +20 -0
  40. package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +114 -0
  41. package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.d.ts +15 -0
  42. package/dist/esm/anyspend/react/components/common/FiatPaymentMethod.js +67 -0
  43. package/dist/esm/anyspend/react/components/common/OrderDetails.d.ts +2 -0
  44. package/dist/esm/anyspend/react/components/common/OrderDetails.js +43 -62
  45. package/dist/esm/anyspend/react/components/common/OrderDetailsCollapsible.d.ts +18 -0
  46. package/dist/esm/anyspend/react/components/common/OrderDetailsCollapsible.js +36 -0
  47. package/dist/esm/anyspend/react/components/common/OrderStatus.js +27 -4
  48. package/dist/esm/anyspend/react/components/common/OrderTokenAmountFiat.d.ts +13 -0
  49. package/dist/esm/anyspend/react/components/common/OrderTokenAmountFiat.js +47 -0
  50. package/dist/esm/anyspend/react/components/common/OrderTokenAmountNew.d.ts +16 -0
  51. package/dist/esm/anyspend/react/components/common/OrderTokenAmountNew.js +60 -0
  52. package/dist/esm/anyspend/react/components/common/PanelOnramp.d.ts +11 -1
  53. package/dist/esm/anyspend/react/components/common/PanelOnramp.js +54 -16
  54. package/dist/esm/anyspend/react/components/common/PanelOnrampPayment.js +1 -12
  55. package/dist/esm/anyspend/react/components/common/PaymentStripeWeb2.js +7 -15
  56. package/dist/esm/anyspend/react/components/common/StepProgress.d.ts +11 -0
  57. package/dist/esm/anyspend/react/components/common/StepProgress.js +19 -0
  58. package/dist/esm/anyspend/react/components/common/TransferCryptoDetails.d.ts +16 -0
  59. package/dist/esm/anyspend/react/components/common/TransferCryptoDetails.js +70 -0
  60. package/dist/esm/anyspend/react/components/index.d.ts +3 -0
  61. package/dist/esm/anyspend/react/components/index.js +3 -0
  62. package/dist/esm/anyspend/react/components/webview/WebviewOnrampPayment.js +1 -10
  63. package/dist/esm/anyspend/utils/format.d.ts +1 -0
  64. package/dist/esm/anyspend/utils/format.js +23 -10
  65. package/dist/esm/anyspend/utils/number.d.ts +7 -0
  66. package/dist/esm/anyspend/utils/number.js +17 -0
  67. package/dist/styles/index.css +1 -1
  68. package/dist/types/anyspend/react/components/AnySpend.d.ts +5 -2
  69. package/dist/types/anyspend/react/components/common/ConnectWalletPayment.d.ts +15 -0
  70. package/dist/types/anyspend/react/components/common/CryptoPaymentMethod.d.ts +20 -0
  71. package/dist/types/anyspend/react/components/common/FiatPaymentMethod.d.ts +15 -0
  72. package/dist/types/anyspend/react/components/common/OrderDetails.d.ts +2 -0
  73. package/dist/types/anyspend/react/components/common/OrderDetailsCollapsible.d.ts +18 -0
  74. package/dist/types/anyspend/react/components/common/OrderTokenAmountFiat.d.ts +13 -0
  75. package/dist/types/anyspend/react/components/common/OrderTokenAmountNew.d.ts +16 -0
  76. package/dist/types/anyspend/react/components/common/PanelOnramp.d.ts +11 -1
  77. package/dist/types/anyspend/react/components/common/StepProgress.d.ts +11 -0
  78. package/dist/types/anyspend/react/components/common/TransferCryptoDetails.d.ts +16 -0
  79. package/dist/types/anyspend/react/components/index.d.ts +3 -0
  80. package/dist/types/anyspend/utils/format.d.ts +1 -0
  81. package/dist/types/anyspend/utils/number.d.ts +7 -0
  82. package/package.json +1 -1
  83. package/src/anyspend/react/components/AnySpend.tsx +535 -177
  84. package/src/anyspend/react/components/AnySpendCustom.tsx +33 -38
  85. package/src/anyspend/react/components/common/ConnectWalletPayment.tsx +124 -0
  86. package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +227 -0
  87. package/src/anyspend/react/components/common/FiatPaymentMethod.tsx +173 -0
  88. package/src/anyspend/react/components/common/OrderDetails.tsx +123 -250
  89. package/src/anyspend/react/components/common/OrderDetailsCollapsible.tsx +156 -0
  90. package/src/anyspend/react/components/common/OrderStatus.tsx +47 -24
  91. package/src/anyspend/react/components/common/OrderTokenAmountFiat.tsx +147 -0
  92. package/src/anyspend/react/components/common/OrderTokenAmountNew.tsx +215 -0
  93. package/src/anyspend/react/components/common/PanelOnramp.tsx +215 -62
  94. package/src/anyspend/react/components/common/PanelOnrampPayment.tsx +1 -14
  95. package/src/anyspend/react/components/common/PaymentStripeWeb2.tsx +42 -99
  96. package/src/anyspend/react/components/common/StepProgress.tsx +104 -0
  97. package/src/anyspend/react/components/common/TransferCryptoDetails.tsx +261 -0
  98. package/src/anyspend/react/components/index.ts +3 -0
  99. package/src/anyspend/react/components/webview/WebviewOnrampPayment.tsx +1 -11
  100. package/src/anyspend/utils/format.ts +24 -11
  101. package/src/anyspend/utils/number.ts +18 -0
  102. package/src/styles/index.css +30 -11
@@ -1,11 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { eqci, getDefaultToken } from "../../../anyspend/index.js";
2
+ import { eqci, getDefaultToken, roundUpUSDCBaseAmountToNearest } from "../../../anyspend/index.js";
3
3
  import { RELAY_ETH_ADDRESS, USDC_BASE } from "../../../anyspend/constants/index.js";
4
4
  import { useAnyspendCreateOnrampOrder, useAnyspendCreateOrder, useAnyspendOrderAndTransactions, useAnyspendQuote, useAnyspendTokenList, useGeoOnrampOptions, } from "../../../anyspend/react/index.js";
5
5
  import { Badge, Button, Dialog, DialogContent, Input, ShinyButton, Skeleton, StyleRoot, Tabs, TabsContent, TabsList, TabTrigger, TextShimmer, Tooltip, TooltipContent, TooltipTrigger, TransitionPanel, useAccountWallet, useHasMounted, useProfile, useRouter, useSearchParamsSSR, useTokenBalancesByChain, } from "../../../global-account/react/index.js";
6
6
  import { cn } from "../../../shared/utils/index.js";
7
7
  import centerTruncate from "../../../shared/utils/centerTruncate.js";
8
- import { formatTokenAmount } from "../../../shared/utils/number.js";
8
+ import { formatTokenAmount, formatUnits } from "../../../shared/utils/number.js";
9
9
  import { simpleHashChainToChainName } from "../../../shared/utils/simplehash.js";
10
10
  import invariant from "invariant";
11
11
  import { ChevronRightCircle, Loader2 } from "lucide-react";
@@ -156,8 +156,8 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
156
156
  const getRelayQuoteRequest = useMemo(() => {
157
157
  return generateGetRelayQuoteRequest({
158
158
  orderType: orderType,
159
- srcChainId: srcChainId,
160
- srcToken: srcToken,
159
+ srcChainId: activeTab === "fiat" ? base.id : srcChainId,
160
+ srcToken: activeTab === "fiat" ? USDC_BASE : srcToken,
161
161
  dstChainId: dstChainId,
162
162
  dstToken: dstToken,
163
163
  dstAmount: dstAmount,
@@ -168,20 +168,21 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
168
168
  spenderAddress: spenderAddress,
169
169
  });
170
170
  }, [
171
+ activeTab,
171
172
  contractAddress,
172
173
  dstAmount,
173
174
  dstChainId,
174
175
  dstToken,
175
176
  encodedData,
176
- metadata,
177
+ metadata?.nftContract?.tokenId,
178
+ metadata?.nftContract?.type,
179
+ metadata?.type,
177
180
  orderType,
178
181
  spenderAddress,
179
182
  srcChainId,
180
183
  srcToken,
181
184
  ]);
182
185
  const { anyspendQuote, isLoadingAnyspendQuote } = useAnyspendQuote(isMainnet, getRelayQuoteRequest);
183
- // Get geo data and onramp options (after quote is available)
184
- const { geoData, isOnrampSupported } = useGeoOnrampOptions(isMainnet, anyspendQuote?.data?.currencyIn?.amountUsd || "0");
185
186
  const { orderAndTransactions: oat } = useAnyspendOrderAndTransactions(isMainnet, orderId);
186
187
  const onSelectOrder = (selectedOrderId) => {
187
188
  setActivePanel(PanelView.ORDER_DETAILS);
@@ -191,30 +192,25 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
191
192
  params.set("orderId", selectedOrderId);
192
193
  router.push(`${window.location.pathname}?${params.toString()}`);
193
194
  };
194
- const [srcAmount, setSrcAmount] = useState(null);
195
- const formattedSrcAmount = srcAmount ? formatTokenAmount(srcAmount, srcToken.decimals, 6, false) : null;
196
- // Update the selected src token to USDC and chain to base when the active tab is fiat,
197
- // also force not to update srcToken by setting dirtySelectSrcToken to true.
198
- useEffect(() => {
199
- if (activeTab === "fiat") {
200
- setSrcChainId(base.id);
201
- setSrcToken(USDC_BASE);
202
- setDirtySelectSrcToken(true);
203
- }
204
- }, [activeTab]);
205
195
  // Update dependent amount when relay price changes
206
- useEffect(() => {
207
- if (anyspendQuote?.data &&
208
- anyspendQuote.data.currencyIn?.amount &&
209
- anyspendQuote.data.currencyIn?.currency?.decimals) {
210
- // Use toPrecision instead of toSignificant
211
- const amount = anyspendQuote.data.currencyIn.amount;
212
- setSrcAmount(BigInt(amount));
196
+ const srcAmount = useMemo(() => {
197
+ if (!anyspendQuote?.data ||
198
+ !anyspendQuote?.data?.currencyIn?.amount ||
199
+ !anyspendQuote?.data?.currencyIn?.currency?.decimals)
200
+ return null;
201
+ const amount = anyspendQuote.data.currencyIn.amount;
202
+ if (activeTab === "fiat") {
203
+ const roundUpAmount = roundUpUSDCBaseAmountToNearest(amount);
204
+ return BigInt(roundUpAmount);
213
205
  }
214
206
  else {
215
- setSrcAmount(null);
207
+ return BigInt(amount);
216
208
  }
217
- }, [anyspendQuote?.data]);
209
+ }, [activeTab, anyspendQuote?.data]);
210
+ const formattedSrcAmount = srcAmount ? formatTokenAmount(srcAmount, srcToken.decimals, 6, false) : null;
211
+ const srcFiatAmount = useMemo(() => (activeTab === "fiat" && srcAmount ? formatUnits(srcAmount.toString(), USDC_BASE.decimals) : "0"), [activeTab, srcAmount]);
212
+ // Get geo data and onramp options (after quote is available)
213
+ const { geoData, isOnrampSupported } = useGeoOnrampOptions(isMainnet, srcFiatAmount);
218
214
  useEffect(() => {
219
215
  if (oat?.data?.order.status === "executed") {
220
216
  console.log("Calling onSuccess");
@@ -248,9 +244,9 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
248
244
  const createOrderParams = {
249
245
  isMainnet: isMainnet,
250
246
  orderType: orderType,
251
- srcChain: srcChainId,
247
+ srcChain: activeTab === "fiat" ? base.id : srcChainId,
252
248
  dstChain: dstChainId,
253
- srcToken: srcToken,
249
+ srcToken: activeTab === "fiat" ? USDC_BASE : srcToken,
254
250
  dstToken: dstToken,
255
251
  srcAmount: srcAmount.toString(),
256
252
  recipientAddress,
@@ -299,7 +295,7 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
299
295
  invariant(srcChainId === base.id, "Selected src chain is not base");
300
296
  void createOnrampOrder({
301
297
  ...createOrderParams,
302
- srcFiatAmount: anyspendQuote?.data?.currencyIn?.amountUsd || "0",
298
+ srcFiatAmount: srcFiatAmount,
303
299
  onramp: {
304
300
  vendor: onramp.vendor,
305
301
  paymentMethod: onramp.paymentMethod,
@@ -388,7 +384,7 @@ export function AnySpendCustom({ isMainnet = true, loadOrder, mode = "modal", re
388
384
  opacity: hasMounted ? 1 : 0,
389
385
  y: hasMounted ? 0 : 20,
390
386
  filter: hasMounted ? "blur(0px)" : "blur(10px)",
391
- }, transition: { duration: 0.3, delay: 0.3, ease: "easeInOut" }, className: "flex w-full flex-col gap-2", children: _jsx(ShinyButton, { accentColor: "hsl(var(--as-brand))", textColor: "text-white", disabled: isCreatingOrder || isLoadingAnyspendQuote || !anyspendQuote || !recipientAddress, onClick: () => handleConfirmOrder(), className: "relative w-full", children: isCreatingOrder ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Loader2, { className: "size-4 animate-spin" }), _jsx("span", { children: "Creating order..." })] })) : isLoadingAnyspendQuote ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Loader2, { className: "size-4 animate-spin" }), _jsx("span", { children: "Loading quote..." })] })) : anyspendQuote && recipientAddress ? (_jsxs(_Fragment, { children: [_jsx("span", { children: "Checkout" }), _jsx(ChevronRightCircle, { className: "absolute right-0 top-1/2 size-6 -translate-y-1/2 opacity-70" })] })) : recipientAddress ? ("No quote found") : ("Please select a recipient") }) }) })] }) }), _jsx(TabsContent, { value: "fiat", children: _jsx("div", { className: "mt-6 flex w-full flex-col gap-6", children: _jsx(PanelOnrampPayment, { srcAmountOnRamp: anyspendQuote?.data?.currencyIn?.amountUsd || "0", recipientName: recipientEnsName, recipientAddress: recipientAddress, isMainnet: isMainnet, isBuyMode: false, selectedDstChainId: dstChainId, selectedDstToken: dstToken, anyspendQuote: anyspendQuote, globalAddress: currentWallet?.wallet?.address, onOrderCreated: (orderId) => setOrderId(orderId), onBack: () => setActiveTab("crypto"), orderType: orderType, nft: metadata.type === "mint_nft"
387
+ }, transition: { duration: 0.3, delay: 0.3, ease: "easeInOut" }, className: "flex w-full flex-col gap-2", children: _jsx(ShinyButton, { accentColor: "hsl(var(--as-brand))", textColor: "text-white", disabled: isCreatingOrder || isLoadingAnyspendQuote || !anyspendQuote || !recipientAddress, onClick: () => handleConfirmOrder(), className: "relative w-full", children: isCreatingOrder ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Loader2, { className: "size-4 animate-spin" }), _jsx("span", { children: "Creating order..." })] })) : isLoadingAnyspendQuote ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Loader2, { className: "size-4 animate-spin" }), _jsx("span", { children: "Loading quote..." })] })) : anyspendQuote && recipientAddress ? (_jsxs(_Fragment, { children: [_jsx("span", { children: "Checkout" }), _jsx(ChevronRightCircle, { className: "absolute right-0 top-1/2 size-6 -translate-y-1/2 opacity-70" })] })) : recipientAddress ? ("No quote found") : ("Please select a recipient") }) }) })] }) }), _jsx(TabsContent, { value: "fiat", children: _jsx("div", { className: "mt-6 flex w-full flex-col gap-6", children: _jsx(PanelOnrampPayment, { srcAmountOnRamp: srcAmount ? formatUnits(srcAmount.toString(), USDC_BASE.decimals) : "0", recipientName: recipientEnsName, recipientAddress: recipientAddress, isMainnet: isMainnet, isBuyMode: false, selectedDstChainId: dstChainId, selectedDstToken: dstToken, anyspendQuote: anyspendQuote, globalAddress: currentWallet?.wallet?.address, onOrderCreated: (orderId) => setOrderId(orderId), onBack: () => setActiveTab("crypto"), orderType: orderType, nft: metadata.type === "mint_nft"
392
388
  ? metadata.nftContract.type === "erc1155"
393
389
  ? {
394
390
  type: "erc1155",
@@ -0,0 +1,15 @@
1
+ import { components } from "../../../../anyspend/types/api";
2
+ type Tournament = components["schemas"]["Tournament"];
3
+ type NFT = components["schemas"]["NFT"];
4
+ interface ConnectWalletPaymentProps {
5
+ order: components["schemas"]["Order"];
6
+ onPayment: () => void;
7
+ onCancel: () => void;
8
+ txLoading: boolean;
9
+ isSwitchingOrExecuting: boolean;
10
+ phantomWalletAddress?: string | null;
11
+ tournament?: Tournament;
12
+ nft?: NFT;
13
+ }
14
+ export default function ConnectWalletPayment({ order, onPayment, txLoading, isSwitchingOrExecuting, phantomWalletAddress, tournament, nft, }: ConnectWalletPaymentProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { RELAY_SOLANA_MAINNET_CHAIN_ID } from "../../../../anyspend/index.js";
4
+ import { ShinyButton, useProfile } from "../../../../global-account/react/index.js";
5
+ import { formatTokenAmount } from "../../../../shared/utils/number.js";
6
+ import { motion } from "framer-motion";
7
+ import { ChevronRight, Loader2 } from "lucide-react";
8
+ import { useMemo } from "react";
9
+ import { OrderDetailsCollapsible } from "./OrderDetailsCollapsible.js";
10
+ import { StepProgress } from "./StepProgress.js";
11
+ export default function ConnectWalletPayment({ order, onPayment, txLoading, isSwitchingOrExecuting, phantomWalletAddress, tournament, nft, }) {
12
+ const profile = useProfile({ address: order.recipientAddress });
13
+ const recipientName = profile.data?.name?.replace(/\.b3\.fun/g, "");
14
+ const srcToken = order.metadata.srcToken;
15
+ const dstToken = order.metadata.dstToken;
16
+ const expectedDstAmount = order.type === "mint_nft" ||
17
+ order.type === "join_tournament" ||
18
+ order.type === "fund_tournament" ||
19
+ order.type === "custom"
20
+ ? "0"
21
+ : order.payload.expectedDstAmount.toString();
22
+ const formattedExpectedDstAmount = formatTokenAmount(BigInt(expectedDstAmount), dstToken.decimals);
23
+ const steps = useMemo(() => [
24
+ {
25
+ id: 1,
26
+ title: "Connect Wallet",
27
+ description: "Connect your wallet to continue",
28
+ },
29
+ {
30
+ id: 2,
31
+ title: "Awaiting Payment",
32
+ description: "Send your payment to the address below",
33
+ },
34
+ {
35
+ id: 3,
36
+ title: "Complete Payment",
37
+ description: "Finalize your transaction",
38
+ },
39
+ ], []);
40
+ if (!srcToken || !dstToken) {
41
+ return _jsx("div", { children: "Loading..." });
42
+ }
43
+ return (_jsxs("div", { className: "flex w-full flex-col items-center gap-6", children: [_jsx(StepProgress, { steps: steps, currentStepIndex: 1 }), _jsxs(motion.div, { initial: { opacity: 0, y: 20 }, animate: { opacity: 1, y: 0 }, transition: { delay: 0.5 }, className: "flex w-full flex-col items-center gap-2", children: [_jsx(ShinyButton, { accentColor: "hsl(var(--as-brand))", textColor: "text-white", className: "flex w-5/6 items-center gap-2 sm:px-0", disabled: txLoading || isSwitchingOrExecuting, onClick: onPayment, children: txLoading ? (_jsxs(_Fragment, { children: ["Transaction Pending", _jsx(Loader2, { className: "ml-2 h-5 w-5 animate-spin" })] })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: "whitespace-nowrap pl-4 text-lg md:text-sm", children: order.srcChain === RELAY_SOLANA_MAINNET_CHAIN_ID && phantomWalletAddress
44
+ ? "Pay from Phantom Wallet"
45
+ : "Pay from Connected Wallet" }), _jsx(ChevronRight, { className: "h-4 w-4" })] })) }), _jsx("div", { className: "mt-4", children: _jsx(OrderDetailsCollapsible, { order: order, dstToken: dstToken, tournament: tournament, nft: nft, recipientName: recipientName, formattedExpectedDstAmount: formattedExpectedDstAmount }) })] })] }));
46
+ }
@@ -0,0 +1,20 @@
1
+ export declare enum PaymentMethod {
2
+ NONE = "none",
3
+ CONNECT_WALLET = "connect_wallet",
4
+ TRANSFER_CRYPTO = "transfer_crypto"
5
+ }
6
+ interface CryptoPaymentMethodProps {
7
+ globalAddress?: string;
8
+ globalWallet?: {
9
+ meta?: {
10
+ icon?: string;
11
+ };
12
+ };
13
+ selectedPaymentMethod: PaymentMethod;
14
+ setSelectedPaymentMethod: (method: PaymentMethod) => void;
15
+ isCreatingOrder: boolean;
16
+ onBack: () => void;
17
+ onSelectPaymentMethod: (method: PaymentMethod) => void;
18
+ }
19
+ export declare function CryptoPaymentMethod({ selectedPaymentMethod, setSelectedPaymentMethod, isCreatingOrder, onBack, onSelectPaymentMethod, }: CryptoPaymentMethodProps): import("react/jsx-runtime").JSX.Element;
20
+ export {};
@@ -0,0 +1,114 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useAccountWallet } from "../../../../global-account/react/index.js";
4
+ import { cn } from "../../../../shared/utils/cn.js";
5
+ import { shortenAddress } from "../../../../shared/utils/formatAddress.js";
6
+ import { ChevronLeft, ChevronRightCircle, Wallet, X } from "lucide-react";
7
+ import { useEffect, useRef } from "react";
8
+ import { toast } from "sonner";
9
+ import { useSetActiveWallet } from "thirdweb/react";
10
+ import { useAccount, useConnect, useDisconnect } from "wagmi";
11
+ export var PaymentMethod;
12
+ (function (PaymentMethod) {
13
+ PaymentMethod["NONE"] = "none";
14
+ PaymentMethod["CONNECT_WALLET"] = "connect_wallet";
15
+ PaymentMethod["TRANSFER_CRYPTO"] = "transfer_crypto";
16
+ })(PaymentMethod || (PaymentMethod = {}));
17
+ export function CryptoPaymentMethod({ selectedPaymentMethod, setSelectedPaymentMethod, isCreatingOrder, onBack, onSelectPaymentMethod, }) {
18
+ const { connect, connectors, isPending: isConnecting, error: connectError } = useConnect();
19
+ const wagmiAccount = useAccount();
20
+ const { address: globalAddress, connectedEOAWallet, isActiveEOAWallet, wallet: globalWallet } = useAccountWallet();
21
+ const { disconnect } = useDisconnect();
22
+ const previousAddress = useRef(globalAddress);
23
+ const setActiveWallet = useSetActiveWallet();
24
+ // Automatically set EOA wallet as active when available
25
+ useEffect(() => {
26
+ if (connectedEOAWallet) {
27
+ console.log("Setting active wallet", connectedEOAWallet);
28
+ setActiveWallet(connectedEOAWallet);
29
+ }
30
+ }, [connectedEOAWallet, isActiveEOAWallet, setActiveWallet]);
31
+ // Handle wallet connection success
32
+ useEffect(() => {
33
+ if (globalAddress && previousAddress.current !== globalAddress) {
34
+ previousAddress.current = globalAddress;
35
+ toast.success("Wallet connected successfully");
36
+ // Automatically select connect wallet method and go back to main view
37
+ setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
38
+ onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
39
+ }
40
+ }, [globalAddress, setSelectedPaymentMethod, onSelectPaymentMethod]);
41
+ // Handle connection errors
42
+ useEffect(() => {
43
+ if (connectError) {
44
+ // Handle specific error cases
45
+ if (connectError.message.includes("Connector already connected")) {
46
+ // If connector is already connected, just proceed with the flow
47
+ console.log("Connector already connected, proceeding with selection");
48
+ // Use wagmi account address or global address
49
+ if (wagmiAccount.address || globalAddress) {
50
+ setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
51
+ onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
52
+ }
53
+ else {
54
+ // Fallback: proceed anyway as the connector reports it's connected
55
+ setTimeout(() => {
56
+ setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
57
+ onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
58
+ }, 100);
59
+ }
60
+ }
61
+ else {
62
+ toast.error(`Failed to connect wallet: ${connectError.message}`);
63
+ }
64
+ }
65
+ }, [connectError, globalAddress, wagmiAccount.address, setSelectedPaymentMethod, onSelectPaymentMethod]);
66
+ return (_jsx("div", { className: "mx-auto w-[460px] max-w-full", children: _jsxs("div", { className: cn("relative flex flex-col gap-10"), children: [_jsx("button", { onClick: onBack, className: "text-as-quaternary hover:text-as-primary absolute flex h-8 w-8 items-center justify-center rounded-lg transition-colors", children: _jsx(ChevronLeft, { className: "h-6 w-6" }) }), _jsx("div", { className: "flex items-center justify-around gap-4", children: _jsx("div", { className: "flex-1 text-center", children: _jsx("h2", { className: "text-as-primary text-lg font-semibold", children: "Choose payment method" }) }) }), _jsxs("div", { className: "flex flex-col gap-3", children: [!globalAddress ? (
67
+ // Not connected - show single connect button
68
+ _jsxs("button", { onClick: () => {
69
+ // Prevent connecting if already connecting or if there's already a connection
70
+ if (isConnecting)
71
+ return;
72
+ try {
73
+ // Check if wagmi already has a connection
74
+ if (wagmiAccount.isConnected && wagmiAccount.address) {
75
+ // Already connected via wagmi, just proceed with selection
76
+ console.log("Wagmi already connected, proceeding with selection");
77
+ setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
78
+ onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
79
+ return;
80
+ }
81
+ // Check if global address exists (b3 account system)
82
+ if (globalAddress) {
83
+ // Already connected via global account, just proceed with selection
84
+ console.log("Global address already exists, proceeding with selection");
85
+ setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
86
+ onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
87
+ return;
88
+ }
89
+ // Use the first available connector or a preferred one
90
+ const preferredConnector = connectors.find(c => c.name.toLowerCase().includes("metamask")) || connectors[0];
91
+ if (preferredConnector) {
92
+ connect({ connector: preferredConnector });
93
+ }
94
+ }
95
+ catch (error) {
96
+ console.error("Connection error:", error);
97
+ toast.error("Failed to connect wallet. Please try again.");
98
+ }
99
+ }, disabled: isConnecting, className: "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 disabled:cursor-not-allowed disabled:opacity-50", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "flex h-8 w-8 items-center justify-center rounded-full bg-blue-100", children: _jsx(Wallet, { className: "h-4 w-4 text-blue-600" }) }), _jsxs("div", { className: "flex flex-col items-start text-left", children: [_jsx("h4", { className: "text-as-primary font-semibold", children: "Connect wallet" }), _jsx("p", { className: "text-as-primary/60 text-sm", children: "Connect your wallet to continue" })] })] }), isConnecting ? (_jsx("div", { className: "border-as-primary/20 border-t-as-primary h-5 w-5 animate-spin rounded-full border-2" })) : (_jsx(ChevronRightCircle, { className: "text-as-primary/40 group-hover:text-as-primary/60 h-5 w-5 transition-colors" }))] })) : (
100
+ // Connected - show wallet info
101
+ _jsx("div", { className: "bg-as-surface-primary border-as-border-secondary rounded-xl border", children: _jsxs("div", { className: "flex items-center justify-between p-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [globalWallet?.meta?.icon ? (_jsx("img", { src: globalWallet.meta.icon, alt: "Connected Wallet", className: "h-8 w-8 rounded-full" })) : (_jsx("div", { className: "flex h-8 w-8 items-center justify-center rounded-full bg-green-100", children: _jsx(Wallet, { className: "h-4 w-4 text-green-600" }) })), _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "text-as-primary font-semibold", children: "Connected Wallet" }), _jsx("span", { className: "text-as-primary/60 text-sm", children: shortenAddress(globalAddress) })] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { onClick: () => {
102
+ setSelectedPaymentMethod(PaymentMethod.CONNECT_WALLET);
103
+ onSelectPaymentMethod(PaymentMethod.CONNECT_WALLET);
104
+ }, className: "bg-as-brand hover:bg-as-brand/90 rounded-lg px-3 py-1.5 text-sm font-medium text-white transition-colors", children: "Use Wallet" }), _jsx("button", { onClick: () => {
105
+ disconnect();
106
+ toast.success("Wallet disconnected");
107
+ if (selectedPaymentMethod === PaymentMethod.CONNECT_WALLET) {
108
+ setSelectedPaymentMethod(PaymentMethod.NONE);
109
+ }
110
+ }, className: "text-as-primary/60 hover:text-as-primary/80 rounded-lg p-1.5 transition-colors", children: _jsx(X, { className: "h-4 w-4" }) })] })] }) })), _jsxs("button", { onClick: () => {
111
+ setSelectedPaymentMethod(PaymentMethod.TRANSFER_CRYPTO);
112
+ onSelectPaymentMethod(PaymentMethod.TRANSFER_CRYPTO);
113
+ }, disabled: isCreatingOrder, className: "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", children: [_jsx("div", { className: "flex flex-col items-start text-left", children: _jsx("h4", { className: "text-as-primary font-semibold", children: "Transfer crypto" }) }), _jsx(ChevronRightCircle, { className: "text-as-primary/40 group-hover:text-as-primary/60 h-5 w-5 transition-colors" })] })] })] }) }));
114
+ }
@@ -0,0 +1,15 @@
1
+ export declare enum FiatPaymentMethod {
2
+ NONE = "none",
3
+ COINBASE_PAY = "coinbase_pay",
4
+ STRIPE = "stripe"
5
+ }
6
+ interface FiatPaymentMethodProps {
7
+ selectedPaymentMethod: FiatPaymentMethod;
8
+ setSelectedPaymentMethod: (method: FiatPaymentMethod) => void;
9
+ onBack: () => void;
10
+ onSelectPaymentMethod: (method: FiatPaymentMethod) => void;
11
+ srcAmountOnRamp: string;
12
+ isMainnet: boolean;
13
+ }
14
+ export declare function FiatPaymentMethodComponent({ selectedPaymentMethod, setSelectedPaymentMethod, onBack, onSelectPaymentMethod, srcAmountOnRamp, isMainnet, }: FiatPaymentMethodProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,67 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useGeoOnrampOptions } from "../../../../anyspend/react/index.js";
4
+ import { cn } from "../../../../shared/utils/cn.js";
5
+ import { ChevronLeft, ChevronRight, Loader2 } from "lucide-react";
6
+ export var FiatPaymentMethod;
7
+ (function (FiatPaymentMethod) {
8
+ FiatPaymentMethod["NONE"] = "none";
9
+ FiatPaymentMethod["COINBASE_PAY"] = "coinbase_pay";
10
+ FiatPaymentMethod["STRIPE"] = "stripe";
11
+ })(FiatPaymentMethod || (FiatPaymentMethod = {}));
12
+ export function FiatPaymentMethodComponent({ selectedPaymentMethod, setSelectedPaymentMethod, onBack, onSelectPaymentMethod, srcAmountOnRamp, isMainnet, }) {
13
+ // Helper function to get fees from API data
14
+ const getFeeFromApi = (paymentMethod) => {
15
+ switch (paymentMethod) {
16
+ case FiatPaymentMethod.COINBASE_PAY:
17
+ // Coinbase doesn't provide fee info in API, use hardcoded $0.02
18
+ return "0.02";
19
+ case FiatPaymentMethod.STRIPE:
20
+ // Get fee from Stripe API response
21
+ if (stripeWeb2Support && "formattedFeeUsd" in stripeWeb2Support) {
22
+ return stripeWeb2Support.formattedFeeUsd;
23
+ }
24
+ return null;
25
+ default:
26
+ return null; // No fee when no payment method selected
27
+ }
28
+ };
29
+ // Load geo-based onramp options like in PanelOnramp
30
+ const { coinbaseAvailablePaymentMethods, isStripeOnrampSupported, stripeWeb2Support, isLoading: isLoadingGeoOnramp, } = useGeoOnrampOptions(isMainnet, srcAmountOnRamp);
31
+ // Generate payment methods based on geo availability (like in PanelOnrampPayment)
32
+ const availablePaymentMethods = [];
33
+ // Add Coinbase Pay if available
34
+ if (coinbaseAvailablePaymentMethods.length > 0) {
35
+ const coinbaseFee = getFeeFromApi(FiatPaymentMethod.COINBASE_PAY);
36
+ availablePaymentMethods.push({
37
+ id: FiatPaymentMethod.COINBASE_PAY,
38
+ name: "Coinbase Pay",
39
+ description: "Debit card, bank account or Coinbase account",
40
+ badge: coinbaseFee ? `$${coinbaseFee} fee` : "Lowest Fee",
41
+ badgeColor: "bg-green-100 text-green-800",
42
+ available: true,
43
+ });
44
+ }
45
+ // Add Stripe if available
46
+ if (isStripeOnrampSupported || (stripeWeb2Support && stripeWeb2Support.isSupport)) {
47
+ const stripeFee = getFeeFromApi(FiatPaymentMethod.STRIPE);
48
+ availablePaymentMethods.push({
49
+ id: FiatPaymentMethod.STRIPE,
50
+ name: "Stripe",
51
+ description: "Credit or debit card payment",
52
+ badge: stripeFee ? `$${stripeFee} fee` : "Standard Fee",
53
+ badgeColor: "bg-yellow-100 text-yellow-800",
54
+ available: true,
55
+ });
56
+ }
57
+ // Show loading state while checking geo availability
58
+ if (isLoadingGeoOnramp) {
59
+ return (_jsx("div", { className: "mx-auto w-[460px] max-w-full", children: _jsxs("div", { className: "flex flex-col gap-6", children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsx("button", { onClick: onBack, className: "text-as-quaternary hover:text-as-primary flex h-8 w-8 items-center justify-center rounded-lg transition-colors", children: _jsx(ChevronLeft, { className: "h-6 w-6" }) }), _jsx("div", { className: "flex-1", children: _jsx("h2", { className: "text-as-primary text-lg font-semibold", children: "Choose payment method" }) })] }), _jsxs("div", { className: "flex items-center justify-center py-8", children: [_jsx(Loader2, { className: "h-6 w-6 animate-spin" }), _jsx("span", { className: "text-as-secondary ml-2 text-sm", children: "Loading payment methods..." })] })] }) }));
60
+ }
61
+ return (_jsx("div", { className: "mx-auto w-[460px] max-w-full", children: _jsxs("div", { className: "flex flex-col gap-6", children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsx("button", { onClick: onBack, className: "text-as-quaternary hover:text-as-primary flex h-8 w-8 items-center justify-center rounded-lg transition-colors", children: _jsx(ChevronLeft, { className: "h-6 w-6" }) }), _jsx("div", { className: "flex-1", children: _jsx("h2", { className: "text-as-primary text-lg font-semibold", children: "Choose payment method" }) })] }), _jsx("div", { className: "flex flex-col gap-3", children: availablePaymentMethods.length === 0 ? (_jsx("div", { className: "bg-as-surface-secondary border-as-border-secondary rounded-2xl border p-6 text-center", children: _jsx("p", { className: "text-as-secondary text-sm", children: "No payment methods available in your region for the selected amount." }) })) : (availablePaymentMethods.map(method => (_jsxs("button", { onClick: () => {
62
+ setSelectedPaymentMethod(method.id);
63
+ onSelectPaymentMethod(method.id);
64
+ }, className: cn("bg-as-surface-secondary border-as-border-secondary flex w-full items-center gap-4 rounded-2xl border p-4 transition-all duration-200", selectedPaymentMethod === method.id
65
+ ? "border-as-brand bg-as-brand/10"
66
+ : "hover:border-as-brand/50 hover:bg-as-brand/5"), children: [_jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full bg-blue-600 text-2xl text-white", children: method.id === FiatPaymentMethod.COINBASE_PAY ? "C" : "S" }), _jsxs("div", { className: "flex flex-1 flex-col items-start text-left", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-as-primary text-base font-semibold", children: method.name }), _jsx("span", { className: cn("rounded-full px-2 py-1 text-xs font-medium", method.badgeColor), children: method.badge })] }), _jsx("span", { className: "text-as-primary/60 text-sm", children: method.description })] }), selectedPaymentMethod === method.id && _jsx(ChevronRight, { className: "text-as-brand h-5 w-5" })] }, method.id)))) })] }) }));
67
+ }
@@ -1,4 +1,5 @@
1
1
  import { components } from "../../../../anyspend/types/api";
2
+ import { PaymentMethod } from "./CryptoPaymentMethod";
2
3
  interface OrderDetailsProps {
3
4
  isMainnet: boolean;
4
5
  mode?: "modal" | "page";
@@ -7,6 +8,7 @@ interface OrderDetailsProps {
7
8
  relayTx: components["schemas"]["RelayTx"] | null;
8
9
  executeTx: components["schemas"]["ExecuteTx"] | null;
9
10
  refundTxs: components["schemas"]["RefundTx"][] | null;
11
+ paymentMethod?: PaymentMethod;
10
12
  onBack?: () => void;
11
13
  }
12
14
  export declare const OrderDetails: import("react").NamedExoticComponent<OrderDetailsProps>;