From 9a22e156d1d62e44e2b4346834467a27d7f90409 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Thu, 13 Nov 2025 11:52:48 +0100 Subject: [PATCH 1/3] feat: add future rates to mint markets --- .../src/lend/hooks/useBorrowPositionDetails.ts | 2 +- apps/main/src/lend/hooks/useMarketDetails.tsx | 1 + .../src/llamalend/entities/llama-markets.ts | 7 +++++-- .../features/market-details/index.tsx | 2 ++ .../market-list/cells/RateCell/RateCell.tsx | 18 ++++++++++++++++-- .../BorrowPositionDetails.tsx | 1 + .../MarketBorrowRateTooltipContent.tsx | 10 +++++++++- .../MarketBorrowRateTooltipWrapper.tsx | 3 ++- apps/main/src/loan/hooks/useMarketDetails.ts | 7 ++++--- packages/prices-api/src/crvusd/models.ts | 1 + packages/prices-api/src/crvusd/parsers.ts | 1 + packages/prices-api/src/crvusd/responses.ts | 1 + 12 files changed, 44 insertions(+), 10 deletions(-) diff --git a/apps/main/src/lend/hooks/useBorrowPositionDetails.ts b/apps/main/src/lend/hooks/useBorrowPositionDetails.ts index fc8994aef2..da41a2c0ba 100644 --- a/apps/main/src/lend/hooks/useBorrowPositionDetails.ts +++ b/apps/main/src/lend/hooks/useBorrowPositionDetails.ts @@ -96,7 +96,7 @@ export const useBorrowPositionDetails = ({ }, borrowAPY: { rate: borrowApy == null ? null : Number(borrowApy), - averageRate: averageRate, + averageRate, averageRateLabel: averageMultiplierString, rebasingYield: rebasingYield ?? null, averageRebasingYield: averageRebasingYield ?? null, diff --git a/apps/main/src/lend/hooks/useMarketDetails.tsx b/apps/main/src/lend/hooks/useMarketDetails.tsx index fe2cc1ddc4..79b3fe6e9b 100644 --- a/apps/main/src/lend/hooks/useMarketDetails.tsx +++ b/apps/main/src/lend/hooks/useMarketDetails.tsx @@ -138,6 +138,7 @@ export const useMarketDetails = ({ }, borrowAPY: { rate: borrowApy != null ? Number(borrowApy) : null, + futureRate: null, // not available for lend markets, for now averageRate: averageBorrowApy ?? null, averageRateLabel: averageMultiplierString, rebasingYield: collateralRebasingYield ?? null, diff --git a/apps/main/src/llamalend/entities/llama-markets.ts b/apps/main/src/llamalend/entities/llama-markets.ts index 0c8cc44ab7..2916a06895 100644 --- a/apps/main/src/llamalend/entities/llama-markets.ts +++ b/apps/main/src/llamalend/entities/llama-markets.ts @@ -57,8 +57,8 @@ export type LlamaMarket = { lendTotalApyMaxBoosted: number | null // supply rate + rebasing yield + total extra incentives + max boosted yield borrowApy: number // base borrow APY % borrowTotalApy: number // borrow - yield from collateral - // extra lending incentives, like OP rewards (so non CRV) - incentives: ExtraIncentive[] + borrowFutureRate: number | null + incentives: ExtraIncentive[] // extra lending incentives, like OP rewards (so non CRV) } type: LlamaMarketType url: string @@ -159,6 +159,7 @@ const convertLendingVault = ( lendTotalApyMaxBoosted: lendApr + (borrowedToken?.rebasingYield ?? 0) + totalExtraRewardApr + (lendCrvAprBoosted ?? 0), borrowApy: apyBorrow, + borrowFutureRate: null, // not available for lend markets // as confusing as it may be, `borrow` is used in the table, but the total borrow is only in the tooltip borrowTotalApy: apyBorrow - (collateralToken?.rebasingYield ?? 0), incentives: extraRewardApr @@ -203,6 +204,7 @@ const convertMintMarket = ( stablecoinToken, llamma, rate, + futureRate, borrowed, borrowedUsd, borrowable, @@ -250,6 +252,7 @@ const convertMintMarket = ( totalCollateralUsd: collateralAmountUsd, rates: { borrowApy: rate * 100, + borrowFutureRate: futureRate * 100, lendApr: null, lendCrvAprBoosted: null, lendCrvAprUnboosted: null, diff --git a/apps/main/src/llamalend/features/market-details/index.tsx b/apps/main/src/llamalend/features/market-details/index.tsx index fef24b49a5..ebc92ca98d 100644 --- a/apps/main/src/llamalend/features/market-details/index.tsx +++ b/apps/main/src/llamalend/features/market-details/index.tsx @@ -36,6 +36,7 @@ type BorrowToken = { } type BorrowAPY = { rate: number | undefined | null + futureRate: number | undefined | null averageRate: number | undefined | null averageRateLabel: string rebasingYield: number | null @@ -155,6 +156,7 @@ export const MarketDetails = ({ ) => { - const rateType = RateTypes[id as keyof typeof RateTypes] + const key = id as keyof typeof RateTypes + const rateType = RateTypes[key] if (!rateType) throw new Error(`RateCell: Unsupported column ID "${id}"`) const Tooltip = TooltipComponents[rateType][market.type] @@ -47,6 +49,18 @@ export const RateCell = ({ {rate == null ? '—' : formatPercent(rate)} + {id === LlamaMarketColumnId.BorrowRate && market.rates.borrowFutureRate && ( + <> + t.palette.text.tertiary, + }} + /> + {formatPercent(market.rates.borrowFutureRate)} + + )} diff --git a/apps/main/src/llamalend/features/market-position-details/BorrowPositionDetails.tsx b/apps/main/src/llamalend/features/market-position-details/BorrowPositionDetails.tsx index 21a98de3dc..55bd417f48 100644 --- a/apps/main/src/llamalend/features/market-position-details/BorrowPositionDetails.tsx +++ b/apps/main/src/llamalend/features/market-position-details/BorrowPositionDetails.tsx @@ -22,6 +22,7 @@ export type Pnl = { export type Health = { value: number | undefined | null; loading: boolean } export type BorrowAPY = { rate: number | undefined | null + futureRate?: number | null averageRate: number | undefined | null averageRateLabel: string rebasingYield: number | null diff --git a/apps/main/src/llamalend/widgets/tooltips/MarketBorrowRateTooltipContent.tsx b/apps/main/src/llamalend/widgets/tooltips/MarketBorrowRateTooltipContent.tsx index a2a282e4d5..d9b15dbfce 100644 --- a/apps/main/src/llamalend/widgets/tooltips/MarketBorrowRateTooltipContent.tsx +++ b/apps/main/src/llamalend/widgets/tooltips/MarketBorrowRateTooltipContent.tsx @@ -14,6 +14,7 @@ import { RewardsTooltipItems } from './RewardTooltipItems' export type MarketBorrowRateTooltipContentProps = { marketType: LlamaMarketType borrowRate: number | null | undefined + borrowFutureRate?: number | null totalBorrowRate: number | null | undefined totalAverageBorrowRate: number | null | undefined averageRate: number | null | undefined @@ -32,6 +33,7 @@ const messages: Record = { export const MarketBorrowRateTooltipContent = ({ marketType, borrowRate, + borrowFutureRate, totalBorrowRate, totalAverageBorrowRate, averageRate, @@ -56,11 +58,17 @@ export const MarketBorrowRateTooltipContent = ({ + {borrowFutureRate && ( + + {formatPercent(borrowFutureRate)} + + )} + {extraRewards.length > 0 && ( diff --git a/apps/main/src/llamalend/widgets/tooltips/MarketBorrowRateTooltipWrapper.tsx b/apps/main/src/llamalend/widgets/tooltips/MarketBorrowRateTooltipWrapper.tsx index 97a2ee6c8e..3b0140ddf4 100644 --- a/apps/main/src/llamalend/widgets/tooltips/MarketBorrowRateTooltipWrapper.tsx +++ b/apps/main/src/llamalend/widgets/tooltips/MarketBorrowRateTooltipWrapper.tsx @@ -13,7 +13,7 @@ export const MarketBorrowRateTooltipWrapper = ({ market }: MarketBorrowRateToolt const { rewards, type: marketType, - rates: { borrowApy: borrowRate, borrowTotalApy }, + rates: { borrowApy: borrowRate, borrowTotalApy, borrowFutureRate }, assets: { collateral: { rebasingYield, symbol: collateralSymbol }, }, @@ -24,6 +24,7 @@ export const MarketBorrowRateTooltipWrapper = ({ market }: MarketBorrowRateToolt Date: Thu, 13 Nov 2025 11:55:15 +0100 Subject: [PATCH 2/3] chore: self-review --- apps/main/src/lend/hooks/useMarketDetails.tsx | 1 - apps/main/src/llamalend/features/market-details/index.tsx | 2 +- .../llamalend/features/market-list/cells/RateCell/RateCell.tsx | 3 +-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/main/src/lend/hooks/useMarketDetails.tsx b/apps/main/src/lend/hooks/useMarketDetails.tsx index 79b3fe6e9b..fe2cc1ddc4 100644 --- a/apps/main/src/lend/hooks/useMarketDetails.tsx +++ b/apps/main/src/lend/hooks/useMarketDetails.tsx @@ -138,7 +138,6 @@ export const useMarketDetails = ({ }, borrowAPY: { rate: borrowApy != null ? Number(borrowApy) : null, - futureRate: null, // not available for lend markets, for now averageRate: averageBorrowApy ?? null, averageRateLabel: averageMultiplierString, rebasingYield: collateralRebasingYield ?? null, diff --git a/apps/main/src/llamalend/features/market-details/index.tsx b/apps/main/src/llamalend/features/market-details/index.tsx index ebc92ca98d..6d9b65faec 100644 --- a/apps/main/src/llamalend/features/market-details/index.tsx +++ b/apps/main/src/llamalend/features/market-details/index.tsx @@ -36,7 +36,7 @@ type BorrowToken = { } type BorrowAPY = { rate: number | undefined | null - futureRate: number | undefined | null + futureRate?: number | null averageRate: number | undefined | null averageRateLabel: string rebasingYield: number | null diff --git a/apps/main/src/llamalend/features/market-list/cells/RateCell/RateCell.tsx b/apps/main/src/llamalend/features/market-list/cells/RateCell/RateCell.tsx index 029387ad9c..99e63d4b12 100644 --- a/apps/main/src/llamalend/features/market-list/cells/RateCell/RateCell.tsx +++ b/apps/main/src/llamalend/features/market-list/cells/RateCell/RateCell.tsx @@ -36,8 +36,7 @@ export const RateCell = ({ getValue, column: { id }, }: CellContext) => { - const key = id as keyof typeof RateTypes - const rateType = RateTypes[key] + const rateType = RateTypes[id as keyof typeof RateTypes] if (!rateType) throw new Error(`RateCell: Unsupported column ID "${id}"`) const Tooltip = TooltipComponents[rateType][market.type] From 691fd5d825d80fbcc3f3f7fa707f8183e187712c Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Thu, 13 Nov 2025 13:00:55 +0100 Subject: [PATCH 3/3] fix: missing prop --- .../src/loan/components/PageLoanCreate/Page.tsx | 16 +++++++--------- .../src/loan/hooks/useLoanPositionDetails.ts | 1 + 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/apps/main/src/loan/components/PageLoanCreate/Page.tsx b/apps/main/src/loan/components/PageLoanCreate/Page.tsx index 42c0e1aff0..fb1f94cc15 100644 --- a/apps/main/src/loan/components/PageLoanCreate/Page.tsx +++ b/apps/main/src/loan/components/PageLoanCreate/Page.tsx @@ -228,15 +228,13 @@ const Page = () => { )} - { - - } + diff --git a/apps/main/src/loan/hooks/useLoanPositionDetails.ts b/apps/main/src/loan/hooks/useLoanPositionDetails.ts index c8607ea21b..fa9e8c87ce 100644 --- a/apps/main/src/loan/hooks/useLoanPositionDetails.ts +++ b/apps/main/src/loan/hooks/useLoanPositionDetails.ts @@ -109,6 +109,7 @@ export const useLoanPositionDetails = ({ }, borrowAPY: { rate: loanDetails?.parameters?.rate ? Number(loanDetails?.parameters?.rate) : null, + futureRate: loanDetails?.parameters?.future_rate ? Number(loanDetails?.parameters?.future_rate) : null, rebasingYield: collateralRebasingYield ?? null, averageRate: averageRate, averageRebasingYield: averageRebasingYield ?? null,