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
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,19 @@ const KATANA_APY_DATA = {
katanaEstApr: 7
} as TVaultApyData

const KATANA_APY_DATA_WITHOUT_REWARDS = {
...KATANA_APY_DATA,
katanaExtras: {
katanaAppRewardsAPR: 0,
steerPointsPerDollar: 1
}
} as TVaultApyData

const KATANA_VAULT_WITHOUT_FIXED_TERM_MARKET = {
...KATANA_SPECTRA_VAULT,
address: '0x0000000000000000000000000000000000000002'
} as TKongVaultInput

const PENDLE_ARB_VAULT = {
chainID: 1,
address: '0x0000000000000000000000000000000000000001',
Expand Down Expand Up @@ -88,6 +101,41 @@ describe('resolveForwardApyDisplayConfig', () => {
expect(isValidElement(tooltip?.content)).toBe(true)
expect(renderToStaticMarkup(tooltip?.content)).toContain('+ 2500 ARB/week')
})

it('does not show a Katana tooltip without KAT rewards or a fixed-rate market', () => {
const { displayConfig, modalConfig } = resolveForwardApyDisplayConfig({
currentVault: KATANA_VAULT_WITHOUT_FIXED_TERM_MARKET,
data: KATANA_APY_DATA_WITHOUT_REWARDS,
displayVariant: 'default',
showSubline: true,
showSublineTooltip: true,
showBoostDetails: true,
canOpenModal: true
})

expect(displayConfig.tooltip?.mode).toBe('none')
expect(displayConfig.tooltip?.content).toBeNull()
expect(displayConfig.showUnderline).toBe(false)
expect(modalConfig).toBeUndefined()
})

it('shows fixed-rate information without claiming the vault receives KAT rewards', () => {
const { displayConfig, modalConfig } = resolveForwardApyDisplayConfig({
currentVault: KATANA_SPECTRA_VAULT,
data: KATANA_APY_DATA_WITHOUT_REWARDS,
displayVariant: 'default',
showSubline: true,
showSublineTooltip: true,
showBoostDetails: true,
canOpenModal: true
})

const tooltipMarkup = renderToStaticMarkup(displayConfig.tooltip?.content)
expect(displayConfig.tooltip?.mode).toBe('tooltip')
expect(tooltipMarkup).toContain('Fixed-rate markets available on Spectra')
expect(tooltipMarkup).not.toContain('receiving KAT incentives')
expect(modalConfig).toBeUndefined()
})
})

