diff --git a/AGENTS.md b/AGENTS.md
index 5186d4b3..f32e3ca2 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -150,6 +150,8 @@ When touching transaction and position flows, validation MUST include all releva
15. **Transaction-history consistency**: dedupe and merge confirmed local/on-chain history consistently (canonical user+chain scope, stable dedup key, bounded TTL) to avoid double counting during indexer lag.
16. **Share-based full-exit withdrawals**: when an existing supplied position is intended to be fully exited (or the target leaves only dust), prefer share-based `morphoWithdraw` over asset-amount withdrawal so residual dust is not stranded by rounding.
17. **UI signal quality**: remove duplicate or low-signal metrics and keep transaction-critical UI focused on decision-relevant data.
+18. **External incentive parity**: when external rewards (for example Merkl HOLD opportunities) materially change carry economics, include them in net preview calculations when global reward-inclusion is enabled, and resolve incentives using canonical chainId+address mappings rather than token symbols.
+19. **APR/APY unit homogeneity**: in any reward/carry/net-rate calculation, normalize every term (base rate, each reward component, aggregates, and displayed subtotals) to the same selected mode before combining, so displayed formulas remain numerically consistent in both APR and APY modes.
### REQUIRED: Regression Rule Capture
After fixing any user-reported bug in a high-impact flow:
diff --git a/src/components/shared/help-tooltip-icon.tsx b/src/components/shared/help-tooltip-icon.tsx
new file mode 100644
index 00000000..13765646
--- /dev/null
+++ b/src/components/shared/help-tooltip-icon.tsx
@@ -0,0 +1,43 @@
+import type { ReactNode } from 'react';
+import { IoHelpCircleOutline } from 'react-icons/io5';
+import { Tooltip } from '@/components/ui/tooltip';
+import { cn } from '@/utils/components';
+
+type HelpTooltipIconProps = {
+ content: ReactNode;
+ ariaLabel?: string;
+ className?: string;
+ iconClassName?: string;
+ tooltipClassName?: string;
+ size?: number;
+};
+
+export function HelpTooltipIcon({
+ content,
+ ariaLabel = 'Show help information',
+ className,
+ iconClassName,
+ tooltipClassName,
+ size = 14,
+}: HelpTooltipIconProps) {
+ return (
+
{item.state.borrowApy ?
{item.state.borrowApy != null ?
Leverage Preview
+Leverage Preview
+
{useLoanAssetInput ? `Start with ${market.loanAsset.symbol}` : `Add Collateral ${market.collateralAsset.symbol}`}
{canUseLoanAssetInput && ( @@ -509,7 +665,7 @@ export function AddCollateralAndLeverage({+
{useTargetLtvInput ? 'Target LTV' : 'Target Multiplier'}
Transaction Preview
+Transaction Preview
Failed to fetch 3-day vault/borrow rates: {vaultRateInsight.error}
)} + {merklHoldIncentives.error && ( +Failed to fetch Merkl hold rewards: {merklHoldIncentives.error}
+ )} {insufficientLiquidity && (
Flash loan repayment borrow exceeds market liquidity ({formatBalance(marketLiquidity, market.loanAsset.decimals)}{' '}
diff --git a/src/stores/useAppSettings.ts b/src/stores/useAppSettings.ts
index 71f9f79f..4536b494 100644
--- a/src/stores/useAppSettings.ts
+++ b/src/stores/useAppSettings.ts
@@ -61,7 +61,7 @@ export const useAppSettings = create