@b3dotfun/sdk 0.0.29-alpha.3 → 0.0.29-alpha.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.
- package/dist/cjs/anyspend/react/components/AnyspendDepositHype.js +8 -2
- package/dist/cjs/anyspend/react/components/common/ConnectWalletPayment.js +9 -1
- package/dist/cjs/anyspend/react/components/common/CryptoPaymentMethod.js +130 -41
- package/dist/cjs/anyspend/react/components/common/OrderDetails.js +6 -3
- package/dist/cjs/anyspend/react/components/common/PaySection.js +6 -4
- package/dist/cjs/anyspend/react/hooks/useAnyspendFlow.d.ts +2 -1
- package/dist/cjs/anyspend/react/hooks/useAnyspendFlow.js +34 -3
- package/dist/cjs/anyspend/react/hooks/useSigMint.d.ts +1 -1
- package/dist/cjs/global-account/react/hooks/useUnifiedChainSwitchAndExecute.d.ts +1 -0
- package/dist/cjs/global-account/react/hooks/useUnifiedChainSwitchAndExecute.js +1 -0
- package/dist/cjs/shared/constants/chains/b3Chain.d.ts +2 -2
- package/dist/cjs/shared/constants/chains/supported.d.ts +4 -4
- package/dist/esm/anyspend/react/components/AnyspendDepositHype.js +8 -2
- package/dist/esm/anyspend/react/components/common/ConnectWalletPayment.js +6 -1
- package/dist/esm/anyspend/react/components/common/CryptoPaymentMethod.js +133 -44
- package/dist/esm/anyspend/react/components/common/OrderDetails.js +7 -4
- package/dist/esm/anyspend/react/components/common/PaySection.js +7 -5
- package/dist/esm/anyspend/react/hooks/useAnyspendFlow.d.ts +2 -1
- package/dist/esm/anyspend/react/hooks/useAnyspendFlow.js +35 -4
- package/dist/esm/anyspend/react/hooks/useSigMint.d.ts +1 -1
- package/dist/esm/global-account/react/hooks/useUnifiedChainSwitchAndExecute.d.ts +1 -0
- package/dist/esm/global-account/react/hooks/useUnifiedChainSwitchAndExecute.js +1 -0
- package/dist/esm/shared/constants/chains/b3Chain.d.ts +2 -2
- package/dist/esm/shared/constants/chains/supported.d.ts +4 -4
- package/dist/styles/index.css +1 -1
- package/dist/types/anyspend/react/hooks/useAnyspendFlow.d.ts +2 -1
- package/dist/types/anyspend/react/hooks/useSigMint.d.ts +1 -1
- package/dist/types/global-account/react/hooks/useUnifiedChainSwitchAndExecute.d.ts +1 -0
- package/dist/types/shared/constants/chains/b3Chain.d.ts +2 -2
- package/dist/types/shared/constants/chains/supported.d.ts +4 -4
- package/package.json +1 -1
- package/src/anyspend/react/components/AnyspendDepositHype.tsx +11 -1
- package/src/anyspend/react/components/common/ConnectWalletPayment.tsx +9 -0
- package/src/anyspend/react/components/common/CryptoPaymentMethod.tsx +289 -103
- package/src/anyspend/react/components/common/OrderDetails.tsx +7 -3
- package/src/anyspend/react/components/common/PaySection.tsx +9 -7
- package/src/anyspend/react/hooks/useAnyspendFlow.ts +41 -3
- package/src/global-account/react/hooks/useUnifiedChainSwitchAndExecute.ts +1 -0
|
@@ -27,6 +27,7 @@ const RecipientSelection_1 = require("./common/RecipientSelection");
|
|
|
27
27
|
const escrow_1 = require("../../../anyspend/abis/escrow");
|
|
28
28
|
const lucide_react_1 = require("lucide-react");
|
|
29
29
|
const PanelOnramp_1 = require("./common/PanelOnramp");
|
|
30
|
+
const SLIPPAGE_PERCENT = 3;
|
|
30
31
|
function generateEncodedDataForDepositHype(amount, beneficiary) {
|
|
31
32
|
(0, invariant_1.default)(BigInt(amount) > 0, "Amount must be greater than zero");
|
|
32
33
|
const encodedData = (0, viem_1.encodeFunctionData)({
|
|
@@ -42,7 +43,7 @@ function AnySpendDepositHype(props) {
|
|
|
42
43
|
}
|
|
43
44
|
function AnySpendDepositHypeInner({ loadOrder, mode = "modal", recipientAddress, paymentType = "crypto", sourceTokenAddress, sourceTokenChainId, onSuccess, depositContractAddress, mainFooter, }) {
|
|
44
45
|
// Use shared flow hook
|
|
45
|
-
const { activePanel, setActivePanel, orderId, oat, selectedSrcChainId, setSelectedSrcChainId, selectedSrcToken, setSelectedSrcToken, srcAmount, setSrcAmount, dstAmount, setIsSrcInputDirty, selectedCryptoPaymentMethod, setSelectedCryptoPaymentMethod, selectedFiatPaymentMethod, setSelectedFiatPaymentMethod, selectedRecipientAddress, setSelectedRecipientAddress, recipientName, globalAddress, anyspendQuote, isLoadingAnyspendQuote, getAnyspendQuoteError, activeInputAmountInWei, geoData, coinbaseAvailablePaymentMethods, stripeWeb2Support, createOrder, isCreatingOrder, createOnrampOrder, isCreatingOnrampOrder, } = (0, useAnyspendFlow_1.useAnyspendFlow)({
|
|
46
|
+
const { activePanel, setActivePanel, orderId, setOrderId, oat, selectedSrcChainId, setSelectedSrcChainId, selectedSrcToken, setSelectedSrcToken, srcAmount, setSrcAmount, dstAmount, setIsSrcInputDirty, selectedCryptoPaymentMethod, setSelectedCryptoPaymentMethod, selectedFiatPaymentMethod, setSelectedFiatPaymentMethod, selectedRecipientAddress, setSelectedRecipientAddress, recipientName, globalAddress, anyspendQuote, isLoadingAnyspendQuote, getAnyspendQuoteError, activeInputAmountInWei, geoData, coinbaseAvailablePaymentMethods, stripeWeb2Support, createOrder, isCreatingOrder, createOnrampOrder, isCreatingOnrampOrder, } = (0, useAnyspendFlow_1.useAnyspendFlow)({
|
|
46
47
|
paymentType,
|
|
47
48
|
recipientAddress,
|
|
48
49
|
loadOrder,
|
|
@@ -50,6 +51,7 @@ function AnySpendDepositHypeInner({ loadOrder, mode = "modal", recipientAddress,
|
|
|
50
51
|
onTransactionSuccess: onSuccess,
|
|
51
52
|
sourceTokenAddress,
|
|
52
53
|
sourceTokenChainId,
|
|
54
|
+
slippage: SLIPPAGE_PERCENT,
|
|
53
55
|
});
|
|
54
56
|
// Button state logic
|
|
55
57
|
const btnInfo = (0, react_3.useMemo)(() => {
|
|
@@ -133,7 +135,10 @@ function AnySpendDepositHypeInner({ loadOrder, mode = "modal", recipientAddress,
|
|
|
133
135
|
(0, invariant_1.default)(selectedRecipientAddress, "Recipient address is not found");
|
|
134
136
|
(0, invariant_1.default)(depositContractAddress, "Deposit contract address is not found");
|
|
135
137
|
const srcAmountBigInt = BigInt(activeInputAmountInWei);
|
|
136
|
-
|
|
138
|
+
// TODO: temp subtract 3% for slippage
|
|
139
|
+
const originalDepositAmountWei = anyspendQuote.data?.currencyOut?.amount || "0";
|
|
140
|
+
const depositAmountWei = ((BigInt(originalDepositAmountWei) * BigInt(100 - SLIPPAGE_PERCENT)) /
|
|
141
|
+
BigInt(100)).toString();
|
|
137
142
|
const encodedData = generateEncodedDataForDepositHype(depositAmountWei, selectedRecipientAddress);
|
|
138
143
|
createOrder({
|
|
139
144
|
recipientAddress: selectedRecipientAddress,
|
|
@@ -221,6 +226,7 @@ function AnySpendDepositHypeInner({ loadOrder, mode = "modal", recipientAddress,
|
|
|
221
226
|
};
|
|
222
227
|
// Order details view
|
|
223
228
|
const orderDetailsView = ((0, jsx_runtime_1.jsx)("div", { className: "mx-auto w-[460px] max-w-full", children: (0, jsx_runtime_1.jsx)("div", { className: "relative flex flex-col gap-4", children: oat && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(OrderStatus_1.OrderStatus, { order: oat.data.order, selectedCryptoPaymentMethod: selectedCryptoPaymentMethod }), (0, jsx_runtime_1.jsx)(OrderDetails_1.OrderDetails, { mode: mode, order: oat.data.order, depositTxs: oat.data.depositTxs, relayTx: oat.data.relayTx, executeTx: oat.data.executeTx, refundTxs: oat.data.refundTxs, cryptoPaymentMethod: paymentType === "fiat" ? CryptoPaymentMethod_1.CryptoPaymentMethodType.NONE : selectedCryptoPaymentMethod, onBack: () => {
|
|
229
|
+
setOrderId(undefined);
|
|
224
230
|
setActivePanel(useAnyspendFlow_1.PanelView.MAIN);
|
|
225
231
|
onSuccess?.();
|
|
226
232
|
} })] })) }) }));
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
"use client";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
3
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
7
|
exports.default = ConnectWalletPayment;
|
|
5
8
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
9
|
const anyspend_1 = require("../../../../anyspend");
|
|
7
10
|
const react_1 = require("../../../../global-account/react");
|
|
11
|
+
const centerTruncate_1 = __importDefault(require("../../../../shared/utils/centerTruncate"));
|
|
8
12
|
const number_1 = require("../../../../shared/utils/number");
|
|
9
13
|
const framer_motion_1 = require("framer-motion");
|
|
10
14
|
const lucide_react_1 = require("lucide-react");
|
|
15
|
+
const wagmi_1 = require("wagmi");
|
|
11
16
|
const OrderDetailsCollapsible_1 = require("./OrderDetailsCollapsible");
|
|
12
17
|
function ConnectWalletPayment({ order, onPayment, txLoading, isSwitchingOrExecuting, phantomWalletAddress, tournament, nft, }) {
|
|
13
18
|
const profile = (0, react_1.useProfile)({ address: order.recipientAddress });
|
|
14
19
|
const recipientName = profile.data?.name?.replace(/\.b3\.fun/g, "");
|
|
20
|
+
const { address: connectedAddress } = (0, wagmi_1.useAccount)();
|
|
15
21
|
const srcToken = order.metadata.srcToken;
|
|
16
22
|
const dstToken = order.metadata.dstToken;
|
|
17
23
|
const expectedDstAmount = order.type === "mint_nft" ||
|
|
@@ -26,5 +32,7 @@ function ConnectWalletPayment({ order, onPayment, txLoading, isSwitchingOrExecut
|
|
|
26
32
|
}
|
|
27
33
|
return ((0, jsx_runtime_1.jsx)("div", { className: "flex w-full flex-col items-center gap-6", children: (0, jsx_runtime_1.jsxs)(framer_motion_1.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: [(0, jsx_runtime_1.jsx)(react_1.ShinyButton, { accentColor: "hsl(var(--as-brand))", textColor: "text-white", className: "flex w-5/6 max-w-[400px] items-center gap-2 sm:px-0", disabled: txLoading || isSwitchingOrExecuting, onClick: onPayment, children: txLoading ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Transaction Pending", (0, jsx_runtime_1.jsx)(lucide_react_1.Loader2, { className: "ml-2 h-5 w-5 animate-spin" })] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("span", { className: "whitespace-nowrap pl-4 text-lg md:text-sm", children: order.srcChain === anyspend_1.RELAY_SOLANA_MAINNET_CHAIN_ID && phantomWalletAddress
|
|
28
34
|
? "Pay from Phantom Wallet"
|
|
29
|
-
: "Pay from Connected Wallet" }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { className: "h-4 w-4" })] })) }), (0, jsx_runtime_1.
|
|
35
|
+
: "Pay from Connected Wallet" }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { className: "h-4 w-4" })] })) }), (0, jsx_runtime_1.jsxs)("span", { className: "label-style text-as-primary/50 text-xs", children: ["Connected to:", " ", order.srcChain === anyspend_1.RELAY_SOLANA_MAINNET_CHAIN_ID && phantomWalletAddress
|
|
36
|
+
? (0, centerTruncate_1.default)(phantomWalletAddress, 6)
|
|
37
|
+
: (0, centerTruncate_1.default)(connectedAddress || "")] }), (0, jsx_runtime_1.jsx)("div", { className: "mt-4", children: (0, jsx_runtime_1.jsx)(OrderDetailsCollapsible_1.OrderDetailsCollapsible, { order: order, dstToken: dstToken, tournament: tournament, nft: nft, recipientName: recipientName, formattedExpectedDstAmount: formattedExpectedDstAmount }) })] }) }));
|
|
30
38
|
}
|
|
@@ -5,16 +5,12 @@ exports.CryptoPaymentMethodType = void 0;
|
|
|
5
5
|
exports.CryptoPaymentMethod = CryptoPaymentMethod;
|
|
6
6
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
7
|
const react_1 = require("../../../../global-account/react");
|
|
8
|
-
const b3Chain_1 = require("../../../../shared/constants/chains/b3Chain");
|
|
9
8
|
const cn_1 = require("../../../../shared/utils/cn");
|
|
10
9
|
const formatAddress_1 = require("../../../../shared/utils/formatAddress");
|
|
11
|
-
const thirdweb_1 = require("../../../../shared/utils/thirdweb");
|
|
12
10
|
const lucide_react_1 = require("lucide-react");
|
|
13
11
|
const react_2 = require("react");
|
|
14
12
|
const react_dom_1 = require("react-dom");
|
|
15
13
|
const sonner_1 = require("sonner");
|
|
16
|
-
const react_3 = require("thirdweb/react");
|
|
17
|
-
const wallets_1 = require("thirdweb/wallets");
|
|
18
14
|
const wagmi_1 = require("wagmi");
|
|
19
15
|
var CryptoPaymentMethodType;
|
|
20
16
|
(function (CryptoPaymentMethodType) {
|
|
@@ -24,45 +20,138 @@ var CryptoPaymentMethodType;
|
|
|
24
20
|
})(CryptoPaymentMethodType || (exports.CryptoPaymentMethodType = CryptoPaymentMethodType = {}));
|
|
25
21
|
function CryptoPaymentMethod({ selectedPaymentMethod, setSelectedPaymentMethod, isCreatingOrder, onBack, onSelectPaymentMethod, }) {
|
|
26
22
|
const { wallet: globalWallet } = (0, react_1.useAccountWallet)();
|
|
27
|
-
const
|
|
23
|
+
const { address, isConnected, connector } = (0, wagmi_1.useAccount)();
|
|
24
|
+
const { connect, connectors, isPending } = (0, wagmi_1.useConnect)();
|
|
28
25
|
const { disconnect } = (0, wagmi_1.useDisconnect)();
|
|
29
|
-
const {
|
|
26
|
+
const { data: walletClient } = (0, wagmi_1.useWalletClient)();
|
|
30
27
|
const [showWalletModal, setShowWalletModal] = (0, react_2.useState)(false);
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
28
|
+
const [selectedWalletConnector, setSelectedWalletConnector] = (0, react_2.useState)(null);
|
|
29
|
+
const [modalStep, setModalStep] = (0, react_2.useState)("wallet-selection");
|
|
30
|
+
// Define available wallet connectors
|
|
31
|
+
const availableConnectors = connectors.filter(connector => ["MetaMask", "WalletConnect", "Coinbase Wallet", "Rainbow"].includes(connector.name));
|
|
32
|
+
// Define wallet options with icons and info
|
|
33
|
+
const walletOptions = [
|
|
34
|
+
{
|
|
35
|
+
id: "metamask",
|
|
36
|
+
name: "MetaMask",
|
|
37
|
+
icon: "🦊",
|
|
38
|
+
description: "Connect using MetaMask browser extension",
|
|
39
|
+
connector: availableConnectors.find(c => c.name === "MetaMask"),
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: "coinbase",
|
|
43
|
+
name: "Coinbase Wallet",
|
|
44
|
+
icon: "🔵",
|
|
45
|
+
description: "Connect using Coinbase Wallet",
|
|
46
|
+
connector: availableConnectors.find(c => c.name === "Coinbase Wallet"),
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: "rainbow",
|
|
50
|
+
name: "Rainbow",
|
|
51
|
+
icon: "🌈",
|
|
52
|
+
description: "Connect using Rainbow wallet",
|
|
53
|
+
connector: availableConnectors.find(c => c.name === "Rainbow"),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "walletconnect",
|
|
57
|
+
name: "WalletConnect",
|
|
58
|
+
icon: "🔗",
|
|
59
|
+
description: "Connect using WalletConnect protocol",
|
|
60
|
+
connector: availableConnectors.find(c => c.name === "WalletConnect"),
|
|
61
|
+
},
|
|
62
|
+
].filter(wallet => wallet.connector); // Only show wallets that have available connectors
|
|
63
|
+
// Reset modal state when closing
|
|
64
|
+
const handleCloseModal = () => {
|
|
65
|
+
setShowWalletModal(false);
|
|
66
|
+
setModalStep("wallet-selection");
|
|
67
|
+
setSelectedWalletConnector(null);
|
|
68
|
+
};
|
|
69
|
+
// Function to request wallet permissions for specific wallet
|
|
70
|
+
const requestWalletPermissions = async (walletConnector) => {
|
|
71
|
+
try {
|
|
72
|
+
// If a specific wallet connector is provided and it's different from current
|
|
73
|
+
if (walletConnector && connector?.name !== walletConnector.name) {
|
|
74
|
+
// Disconnect current and connect to the selected wallet
|
|
75
|
+
// if (isConnected) {
|
|
76
|
+
// disconnect();
|
|
77
|
+
// // Small delay to ensure disconnection
|
|
78
|
+
// await new Promise(resolve => setTimeout(resolve, 100));
|
|
79
|
+
// }
|
|
80
|
+
await connect({ connector: walletConnector });
|
|
81
|
+
setSelectedPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
|
|
82
|
+
onSelectPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
|
|
83
|
+
sonner_1.toast.success(`Connected to ${walletConnector.name}`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// If same wallet or no specific wallet, request permissions for account switching
|
|
87
|
+
if (walletClient && "request" in walletClient) {
|
|
88
|
+
await walletClient.request({
|
|
89
|
+
method: "wallet_requestPermissions",
|
|
90
|
+
params: [{ eth_accounts: {} }],
|
|
91
|
+
});
|
|
92
|
+
sonner_1.toast.success("Account selection completed");
|
|
93
|
+
setSelectedPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
|
|
94
|
+
onSelectPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Fallback: show modal for manual wallet selection
|
|
98
|
+
setShowWalletModal(true);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error("Failed to request wallet permissions:", error);
|
|
103
|
+
if (error && typeof error === "object" && "message" in error) {
|
|
104
|
+
const errorMessage = error.message.toLowerCase();
|
|
105
|
+
if (errorMessage.includes("rejected") ||
|
|
106
|
+
errorMessage.includes("denied") ||
|
|
107
|
+
errorMessage.includes("cancelled")) {
|
|
108
|
+
sonner_1.toast.error("Account selection cancelled");
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
sonner_1.toast.error("Failed to open account selection");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
sonner_1.toast.error("Failed to open account selection");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "crypto-payment-method mx-auto h-fit w-[460px] max-w-full", children: [(0, jsx_runtime_1.jsxs)("div", { className: (0, cn_1.cn)("relative flex flex-col gap-10"), children: [(0, jsx_runtime_1.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: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronLeft, { className: "h-6 w-6" }) }), (0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-around gap-4", children: (0, jsx_runtime_1.jsx)("div", { className: "flex-1 text-center", children: (0, jsx_runtime_1.jsx)("h2", { className: "text-as-primary text-lg font-semibold", children: "Select a payment method" }) }) }), (0, jsx_runtime_1.jsxs)("div", { className: "crypto-payment-methods flex flex-col gap-6", children: [(0, jsx_runtime_1.jsxs)("button", { onClick: () => {
|
|
120
|
+
// Always show wallet selection modal first
|
|
121
|
+
setShowWalletModal(true);
|
|
122
|
+
}, className: "crypto-payment-method-connect-wallet bg-as-surface-primary border-as-border-secondary hover:border-as-secondary/80 group flex w-full items-center justify-between gap-4 rounded-xl border px-4 py-3.5 transition-all duration-200 hover:shadow-md", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-3", children: [(0, jsx_runtime_1.jsx)("div", { className: "wallet-icon flex h-8 w-8 items-center justify-center rounded-full bg-blue-100", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Wallet, { className: "h-4 w-4 text-blue-600" }) }), (0, jsx_runtime_1.jsx)("div", { className: "flex flex-col items-start text-left", children: (0, jsx_runtime_1.jsx)("h4", { className: "text-as-primary font-semibold", children: "Connect wallet" }) })] }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRightCircle, { className: "text-as-primary/40 group-hover:text-as-primary/60 h-5 w-5 transition-colors" })] }), (0, jsx_runtime_1.jsxs)("button", { onClick: () => {
|
|
55
123
|
setSelectedPaymentMethod(CryptoPaymentMethodType.TRANSFER_CRYPTO);
|
|
56
124
|
onSelectPaymentMethod(CryptoPaymentMethodType.TRANSFER_CRYPTO);
|
|
57
|
-
}, disabled: isCreatingOrder, className: "crypto-payment-method-transfer 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: [(0, jsx_runtime_1.jsx)("div", { className: "flex flex-col items-start text-left", children: (0, jsx_runtime_1.jsx)("h4", { className: "text-as-primary font-semibold", children: "Transfer crypto" }) }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRightCircle, { className: "text-as-primary/40 group-hover:text-as-primary/60 h-5 w-5 transition-colors" })] })
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
125
|
+
}, disabled: isCreatingOrder, className: "crypto-payment-method-transfer 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: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-3", children: [(0, jsx_runtime_1.jsx)("div", { className: "wallet-icon flex h-8 w-8 items-center justify-center rounded-full bg-orange-100", children: (0, jsx_runtime_1.jsx)(lucide_react_1.ZapIcon, { className: "h-4 w-4" }) }), (0, jsx_runtime_1.jsx)("div", { className: "flex flex-col items-start text-left", children: (0, jsx_runtime_1.jsx)("h4", { className: "text-as-primary font-semibold", children: "Transfer crypto" }) })] }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRightCircle, { className: "text-as-primary/40 group-hover:text-as-primary/60 h-5 w-5 transition-colors" })] }), isConnected && ((0, jsx_runtime_1.jsxs)("div", { className: "installed-wallets", children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-as-primary/80 mb-3 text-sm font-medium", children: "Connected wallets" }), (0, jsx_runtime_1.jsx)("div", { className: "space-y-2", children: (0, jsx_runtime_1.jsx)("button", { onClick: () => {
|
|
126
|
+
setSelectedPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
|
|
127
|
+
onSelectPaymentMethod(CryptoPaymentMethodType.CONNECT_WALLET);
|
|
128
|
+
sonner_1.toast.success(`Selected ${connector?.name || "wallet"}`);
|
|
129
|
+
}, className: (0, cn_1.cn)("crypto-payment-method-connect-wallet w-full rounded-xl border p-4 text-left transition-all hover:shadow-md", selectedPaymentMethod === CryptoPaymentMethodType.CONNECT_WALLET
|
|
130
|
+
? "connected-wallet border-as-brand bg-as-brand/5"
|
|
131
|
+
: "border-as-border-secondary bg-as-surface-primary hover:border-as-secondary/80"), children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-3", children: [globalWallet?.meta?.icon ? ((0, jsx_runtime_1.jsx)("img", { src: globalWallet.meta.icon, alt: "Wallet", className: "h-10 w-10 rounded-full" })) : ((0, jsx_runtime_1.jsx)("div", { className: "wallet-icon flex h-10 w-10 items-center justify-center rounded-full bg-blue-100", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Wallet, { className: "h-5 w-5 text-blue-600" }) })), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-as-primary font-semibold", children: connector?.name || "Connected Wallet" }), (0, jsx_runtime_1.jsx)("span", { className: "text-as-primary/60 text-sm", children: (0, formatAddress_1.shortenAddress)(address || "") })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [selectedPaymentMethod === CryptoPaymentMethodType.CONNECT_WALLET && ((0, jsx_runtime_1.jsx)("div", { className: "h-2 w-2 rounded-full bg-green-500" })), (0, jsx_runtime_1.jsx)("button", { onClick: e => {
|
|
132
|
+
e.stopPropagation();
|
|
133
|
+
disconnect();
|
|
134
|
+
sonner_1.toast.success("Wallet disconnected");
|
|
135
|
+
if (selectedPaymentMethod === CryptoPaymentMethodType.CONNECT_WALLET) {
|
|
136
|
+
setSelectedPaymentMethod(CryptoPaymentMethodType.NONE);
|
|
137
|
+
}
|
|
138
|
+
}, className: "text-as-primary/60 hover:text-as-primary/80 rounded-lg p-1.5 transition-colors", children: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { className: "h-4 w-4" }) })] })] }) }) })] }))] })] }), showWalletModal &&
|
|
139
|
+
(0, react_dom_1.createPortal)((0, jsx_runtime_1.jsx)("div", { className: "pointer-events-auto fixed inset-0 z-[9999] flex items-center justify-center bg-black/50", children: (0, jsx_runtime_1.jsxs)("div", { className: "max-h-[80vh] w-[400px] max-w-[90vw] overflow-auto rounded-xl bg-white p-6 dark:bg-gray-900", children: [(0, jsx_runtime_1.jsxs)("div", { className: "mb-4 flex items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [modalStep === "account-selection" && ((0, jsx_runtime_1.jsx)("button", { onClick: () => setModalStep("wallet-selection"), className: "text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200", children: (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronLeft, { className: "h-5 w-5" }) })), (0, jsx_runtime_1.jsx)("h3", { className: "text-lg font-semibold text-gray-900 dark:text-white", children: modalStep === "wallet-selection"
|
|
140
|
+
? "Select a payment method"
|
|
141
|
+
: `Connect ${selectedWalletConnector?.name}` })] }), (0, jsx_runtime_1.jsx)("button", { onClick: handleCloseModal, className: "text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200", children: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { className: "h-5 w-5" }) })] }), (0, jsx_runtime_1.jsx)("div", { className: "space-y-4", children: modalStep === "wallet-selection" ? ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsxs)("div", { className: "space-y-3", children: [(0, jsx_runtime_1.jsx)("h4", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: isConnected ? "Switch wallet or account" : "Choose wallet to connect" }), walletOptions.map(walletOption => {
|
|
142
|
+
const isCurrentWallet = isConnected && connector?.name === walletOption.connector?.name;
|
|
143
|
+
return ((0, jsx_runtime_1.jsx)("button", { onClick: async () => {
|
|
144
|
+
setSelectedWalletConnector(walletOption.connector);
|
|
145
|
+
setModalStep("account-selection");
|
|
146
|
+
}, disabled: isPending, className: `w-full rounded-xl border p-4 text-left transition-all hover:shadow-md disabled:opacity-50 ${isCurrentWallet
|
|
147
|
+
? "border-blue-500 bg-blue-50 dark:bg-blue-900/20"
|
|
148
|
+
: "border-gray-200 bg-white hover:border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:hover:border-gray-500"}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-3", children: [(0, jsx_runtime_1.jsx)("div", { className: `flex h-12 w-12 items-center justify-center rounded-xl text-xl ${isCurrentWallet ? "bg-blue-100 dark:bg-blue-800" : "bg-gray-100 dark:bg-gray-700"}`, children: walletOption.icon }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-sm font-semibold text-gray-900 dark:text-white", children: walletOption.name }), isCurrentWallet && ((0, jsx_runtime_1.jsx)("span", { className: "rounded-full bg-blue-100 px-2 py-0.5 text-xs font-medium text-blue-700 dark:bg-blue-800 dark:text-blue-200", children: "Connected" }))] }), (0, jsx_runtime_1.jsx)("div", { className: "text-xs text-gray-500 dark:text-gray-400", children: isCurrentWallet ? "Switch account or reconnect" : walletOption.description })] })] }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRightCircle, { className: "h-5 w-5 text-gray-400" })] }) }, walletOption.id));
|
|
149
|
+
})] }) })) : (
|
|
150
|
+
/* Account Selection Step */
|
|
151
|
+
(0, jsx_runtime_1.jsxs)("div", { className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("p", { className: "text-sm text-gray-600 dark:text-gray-400", children: ["Connect to ", selectedWalletConnector?.name, " to view available accounts"] }), (0, jsx_runtime_1.jsx)("button", { onClick: async () => {
|
|
152
|
+
handleCloseModal();
|
|
153
|
+
await requestWalletPermissions(selectedWalletConnector);
|
|
154
|
+
}, disabled: isPending, className: "w-full rounded-lg border border-gray-200 bg-white p-4 text-center transition-all hover:border-gray-300 hover:shadow-md disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:hover:border-gray-500", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-center gap-3", children: [(0, jsx_runtime_1.jsx)("div", { className: "flex h-10 w-10 items-center justify-center rounded-lg bg-gray-100 dark:bg-gray-700", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Wallet, { className: "h-5 w-5 text-gray-600 dark:text-gray-400" }) }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { className: "text-sm font-medium text-gray-900 dark:text-white", children: isPending
|
|
155
|
+
? `Connecting to ${selectedWalletConnector?.name}...`
|
|
156
|
+
: `Connect ${selectedWalletConnector?.name}` }), (0, jsx_runtime_1.jsx)("div", { className: "text-xs text-gray-500 dark:text-gray-400", children: isPending ? "Please check your wallet" : "Click to connect and select account" })] })] }) })] })) })] }) }), typeof window !== "undefined" ? document.getElementById("b3-root") || document.body : document.body)] }));
|
|
68
157
|
}
|
|
@@ -49,6 +49,9 @@ function getOrderSuccessText({ order, tournament, formattedActualDstAmount, dstT
|
|
|
49
49
|
actionText = `funded ${tournament?.name}`;
|
|
50
50
|
return `Successfully ${actionText}`;
|
|
51
51
|
case "custom":
|
|
52
|
+
if (order.metadata.action === anyspend_1.DEPOSIT_HYPE_ACTION) {
|
|
53
|
+
return `Successfully deposited ${(0, number_1.formatTokenAmount)(BigInt(order.payload?.amount || "0"), 18)} HYPE to ${recipient}`;
|
|
54
|
+
}
|
|
52
55
|
actionText = order.metadata.action || `executed contract`;
|
|
53
56
|
return `Successfully ${actionText}`;
|
|
54
57
|
default:
|
|
@@ -145,7 +148,7 @@ exports.OrderDetails = (0, react_5.memo)(function OrderDetails({ mode = "modal",
|
|
|
145
148
|
const [txHash, setTxHash] = (0, react_5.useState)();
|
|
146
149
|
const [showQRCode, setShowQRCode] = (0, react_5.useState)(false);
|
|
147
150
|
const { isLoading: txLoading, isSuccess: txSuccess } = (0, wagmi_1.useWaitForTransactionReceipt)({ hash: txHash });
|
|
148
|
-
const {
|
|
151
|
+
const { switchChainAndExecuteWithEOA, isSwitchingOrExecuting } = (0, react_1.useUnifiedChainSwitchAndExecute)();
|
|
149
152
|
const { colorMode } = (0, react_2.useColorMode)();
|
|
150
153
|
const roundedUpSrcAmount = (0, react_5.useMemo)(() => {
|
|
151
154
|
// Display the full transfer amount without rounding since users need to see the exact value they're transferring.
|
|
@@ -175,11 +178,11 @@ exports.OrderDetails = (0, react_5.memo)(function OrderDetails({ mode = "modal",
|
|
|
175
178
|
to = order.srcTokenAddress;
|
|
176
179
|
value = BigInt(0);
|
|
177
180
|
}
|
|
178
|
-
const txHash = await
|
|
181
|
+
const txHash = await switchChainAndExecuteWithEOA(order.srcChain, { to, data: txData, value });
|
|
179
182
|
if (txHash) {
|
|
180
183
|
setTxHash(txHash);
|
|
181
184
|
}
|
|
182
|
-
}, [order,
|
|
185
|
+
}, [order, switchChainAndExecuteWithEOA]);
|
|
183
186
|
// Main payment handler that triggers chain switch and payment
|
|
184
187
|
const handlePayment = async () => {
|
|
185
188
|
console.log("Initiating payment process. Target chain:", order.srcChain, "Current chain:", walletClient?.chain?.id);
|
|
@@ -9,13 +9,15 @@ const number_1 = require("../../../../shared/utils/number");
|
|
|
9
9
|
const lucide_react_1 = require("lucide-react");
|
|
10
10
|
const react_2 = require("motion/react");
|
|
11
11
|
const react_3 = require("react");
|
|
12
|
+
const wagmi_1 = require("wagmi");
|
|
12
13
|
const CryptoPaymentMethod_1 = require("./CryptoPaymentMethod");
|
|
13
14
|
const FiatPaymentMethod_1 = require("./FiatPaymentMethod");
|
|
14
15
|
const OrderTokenAmount_1 = require("./OrderTokenAmount");
|
|
15
16
|
const TokenBalance_1 = require("./TokenBalance");
|
|
16
17
|
function PaySection({ paymentType, selectedSrcChainId, setSelectedSrcChainId, selectedSrcToken, setSelectedSrcToken, srcAmount, setSrcAmount, setIsSrcInputDirty, selectedCryptoPaymentMethod, selectedFiatPaymentMethod, onSelectCryptoPaymentMethod, onSelectFiatPaymentMethod, anyspendQuote, }) {
|
|
17
|
-
const { address:
|
|
18
|
-
const
|
|
18
|
+
const { address: connectedAddress, isConnected } = (0, wagmi_1.useAccount)();
|
|
19
|
+
const { data: profileData } = (0, react_1.useProfile)({ address: connectedAddress });
|
|
20
|
+
const connectedName = profileData?.displayName;
|
|
19
21
|
const { data: srcTokenMetadata } = (0, react_1.useTokenData)(selectedSrcToken?.chainId, selectedSrcToken?.address);
|
|
20
22
|
// Add ref to track if we've applied metadata
|
|
21
23
|
const appliedSrcMetadataRef = (0, react_3.useRef)(false);
|
|
@@ -41,13 +43,13 @@ function PaySection({ paymentType, selectedSrcChainId, setSelectedSrcChainId, se
|
|
|
41
43
|
(0, react_3.useEffect)(() => {
|
|
42
44
|
appliedSrcMetadataRef.current = false;
|
|
43
45
|
}, [selectedSrcToken.address, selectedSrcToken.chainId]);
|
|
44
|
-
return ((0, jsx_runtime_1.jsxs)(react_2.motion.div, { initial: { opacity: 0, y: 20, filter: "blur(10px)" }, animate: { opacity: 1, y: 0, filter: "blur(0px)" }, transition: { duration: 0.3, delay: 0, ease: "easeInOut" }, className: "bg-as-surface-secondary border-as-border-secondary relative flex w-full flex-col gap-2 rounded-2xl border p-4 sm:p-6", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-as-primary/50 flex h-7 items-center text-sm", children: "Pay" }), paymentType === "crypto" ? ((0, jsx_runtime_1.jsx)("button", { className: "text-as-tertiarry flex h-7 items-center gap-2 text-sm transition-colors", onClick: onSelectCryptoPaymentMethod, children: selectedCryptoPaymentMethod === CryptoPaymentMethod_1.CryptoPaymentMethodType.CONNECT_WALLET ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [
|
|
46
|
+
return ((0, jsx_runtime_1.jsxs)(react_2.motion.div, { initial: { opacity: 0, y: 20, filter: "blur(10px)" }, animate: { opacity: 1, y: 0, filter: "blur(0px)" }, transition: { duration: 0.3, delay: 0, ease: "easeInOut" }, className: "bg-as-surface-secondary border-as-border-secondary relative flex w-full flex-col gap-2 rounded-2xl border p-4 sm:p-6", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-as-primary/50 flex h-7 items-center text-sm", children: "Pay" }), paymentType === "crypto" ? ((0, jsx_runtime_1.jsx)("button", { className: "text-as-tertiarry flex h-7 items-center gap-2 text-sm transition-colors focus:!outline-none", onClick: onSelectCryptoPaymentMethod, children: selectedCryptoPaymentMethod === CryptoPaymentMethod_1.CryptoPaymentMethodType.CONNECT_WALLET ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [isConnected ? ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center gap-1", children: connectedName ? (0, utils_1.formatUsername)(connectedName) : (0, formatAddress_1.shortenAddress)(connectedAddress || "") })) : ("Connect wallet"), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { className: "h-4 w-4" })] })) : selectedCryptoPaymentMethod === CryptoPaymentMethod_1.CryptoPaymentMethodType.TRANSFER_CRYPTO ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Transfer crypto", (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { className: "h-4 w-4" })] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Select payment method", (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { className: "h-4 w-4" })] })) })) : ((0, jsx_runtime_1.jsx)("button", { className: "text-as-tertiarry flex h-7 items-center gap-2 text-sm transition-colors", onClick: onSelectFiatPaymentMethod, children: selectedFiatPaymentMethod === FiatPaymentMethod_1.FiatPaymentMethod.COINBASE_PAY ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("div", { className: "flex h-5 w-5 items-center justify-center rounded-full bg-blue-600", children: (0, jsx_runtime_1.jsx)("span", { className: "text-xs font-bold text-white", children: "C" }) }), "Coinbase Pay"] }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { className: "h-4 w-4" })] })) : selectedFiatPaymentMethod === FiatPaymentMethod_1.FiatPaymentMethod.STRIPE ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("div", { className: "flex h-5 w-5 items-center justify-center rounded-full bg-blue-600", children: (0, jsx_runtime_1.jsx)("span", { className: "text-xs font-bold text-white", children: "S" }) }), "Credit/Debit Card"] }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { className: "h-4 w-4" })] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Select payment method", (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { className: "h-4 w-4" })] })) }))] }), paymentType === "crypto" ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(OrderTokenAmount_1.OrderTokenAmount, { address: connectedAddress, context: "from", inputValue: srcAmount, onChangeInput: value => {
|
|
45
47
|
setIsSrcInputDirty(true);
|
|
46
48
|
setSrcAmount(value);
|
|
47
49
|
}, chainId: selectedSrcChainId, setChainId: setSelectedSrcChainId, token: selectedSrcToken, setToken: setSelectedSrcToken }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-as-primary/50 flex h-5 items-center text-sm", children: (0, number_1.formatDisplayNumber)(anyspendQuote?.data?.currencyIn?.amountUsd, {
|
|
48
50
|
style: "currency",
|
|
49
51
|
fallback: "",
|
|
50
|
-
}) }), (0, jsx_runtime_1.jsx)(TokenBalance_1.TokenBalance, { token: selectedSrcToken, walletAddress:
|
|
52
|
+
}) }), (0, jsx_runtime_1.jsx)(TokenBalance_1.TokenBalance, { token: selectedSrcToken, walletAddress: connectedAddress, onChangeInput: value => {
|
|
51
53
|
setIsSrcInputDirty(true);
|
|
52
54
|
setSrcAmount(value);
|
|
53
55
|
} })] })] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-center pb-2 pt-8", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-1", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-as-tertiarry text-2xl font-bold", children: "$" }), (0, jsx_runtime_1.jsx)(react_1.Input, { type: "text", value: srcAmount, onChange: e => setSrcAmount(e.target.value.replace(/[^0-9.]/g, "")), placeholder: "5", className: "text-as-primary placeholder:text-as-primary/50 h-auto min-w-[70px] border-0 bg-transparent p-0 px-3 pt-1 text-4xl font-bold focus-visible:ring-0 focus-visible:ring-offset-0", style: {
|
|
@@ -18,8 +18,9 @@ interface UseAnyspendFlowProps {
|
|
|
18
18
|
onTransactionSuccess?: () => void;
|
|
19
19
|
sourceTokenAddress?: string;
|
|
20
20
|
sourceTokenChainId?: number;
|
|
21
|
+
slippage?: number;
|
|
21
22
|
}
|
|
22
|
-
export declare function useAnyspendFlow({ paymentType, recipientAddress, loadOrder, isDepositMode, onOrderSuccess, onTransactionSuccess, sourceTokenAddress, sourceTokenChainId, }: UseAnyspendFlowProps): {
|
|
23
|
+
export declare function useAnyspendFlow({ paymentType, recipientAddress, loadOrder, isDepositMode, onOrderSuccess, onTransactionSuccess, sourceTokenAddress, sourceTokenChainId, slippage, }: UseAnyspendFlowProps): {
|
|
23
24
|
activePanel: PanelView;
|
|
24
25
|
setActivePanel: import("react").Dispatch<import("react").SetStateAction<PanelView>>;
|
|
25
26
|
orderId: string | undefined;
|
|
@@ -22,7 +22,9 @@ var PanelView;
|
|
|
22
22
|
PanelView[PanelView["ORDER_DETAILS"] = 4] = "ORDER_DETAILS";
|
|
23
23
|
PanelView[PanelView["LOADING"] = 5] = "LOADING";
|
|
24
24
|
})(PanelView || (exports.PanelView = PanelView = {}));
|
|
25
|
-
function useAnyspendFlow({ paymentType = "crypto", recipientAddress, loadOrder, isDepositMode = false, onOrderSuccess, onTransactionSuccess, sourceTokenAddress, sourceTokenChainId, }) {
|
|
25
|
+
function useAnyspendFlow({ paymentType = "crypto", recipientAddress, loadOrder, isDepositMode = false, onOrderSuccess, onTransactionSuccess, sourceTokenAddress, sourceTokenChainId, slippage = 0, }) {
|
|
26
|
+
const searchParams = (0, react_2.useSearchParamsSSR)();
|
|
27
|
+
const router = (0, react_2.useRouter)();
|
|
26
28
|
// Panel and order state
|
|
27
29
|
const [activePanel, setActivePanel] = (0, react_3.useState)(loadOrder ? PanelView.ORDER_DETAILS : PanelView.MAIN);
|
|
28
30
|
const [orderId, setOrderId] = (0, react_3.useState)(loadOrder);
|
|
@@ -49,6 +51,11 @@ function useAnyspendFlow({ paymentType = "crypto", recipientAddress, loadOrder,
|
|
|
49
51
|
setSelectedRecipientAddress(globalAddress);
|
|
50
52
|
}
|
|
51
53
|
}, [selectedRecipientAddress, globalAddress]);
|
|
54
|
+
(0, react_3.useEffect)(() => {
|
|
55
|
+
if (paymentType === "crypto") {
|
|
56
|
+
setSelectedCryptoPaymentMethod(CryptoPaymentMethod_1.CryptoPaymentMethodType.CONNECT_WALLET);
|
|
57
|
+
}
|
|
58
|
+
}, [paymentType]);
|
|
52
59
|
// Fetch specific token when sourceTokenAddress and sourceTokenChainId are provided
|
|
53
60
|
(0, react_3.useEffect)(() => {
|
|
54
61
|
const fetchSourceToken = async () => {
|
|
@@ -96,13 +103,25 @@ function useAnyspendFlow({ paymentType = "crypto", recipientAddress, loadOrder,
|
|
|
96
103
|
if (anyspendQuote?.data?.currencyOut?.amount && anyspendQuote.data.currencyOut.currency?.decimals) {
|
|
97
104
|
const amount = anyspendQuote.data.currencyOut.amount;
|
|
98
105
|
const decimals = anyspendQuote.data.currencyOut.currency.decimals;
|
|
99
|
-
|
|
106
|
+
// Apply slippage (0-100) - reduce amount by slippage percentageFixed slippage value
|
|
107
|
+
const amountWithSlippage = (BigInt(amount) * BigInt(100 - slippage)) / BigInt(100);
|
|
108
|
+
const formattedAmount = (0, number_1.formatTokenAmount)(amountWithSlippage, decimals, 6, false);
|
|
100
109
|
setDstAmount(formattedAmount);
|
|
101
110
|
}
|
|
102
111
|
else {
|
|
103
112
|
setDstAmount("");
|
|
104
113
|
}
|
|
105
|
-
}, [anyspendQuote]);
|
|
114
|
+
}, [anyspendQuote, slippage]);
|
|
115
|
+
// Update useEffect for URL parameter to not override loadOrder
|
|
116
|
+
(0, react_3.useEffect)(() => {
|
|
117
|
+
if (loadOrder)
|
|
118
|
+
return; // Skip if we have a loadOrder
|
|
119
|
+
const orderIdParam = searchParams.get("orderId");
|
|
120
|
+
if (orderIdParam) {
|
|
121
|
+
setOrderId(orderIdParam);
|
|
122
|
+
setActivePanel(PanelView.ORDER_DETAILS);
|
|
123
|
+
}
|
|
124
|
+
}, [searchParams, loadOrder]);
|
|
106
125
|
// Order creation hooks
|
|
107
126
|
const { createOrder, isCreatingOrder } = (0, react_1.useAnyspendCreateOrder)({
|
|
108
127
|
onSuccess: data => {
|
|
@@ -110,6 +129,18 @@ function useAnyspendFlow({ paymentType = "crypto", recipientAddress, loadOrder,
|
|
|
110
129
|
setOrderId(newOrderId);
|
|
111
130
|
setActivePanel(PanelView.ORDER_DETAILS);
|
|
112
131
|
onOrderSuccess?.(newOrderId);
|
|
132
|
+
// Add orderId and payment method to URL for persistence
|
|
133
|
+
const params = new URLSearchParams(searchParams.toString()); // Preserve existing params
|
|
134
|
+
params.set("orderId", newOrderId);
|
|
135
|
+
if (selectedCryptoPaymentMethod !== CryptoPaymentMethod_1.CryptoPaymentMethodType.NONE) {
|
|
136
|
+
console.log("Setting cryptoPaymentMethod in URL:", selectedCryptoPaymentMethod);
|
|
137
|
+
params.set("cryptoPaymentMethod", selectedCryptoPaymentMethod);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.log("Payment method is NONE, not setting in URL");
|
|
141
|
+
}
|
|
142
|
+
console.log("Final URL params:", params.toString());
|
|
143
|
+
router.push(`${window.location.pathname}?${params.toString()}`);
|
|
113
144
|
},
|
|
114
145
|
onError: error => {
|
|
115
146
|
console.error(error);
|
|
@@ -5,6 +5,7 @@ export interface UnifiedTransactionParams {
|
|
|
5
5
|
}
|
|
6
6
|
export declare function useUnifiedChainSwitchAndExecute(): {
|
|
7
7
|
switchChainAndExecute: (targetChainId: number, params: UnifiedTransactionParams) => Promise<string | undefined>;
|
|
8
|
+
switchChainAndExecuteWithEOA: (targetChainId: number, params: UnifiedTransactionParams) => Promise<string | undefined>;
|
|
8
9
|
isSwitchingOrExecuting: boolean;
|
|
9
10
|
isActiveSmartWallet: boolean | undefined;
|
|
10
11
|
isActiveEOAWallet: boolean | undefined;
|
|
@@ -164,6 +164,7 @@ function useUnifiedChainSwitchAndExecute() {
|
|
|
164
164
|
}, [isActiveSmartWallet, isActiveEOAWallet, handleAASendTransaction, handleEOASwitchChainAndSendTransaction]);
|
|
165
165
|
return {
|
|
166
166
|
switchChainAndExecute,
|
|
167
|
+
switchChainAndExecuteWithEOA: handleEOASwitchChainAndSendTransaction,
|
|
167
168
|
isSwitchingOrExecuting,
|
|
168
169
|
isActiveSmartWallet,
|
|
169
170
|
isActiveEOAWallet,
|
|
@@ -88,9 +88,9 @@ export declare const getViemChainConfig: (config: ChainNetworks) => {
|
|
|
88
88
|
readonly rpc: string;
|
|
89
89
|
readonly icon: {
|
|
90
90
|
format: string;
|
|
91
|
-
url: string;
|
|
92
|
-
width: number;
|
|
93
91
|
height: number;
|
|
92
|
+
width: number;
|
|
93
|
+
url: string;
|
|
94
94
|
};
|
|
95
95
|
};
|
|
96
96
|
export declare const thirdwebB3Testnet: ThirdwebChain;
|
|
@@ -10,9 +10,9 @@ export declare const supportedChainNetworks: {
|
|
|
10
10
|
testnet?: boolean | undefined;
|
|
11
11
|
fees?: Record<string, any> | undefined;
|
|
12
12
|
formatters?: Record<string, any> | undefined;
|
|
13
|
+
color?: string | undefined;
|
|
13
14
|
testnetConfigID?: number | undefined;
|
|
14
15
|
badge?: string | undefined;
|
|
15
|
-
color?: string | undefined;
|
|
16
16
|
enabledFeatures?: string[] | undefined;
|
|
17
17
|
blockExplorers: {
|
|
18
18
|
default: string;
|
|
@@ -35,13 +35,13 @@ export declare const supportedChainNetworks: {
|
|
|
35
35
|
uri: string;
|
|
36
36
|
}[];
|
|
37
37
|
};
|
|
38
|
-
_id: string | {};
|
|
39
38
|
icon: {
|
|
40
39
|
format: string;
|
|
41
|
-
url: string;
|
|
42
|
-
width: number;
|
|
43
40
|
height: number;
|
|
41
|
+
width: number;
|
|
42
|
+
url: string;
|
|
44
43
|
};
|
|
44
|
+
_id: string | {};
|
|
45
45
|
}[];
|
|
46
46
|
export declare const coingeckoChains: Record<number, {
|
|
47
47
|
coingecko_id: string;
|
|
@@ -21,6 +21,7 @@ import { RecipientSelection } from "./common/RecipientSelection.js";
|
|
|
21
21
|
import { ESCROW_ABI } from "../../../anyspend/abis/escrow.js";
|
|
22
22
|
import { ArrowDown } from "lucide-react";
|
|
23
23
|
import { PanelOnramp } from "./common/PanelOnramp.js";
|
|
24
|
+
const SLIPPAGE_PERCENT = 3;
|
|
24
25
|
function generateEncodedDataForDepositHype(amount, beneficiary) {
|
|
25
26
|
invariant(BigInt(amount) > 0, "Amount must be greater than zero");
|
|
26
27
|
const encodedData = encodeFunctionData({
|
|
@@ -36,7 +37,7 @@ export function AnySpendDepositHype(props) {
|
|
|
36
37
|
}
|
|
37
38
|
function AnySpendDepositHypeInner({ loadOrder, mode = "modal", recipientAddress, paymentType = "crypto", sourceTokenAddress, sourceTokenChainId, onSuccess, depositContractAddress, mainFooter, }) {
|
|
38
39
|
// Use shared flow hook
|
|
39
|
-
const { activePanel, setActivePanel, orderId, oat, selectedSrcChainId, setSelectedSrcChainId, selectedSrcToken, setSelectedSrcToken, srcAmount, setSrcAmount, dstAmount, setIsSrcInputDirty, selectedCryptoPaymentMethod, setSelectedCryptoPaymentMethod, selectedFiatPaymentMethod, setSelectedFiatPaymentMethod, selectedRecipientAddress, setSelectedRecipientAddress, recipientName, globalAddress, anyspendQuote, isLoadingAnyspendQuote, getAnyspendQuoteError, activeInputAmountInWei, geoData, coinbaseAvailablePaymentMethods, stripeWeb2Support, createOrder, isCreatingOrder, createOnrampOrder, isCreatingOnrampOrder, } = useAnyspendFlow({
|
|
40
|
+
const { activePanel, setActivePanel, orderId, setOrderId, oat, selectedSrcChainId, setSelectedSrcChainId, selectedSrcToken, setSelectedSrcToken, srcAmount, setSrcAmount, dstAmount, setIsSrcInputDirty, selectedCryptoPaymentMethod, setSelectedCryptoPaymentMethod, selectedFiatPaymentMethod, setSelectedFiatPaymentMethod, selectedRecipientAddress, setSelectedRecipientAddress, recipientName, globalAddress, anyspendQuote, isLoadingAnyspendQuote, getAnyspendQuoteError, activeInputAmountInWei, geoData, coinbaseAvailablePaymentMethods, stripeWeb2Support, createOrder, isCreatingOrder, createOnrampOrder, isCreatingOnrampOrder, } = useAnyspendFlow({
|
|
40
41
|
paymentType,
|
|
41
42
|
recipientAddress,
|
|
42
43
|
loadOrder,
|
|
@@ -44,6 +45,7 @@ function AnySpendDepositHypeInner({ loadOrder, mode = "modal", recipientAddress,
|
|
|
44
45
|
onTransactionSuccess: onSuccess,
|
|
45
46
|
sourceTokenAddress,
|
|
46
47
|
sourceTokenChainId,
|
|
48
|
+
slippage: SLIPPAGE_PERCENT,
|
|
47
49
|
});
|
|
48
50
|
// Button state logic
|
|
49
51
|
const btnInfo = useMemo(() => {
|
|
@@ -127,7 +129,10 @@ function AnySpendDepositHypeInner({ loadOrder, mode = "modal", recipientAddress,
|
|
|
127
129
|
invariant(selectedRecipientAddress, "Recipient address is not found");
|
|
128
130
|
invariant(depositContractAddress, "Deposit contract address is not found");
|
|
129
131
|
const srcAmountBigInt = BigInt(activeInputAmountInWei);
|
|
130
|
-
|
|
132
|
+
// TODO: temp subtract 3% for slippage
|
|
133
|
+
const originalDepositAmountWei = anyspendQuote.data?.currencyOut?.amount || "0";
|
|
134
|
+
const depositAmountWei = ((BigInt(originalDepositAmountWei) * BigInt(100 - SLIPPAGE_PERCENT)) /
|
|
135
|
+
BigInt(100)).toString();
|
|
131
136
|
const encodedData = generateEncodedDataForDepositHype(depositAmountWei, selectedRecipientAddress);
|
|
132
137
|
createOrder({
|
|
133
138
|
recipientAddress: selectedRecipientAddress,
|
|
@@ -215,6 +220,7 @@ function AnySpendDepositHypeInner({ loadOrder, mode = "modal", recipientAddress,
|
|
|
215
220
|
};
|
|
216
221
|
// Order details view
|
|
217
222
|
const orderDetailsView = (_jsx("div", { className: "mx-auto w-[460px] max-w-full", children: _jsx("div", { className: "relative flex flex-col gap-4", children: oat && (_jsxs(_Fragment, { children: [_jsx(OrderStatus, { order: oat.data.order, selectedCryptoPaymentMethod: selectedCryptoPaymentMethod }), _jsx(OrderDetails, { mode: mode, order: oat.data.order, depositTxs: oat.data.depositTxs, relayTx: oat.data.relayTx, executeTx: oat.data.executeTx, refundTxs: oat.data.refundTxs, cryptoPaymentMethod: paymentType === "fiat" ? CryptoPaymentMethodType.NONE : selectedCryptoPaymentMethod, onBack: () => {
|
|
223
|
+
setOrderId(undefined);
|
|
218
224
|
setActivePanel(PanelView.MAIN);
|
|
219
225
|
onSuccess?.();
|
|
220
226
|
} })] })) }) }));
|