diff --git a/src/components/pages/vaults/components/table/apyDisplayConfig.test.tsx b/src/components/pages/vaults/components/table/apyDisplayConfig.test.tsx index d19e94544..c2b1d0d0a 100644 --- a/src/components/pages/vaults/components/table/apyDisplayConfig.test.tsx +++ b/src/components/pages/vaults/components/table/apyDisplayConfig.test.tsx @@ -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', @@ -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', () => { @@ -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() + }) }) diff --git a/src/components/pages/vaults/components/table/apyDisplayConfig.tsx b/src/components/pages/vaults/components/table/apyDisplayConfig.tsx index 57f9a4332..82bb1b76b 100644 --- a/src/components/pages/vaults/components/table/apyDisplayConfig.tsx +++ b/src/components/pages/vaults/components/table/apyDisplayConfig.tsx @@ -53,6 +53,7 @@ type TKatanaTooltipOptions = { fixedTermProviders: TFixedTermMarket[] fixedTermIcons: ReactElement[] fixedTermProviderLabel: string + hasKatanaRewards: boolean showModalCTA: boolean onRequestModalOpen?: () => void } @@ -136,20 +137,22 @@ function buildKatanaTooltipContent({ fixedTermProviders, fixedTermIcons, fixedTermProviderLabel, + hasKatanaRewards, showModalCTA, onRequestModalOpen }: TKatanaTooltipOptions): ReactElement { return (
-
- {'⚔️'} -
- {'This Vault is receiving KAT incentives'} - {'*There are conditions to earn this rate'} + {hasKatanaRewards ? ( +
+ {'⚔️'} +
+ {'This Vault is receiving KAT incentives'} +
-
+ ) : null} {fixedTermProviders.length > 0 ? ( -
+
{fixedTermIcons} @@ -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 = { @@ -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 = { @@ -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 @@ -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 = {