@b3dotfun/sdk 0.0.5-alpha.6 → 0.0.5

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 (93) hide show
  1. package/dist/cjs/anyspend/constants/index.js +2 -2
  2. package/dist/cjs/anyspend/react/components/AnySpend.js +2 -2
  3. package/dist/cjs/anyspend/react/components/index.d.ts +5 -7
  4. package/dist/cjs/anyspend/react/components/index.js +11 -15
  5. package/dist/cjs/anyspend/react/hooks/useAnyspendCreateOnrampOrder.d.ts +0 -1
  6. package/dist/cjs/anyspend/react/hooks/useAnyspendCreateOnrampOrder.js +3 -4
  7. package/dist/cjs/anyspend/react/hooks/useAnyspendOrderAndTransactions.d.ts +0 -10
  8. package/dist/cjs/anyspend/react/hooks/useAnyspendOrderHistory.d.ts +0 -10
  9. package/dist/cjs/anyspend/services/anyspend.d.ts +1 -7
  10. package/dist/cjs/anyspend/services/anyspend.js +2 -3
  11. package/dist/cjs/anyspend/types/order.d.ts +0 -18
  12. package/dist/cjs/anyspend/types/order.js +0 -1
  13. package/dist/cjs/anyspend/types/req-res/createOrder.d.ts +0 -50
  14. package/dist/cjs/anyspend/types/req-res/createOrder.js +0 -1
  15. package/dist/cjs/anyspend/types/req-res/getOrderAndTransactions.d.ts +0 -35
  16. package/dist/cjs/anyspend/types/req-res/getOrderHistory.d.ts +0 -25
  17. package/dist/cjs/global-account/react/hooks/index.d.ts +1 -2
  18. package/dist/cjs/global-account/react/hooks/index.js +1 -3
  19. package/dist/cjs/global-account/react/hooks/useTokenFromUrl.d.ts +1 -5
  20. package/dist/cjs/global-account/react/hooks/useTokenFromUrl.js +13 -74
  21. package/dist/cjs/shared/constants/chains/supported.d.ts +3 -13
  22. package/dist/cjs/shared/constants/chains/supported.js +9 -15
  23. package/dist/esm/anyspend/constants/index.js +2 -2
  24. package/dist/esm/anyspend/react/components/AnySpend.js +2 -2
  25. package/dist/esm/anyspend/react/components/index.d.ts +5 -7
  26. package/dist/esm/anyspend/react/components/index.js +5 -7
  27. package/dist/esm/anyspend/react/hooks/useAnyspendCreateOnrampOrder.d.ts +0 -1
  28. package/dist/esm/anyspend/react/hooks/useAnyspendCreateOnrampOrder.js +4 -5
  29. package/dist/esm/anyspend/react/hooks/useAnyspendOrderAndTransactions.d.ts +0 -10
  30. package/dist/esm/anyspend/react/hooks/useAnyspendOrderHistory.d.ts +0 -10
  31. package/dist/esm/anyspend/services/anyspend.d.ts +1 -7
  32. package/dist/esm/anyspend/services/anyspend.js +2 -3
  33. package/dist/esm/anyspend/types/order.d.ts +0 -18
  34. package/dist/esm/anyspend/types/order.js +0 -1
  35. package/dist/esm/anyspend/types/req-res/createOrder.d.ts +0 -50
  36. package/dist/esm/anyspend/types/req-res/createOrder.js +0 -1
  37. package/dist/esm/anyspend/types/req-res/getOrderAndTransactions.d.ts +0 -35
  38. package/dist/esm/anyspend/types/req-res/getOrderHistory.d.ts +0 -25
  39. package/dist/esm/global-account/react/hooks/index.d.ts +1 -2
  40. package/dist/esm/global-account/react/hooks/index.js +0 -1
  41. package/dist/esm/global-account/react/hooks/useTokenFromUrl.d.ts +1 -5
  42. package/dist/esm/global-account/react/hooks/useTokenFromUrl.js +13 -73
  43. package/dist/esm/shared/constants/chains/supported.d.ts +3 -13
  44. package/dist/esm/shared/constants/chains/supported.js +8 -13
  45. package/dist/styles/index.css +1 -1
  46. package/dist/types/anyspend/react/components/index.d.ts +5 -7
  47. package/dist/types/anyspend/react/hooks/useAnyspendCreateOnrampOrder.d.ts +0 -1
  48. package/dist/types/anyspend/react/hooks/useAnyspendOrderAndTransactions.d.ts +0 -10
  49. package/dist/types/anyspend/react/hooks/useAnyspendOrderHistory.d.ts +0 -10
  50. package/dist/types/anyspend/services/anyspend.d.ts +1 -7
  51. package/dist/types/anyspend/types/order.d.ts +0 -18
  52. package/dist/types/anyspend/types/req-res/createOrder.d.ts +0 -50
  53. package/dist/types/anyspend/types/req-res/getOrderAndTransactions.d.ts +0 -35
  54. package/dist/types/anyspend/types/req-res/getOrderHistory.d.ts +0 -25
  55. package/dist/types/global-account/react/hooks/index.d.ts +1 -2
  56. package/dist/types/global-account/react/hooks/useTokenFromUrl.d.ts +1 -5
  57. package/dist/types/shared/constants/chains/supported.d.ts +3 -13
  58. package/package.json +3 -3
  59. package/src/anyspend/constants/index.ts +4 -2
  60. package/src/anyspend/react/components/AnySpend.tsx +2 -2
  61. package/src/anyspend/react/components/index.ts +5 -7
  62. package/src/anyspend/react/hooks/useAnyspendCreateOnrampOrder.ts +4 -7
  63. package/src/anyspend/services/anyspend.ts +2 -5
  64. package/src/anyspend/types/order.ts +0 -1
  65. package/src/anyspend/types/req-res/createOrder.ts +0 -1
  66. package/src/global-account/react/hooks/index.ts +1 -2
  67. package/src/global-account/react/hooks/useTokenFromUrl.tsx +13 -95
  68. package/src/shared/constants/chains/supported.ts +8 -23
  69. package/dist/cjs/anyspend/react/components/webview/WebviewOnrampOrderStatus.d.ts +0 -6
  70. package/dist/cjs/anyspend/react/components/webview/WebviewOnrampOrderStatus.js +0 -37
  71. package/dist/cjs/anyspend/react/components/webview/WebviewOnrampPayment.d.ts +0 -12
  72. package/dist/cjs/anyspend/react/components/webview/WebviewOnrampPayment.js +0 -173
  73. package/dist/cjs/global-account/react/hooks/useB3EnsName.d.ts +0 -9
  74. package/dist/cjs/global-account/react/hooks/useB3EnsName.js +0 -39
  75. package/dist/cjs/shared/generated/coingecko-chains.json +0 -1072
  76. package/dist/esm/anyspend/react/components/webview/WebviewOnrampOrderStatus.d.ts +0 -6
  77. package/dist/esm/anyspend/react/components/webview/WebviewOnrampOrderStatus.js +0 -31
  78. package/dist/esm/anyspend/react/components/webview/WebviewOnrampPayment.d.ts +0 -12
  79. package/dist/esm/anyspend/react/components/webview/WebviewOnrampPayment.js +0 -167
  80. package/dist/esm/global-account/react/hooks/useB3EnsName.d.ts +0 -9
  81. package/dist/esm/global-account/react/hooks/useB3EnsName.js +0 -32
  82. package/dist/esm/shared/generated/coingecko-chains.json +0 -1072
  83. package/dist/types/anyspend/react/components/webview/WebviewOnrampOrderStatus.d.ts +0 -6
  84. package/dist/types/anyspend/react/components/webview/WebviewOnrampPayment.d.ts +0 -12
  85. package/dist/types/global-account/react/hooks/useB3EnsName.d.ts +0 -9
  86. package/src/anyspend/README.md +0 -626
  87. package/src/anyspend/react/components/webview/WebviewOnrampOrderStatus.tsx +0 -120
  88. package/src/anyspend/react/components/webview/WebviewOnrampPayment.tsx +0 -369
  89. package/src/global-account/react/hooks/useB3EnsName.ts +0 -49
  90. package/src/shared/generated/coingecko-chains.json +0 -1072
  91. /package/dist/cjs/{shared/generated → generated}/chain-networks.json +0 -0
  92. /package/dist/esm/{shared/generated → generated}/chain-networks.json +0 -0
  93. /package/src/{shared/generated → generated}/chain-networks.json +0 -0
