import { EXPLORERS } from '@components/settings/PreferredExplorerSettings' import FormatNumericValue from '@components/shared/FormatNumericValue' import { ArrowTopRightOnSquareIcon } from '@heroicons/react/20/solid' import { PublicKey } from '@solana/web3.js' import useLocalStorageState from 'hooks/useLocalStorageState' import { useTranslation } from 'next-i18next' import Image from 'next/image' import { useMemo } from 'react' import { isPerpLiquidation, LiquidationActivity, SpotOrPerpLiquidationItem, } from 'types' import { PREFERRED_EXPLORER_KEY } from 'utils/constants' import { abbreviateAddress } from 'utils/formatting' const LiquidationDetails = ({ activity, }: { activity: LiquidationActivity }) => { const { t } = useTranslation(['common', 'activity', 'settings']) const [preferredExplorer] = useLocalStorageState( PREFERRED_EXPLORER_KEY, EXPLORERS[0], ) const getAssetLiquidatedReturned = (details: SpotOrPerpLiquidationItem) => { const assets = { liquidated: { amount: 0, symbol: '', value: 0 }, returned: { amount: 0, symbol: '', value: 0 }, } if (isPerpLiquidation(details)) { const { base_transfer, perp_market_name, price, quote_transfer } = details const isLiquidatorBase = base_transfer > 0 ? 1 : -1 const isLiquidatorQuote = base_transfer > 0 ? -1 : 1 const liquidatedAmount = Math.abs(base_transfer) const returnedAmount = Math.abs(quote_transfer) assets.liquidated.amount = liquidatedAmount assets.liquidated.value = liquidatedAmount * price * isLiquidatorBase assets.liquidated.symbol = perp_market_name assets.returned.amount = returnedAmount assets.returned.value = returnedAmount * isLiquidatorQuote assets.returned.symbol = 'USDC' } else { const { liab_amount, liab_price, liab_symbol, asset_amount, asset_price, asset_symbol, } = details assets.liquidated.amount = Math.abs(asset_amount) assets.liquidated.symbol = asset_symbol assets.liquidated.value = asset_amount * asset_price assets.returned.amount = Math.abs(liab_amount) assets.returned.symbol = liab_symbol assets.returned.value = liab_amount * liab_price } return assets } const [ assetLiquidated, assetReturned, assetLiquidatedSymbol, assetReturnedSymbol, liquidatedValue, returnedValue, fee, ] = useMemo(() => { if (!activity) return [0, 0, '', '', 0, 0, 0] const values = getAssetLiquidatedReturned(activity.activity_details) const isNegativeFee = activity.activity_details.side === 'liqee' ? -1 : 1 const fee = (Math.abs(values.liquidated.value) - Math.abs(values.returned.value)) * isNegativeFee return [ values.liquidated.amount, values.returned.amount, values.liquidated.symbol, values.returned.symbol, values.liquidated.value, values.returned.value, fee, ] }, [activity]) return (
{isPerpLiquidation(activity.activity_details) ? ( <>

{t('activity:liquidation-type')}

{t('perp')}

{t('activity:asset-liquidated')}

{' '} {assetLiquidatedSymbol} at{' '}

{t('activity:asset-returned')}

{' '} {assetReturnedSymbol}

) : ( <>

{t('activity:liquidation-type')}

{t('spot')}

{t('activity:asset-liquidated')}

{' '} {assetLiquidatedSymbol} at{' '}

{t('activity:asset-returned')}

{' '} {assetReturnedSymbol} at{' '}

)}

{t('activity:liquidation-fee')}

{t('activity:liquidation-side')}

{activity.activity_details.side === 'liqor' ? t('activity:liquidator') : t('activity:liquidated')}

{t('activity:counterparty')}

{abbreviateAddress( new PublicKey(activity.activity_details.counterparty), )}

{t('transaction')}

{t(`settings:${preferredExplorer.name}`)}
) } export default LiquidationDetails