From 4746c93d97affd1bb87ecdcb58f9979b7fa89426 Mon Sep 17 00:00:00 2001 From: fr1j0 Date: Sat, 21 Mar 2026 12:40:04 -0400 Subject: [PATCH] fix: sPinto unwrap output and send tokens UX issues - Fix sPinto unwrap showing incorrect PINTO amount (capped by existing deposit balance instead of actual previewRedeem quote) - Fix unwrap-to-silo stalk/seeds calculated from existing crates instead of new deposit rewards - Fix "ExternalWallet" camelCase on send confirmation page - Move transfer notice to appear only after both address and destination type are selected - Require acknowledgment checkbox for both External and Farm Wallet sends - Stop resetting acknowledgment checkbox when switching destination type Co-Authored-By: Claude Opus 4.6 (1M context) --- src/pages/silo/actions/UnwrapToken.tsx | 29 ++++++++-------- .../transfer/actions/TransferFarmBalance.tsx | 6 ++-- .../actions/farmbalance/FinalStep.tsx | 2 +- .../transfer/actions/farmbalance/StepOne.tsx | 33 ++++++++++--------- 4 files changed, 34 insertions(+), 36 deletions(-) diff --git a/src/pages/silo/actions/UnwrapToken.tsx b/src/pages/silo/actions/UnwrapToken.tsx index cbe44950b..64d822aef 100644 --- a/src/pages/silo/actions/UnwrapToken.tsx +++ b/src/pages/silo/actions/UnwrapToken.tsx @@ -26,9 +26,9 @@ import useTransaction from "@/hooks/useTransaction"; import { FarmerBalance, useFarmerBalances } from "@/state/useFarmerBalances"; import { useFarmerSilo } from "@/state/useFarmerSilo"; import { usePriceData } from "@/state/usePriceData"; +import { useSiloData } from "@/state/useSiloData"; import useTokenData from "@/state/useTokenData"; import { trackSimpleEvent } from "@/utils/analytics"; -import { pickCratesAsCrates, sortCratesByStem } from "@/utils/convert"; import { tryExtractErrorMessage } from "@/utils/error"; import { formatter } from "@/utils/format"; import { toSafeTVFromHuman } from "@/utils/number"; @@ -86,7 +86,7 @@ export default function UnwrapToken({ siloToken }: { siloToken: Token }) { // Queries & Hooks // Quote for redeemToSilo and redeemAdvanced const { data: quote, ...quoteQuery } = useUnwrapTokenQuoteQuery(amountTV, siloToken, mainToken, quoteDisabled); - const output = useUnwrapQuoteOutputSummary(contractBalances.deposits, mainToken, quote); + const output = useUnwrapQuoteOutputSummary(mainToken, quote); // Quote for swap (ONLY if tokenOut is not main token) const swap = useSwap({ @@ -522,18 +522,9 @@ function useUnwrapTokenQuoteQuery(amount: TV, tokenIn: Token, tokenOut: Token, d }; } -function useUnwrapQuoteOutputSummary( - data: ReturnType["deposits"], - token: Token, - quote: TV | undefined, -) { +function useUnwrapQuoteOutputSummary(token: Token, quote: TV | undefined) { const { tokenPrices } = usePriceData(); - - // sort by latest deposit first - const sortedDeposits = useMemo(() => { - const depositsData = data.get(token); - return sortCratesByStem(depositsData?.deposits ?? [], "desc"); - }, [data, token]); + const siloData = useSiloData(); return useMemo(() => { if (!quote || quote.lte(0)) return undefined; @@ -541,11 +532,19 @@ function useUnwrapQuoteOutputSummary( const tokenPrice = tokenPrices.get(token); const usd = quote.mul(tokenPrice?.instant ?? 0); + const sData = siloData.tokenData.get(token); + if (!sData) return undefined; + + const stalkGain = quote.mul(sData.rewards.stalk).mul(sData.tokenBDV); + const seedGain = quote.mul(sData.rewards.seeds).mul(sData.tokenBDV); + return { - ...pickCratesAsCrates(sortedDeposits, quote), + amount: quote, + stalk: { total: stalkGain }, + seeds: seedGain, usd: usd, }; - }, [quote, sortedDeposits]); + }, [quote, token, tokenPrices, siloData]); } function useFilterOutTokens(token: Token) { diff --git a/src/pages/transfer/actions/TransferFarmBalance.tsx b/src/pages/transfer/actions/TransferFarmBalance.tsx index 453b0df12..8224aa193 100644 --- a/src/pages/transfer/actions/TransferFarmBalance.tsx +++ b/src/pages/transfer/actions/TransferFarmBalance.tsx @@ -27,7 +27,7 @@ export default function TransferFarmBalance() { useEffect(() => { setTransferNotice(false); - }, [balanceTo, destination]); + }, [destination]); const totalAmount = useMemo( () => transferData.reduce((total, tokenData) => Number(tokenData.amount) + total, 0), @@ -93,9 +93,7 @@ export default function TransferFarmBalance() { stepNumber={step} setStep={setStep} totalSteps={2} - enableNextStep={ - !!destination && totalAmount > 0 && !!balanceTo && (balanceTo === FarmToMode.INTERNAL ? transferNotice : true) - } + enableNextStep={!!destination && totalAmount > 0 && !!balanceTo && transferNotice} onSubmit={onSubmit} stepDescription={stepDescription} > diff --git a/src/pages/transfer/actions/farmbalance/FinalStep.tsx b/src/pages/transfer/actions/farmbalance/FinalStep.tsx index 922859b68..685a0e462 100644 --- a/src/pages/transfer/actions/farmbalance/FinalStep.tsx +++ b/src/pages/transfer/actions/farmbalance/FinalStep.tsx @@ -23,7 +23,7 @@ export default function FinalStep({ balanceTo, destination, transferData }: Step
- {balanceTo === FarmToMode.EXTERNAL ? "ExternalWallet" : "Farm Wallet"} + {balanceTo === FarmToMode.EXTERNAL ? "External Wallet" : "Farm Wallet"}
diff --git a/src/pages/transfer/actions/farmbalance/StepOne.tsx b/src/pages/transfer/actions/farmbalance/StepOne.tsx index 894a33ced..137798d4c 100644 --- a/src/pages/transfer/actions/farmbalance/StepOne.tsx +++ b/src/pages/transfer/actions/farmbalance/StepOne.tsx @@ -244,28 +244,29 @@ export default function StepOne({ - - {destination && ( - - - - )} - + + + {destination && balanceTo !== undefined && ( + + + + )} + ); }