diff --git a/src/components/stake-form.tsx b/src/components/stake-form.tsx index 2275bbe..339db16 100644 --- a/src/components/stake-form.tsx +++ b/src/components/stake-form.tsx @@ -7,8 +7,8 @@ import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { ChevronDown, CheckCircle, XCircle, Loader2, ArrowDownUp } from 'lucide-react'; import { useAccount } from 'wagmi'; -import { useGetAllPools, useTokenDetails, useSwapMintAmounts, useBurnSwapAmounts, useLPTokenBalance, type PoolDetails, type TokenDetails } from '@/hooks/usePartyPlanner'; -import { useSwapMint, useBurnSwap } from '@/hooks/usePartyPool'; +import { useGetAllPools, useTokenDetails, useSwapMintAmounts, useBurnSwapAmounts, useLPTokenBalance, type PoolDetails, type TokenDetails, type BurnSwapAmounts } from '@/hooks/usePartyPlanner'; +import { useSwapMint, useBurnSwap, type ActualSwapMintAmounts, type ActualBurnSwapAmounts } from '@/hooks/usePartyPool'; import { formatUnits, parseUnits } from 'viem'; import IPartyPoolABI from '@/contracts/IPartyPoolABI'; @@ -30,6 +30,8 @@ export function StakeForm({ defaultMode = 'stake' }: StakeFormProps) { const [isTokenDropdownOpen, setIsTokenDropdownOpen] = useState(false); const [transactionStatus, setTransactionStatus] = useState('idle'); const [transactionError, setTransactionError] = useState(null); + const [actualSwapMintAmounts, setActualSwapMintAmounts] = useState(null); + const [actualBurnSwapAmounts, setActualBurnSwapAmounts] = useState(null); const poolDropdownRef = useRef(null); const tokenDropdownRef = useRef(null); @@ -152,21 +154,31 @@ export function StakeForm({ defaultMode = 'stake' }: StakeFormProps) { try { if (mode === 'stake') { - // Execute the swap mint transaction - await executeSwapMint( + // Execute the swap mint transaction and capture actual amounts + const result = await executeSwapMint( selectedPool.address, selectedToken.address, inputTokenIndex, maxAmountIn ); + + // Store actual swap mint amounts if available + if (result?.actualSwapMintAmounts) { + setActualSwapMintAmounts(result.actualSwapMintAmounts); + } } else { - // Execute the burn swap transaction - await executeBurnSwap( + // Execute the burn swap transaction and capture actual amounts + const result = await executeBurnSwap( selectedPool.address, maxAmountIn, inputTokenIndex, false // unwrap = false by default ); + + // Store actual burn swap amounts if available + if (result?.actualBurnSwapAmounts) { + setActualBurnSwapAmounts(result.actualBurnSwapAmounts); + } } setTransactionStatus('success'); @@ -490,7 +502,13 @@ export function StakeForm({ defaultMode = 'stake' }: StakeFormProps) {
{t('stake.amountOut')}: - {burnSwapLoading ? 'Calculating...' : `${formatUnits(burnSwapAmounts, selectedToken.decimals)} ${selectedToken.symbol}`} + {burnSwapLoading ? 'Calculating...' : `${Number(formatUnits(burnSwapAmounts.amountOut, selectedToken.decimals)).toLocaleString('en-US', { maximumFractionDigits: 6 })} ${selectedToken.symbol}`} + +
+
+ {t('stake.fee')}: + + {burnSwapLoading ? 'Calculating...' : `${Number(formatUnits(burnSwapAmounts.outFee, selectedToken.decimals)).toLocaleString('en-US', { maximumFractionDigits: 6 })} ${selectedToken.symbol}`}
@@ -538,12 +556,82 @@ export function StakeForm({ defaultMode = 'stake' }: StakeFormProps) {

{mode === 'stake' ? 'Stake Confirmed!' : 'Unstake Confirmed!'}

-

- {mode === 'stake' - ? `Successfully staked ${stakeAmount} ${selectedToken?.symbol} to ${selectedPool?.symbol}` - : `Successfully unstaked ${stakeAmount} ${selectedPool?.symbol} LP for ${selectedToken?.symbol}` - } -

+ + {/* Display actual amounts or estimates */} + {mode === 'stake' ? ( + // Stake mode success message +
+ {actualSwapMintAmounts && selectedToken && selectedPool ? ( + // Show actual amounts from transaction + <> +
+ Token Used: + {formatUnits(actualSwapMintAmounts.amountInUsed, selectedToken.decimals)} {selectedToken.symbol} +
+
+ LP Received: + {formatUnits(actualSwapMintAmounts.lpMinted, 18)} {selectedPool.symbol} +
+
+ LP Fee: + {formatUnits(actualSwapMintAmounts.lpFee, selectedToken.decimals)} {selectedToken.symbol} +
+
+ Protocol Fee: + {formatUnits(actualSwapMintAmounts.protocolFee, selectedToken.decimals)} {selectedToken.symbol} +
+ + ) : ( + // Fallback to estimates + <> +

+ Successfully staked {stakeAmount} {selectedToken?.symbol} to {selectedPool?.symbol} +
+ + *Disclaimer: This is an estimate from the protocol. The actual amounts might be slightly different due to slippage. + +

+ + )} +
+ ) : ( + // Unstake mode success message +
+ {actualBurnSwapAmounts && selectedToken && selectedPool ? ( + // Show actual amounts from transaction + <> +
+ LP Burned: + {formatUnits(actualBurnSwapAmounts.amountIn, 18)} {selectedPool.symbol} +
+
+ Token Received: + {formatUnits(actualBurnSwapAmounts.amountOut, selectedToken.decimals)} {selectedToken.symbol} +
+
+ LP Fee: + {formatUnits(actualBurnSwapAmounts.lpFee, selectedToken.decimals)} {selectedToken.symbol} +
+
+ Protocol Fee: + {formatUnits(actualBurnSwapAmounts.protocolFee, selectedToken.decimals)} {selectedToken.symbol} +
+ + ) : ( + // Fallback to estimates + <> +

+ Successfully unstaked {stakeAmount} {selectedPool?.symbol} LP for {selectedToken?.symbol} +
+ + *Disclaimer: This is an estimate from the protocol. The actual amounts might be slightly different due to slippage. + +

+ + )} +
+ )} +