Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 17 additions & 9 deletions apps/web/src/app/pages/trade/xswap/_components/SwapPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,19 @@ export default function SwapPanel() {
[onPercentSelection, maxInputAmount],
);

const handleMaxBridgeAmountClick = (amount: CurrencyAmount<XToken>) => {
onUserInput(Field.OUTPUT, amount?.toFixed(4));
};
const handleMaxBridgeAmountClick = useCallback(
(amount: CurrencyAmount<XToken>) => {
onUserInput(Field.OUTPUT, amount?.toFixed(4));
},
[onUserInput],
);

const handleMaxWithdrawAmountClick = (amount: CurrencyAmount<Currency>) => {
onUserInput(Field.OUTPUT, amount?.toFixed(4));
};
const handleMaxWithdrawAmountClick = useCallback(
(amount: CurrencyAmount<Currency>) => {
onUserInput(Field.OUTPUT, amount?.toFixed(4));
},
[onUserInput],
);

const rates = useRatesWithOracle();

Expand All @@ -167,6 +173,10 @@ export default function SwapPanel() {
return formattedAmounts[Field.OUTPUT];
}, [mmTrade.isMMBetter, mmTrade.trade?.outputAmount, formattedAmounts, independentField]);

const handleActivateSolanaAccount = useCallback(() => {
handleOutputType('0.002');
}, [handleOutputType]);

return (
<>
<BrightPanel bg="bg3" p={[3, 7]} flexDirection="column" alignItems="stretch" flex={1}>
Expand Down Expand Up @@ -311,9 +321,7 @@ export default function SwapPanel() {
destinationChainId={direction.to}
currencyAmount={parsedAmounts[Field.OUTPUT]}
recipient={recipient ?? ''}
onActivate={() => {
handleOutputType('0.002');
}}
onActivate={handleActivateSolanaAccount}
/>

<MMPendingIntents />
Expand Down
117 changes: 81 additions & 36 deletions apps/web/src/store/swap/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,14 +100,17 @@ export function useSwapActionHandlers() {
[dispatch],
);

return {
onSwitchTokens,
onCurrencySelection,
onUserInput,
onChangeRecipient,
onPercentSelection,
onChainSelection,
};
return useMemo(
() => ({
onSwitchTokens,
onCurrencySelection,
onUserInput,
onChangeRecipient,
onPercentSelection,
onChainSelection,
}),
[onSwitchTokens, onCurrencySelection, onUserInput, onChangeRecipient, onPercentSelection, onChainSelection],
);
}

// try to parse a user entered amount for a given token
Expand Down Expand Up @@ -445,27 +448,59 @@ export function useDerivedSwapInfo(): {
inputError = t`Swap`;
}

return {
account,
trade,
currencies,
_currencies,
currencyBalances,
parsedAmount,
inputError,
percents,
price,
direction,
dependentField,
parsedAmounts,
formattedAmounts,
canBridge,
maximumBridgeAmount,
stellarValidation,
stellarTrustlineValidation,
maximumOutputAmount,
canSwap,
};
// Memoize the direction object
const memoizedDirection = useMemo(
() => ({
from: currencies[Field.INPUT]?.xChainId || '0x1.icon',
to: currencies[Field.OUTPUT]?.xChainId || '0x1.icon',
}),
[currencies[Field.INPUT]?.xChainId, currencies[Field.OUTPUT]?.xChainId],
);

return useMemo(
() => ({
account,
trade,
currencies,
_currencies,
currencyBalances,
parsedAmount,
inputError,
percents,
price,
direction: memoizedDirection,
dependentField,
parsedAmounts,
formattedAmounts,
canBridge,
maximumBridgeAmount,
stellarValidation,
stellarTrustlineValidation,
maximumOutputAmount,
canSwap,
}),
[
account,
trade,
currencies,
_currencies,
currencyBalances,
parsedAmount,
inputError,
percents,
price,
memoizedDirection,
dependentField,
parsedAmounts,
formattedAmounts,
canBridge,
maximumBridgeAmount,
stellarValidation,
stellarTrustlineValidation,
maximumOutputAmount,
canSwap,
],
);
}

export function useInitialSwapLoad(): void {
Expand Down Expand Up @@ -624,13 +659,23 @@ export function useDerivedMMTradeInfo(trade: Trade<Currency, Currency, TradeType
// compare mmTradeQuery result and trade
const mmTrade = mmTradeQuery.data;

const swapOutput = convert(outputCurrency?.wrapped, trade?.outputAmount);
const swapInput = convert(inputCurrency?.wrapped, trade?.inputAmount);
const swapOutput = useMemo(
() => convert(outputCurrency?.wrapped, trade?.outputAmount),
[outputCurrency, trade?.outputAmount],
);
const swapInput = useMemo(
() => convert(inputCurrency?.wrapped, trade?.inputAmount),
[inputCurrency, trade?.inputAmount],
);

return {
isMMBetter: isExactInput
return useMemo(() => {
const isMMBetter = isExactInput
? mmTrade?.outputAmount && (swapOutput ? mmTrade.outputAmount.greaterThan(swapOutput) : true)
: mmTrade?.inputAmount && (swapInput ? mmTrade.inputAmount.lessThan(swapInput) : true),
trade: mmTrade,
};
: mmTrade?.inputAmount && (swapInput ? mmTrade.inputAmount.lessThan(swapInput) : true);

return {
isMMBetter,
trade: mmTrade,
};
}, [isExactInput, mmTrade, swapOutput, swapInput]);
}