Skip to content

Commit 9599631

Browse files
authored
Pw/various-refinance-fixes (#3927)
* Added portfolio banners * refactor * Fixed aave borrow rate * fix comment * Fixed maxLTV aave * Fixed liq price for the simulated position * bump client package * Fixed formatting * updated deps * updated deps * imports fix * Fixed borrow rate and liq price for maker * Fixed liq price confusion Fixed MaxLTV change * Fixed borrow rate change value * Fix lint
1 parent 106cea0 commit 9599631

14 files changed

+149
-126
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { stablecoinTokensUpperCase } from 'features/refinance/stablecoinTokensUpperCase'
2+
13
export function isShortPosition({ collateralToken }: { collateralToken: string }): boolean {
2-
return ['SDAI', 'DAI', 'USDC'].includes(collateralToken)
4+
return stablecoinTokensUpperCase.includes(collateralToken.toUpperCase())
35
}

features/refinance/components/RefinancePortfolioBanner.tsx

+26-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ProtocolName } from '@summer_fi/summerfi-sdk-common'
12
import { useAccountContext } from 'components/context/AccountContextProvider'
23
import { useRefinanceGeneralContext } from 'features/refinance/contexts/RefinanceGeneralContext'
34
import { RefinanceModalController } from 'features/refinance/controllers'
@@ -131,14 +132,36 @@ export const RefinancePortfolioBanner: FC<RefinancePortfolioBannerProps> = ({ po
131132
<Text as="span" variant="boldParagraph3" color="primary100">
132133
{tPortfolio('refinance.banner.default', {
133134
id: vaultId,
135+
protocol: ProtocolName.Maker,
134136
})}
135137
</Text>
136138
),
137139
[LendingProtocol.Ajna]: null,
138-
[LendingProtocol.AaveV3]: null,
140+
[LendingProtocol.AaveV3]: (
141+
<Text as="span" variant="boldParagraph3" color="primary100">
142+
{tPortfolio('refinance.banner.default', {
143+
id: vaultId,
144+
protocol: ProtocolName.AaveV3,
145+
})}
146+
</Text>
147+
),
139148
[LendingProtocol.AaveV2]: null,
140-
[LendingProtocol.SparkV3]: null,
141-
[LendingProtocol.MorphoBlue]: null,
149+
[LendingProtocol.SparkV3]: (
150+
<Text as="span" variant="boldParagraph3" color="primary100">
151+
{tPortfolio('refinance.banner.default', {
152+
id: vaultId,
153+
protocol: ProtocolName.Spark,
154+
})}
155+
</Text>
156+
),
157+
[LendingProtocol.MorphoBlue]: (
158+
<Text as="span" variant="boldParagraph3" color="primary100">
159+
{tPortfolio('refinance.banner.default', {
160+
id: vaultId,
161+
protocol: ProtocolName.MorphoBlue,
162+
})}
163+
</Text>
164+
),
142165
}[protocol]
143166

144167
const contextId = `${vaultId}${primaryToken}${secondaryToken}`.toLowerCase()

features/refinance/components/RefinancePositionView.tsx