describe('resolveHistoricalApyDisplayConfig', () => {
Expand All @@ -104,4 +152,17 @@ describe('resolveHistoricalApyDisplayConfig', () => {
expect(modalConfig.content.props.isEligibleForSpectraBoost).toBe(true)
}
})

it('does not show a Katana tooltip without KAT rewards or a fixed-rate market', () => {
const { displayConfig, modalConfig } = resolveHistoricalApyDisplayConfig({
currentVault: KATANA_VAULT_WITHOUT_FIXED_TERM_MARKET,
data: KATANA_APY_DATA_WITHOUT_REWARDS,
showSublineTooltip: true
})

expect(displayConfig.tooltip?.mode).toBe('none')
expect(displayConfig.tooltip?.content).toBeNull()
expect(displayConfig.showUnderline).toBe(false)
expect(modalConfig).toBeUndefined()
})
})
41 changes: 26 additions & 15 deletions src/components/pages/vaults/components/table/apyDisplayConfig.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ type TKatanaTooltipOptions = {
fixedTermProviders: TFixedTermMarket[]
fixedTermIcons: ReactElement[]
fixedTermProviderLabel: string
hasKatanaRewards: boolean
showModalCTA: boolean
onRequestModalOpen?: () => void
}
Expand Down Expand Up @@ -136,20 +137,22 @@ function buildKatanaTooltipContent({
fixedTermProviders,
fixedTermIcons,
fixedTermProviderLabel,
hasKatanaRewards,
showModalCTA,
onRequestModalOpen
}: TKatanaTooltipOptions): ReactElement {
return (
<div className={'rounded-lg border border-border bg-surface-secondary p-2 text-xs text-text-primary'}>
<div className={'flex items-center gap-2'}>
<span aria-hidden>{'⚔️'}</span>
<div className={'flex flex-col'}>
<span>{'This Vault is receiving KAT incentives'}</span>
<span>{'*There are conditions to earn this rate'}</span>
{hasKatanaRewards ? (
<div className={'flex items-center gap-2'}>
<span aria-hidden>{'⚔️'}</span>
<div className={'flex flex-col'}>
<span>{'This Vault is receiving KAT incentives'}</span>
</div>
</div>
</div>
) : null}
{fixedTermProviders.length > 0 ? (
<div className={'mt-1 flex items-center gap-3'}>
<div className={hasKatanaRewards ? 'mt-1 flex items-center gap-3 mb-2' : 'flex items-center gap-3'}>
<span className={'flex items-center gap-1 text-text-secondary'} aria-hidden={true}>
{fixedTermIcons}
</span>
Expand Down Expand Up @@ -251,17 +254,21 @@ export function resolveForwardApyDisplayConfig({
const katanaExtras = data.katanaExtras
const hasKatanaEstApr = typeof data.katanaEstApr === 'number'
const isKatanaVault = chainID === KATANA_CHAIN_ID && katanaExtras && hasKatanaEstApr
const hasKatanaRewards = (katanaExtras?.katanaAppRewardsAPR ?? 0) > 0
const hasFixedTermMarket = fixedTermContext.fixedTermProviders.length > 0
const shouldShowKatanaTooltip = Boolean(isKatanaVault && (hasKatanaRewards || hasFixedTermMarket))
const katanaTooltipContent =
showSublineTooltip && isKatanaVault
showSublineTooltip && shouldShowKatanaTooltip
? buildKatanaTooltipContent({
fixedTermProviders: fixedTermContext.fixedTermProviders,
fixedTermIcons: fixedTermContext.fixedTermIcons,
fixedTermProviderLabel: fixedTermContext.fixedTermProviderLabel,
showModalCTA: canOpenModal,
hasKatanaRewards,
showModalCTA: canOpenModal && hasKatanaRewards,
onRequestModalOpen
})
: null
const tooltipContent = katanaTooltipContent ?? standardTooltipContent
const tooltipContent = isKatanaVault ? katanaTooltipContent : standardTooltipContent

const fixedRateIndicator = fixedTermContext.fixedTermIndicator
const baseTooltipConfig: TApyTooltipConfig = {
Expand Down Expand Up @@ -290,7 +297,8 @@ export function resolveForwardApyDisplayConfig({
)
const modalContent = katanaDetails

const tooltipMode = allowTooltip ? resolveTooltipMode(canOpenModal, Boolean(tooltipContent)) : 'none'
const allowKatanaModal = canOpenModal && hasKatanaRewards
const tooltipMode = allowTooltip ? resolveTooltipMode(allowKatanaModal, Boolean(tooltipContent)) : 'none'
const tooltipConfig = withTooltipMode(baseTooltipConfig, tooltipMode)
const katanaEstApr = data.katanaEstApr ?? 0
const displayConfig: TApyDisplayConfig = {
Expand All @@ -299,7 +307,7 @@ export function resolveForwardApyDisplayConfig({
shouldRender: true,
fallbackLabel: 'NEW',
tooltip: tooltipConfig,
isInteractive: tooltipMode === 'tooltip+modal' && canOpenModal,
isInteractive: tooltipMode === 'tooltip+modal' && allowKatanaModal,
showUnderline: tooltipMode !== 'none',
showAsterisk: tooltipMode === 'tooltip+modal',
subline: katanaSubline
Expand Down Expand Up @@ -574,19 +582,22 @@ export function resolveHistoricalApyDisplayConfig({
const allowTooltip = allowTooltipBase && shouldRenderValue

const katanaExtras = data.katanaExtras
const hasKatanaRewards = Boolean(shouldUseKatanaAPRs && katanaExtras && hasKatanaApr)
const hasKatanaRewards = Boolean(shouldUseKatanaAPRs && hasKatanaApr && (katanaExtras?.katanaAppRewardsAPR ?? 0) > 0)
const hasFixedTermMarket = fixedTermContext.fixedTermProviders.length > 0
const shouldShowKatanaTooltip = shouldUseKatanaAPRs && (hasKatanaRewards || hasFixedTermMarket)
const allowModal = hasKatanaRewards && shouldRenderValue
const katanaTooltipContent =
showSublineTooltip && hasKatanaRewards
showSublineTooltip && shouldShowKatanaTooltip
? buildKatanaTooltipContent({
fixedTermProviders: fixedTermContext.fixedTermProviders,
fixedTermIcons: fixedTermContext.fixedTermIcons,
fixedTermProviderLabel: fixedTermContext.fixedTermProviderLabel,
hasKatanaRewards,
showModalCTA: allowModal,
onRequestModalOpen
})
: null
const tooltipContent = katanaTooltipContent ?? standardTooltipContent
const tooltipContent = shouldUseKatanaAPRs ? katanaTooltipContent : standardTooltipContent

const fixedRateIndicator = fixedTermContext.fixedTermIndicator
const baseTooltipConfig: TApyTooltipConfig = {
Expand Down