import { useBridgeState } from '@/slices/bridge/hooks' import { useAccount } from 'wagmi' import { useTranslations } from 'next-intl' import { useUsdSlippage } from '@hooks/useUsdSlippage' import { formatBigIntToString } from '@/utils/bigint/format' import { getValidAddress, isValidAddress } from '@/utils/isValidAddress' import { EMPTY_BRIDGE_QUOTE } from '@/constants/bridge' import { CHAINS_BY_ID } from '@constants/chains' import { DATA_PLACEHOLDER } from '@/constants/placeholders' import { useBridgeQuoteState } from '@/slices/bridgeQuote/hooks' import { getSignificantDecimals } from '@/utils/getSignificantDecimals' import { formatSlippage } from '@/utils/formatSlippage' import { useDefiLlamaPrice } from '@/utils/hooks/useDefiLlamaPrice' import { zeroAddress } from 'viem' import { calculateUsdValue } from '@/utils/calculateUsdValue' import { parseTokenAmount } from '@/utils/decimals' import { formatCompactDuration } from '@/utils/time' export const BridgeExchangeRateInfo = () => { /* TODO: * Upgrade to collapsable element * Convert from div to details (conflict on mobile for details/summary) * Use dark:border-zinc-800 in
className */ return (
{' '}
) } const DestinationAddress = () => { const { address } = useAccount() const { destinationAddress } = useBridgeState() const t = useTranslations('Bridge') const showAddress = destinationAddress && getValidAddress(address) !== getValidAddress(destinationAddress) const isInputValidAddress: boolean = destinationAddress ? isValidAddress(destinationAddress) : false if (showAddress && isInputValidAddress) { return (
{t('To')}:
{destinationAddress}
) } } const Slippage = () => { const { debouncedFromValue, fromChainId, toChainId } = useBridgeState() const t = useTranslations('Slippage') const { bridgeQuote: { inputAmountForQuote, outputAmount, originTokenForQuote, destTokenForQuote, }, isLoading: isQuoteLoading, } = useBridgeQuoteState() // Parse input amount - convert decimal string to bigint const inputAmount = parseTokenAmount( inputAmountForQuote, originTokenForQuote, fromChainId ) // Calculate USD-based slippage const { slippage, isLoading: isSlippageLoading, error, textColor, } = useUsdSlippage({ originToken: originTokenForQuote, destToken: destTokenForQuote, originChainId: fromChainId, destChainId: toChainId, inputAmount, outputAmount, }) // Show content const isLoading = isSlippageLoading || isQuoteLoading const shouldShow = !isLoading && debouncedFromValue !== '0' && inputAmount && inputAmount > 0n && outputAmount && outputAmount > 0n return (
{t('Slippage')} {shouldShow ? ( <> {error && {t(error)}} {!error && slippage !== null && ( {formatSlippage(slippage)} )} {!error && slippage === null && DATA_PLACEHOLDER} ) : ( DATA_PLACEHOLDER )}
) } const Router = () => { const { bridgeQuote: { bridgeModuleName }, isLoading, } = useBridgeQuoteState() const t = useTranslations('Bridge') const shouldShow = !isLoading && bridgeModuleName return (
{t('Router')} {shouldShow ? bridgeModuleName : DATA_PLACEHOLDER}
) } const EstimatedTime = () => { const { fromToken } = useBridgeState() const { bridgeQuote, isLoading } = useBridgeQuoteState() const t = useTranslations('Time') const compactDurationLabels = { minute: t('m'), second: t('s'), } const shouldShow = !isLoading && fromToken && bridgeQuote && bridgeQuote.outputAmount !== EMPTY_BRIDGE_QUOTE.outputAmount && typeof bridgeQuote.estimatedTime === 'number' && Number.isFinite(bridgeQuote.estimatedTime) return (
{t('Estimated Time')} {shouldShow ? ( {formatCompactDuration( bridgeQuote.estimatedTime, compactDurationLabels )} ) : ( DATA_PLACEHOLDER )}
) } const GasDropLabel = () => { const { toChainId } = useBridgeState() const { bridgeQuote: { gasDropAmount }, isLoading, } = useBridgeQuoteState() const t = useTranslations('Bridge') const symbol = CHAINS_BY_ID[toChainId]?.nativeCurrency.symbol const stringifiedGasAmount = formatBigIntToString(gasDropAmount, 18) const significantDecimals = getSignificantDecimals(stringifiedGasAmount) const formattedGasDropAmount = formatBigIntToString( gasDropAmount, 18, significantDecimals ) const price = useDefiLlamaPrice( gasDropAmount > 0n ? { addresses: { [toChainId]: zeroAddress } } : null ) const airdropInDollars = calculateUsdValue(formattedGasDropAmount, price) if (isLoading || gasDropAmount === EMPTY_BRIDGE_QUOTE.gasDropAmount) { return null } return ( <> {t('Will also receive')} {formattedGasDropAmount} {' '} {symbol} {airdropInDollars && `(${airdropInDollars})`} ) }