+3-6
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
formatDecimalAsPercent,
1616
formatLtvDecimalAsPercent,
1717
} from 'helpers/formatters/format'
18-
import { one } from 'helpers/zero'
1918
import type { LendingProtocol } from 'lendingProtocols'
2019
import { useTranslation } from 'next-i18next'
2120
import React from 'react'
@@ -123,13 +122,11 @@ export const RefinancePositionView = <Type extends RefinancePositionViewType>(
123122
? `${secondaryToken}/${primaryToken}`
124123
: `${primaryToken}/${secondaryToken}`
125124

125+
const formattedLiquidationPrice = positionData?.liquidationPrice
126+
126127
const formatted = {
127128
ltv: positionData?.ltv && formatLtvDecimalAsPercent(positionData.ltv),
128-
liquidationPrice:
129-
positionData?.liquidationPrice &&
130-
formatCryptoBalance(
131-
isShort ? one.div(positionData.liquidationPrice) : positionData.liquidationPrice,
132-
),
129+
liquidationPrice: formattedLiquidationPrice && formatCryptoBalance(formattedLiquidationPrice),
133130
collateral: positionData?.collateral && (
134131
<ItemValueWithIcon tokens={[primaryToken]}>
135132
{formatCryptoBalance(positionData.collateral)}

features/refinance/components/RefinanceSimulation.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const RefinanceSimulation = () => {
1313
state: { strategy },
1414
},
1515
poolData: { maxLtv: currentMaxLtv },
16-
position: { netApy: currentBorrowRate },
16+
position: { borrowRate: currentBorrowRate },
1717
} = useRefinanceContext()
1818

1919
const positionData = useSimulationPositionData()

features/refinance/components/steps/RefinanceReviewChangesSection.tsx

+13-21
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,7 @@ import BigNumber from 'bignumber.js'
22
import { InfoSection } from 'components/infoSection/InfoSection'
33
import { ItemValueWithIcon } from 'components/infoSection/ItemValueWithIcon'
44
import { useRefinanceContext } from 'features/refinance/contexts'
5-
import {
6-
formatCryptoBalance,
7-
formatDecimalAsPercent,
8-
formatLtvDecimalAsPercent,
9-
} from 'helpers/formatters/format'
5+
import { formatCryptoBalance, formatLtvDecimalAsPercent } from 'helpers/formatters/format'
106
import { useTranslation } from 'next-i18next'
117
import React from 'react'
128
import { Text } from 'theme-ui'
@@ -38,39 +34,43 @@ const getChangeVariant = (
3834
export const RefinanceReviewChangesSection = () => {
3935
const { t } = useTranslation()
4036

41-
const { poolData, position, simulation, automations } = useRefinanceContext()
37+
const {
38+
poolData,
39+
position,
40+
simulation,
41+
automations,
42+
form: {
43+
state: { strategy },
44+
},
45+
} = useRefinanceContext()
4246

4347
const ltv = new BigNumber(poolData.maxLtv.loanToValue)
4448
const liquidationPrice = new BigNumber(position.liquidationPrice)
4549
const debt = new BigNumber(position.debtTokenData.amount)
4650
const debtToken = position.debtTokenData.token.symbol
4751

48-
if (!simulation.refinanceSimulation) {
52+
if (!simulation.refinanceSimulation || !strategy?.maxLtv) {
4953
return null
5054
}
5155
const targetPosition = simulation.refinanceSimulation.targetPosition
5256

5357
const isAutomationEnabled = Object.values(automations).some((item) => item.enabled)
5458

55-
const afterLtv = new BigNumber(
56-
simulation.liquidationThreshold ? simulation.liquidationThreshold.toProportion() : 0,
57-
)
59+
const afterLtv = new BigNumber(strategy.maxLtv)
5860

5961
const afterLiquidationPriceInUsd = simulation.liquidationPrice
6062
const afterLiquidationPrice = new BigNumber(afterLiquidationPriceInUsd)
6163
const afterDebt = new BigNumber(targetPosition.debtAmount.amount)
6264
const afterDebtToken = targetPosition.debtAmount.token.symbol
6365

64-
const ltvChange = afterLtv.minus(ltv).div(ltv)
65-
const liquidationPriceChange = afterLiquidationPrice.minus(liquidationPrice).div(liquidationPrice)
66+
const ltvChange = afterLtv.minus(ltv)
6667

6768
const formatted = {
6869
ltv: formatLtvDecimalAsPercent(ltv),
6970
afterLtv: formatLtvDecimalAsPercent(afterLtv),
7071
ltvChange: formatLtvDecimalAsPercent(ltvChange),
7172
liquidationPrice: formatCryptoBalance(liquidationPrice),
7273
afterLiquidationPrice: formatCryptoBalance(afterLiquidationPrice),
73-
liquidationPriceChange: formatDecimalAsPercent(liquidationPriceChange),
7474
debt: <ItemValueWithIcon tokens={[debtToken]}>{formatCryptoBalance(debt)}</ItemValueWithIcon>,
7575
afterDebt: (
7676
<ItemValueWithIcon tokens={[afterDebtToken]}>
@@ -89,14 +89,6 @@ export const RefinanceReviewChangesSection = () => {
8989
label: t('system.liq-price-short'),
9090
value: formatted.liquidationPrice,
9191
change: formatted.afterLiquidationPrice,
92-
secondary: {
93-
value: formatted.liquidationPriceChange,
94-
variant: getChangeVariant(
95-
'liquidationPrice',
96-
liquidationPriceChange,
97-
position.isShort,
98-
),
99-
},
10092
},
10193
{
10294
label: t('max-ltv'),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
export const ethCorrelatedUpperCase = [
2+
'AETHCBETH',
3+
'AETHRETH',
4+
'AETHWETH',
5+
'AETHWSTETH',
6+
'ASETH',
7+
'AWETH',
8+
'AWSTETH',
9+
'CBETH',
10+
'CETH',
11+
'CWETHV3',
12+
'ETH',
13+
'EZETH',
14+
'OSETH',
15+
'RETH',
16+
'STETH',
17+
'WEETH',
18+
'WETH',
19+
'WSTETH',
20+
'WOETH',
21+
]

features/refinance/helpers/getEmode.tsx

+2-51
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,7 @@
11
import { EmodeType } from '@summer_fi/summerfi-sdk-client'
22
import type { IToken } from '@summer_fi/summerfi-sdk-common'
3-
4-
const stablecoinTokensUpperCase = [
5-
'ADAI',
6-
'AETHDAI',
7-
'AETHLUSD',
8-
'AETHPYUSD',
9-
'AETHSDAI',
10-
'AETHUSDC',
11-
'AETHUSDT',
12-
'AUSDC',
13-
'AUSDT',
14-
'CDAI',
15-
'CRVUSD',
16-
'CUSDC',
17-
'CUSDCV3',
18-
'DAI',
19-
'FRAX',
20-
'GHO',
21-
'GUSD',
22-
'LUSD',
23-
'PYUSD',
24-
'SDAI',
25-
'SUSD',
26-
'SUSDE',
27-
'USDC.E',
28-
'USDC',
29-
'USDE',
30-
'USDT',
31-
]
32-
const ethCorrelatedUpperCase = [
33-
'AETHCBETH',
34-
'AETHRETH',
35-
'AETHWETH',
36-
'AETHWSTETH',
37-
'ASETH',
38-
'AWETH',
39-
'AWSTETH',
40-
'CBETH',
41-
'CBETH',
42-
'CETH',
43-
'CWETHV3',
44-
'ETH',
45-
'EZETH',
46-
'OSETH',
47-
'RETH',
48-
'STETH',
49-
'WEETH',
50-
'WETH',
51-
'WSTETH',
52-
'WOETH',
53-
]
3+
import { ethCorrelatedUpperCase } from 'features/refinance/ethCorrelatedUpperCase'
4+
import { stablecoinTokensUpperCase } from 'features/refinance/stablecoinTokensUpperCase'
545

556
export function getEmode(collateralToken: IToken, debtToken: IToken) {
567
const collateralTokenSymbolUpperCase = collateralToken.symbol.toUpperCase()

features/refinance/hooks/useAaveLikeRefinanceContextInputs.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export const useAaveLikeRefinanceContextInputs = ({
5757

5858
const castedPosition = position as AaveLikePositionV2
5959

60-
const borrowRate = castedPosition.category.liquidationThreshold.toString()
60+
const borrowRate = castedPosition.borrowRate.toString()
6161
const ltv = castedPosition.riskRatio.loanToValue.toString()
6262
const maxLtv = castedPosition.maxRiskRatio.loanToValue.toString()
6363
const liquidationPrice = castedPosition.liquidationPrice.toString()

features/refinance/hooks/useSdkSimulation.tsx

+23-9
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ import {
1515
Percentage,
1616
ProtocolName,
1717
} from '@summer_fi/summerfi-sdk-common'
18+
import BigNumber from 'bignumber.js'
1819
import { getTokenPrice } from 'blockchain/prices'
1920
import { tokenPriceStore } from 'blockchain/prices.constants'
21+
import { isShortPosition } from 'features/omni-kit/helpers'
2022
import { useRefinanceGeneralContext } from 'features/refinance/contexts'
2123
import { getPosition } from 'features/refinance/helpers/getPosition'
2224
import { getProtocolNameByLendingProtocol } from 'features/refinance/helpers/getProtocolNameByLendingProtocol'
@@ -108,7 +110,7 @@ export function useSdkSimulation(): SDKSimulation {
108110
const _collateralPrice = getTokenPrice(
109111
collateralTokenData.token.symbol,
110112
tokenPriceStore.prices,
111-
'collateral price - refinance modal controller',
113+
'collateral price - useSdkSimulation',
112114
).toString()
113115
setCollateralPrice(_collateralPrice)
114116

@@ -162,13 +164,13 @@ export function useSdkSimulation(): SDKSimulation {
162164
})
163165
setSourcePosition(_sourcePosition)
164166

165-
const _liquidationThreshold = (
167+
const _targetLiquidationThreshold = (
166168
targetPoolInfo as ILendingPoolInfo
167169
).collateral.liquidationThreshold.toLTV()
168-
if (_liquidationThreshold == null) {
170+
if (_targetLiquidationThreshold == null) {
169171
return
170172
}
171-
setLiquidationThreshold(_liquidationThreshold)
173+
setLiquidationThreshold(_targetLiquidationThreshold)
172174

173175
const refinanceParameters: IRefinanceParameters = {
174176
sourcePosition: _sourcePosition,
@@ -198,12 +200,24 @@ export function useSdkSimulation(): SDKSimulation {
198200
setImportPositionSimulation(_importPositionSimulation)
199201
}
200202

201-
const afterLiquidationPriceInUsd = PositionUtils.getLiquidationPriceInUsd({
202-
liquidationThreshold: _liquidationThreshold,
203-
debtPriceInUsd: _debtPrice,
204-
position: _refinanceSimulation?.targetPosition,
203+
const targetDebtPrice = getTokenPrice(
204+
_refinanceSimulation.targetPosition.debtAmount.token.symbol,
205+
tokenPriceStore.prices,
206+
'target debt price - useSdkSimulation',
207+
).toString()
208+
209+
const targetLiquidationPriceInUsd = PositionUtils.getLiquidationPriceInDebtTokens({
210+
liquidationThreshold: _targetLiquidationThreshold,
211+
debtPriceInUsd: targetDebtPrice,
212+
position: _refinanceSimulation.targetPosition,
213+
})
214+
const isShort = isShortPosition({
215+
collateralToken: _refinanceSimulation.targetPosition.collateralAmount.token.symbol,
205216
})
206-
setLiquidationPrice(afterLiquidationPriceInUsd)
217+
const _liquidationPrice = isShort
218+
? new BigNumber(1).div(targetLiquidationPriceInUsd).toString()
219+
: targetLiquidationPriceInUsd
220+
setLiquidationPrice(_liquidationPrice)
207221
}
208222
void fetchData().catch((err) => {
209223
setError(err.message)

features/refinance/hooks/useSdkTransaction.tsx

+21-26
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { makeSDK } from '@summer_fi/summerfi-sdk-client'
22
import type { ISimulation, Order, SimulationType } from '@summer_fi/summerfi-sdk-common'
3-
import { Address, AddressType, Wallet } from '@summer_fi/summerfi-sdk-common'
3+
import { Address, AddressType, PositionsManager, Wallet } from '@summer_fi/summerfi-sdk-common'
44
import { useRefinanceContext } from 'features/refinance/contexts'
55
import { RefinanceSidebarStep } from 'features/refinance/types'
66
import { LendingProtocol } from 'lendingProtocols'
@@ -43,12 +43,7 @@ export function useSdkRefinanceTransaction({
4343
}, [currentStep])
4444

4545
useEffect(() => {
46-
if (
47-
!strategy ||
48-
!dpm?.address ||
49-
refinanceSimulation == null ||
50-
(importPositionSimulation == null && lendingProtocol === LendingProtocol.Maker)
51-
) {
46+
if (!strategy || !dpm?.address || refinanceSimulation == null) {
5247
return
5348
}
5449
const fetchData = async () => {
@@ -63,28 +58,28 @@ export function useSdkRefinanceTransaction({
6358
walletAddress: wallet.address,
6459
})
6560

66-
const [_importPositionOrder, _refinanceOrder] = await Promise.all([
67-
lendingProtocol === LendingProtocol.Maker
68-
? user.newOrder({
69-
positionsManager: {
70-
address: Address.createFromEthereum({
71-
value: dpm.address as `0x${string}`,
72-
}),
73-
},
74-
simulation: importPositionSimulation,
75-
})
76-
: Promise.resolve(null),
77-
user.newOrder({
78-
positionsManager: {
61+
const _refinanceOrder = await user.newOrder({
62+
positionsManager: PositionsManager.createFrom({
63+
address: Address.createFromEthereum({
64+
value: dpm.address as `0x${string}`,
65+
}),
66+
}),
67+
simulation: refinanceSimulation,
68+
})
69+
setTxRefinance(_refinanceOrder)
70+
71+
// for maker
72+
if (lendingProtocol === LendingProtocol.Maker && importPositionSimulation != null) {
73+
const _importPositionOrder = await user.newOrder({
74+
positionsManager: PositionsManager.createFrom({
7975
address: Address.createFromEthereum({
8076
value: dpm.address as `0x${string}`,
8177
}),
82-
},
83-
simulation: refinanceSimulation,
84-
}),
85-
])
86-
setTxImportPosition(_importPositionOrder)
87-
setTxRefinance(_refinanceOrder)
78+
}),
79+
simulation: importPositionSimulation,
80+
})
81+
setTxImportPosition(_importPositionOrder)
82+
}
8883
}
8984
void fetchData().catch((err) => {
9085
setError(err.message)

0 commit comments

Comments
 (0)