From 0c9b1092752cd560f62ea4d2142d3726ac223a9f Mon Sep 17 00:00:00 2001 From: matheus1lva Date: Fri, 3 Jul 2026 09:36:16 -0300 Subject: [PATCH 1/3] fix: remove unecessary tooltip --- .../pages/vaults/components/table/apyDisplayConfig.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/components/pages/vaults/components/table/apyDisplayConfig.tsx b/src/components/pages/vaults/components/table/apyDisplayConfig.tsx index 57f9a4332..c8d049dce 100644 --- a/src/components/pages/vaults/components/table/apyDisplayConfig.tsx +++ b/src/components/pages/vaults/components/table/apyDisplayConfig.tsx @@ -141,13 +141,6 @@ function buildKatanaTooltipContent({ }: TKatanaTooltipOptions): ReactElement { return (
-
- {'⚔️'} -
- {'This Vault is receiving KAT incentives'} - {'*There are conditions to earn this rate'} -
-
{fixedTermProviders.length > 0 ? (
From 27537c65fa83c9febdcac866b2a54db2b343b7c3 Mon Sep 17 00:00:00 2001 From: matheus1lva Date: Fri, 3 Jul 2026 10:09:39 -0300 Subject: [PATCH 2/3] update margin --- .../pages/vaults/components/table/apyDisplayConfig.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/pages/vaults/components/table/apyDisplayConfig.tsx b/src/components/pages/vaults/components/table/apyDisplayConfig.tsx index c8d049dce..14b00f767 100644 --- a/src/components/pages/vaults/components/table/apyDisplayConfig.tsx +++ b/src/components/pages/vaults/components/table/apyDisplayConfig.tsx @@ -27,7 +27,7 @@ const FIXED_RATE_LINK_CLASS = 'inline-flex items-center gap-1 font-semibold underline decoration-neutral-600/30 decoration-dotted ' + 'underline-offset-4 transition-opacity hover:decoration-neutral-600' const KATANA_TOOLTIP_CTA_CLASS = - 'mt-2 mx-auto block font-semibold underline decoration-neutral-600/30 decoration-dotted underline-offset-4 ' + + 'mx-auto block font-semibold underline decoration-neutral-600/30 decoration-dotted underline-offset-4 ' + 'transition-opacity hover:decoration-neutral-600' export type TApyModalConfig = { @@ -142,7 +142,7 @@ function buildKatanaTooltipContent({ return (
{fixedTermProviders.length > 0 ? ( -
+
{fixedTermIcons} From bcf91264d4b9b57e8015cf9ebf402be3615d39a4 Mon Sep 17 00:00:00 2001 From: rossgalloway <58150151+rossgalloway@users.noreply.github.com> Date: Fri, 17 Jul 2026 20:01:55 +0000 Subject: [PATCH 3/3] Fix Katana reward tooltip eligibility Only show Katana reward messaging when the vault has a positive KAT rewards APR, while preserving fixed-rate market information.\n\nAdd coverage for rewardless vaults with and without fixed-rate markets across forward and historical APY displays. --- .../table/apyDisplayConfig.test.tsx | 61 +++++++++++++++++++ .../components/table/apyDisplayConfig.tsx | 38 +++++++++--- 2 files changed, 89 insertions(+), 10 deletions(-) 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 14b00f767..82bb1b76b 100644 --- a/src/components/pages/vaults/components/table/apyDisplayConfig.tsx +++ b/src/components/pages/vaults/components/table/apyDisplayConfig.tsx @@ -27,7 +27,7 @@ const FIXED_RATE_LINK_CLASS = 'inline-flex items-center gap-1 font-semibold underline decoration-neutral-600/30 decoration-dotted ' + 'underline-offset-4 transition-opacity hover:decoration-neutral-600' const KATANA_TOOLTIP_CTA_CLASS = - 'mx-auto block font-semibold underline decoration-neutral-600/30 decoration-dotted underline-offset-4 ' + + 'mt-2 mx-auto block font-semibold underline decoration-neutral-600/30 decoration-dotted underline-offset-4 ' + 'transition-opacity hover:decoration-neutral-600' export type TApyModalConfig = { @@ -53,6 +53,7 @@ type TKatanaTooltipOptions = { fixedTermProviders: TFixedTermMarket[] fixedTermIcons: ReactElement[] fixedTermProviderLabel: string + hasKatanaRewards: boolean showModalCTA: boolean onRequestModalOpen?: () => void } @@ -136,13 +137,22 @@ function buildKatanaTooltipContent({ fixedTermProviders, fixedTermIcons, fixedTermProviderLabel, + hasKatanaRewards, showModalCTA, onRequestModalOpen }: TKatanaTooltipOptions): ReactElement { return (
+ {hasKatanaRewards ? ( +
+ {'⚔️'} +
+ {'This Vault is receiving KAT incentives'} +
+
+ ) : null} {fixedTermProviders.length > 0 ? ( -
+
{fixedTermIcons} @@ -244,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 = { @@ -283,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 = { @@ -292,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 @@ -567,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 = {