import { ColumnDef, createColumnHelper } from '@tanstack/react-table' import BigNumber from 'bignumber.js' import classNames from 'classnames' import { AnimatedNumber, Apy, Button, DisplayCurrency, Loading, SVG, TextTooltip, TokenBalance, } from 'components/common' import { VaultLogo, VaultName } from 'components/fields' import { VAULT_DEPOSIT_BUFFER } from 'constants/appConstants' import { convertPercentage } from 'functions' import { convertApyToDailyApy, formatValue, getTimeAndUnit, ltvToLeverage } from 'libs/parse' import { useRouter } from 'next/router' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import useStore from 'store' import styles from './useAvailableVaultsColumns.module.scss' export const useAvailableVaultsColumns = () => { const { t } = useTranslation() const router = useRouter() const baseCurrency = useStore((s) => s.baseCurrency) const columnHelper = createColumnHelper() const redBankAssets = useStore((s) => s.redBankAssets) const defaultAvailableVaultsColumns: ColumnDef[] = useMemo( () => [ columnHelper.accessor('color', { enableSorting: false, header: '', cell: (info) =>
, }), columnHelper.accessor('denoms', { enableSorting: false, header: '', cell: (info) => , }), columnHelper.accessor('name', { enableSorting: true, header: t('fields.name'), cell: ({ row }) => { return ( } tooltip={t('fields.tooltips.name', { asset1: row.original.symbols.primary, asset2: row.original.symbols.secondary, ...getTimeAndUnit(row.original.lockup), })} /> ) }, }), columnHelper.accessor('ltv', { enableSorting: true, header: () => ( ), cell: ({ row }) => { return ( <>

{formatValue(ltvToLeverage(row.original.ltv.contract), 2, 2, false, false, 'x')}

{t('global.max_lower')}

) }, }), columnHelper.accessor('apy', { id: 'apy', enableSorting: true, header: () => ( ), cell: ({ row }) => { if (row.original.apy === null) { return } const maxLeverage = ltvToLeverage(row.original.ltv.contract) const primaryBorrowAsset = redBankAssets.find( (asset) => asset.denom === row.original.denoms.primary, ) const secondaryBorrowAsset = redBankAssets.find( (asset) => asset.denom === row.original.denoms.secondary, ) const borrowRates = [] if (primaryBorrowAsset?.borrowEnabled) borrowRates.push(primaryBorrowAsset.borrowRate) if (secondaryBorrowAsset?.borrowEnabled) borrowRates.push(secondaryBorrowAsset.borrowRate) const borrowRate = Math.min(...borrowRates) const maxBorrowRate = borrowRate * (ltvToLeverage(row.original.ltv.contract) - 1) const minAPY = new BigNumber(row.original.apy).toNumber() const maxAPY = new BigNumber(minAPY).times(maxLeverage).toNumber() - maxBorrowRate const minDailyAPY = new BigNumber(convertApyToDailyApy(row.original.apy)) .decimalPlaces(2) .toNumber() const maxDailyAPY = new BigNumber(minDailyAPY) .times(maxLeverage) .decimalPlaces(2) .toNumber() const apyDataNoLev = { total: row.original.apy || 0, borrow: 0 } const apyDataLev = { total: row.original.apy || 0, borrow: maxBorrowRate } return ( <> } tooltip={} /> - } tooltip={ } />

{`${minDailyAPY} - ${maxDailyAPY}%/${t('common.day')}`}

) }, }), columnHelper.accessor('vaultCap', { enableSorting: true, header: () => ( ), cell: ({ row }) => { if (!row.original.vaultCap) { return ( <>

{0}% {t('common.used')}

) } const percent = convertPercentage( (row.original.vaultCap.used / (row.original.vaultCap.max * VAULT_DEPOSIT_BUFFER)) * 100, ) const percentClasses = classNames('s', 'faded', percent >= 100 ? 'colorInfoLoss' : '') const vaultCap = row.original.vaultCap return (

{percent}% {t('common.used')}

} tooltip={ } /> ) }, }), columnHelper.accessor('provider', { enableSorting: true, header: t('common.by'), cell: () => , }), columnHelper.accessor('description', { enableSorting: true, header: t('common.description'), cell: ({ row }) => ( ), }), columnHelper.display({ id: 'actions', cell: ({ row }) => { return (