From 4796871612cfbe06c48a4ee6fd25495ab168fe57 Mon Sep 17 00:00:00 2001 From: Manan Tank Date: Thu, 18 Sep 2025 02:36:28 +0530 Subject: [PATCH] SDK, Dashboard: Fix SwapWidget setting same token for buy and sell in chain page --- .changeset/cuddly-steaks-bathe.md | 5 ++ .../@/components/blocks/BuyAndSwapEmbed.tsx | 9 ++- .../web/ui/Bridge/swap-widget/SwapWidget.tsx | 57 +++++++++++-------- 3 files changed, 45 insertions(+), 26 deletions(-) create mode 100644 .changeset/cuddly-steaks-bathe.md diff --git a/.changeset/cuddly-steaks-bathe.md b/.changeset/cuddly-steaks-bathe.md new file mode 100644 index 00000000000..fa61bdecd88 --- /dev/null +++ b/.changeset/cuddly-steaks-bathe.md @@ -0,0 +1,5 @@ +--- +"thirdweb": patch +--- + +Fix SwapWidget setting same token for buy and sell in some cases when using last used token from storage diff --git a/apps/dashboard/src/@/components/blocks/BuyAndSwapEmbed.tsx b/apps/dashboard/src/@/components/blocks/BuyAndSwapEmbed.tsx index 55f2e9603e0..498867f9bff 100644 --- a/apps/dashboard/src/@/components/blocks/BuyAndSwapEmbed.tsx +++ b/apps/dashboard/src/@/components/blocks/BuyAndSwapEmbed.tsx @@ -97,9 +97,12 @@ export function BuyAndSwapEmbed(props: { chainId: props.chain.id, tokenAddress: props.tokenAddress, }, - buyToken: { - chainId: props.chain.id, - }, + // only set `buyToken` as "Native token" if `sellToken` is not a "native token" already + buyToken: props.tokenAddress + ? { + chainId: props.chain.id, + } + : undefined, }} onError={(error, quote) => { const errorMessage = parseError(error); diff --git a/packages/thirdweb/src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx b/packages/thirdweb/src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx index cd9989c91bc..00d05687289 100644 --- a/packages/thirdweb/src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx +++ b/packages/thirdweb/src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx @@ -323,33 +323,30 @@ function SwapWidgetContent(props: SwapWidgetProps) { chainId: props.prefill.buyToken.chainId, }; } - const last = getLastUsedTokens()?.buyToken; - if (last) { - return { - tokenAddress: getAddress(last.tokenAddress), - chainId: last.chainId, - }; + const lastUsedBuyToken = getLastUsedTokens()?.buyToken; + + // the token that will be set as initial value of sell token + const sellToken = getInitialSellToken( + props.prefill, + getLastUsedTokens()?.sellToken, + ); + + // if both tokens are same, ignore "buyToken", keep "sellToken" + if ( + lastUsedBuyToken && + sellToken && + lastUsedBuyToken.tokenAddress.toLowerCase() === + sellToken.tokenAddress.toLowerCase() && + lastUsedBuyToken.chainId === sellToken.chainId + ) { + return undefined; } - return undefined; + + return lastUsedBuyToken; }); const [sellToken, setSellToken] = useState(() => { - if (props.prefill?.sellToken) { - return { - tokenAddress: - props.prefill.sellToken.tokenAddress || - getAddress(NATIVE_TOKEN_ADDRESS), - chainId: props.prefill.sellToken.chainId, - }; - } - const last = getLastUsedTokens()?.sellToken; - if (last) { - return { - tokenAddress: getAddress(last.tokenAddress), - chainId: last.chainId, - }; - } - return undefined; + return getInitialSellToken(props.prefill, getLastUsedTokens()?.sellToken); }); // persist selections to localStorage whenever they change @@ -515,3 +512,17 @@ function SwapWidgetContent(props: SwapWidgetProps) { return null; } + +function getInitialSellToken( + prefill: SwapWidgetProps["prefill"], + lastUsedSellToken: TokenSelection | undefined, +) { + if (prefill?.sellToken) { + return { + tokenAddress: + prefill.sellToken.tokenAddress || getAddress(NATIVE_TOKEN_ADDRESS), + chainId: prefill.sellToken.chainId, + }; + } + return lastUsedSellToken; +}