@@ -1,120 +0,0 @@
1
- import { getChainName, Order, OrderStatus, OrderType } from "@b3dotfun/sdk/anyspend";
2
- import { Badge, useTokenData } from "@b3dotfun/sdk/global-account/react";
3
- import centerTruncate from "@b3dotfun/sdk/shared/utils/centerTruncate";
4
- import { CheckIcon, Copy, ExternalLink, Loader2 } from "lucide-react";
5
- import { toast } from "sonner";
6
- import { formatUnits } from "viem";
7
-
8
- interface WebviewOnrampOrderStatusProps {
9
- order: Order;
10
- }
11
-
12
- export function WebviewOnrampOrderStatus({ order }: WebviewOnrampOrderStatusProps) {
13
- console.log(order.status);
14
- const isPending =
15
- order.status === OrderStatus.WaitingStripePayment ||
16
- order.status === OrderStatus.ScanningDepositTransaction ||
17
- order.status === OrderStatus.SendingTokenFromVault ||
18
- order.status === OrderStatus.ObtainToken ||
19
- order.status === OrderStatus.Relay;
20
- const isExecuted = order.status === OrderStatus.Executed;
21
- const isFailed = order.status === OrderStatus.Failure;
22
- const isRefunded = order.status === OrderStatus.Refunded;
23
-
24
- // Get token metadata
25
- const { data: tokenMetadata } = useTokenData(order.metadata.dstToken.chainId, order.metadata.dstToken.address);
26
-
27
- // Only show expected amount for swap orders
28
- const expectedAmount =
29
- order.type === OrderType.Swap
30
- ? Number(formatUnits(BigInt(order.payload.expectedDstAmount), order.metadata.dstToken.decimals)).toFixed(2)
31
- : null;
32
-
33
- // Use token metadata logo if available
34
- const tokenLogoUrl = tokenMetadata?.logoURI || order.metadata.dstToken.metadata?.logoURI;
35
-
36
- const handleCopy = (text: string, label: string) => {
37
- navigator.clipboard.writeText(text);
38
- toast.success(`${label} copied to clipboard`);
39
- };
40
-
41
- return (
42
- <div className="mx-auto flex w-full max-w-[460px] flex-col gap-6">
43
- {/* Status Badge */}
44
- <div className="flex justify-center">
45
- <Badge variant="default" className="flex items-center gap-3 px-4 py-2 text-base">
46
- {isPending && <Loader2 className="h-4 w-4 animate-spin" />}
47
- {isExecuted && <CheckIcon className="h-4 w-4 text-green-500" />}
48
- {isFailed && <ExternalLink className="h-4 w-4 text-red-500" />}
49
- <span>
50
- {isPending && "Processing Payment..."}
51
- {isExecuted && "Payment Complete"}
52
- {isFailed && "Payment Failed"}
53
- {isRefunded && "Payment Refunded"}
54
- </span>
55
- </Badge>
56
- </div>
57
-
58
- {/* Order Summary Card */}
59
- <div className="overflow-hidden rounded-xl bg-white">
60
- <div className="px-6 py-4">
61
- <h2 className="mb-4 text-lg font-semibold">Order Summary</h2>
62
- <div className="flex flex-col divide-y">
63
- {/* Amount Paid */}
64
- <div className="flex items-center justify-between py-3">
65
- <span className="text-gray-600">Amount Paid</span>
66
- <span className="text-lg font-semibold">
67
- ${Number(formatUnits(BigInt(order.srcAmount), order.metadata.srcToken.decimals)).toFixed(2)}
68
- </span>
69
- </div>
70
-
71
- {/* Receiving Amount - Only show for swap orders */}
72
- {order.type === OrderType.Swap && expectedAmount && (
73
- <div className="flex items-center justify-between py-3">
74
- <span className="text-gray-600">Est Token Amount</span>
75
- <div className="flex items-center gap-2">
76
- {tokenLogoUrl && (
77
- <img src={tokenLogoUrl} alt={order.metadata.dstToken.symbol} className="h-5 w-5 rounded-full" />
78
- )}
79
- <span className="font-medium">
80
- {expectedAmount} {order.metadata.dstToken.symbol}
81
- </span>
82
- </div>
83
- </div>
84
- )}
85
-
86
- {/* Network */}
87
- <div className="flex items-center justify-between py-3">
88
- <span className="text-gray-600">Network</span>
89
- <span className="font-medium">{getChainName(order.dstChain)}</span>
90
- </div>
91
-
92
- {/* Recipient */}
93
- <div className="flex items-center justify-between py-3">
94
- <span className="text-gray-600">Recipient</span>
95
- <button
96
- onClick={() => handleCopy(order.recipientAddress, "Recipient address")}
97
- className="flex items-center gap-2 font-medium transition-colors hover:text-blue-600"
98
- >
99
- {centerTruncate(order.recipientAddress, 8)}
100
- <Copy className="h-4 w-4" />
101
- </button>
102
- </div>
103
-
104
- {/* Order ID */}
105
- <div className="flex items-center justify-between py-3">
106
- <span className="text-gray-600">Order ID</span>
107
- <button
108
- onClick={() => handleCopy(order.id, "Order ID")}
109
- className="flex items-center gap-2 font-medium transition-colors hover:text-blue-600"
110
- >
111
- {centerTruncate(order.id, 8)}
112
- <Copy className="h-4 w-4" />
113
- </button>
114
- </div>
115
- </div>
116
- </div>
117
- </div>
118
- </div>
119
- );
120
- }
@@ -1,369 +0,0 @@
1
- import {
2
- getChainName,
3
- GetQuoteResponse,
4
- OnrampVendor,
5
- Order,
6
- OrderType,
7
- STRIPE_CONFIG,
8
- Token,
9
- useAnyspendCreateOnrampOrder,
10
- useGeoOnrampOptions,
11
- useStripeClientSecret
12
- } from "@b3dotfun/sdk/anyspend";
13
- import centerTruncate from "@b3dotfun/sdk/shared/utils/centerTruncate";
14
- import { Elements, PaymentElement, useElements, useStripe } from "@stripe/react-stripe-js";
15
- import { loadStripe } from "@stripe/stripe-js";
16
- import { motion } from "framer-motion";
17
- import { Loader2 } from "lucide-react";
18
- import { useEffect, useRef, useState } from "react";
19
- import { toast } from "sonner";
20
- import { formatUnits } from "viem";
21
-
22
- const stripePromise = loadStripe(STRIPE_CONFIG.publishableKey);
23
-
24
- interface WebviewOnrampPaymentProps {
25
- srcAmountOnRamp: string;
26
- recipientAddress?: string;
27
- destinationToken: Token;
28
- partnerId?: string;
29
- anyspendQuote: GetQuoteResponse | undefined;
30
- onPaymentSuccess: (orderId: string) => void;
31
- userId?: string;
32
- }
33
-
34
- // Stripe Payment Form Component
35
- function StripePaymentForm({ order, onPaymentSuccess }: { order: Order; onPaymentSuccess: (orderId: string) => void }) {
36
- const stripe = useStripe();
37
- const elements = useElements();
38
- const [isProcessing, setIsProcessing] = useState(false);
39
- const [error, setError] = useState<string | null>(null);
40
-
41
- const handleSubmit = async (e: React.FormEvent) => {
42
- e.preventDefault();
43
-
44
- if (!stripe || !elements) {
45
- return;
46
- }
47
-
48
- setIsProcessing(true);
49
- setError(null);
50
-
51
- try {
52
- const { error: submitError } = await stripe.confirmPayment({
53
- elements,
54
- redirect: "if_required"
55
- });
56
-
57
- if (submitError) {
58
- setError(submitError.message || "An error occurred");
59
- console.error("Payment error:", submitError);
60
- } else {
61
- console.log("Payment successful");
62
- onPaymentSuccess(order.id);
63
- }
64
- } catch (err: any) {
65
- setError(err.message || "An error occurred");
66
- console.error("Payment error:", err);
67
- } finally {
68
- setIsProcessing(false);
69
- }
70
- };
71
-
72
- const stripeElementOptions = {
73
- layout: "tabs" as const,
74
- defaultValues: {
75
- billingDetails: {
76
- name: "",
77
- email: ""
78
- }
79
- }
80
- };
81
-
82
- return (
83
- <form onSubmit={handleSubmit} className="w-full">
84
- <div className="overflow-hidden rounded-xl bg-white">
85
- <div className="px-6 py-4">
86
- <h2 className="mb-4 text-lg font-semibold">Payment Details</h2>
87
- <PaymentElement options={stripeElementOptions} />
88
-
89
- {error && (
90
- <div className="mt-4 rounded-lg border border-red-200 bg-red-50 p-3 text-sm text-red-600">{error}</div>
91
- )}
92
-
93
- <button
94
- type="submit"
95
- disabled={!stripe || isProcessing}
96
- className="mt-6 w-full rounded-xl bg-blue-600 px-4 py-3 font-medium text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50"
97
- >
98
- {isProcessing ? (
99
- <div className="flex items-center justify-center gap-2">
100
- <Loader2 className="h-5 w-5 animate-spin" />
101
- <span>Processing...</span>
102
- </div>
103
- ) : (
104
- <span>Complete Payment</span>
105
- )}
106
- </button>
107
- </div>
108
- </div>
109
- </form>
110
- );
111
- }
112
-
113
- export function WebviewOnrampPayment({
114
- srcAmountOnRamp,
115
- recipientAddress,
116
- destinationToken,
117
- anyspendQuote,
118
- onPaymentSuccess,
119
- userId,
120
- partnerId
121
- }: WebviewOnrampPaymentProps) {
122
- const [stableAmountForGeo, setStableAmountForGeo] = useState(srcAmountOnRamp);
123
- const hasInitialized = useRef(false);
124
- const [createdOrder, setCreatedOrder] = useState<Order | null>(null);
125
- const orderCreationAttempted = useRef(false);
126
-
127
- // Only update the stable amount on first render or when explicitly needed
128
- useEffect(() => {
129
- if (!hasInitialized.current && srcAmountOnRamp) {
130
- setStableAmountForGeo(srcAmountOnRamp);
131
- hasInitialized.current = true;
132
- }
133
- }, [srcAmountOnRamp]);
134
-
135
- const {
136
- geoData,
137
- isStripeWeb2Supported,
138
- isLoading: isLoadingGeoOnramp
139
- } = useGeoOnrampOptions(true, stableAmountForGeo);
140
-
141
- const { createOrder, isCreatingOrder } = useAnyspendCreateOnrampOrder({
142
- onSuccess: data => {
143
- const orderId = data.data.id;
144
- setCreatedOrder(data.data);
145
- },
146
- onError: error => {
147
- console.error(error);
148
- toast.error("Failed to create order: " + error.message);
149
- }
150
- });
151
-
152
- const { clientSecret, isLoadingStripeClientSecret } = useStripeClientSecret(
153
- true,
154
- createdOrder?.stripePaymentIntentId || ""
155
- );
156
-
157
- // Create order when component mounts and all required data is available
158
- useEffect(() => {
159
- const createOrderIfPossible = async () => {
160
- if (
161
- !orderCreationAttempted.current &&
162
- recipientAddress &&
163
- srcAmountOnRamp &&
164
- parseFloat(srcAmountOnRamp) > 0 &&
165
- isStripeWeb2Supported &&
166
- anyspendQuote &&
167
- geoData
168
- ) {
169
- orderCreationAttempted.current = true;
170
-
171
- try {
172
- const getDstToken = (): Token => {
173
- return {
174
- ...destinationToken,
175
- chainId: destinationToken.chainId,
176
- address: destinationToken.address
177
- };
178
- };
179
-
180
- createOrder({
181
- isMainnet: true,
182
- recipientAddress,
183
- orderType: OrderType.Swap,
184
- dstChain: getDstToken().chainId,
185
- dstToken: getDstToken(),
186
- srcFiatAmount: srcAmountOnRamp,
187
- onramp: {
188
- vendor: OnrampVendor.StripeWeb2,
189
- paymentMethod: "",
190
- country: geoData.country || "US",
191
- ipAddress: geoData.ip,
192
- redirectUrl: `${window.location.origin}${userId ? `?userId=${userId}` : ""}`
193
- },
194
- expectedDstAmount: anyspendQuote.data?.currencyOut?.amount?.toString() || "0",
195
- partnerId
196
- });
197
- } catch (err: any) {
198
- console.error(err);
199
- toast.error("Failed to create order: " + err.message);
200
- }
201
- }
202
- };
203
-
204
- createOrderIfPossible();
205
- }, [
206
- recipientAddress,
207
- srcAmountOnRamp,
208
- isStripeWeb2Supported,
209
- anyspendQuote,
210
- geoData,
211
- createOrder,
212
- destinationToken,
213
- userId,
214
- partnerId
215
- ]);
216
-
217
- // Check if all required data is loaded
218
- const isLoading = isLoadingGeoOnramp || !anyspendQuote || !destinationToken.metadata?.logoURI;
219
-
220
- // Show loading state while data is being fetched or order is being created
221
- if (isLoading || isCreatingOrder || isLoadingStripeClientSecret) {
222
- return (
223
- <div className="mx-auto flex w-full max-w-[460px] flex-col items-center justify-center gap-3 py-12">
224
- <Loader2 className="text-as-brand h-8 w-8 animate-spin" />
225
- <span className="text-as-primary/70">
226
- {isCreatingOrder
227
- ? "Creating payment session..."
228
- : isLoadingStripeClientSecret
229
- ? "Loading payment form..."
230
- : "Loading payment details..."}
231
- </span>
232
- </div>
233
- );
234
- }
235
-
236
- // If we have a created order and client secret, show the payment form
237
- if (createdOrder && clientSecret) {
238
- return (
239
- <div className="mx-auto flex w-full max-w-[460px] flex-col gap-6">
240
- {/* Order Summary Card */}
241
- <div className="overflow-hidden rounded-xl bg-white">
242
- <div className="px-6 py-4">
243
- <h2 className="mb-4 text-lg font-semibold">Order summary</h2>
244
- <div className="flex flex-col divide-y">
245
- {/* Destination Token */}
246
- <div className="flex items-center justify-between py-3">
247
- <span className="text-gray-600">Receiving</span>
248
- <div className="flex items-center gap-2">
249
- {destinationToken.metadata?.logoURI && (
250
- <img
251
- src={destinationToken.metadata.logoURI}
252
- alt={destinationToken.symbol}
253
- className="h-5 w-5 rounded-full"
254
- />
255
- )}
256
- <span className="font-medium">
257
- {anyspendQuote?.data?.currencyOut?.amount
258
- ? Number(
259
- formatUnits(BigInt(anyspendQuote.data.currencyOut.amount), destinationToken.decimals)
260
- ).toFixed(4)
261
- : "0"}{" "}
262
- {destinationToken.symbol}
263
- </span>
264
- </div>
265
- </div>
266
-
267
- {/* Network */}
268
- <div className="flex items-center justify-between py-3">
269
- <span className="text-gray-600">Network</span>
270
- <span className="font-medium">{getChainName(destinationToken.chainId)}</span>
271
- </div>
272
-
273
- {/* Recipient Section */}
274
- {recipientAddress && (
275
- <div className="flex items-center justify-between py-3">
276
- <span className="text-gray-600">Recipient</span>
277
- <span className="font-medium">{centerTruncate(recipientAddress)}</span>
278
- </div>
279
- )}
280
-
281
- {/* Amount Section */}
282
- <div className="flex items-center justify-between py-3">
283
- <span className="text-gray-600">You Pay</span>
284
- <span className="text-lg font-semibold">${parseFloat(srcAmountOnRamp).toFixed(2)}</span>
285
- </div>
286
- </div>
287
- </div>
288
- </div>
289
-
290
- {/* Stripe Elements */}
291
- <Elements
292
- stripe={stripePromise}
293
- options={{
294
- clientSecret,
295
- appearance: {
296
- theme: "flat",
297
- variables: {
298
- colorPrimary: "#2563eb",
299
- colorBackground: "#ffffff",
300
- borderRadius: "12px"
301
- }
302
- }
303
- }}
304
- >
305
- <StripePaymentForm order={createdOrder} onPaymentSuccess={onPaymentSuccess} />
306
- </Elements>
307
- </div>
308
- );
309
- }
310
-
311
- // Show initial order summary while waiting for order creation
312
- return (
313
- <motion.div
314
- initial={{ opacity: 0, y: 20 }}
315
- animate={{ opacity: 1, y: 0 }}
316
- transition={{ duration: 0.3 }}
317
- className="mx-auto w-full max-w-[460px]"
318
- >
319
- <div className="overflow-hidden rounded-xl bg-white">
320
- <div className="px-6 py-4">
321
- <h2 className="mb-4 text-lg font-semibold">Order summary</h2>
322
- <div className="flex flex-col divide-y">
323
- {/* Destination Token */}
324
- <div className="flex items-center justify-between py-3">
325
- <span className="text-gray-600">Receiving</span>
326
- <div className="flex items-center gap-2">
327
- {destinationToken.metadata?.logoURI && (
328
- <img
329
- src={destinationToken.metadata.logoURI}
330
- alt={destinationToken.symbol}
331
- className="h-5 w-5 rounded-full"
332
- />
333
- )}
334
- <span className="font-medium">
335
- {anyspendQuote?.data?.currencyOut?.amount
336
- ? Number(
337
- formatUnits(BigInt(anyspendQuote.data.currencyOut.amount), destinationToken.decimals)
338
- ).toFixed(4)
339
- : "0"}{" "}
340
- {destinationToken.symbol}
341
- </span>
342
- </div>
343
- </div>
344
-
345
- {/* Network */}
346
- <div className="flex items-center justify-between py-3">
347
- <span className="text-gray-600">Network</span>
348
- <span className="font-medium">{getChainName(destinationToken.chainId)}</span>
349
- </div>
350
-
351
- {/* Recipient Section */}
352
- {recipientAddress && (
353
- <div className="flex items-center justify-between py-3">
354
- <span className="text-gray-600">Recipient</span>
355
- <span className="font-medium">{centerTruncate(recipientAddress)}</span>
356
- </div>
357
- )}
358
-
359
- {/* Amount Section */}
360
- <div className="flex items-center justify-between py-3">
361
- <span className="text-gray-600">You Pay</span>
362
- <span className="text-lg font-semibold">${parseFloat(srcAmountOnRamp).toFixed(2)}</span>
363
- </div>
364
- </div>
365
- </div>
366
- </div>
367
- </motion.div>
368
- );
369
- }
@@ -1,49 +0,0 @@
1
- import bsmntApp from "@b3dotfun/sdk/global-account/bsmnt";
2
- import { B3_AUTH_COOKIE_NAME } from "@b3dotfun/sdk/shared/constants";
3
- import Cookies from "js-cookie";
4
-
5
- import { useCallback, useMemo } from "react";
6
-
7
- export const useB3EnsName = () => {
8
- const registerEns = useCallback(
9
- async (username: string, message: string, hash: string) => {
10
- if (!bsmntApp.authentication.authenticated) {
11
- await bsmntApp.authentication.authenticate({
12
- strategy: "b3-jwt",
13
- accessToken: Cookies.get(B3_AUTH_COOKIE_NAME) || ""
14
- });
15
- }
16
-
17
- const response = await bsmntApp.service("profiles").registerUsername(
18
- {
19
- username,
20
- message,
21
- hash
22
- },
23
- {}
24
- );
25
-
26
- return response;
27
- },
28
- [bsmntApp.authentication.authenticated]
29
- );
30
-
31
- const getEns = useCallback(async (address: string) => {
32
- const response = await fetch(`https://ens-gateway.b3.fun/address/${address}`);
33
-
34
- if (!response.ok) {
35
- throw new Error(`Failed to fetch ENS name: ${response.statusText}`);
36
- }
37
-
38
- const data = await response.json();
39
- return data as { name: string };
40
- }, []);
41
-
42
- return useMemo(
43
- () => ({
44
- registerEns,
45
- getEns
46
- }),
47
- [registerEns, getEns]
48
- );
49
- };