Skip to content

Commit 8bccad9

Browse files
authored
Merge pull request #1311 from mars-protocol/develop
2 parents 1b6fe62 + d0cceae commit 8bccad9

File tree

9 files changed

+81
-4
lines changed

9 files changed

+81
-4
lines changed

src/components/account/AccountComposition.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import useVaultAprs from 'hooks/vaults/useVaultAprs'
1919
import useStore from 'store'
2020
import { BNCoin } from 'types/classes/BNCoin'
2121
import { getAccountSummaryStats, getAccountUnrealizedPnlValue } from 'utils/accounts'
22+
import usePerpsMarketStates from 'hooks/perps/usePerpsMarketStates'
2223

2324
interface Props {
2425
account: Account
@@ -56,6 +57,7 @@ export default function AccountComposition(props: Props) {
5657
[lendingAvailableAssets, accountLentAssets],
5758
)
5859
const assetParams = useAssetParams()
60+
const perpsMarketStates = usePerpsMarketStates()
5961

6062
const { positionValue, debts, netWorth, collateralValue, apy, leverage } = useMemo(
6163
() =>
@@ -68,6 +70,7 @@ export default function AccountComposition(props: Props) {
6870
astroLpAprs,
6971
assetParams.data || [],
7072
perpsVault?.apy || 0,
73+
perpsMarketStates.data || [],
7174
),
7275
[
7376
account,
@@ -78,6 +81,7 @@ export default function AccountComposition(props: Props) {
7881
astroLpAprs,
7982
assetParams.data,
8083
perpsVault?.apy,
84+
perpsMarketStates,
8185
],
8286
)
8387

@@ -108,6 +112,7 @@ export default function AccountComposition(props: Props) {
108112
astroLpAprs,
109113
assetParams.data || [],
110114
perpsVault?.apy || 0,
115+
perpsMarketStates.data || [],
111116
)
112117
}, [
113118
updatedAccount,
@@ -118,6 +123,7 @@ export default function AccountComposition(props: Props) {
118123
astroLpAprs,
119124
assetParams.data,
120125
perpsVault?.apy,
126+
perpsMarketStates.data,
121127
positionValue,
122128
debts,
123129
netWorth,

src/components/account/AccountDetails/index.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
calculateAccountBalanceValue,
3535
calculateAccountLeverage,
3636
} from 'utils/accounts'
37+
import usePerpsMarketStates from 'hooks/perps/usePerpsMarketStates'
3738

3839
interface Props {
3940
account: Account
@@ -84,6 +85,7 @@ function AccountDetails(props: Props) {
8485
() => calculateAccountBalanceValue(updatedAccount ?? account, assets),
8586
[updatedAccount, account, assets],
8687
)
88+
8789
const coin = BNCoin.fromDenomAndBigNumber(ORACLE_DENOM, accountBalanceValue)
8890
const leverage = useMemo(() => calculateAccountLeverage(account, assets), [account, assets])
8991
const updatedLeverage = useMemo(() => {
@@ -100,6 +102,8 @@ function AccountDetails(props: Props) {
100102
const { availableAssets: lendingAvailableAssets, accountLentAssets } =
101103
useLendingMarketAssetsTableData()
102104

105+
const perpsMarketStates = usePerpsMarketStates()
106+
103107
const lendingAssetsData = useMemo(
104108
() => [...lendingAvailableAssets, ...accountLentAssets],
105109
[lendingAvailableAssets, accountLentAssets],
@@ -114,6 +118,7 @@ function AccountDetails(props: Props) {
114118
vaultAprs,
115119
astroLpAprs,
116120
perpsVault?.apy || 0,
121+
perpsMarketStates.data || [],
117122
),
118123
[
119124
updatedAccount,
@@ -124,6 +129,7 @@ function AccountDetails(props: Props) {
124129
vaultAprs,
125130
astroLpAprs,
126131
perpsVault?.apy,
132+
perpsMarketStates.data,
127133
],
128134
)
129135
const isFullWidth =

src/components/account/AccountList/AccountStats.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import useVaultAprs from 'hooks/vaults/useVaultAprs'
1616
import useStore from 'store'
1717
import { calculateAccountApy, calculateAccountBalanceValue } from 'utils/accounts'
1818
import { mergeBNCoinArrays } from 'utils/helpers'
19+
import usePerpsMarketStates from 'hooks/perps/usePerpsMarketStates'
1920

2021
interface Props {
2122
accountId: string
@@ -30,6 +31,8 @@ export default function AccountStats(props: Props) {
3031
const { data: vaultAprs } = useVaultAprs()
3132
const { data: perpsVault } = usePerpsVault()
3233
const astroLpAprs = useAstroLpAprs()
34+
const perpsMarketStates = usePerpsMarketStates()
35+
3336
const positionBalance = useMemo(
3437
() => (!account ? null : calculateAccountBalanceValue(account, assets)),
3538
[account, assets],
@@ -55,8 +58,18 @@ export default function AccountStats(props: Props) {
5558
vaultAprs,
5659
astroLpAprs,
5760
perpsVault?.apy || 0,
61+
perpsMarketStates.data || [],
5862
),
59-
[account, borrowAssetsData, lendingAssetsData, assets, vaultAprs, astroLpAprs, perpsVault?.apy],
63+
[
64+
account,
65+
borrowAssetsData,
66+
lendingAssetsData,
67+
assets,
68+
vaultAprs,
69+
astroLpAprs,
70+
perpsVault?.apy,
71+
perpsMarketStates.data,
72+
],
6073
)
6174

6275
const deleteAccountHandler = useCallback(() => {

src/components/account/AccountSummary/index.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import usePerpsVault from 'hooks/perps/usePerpsVault'
2222
import useVaultAprs from 'hooks/vaults/useVaultAprs'
2323
import useStore from 'store'
2424
import { calculateAccountApy, getAccountSummaryStats } from 'utils/accounts'
25+
import usePerpsMarketStates from 'hooks/perps/usePerpsMarketStates'
2526

2627
interface Props {
2728
account: Account
@@ -56,6 +57,7 @@ export default function AccountSummary(props: Props) {
5657
() => [...lendingAvailableAssets, ...accountLentAssets],
5758
[lendingAvailableAssets, accountLentAssets],
5859
)
60+
const perpsMarketStates = usePerpsMarketStates()
5961
const { health, healthFactor } = useHealthComputer(account)
6062
const { health: updatedHealth, healthFactor: updatedHealthFactor } = useHealthComputer(
6163
updatedAccount || account,
@@ -72,6 +74,7 @@ export default function AccountSummary(props: Props) {
7274
astroLpAprs,
7375
assetParams.data || [],
7476
perpsVault?.apy || 0,
77+
perpsMarketStates.data || [],
7578
),
7679
[
7780
updatedAccount,
@@ -83,6 +86,7 @@ export default function AccountSummary(props: Props) {
8386
astroLpAprs,
8487
assetParams.data,
8588
perpsVault?.apy,
89+
perpsMarketStates.data,
8690
],
8791
)
8892

@@ -97,6 +101,7 @@ export default function AccountSummary(props: Props) {
97101
astroLpAprs,
98102
assetParams.data || [],
99103
perpsVault?.apy || 0,
104+
perpsMarketStates.data || [],
100105
)
101106

102107
if (updatedLeverage.eq(leverage)) return null
@@ -111,6 +116,7 @@ export default function AccountSummary(props: Props) {
111116
assetParams.data,
112117
perpsVault?.apy,
113118
leverage,
119+
perpsMarketStates.data,
114120
])
115121

116122
const handleToggle = useCallback(
@@ -134,6 +140,7 @@ export default function AccountSummary(props: Props) {
134140
vaultAprs,
135141
astroLpAprs,
136142
perpsVault?.apy || 0,
143+
perpsMarketStates.data || [],
137144
),
138145
[
139146
updatedAccount,
@@ -145,6 +152,7 @@ export default function AccountSummary(props: Props) {
145152
vaultAprs,
146153
astroLpAprs,
147154
perpsVault?.apy,
155+
perpsMarketStates.data,
148156
],
149157
)
150158

src/components/portfolio/Account/Summary.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import usePerpsVault from 'hooks/perps/usePerpsVault'
1414
import useVaultAprs from 'hooks/vaults/useVaultAprs'
1515
import { getAccountSummaryStats } from 'utils/accounts'
1616
import { DEFAULT_PORTFOLIO_STATS } from 'utils/constants'
17+
import usePerpsMarketStates from 'hooks/perps/usePerpsMarketStates'
1718

1819
interface Props {
1920
account: Account
@@ -31,6 +32,7 @@ function Content(props: Props) {
3132
const { data: perpsVault } = usePerpsVault()
3233
const astroLpAprs = useAstroLpAprs()
3334
const assetParams = useAssetParams()
35+
const perpsMarketStates = usePerpsMarketStates()
3436

3537
const stats = useMemo(() => {
3638
if (!account || !borrowAssets.length || !lendingAssets.length) return DEFAULT_PORTFOLIO_STATS
@@ -44,6 +46,7 @@ function Content(props: Props) {
4446
astroLpAprs,
4547
assetParams.data || [],
4648
perpsVault?.apy || 0,
49+
perpsMarketStates.data || [],
4750
)
4851

4952
return [
@@ -97,6 +100,7 @@ function Content(props: Props) {
97100
astroLpAprs,
98101
assetParams.data,
99102
perpsVault?.apy,
103+
perpsMarketStates.data,
100104
props.v1,
101105
])
102106

src/components/portfolio/Card/index.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import usePerpsVault from 'hooks/perps/usePerpsVault'
2121
import useVaultAprs from 'hooks/vaults/useVaultAprs'
2222
import { getAccountSummaryStats } from 'utils/accounts'
2323
import { getRoute } from 'utils/route'
24+
import usePerpsMarketStates from 'hooks/perps/usePerpsMarketStates'
2425

2526
interface Props {
2627
accountId: string
@@ -45,6 +46,7 @@ export default function PortfolioCard(props: Props) {
4546
getDefaultChainSettings(chainConfig).reduceMotion,
4647
)
4748
const assetParams = useAssetParams()
49+
const perpsMarketStates = usePerpsMarketStates()
4850

4951
const stats: { title: ReactNode; sub: string }[] = useMemo(() => {
5052
if (!account || !assets.length || !lendingAssets.length || !borrowAssets.length) {
@@ -63,6 +65,7 @@ export default function PortfolioCard(props: Props) {
6365
astroLpAprs,
6466
assetParams.data || [],
6567
perpsVault?.apy || 0,
68+
perpsMarketStates.data || [],
6669
)
6770

6871
return [
@@ -88,6 +91,7 @@ export default function PortfolioCard(props: Props) {
8891
astroLpAprs,
8992
assetParams.data,
9093
perpsVault?.apy,
94+
perpsMarketStates.data,
9195
])
9296

9397
if (!account) {

src/components/portfolio/Overview/Summary.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import useStore from 'store'
1717
import { getAccountSummaryStats } from 'utils/accounts'
1818
import { DEFAULT_PORTFOLIO_STATS } from 'utils/constants'
1919
import { mergeBNCoinArrays, mergePerpsVaults } from 'utils/helpers'
20+
import usePerpsMarketStates from 'hooks/perps/usePerpsMarketStates'
2021

2122
export default function PortfolioSummary() {
2223
const { address: urlAddress } = useParams()
@@ -31,6 +32,7 @@ export default function PortfolioSummary() {
3132
const astroLpAprs = useAstroLpAprs()
3233
const assetParams = useAssetParams()
3334
const { data: perpsVault } = usePerpsVault()
35+
const perpsMarketStates = usePerpsMarketStates()
3436

3537
const allAccounts = useMemo(() => {
3638
return [...(defaultAccounts || []), ...(hlsAccounts || [])]
@@ -48,7 +50,7 @@ export default function PortfolioSummary() {
4850
combinedAccount.stakedAstroLps,
4951
account.stakedAstroLps,
5052
)
51-
53+
combinedAccount.perps = combinedAccount.perps.concat(account.perps)
5254
return combinedAccount
5355
},
5456
{
@@ -76,6 +78,7 @@ export default function PortfolioSummary() {
7678
astroLpAprs,
7779
assetParams.data || [],
7880
perpsVault?.apy || 0,
81+
perpsMarketStates.data || [],
7982
)
8083

8184
return [
@@ -129,6 +132,7 @@ export default function PortfolioSummary() {
129132
astroLpAprs,
130133
assetParams,
131134
perpsVault?.apy,
135+
perpsMarketStates.data,
132136
])
133137

134138
if (!walletAddress && !urlAddress) return null

src/utils/accounts.ts

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { PRICE_ORACLE_DECIMALS } from 'constants/query'
44
import { BNCoin } from 'types/classes/BNCoin'
55
import { VaultPosition } from 'types/generated/mars-credit-manager/MarsCreditManager.types'
66
import { AssetParamsBaseForAddr } from 'types/generated/mars-params/MarsParams.types'
7+
import { MarketResponse } from 'types/generated/mars-perps/MarsPerps.types'
78
import { Positions } from 'types/generated/mars-rover-health-computer/MarsRoverHealthComputer.types'
89
import { byDenom } from 'utils/array'
910
import { getCoinValue } from 'utils/formatters'
@@ -137,21 +138,48 @@ export const calculateAccountApy = (
137138
vaultAprs: Apr[],
138139
astroLpAprs: Apr[],
139140
perpsVaultApy: number,
141+
perpsMarketStates?: MarketResponse[],
140142
): BigNumber => {
141143
const totalValue = getAccountTotalValue(account, assets)
142-
143144
const debtsValue = calculateAccountValue('debts', account, assets)
144145
const totalDenominatorValue = totalValue.minus(debtsValue.abs())
145146

146147
if (totalDenominatorValue.isLessThanOrEqualTo(0)) return BN_ZERO
147-
const { vaults, lends, debts, deposits, stakedAstroLps, perpsVault } = account
148+
149+
const { vaults, lends, debts, deposits, stakedAstroLps, perpsVault, perps } = account
148150

149151
let totalDepositsInterestValue = BN_ZERO
150152
let totalLendsInterestValue = BN_ZERO
151153
let totalVaultsInterestValue = BN_ZERO
152154
let totalDebtInterestValue = BN_ZERO
153155
let totalAstroStakedLpsInterestValue = BN_ZERO
154156
let totalPerpsVaultInterestValue = BN_ZERO
157+
let totalPerpsFundingInterestValue = BN_ZERO
158+
159+
if (perps?.length && perpsMarketStates?.length) {
160+
perps.forEach((position) => {
161+
const marketState = perpsMarketStates.find((state) => state.denom === position.denom)
162+
163+
if (!marketState?.current_funding_rate) return
164+
165+
const positionValue = position.amount
166+
.abs()
167+
.multipliedBy(position.currentPrice)
168+
.shiftedBy(-PRICE_ORACLE_DECIMALS)
169+
const annualizedFundingRate = BN(marketState.current_funding_rate)
170+
.multipliedBy(100)
171+
.multipliedBy(365)
172+
173+
const fundingMultiplier = position.tradeDirection === 'long' ? -1 : 1
174+
175+
const fundingInterest = positionValue
176+
.multipliedBy(annualizedFundingRate)
177+
.multipliedBy(fundingMultiplier)
178+
.dividedBy(100)
179+
180+
totalPerpsFundingInterestValue = totalPerpsFundingInterestValue.plus(fundingInterest)
181+
})
182+
}
155183

156184
deposits?.forEach((deposit) => {
157185
const asset = assets.find(byDenom(deposit.denom))
@@ -233,6 +261,7 @@ export const calculateAccountApy = (
233261
.plus(totalDepositsInterestValue)
234262
.plus(totalAstroStakedLpsInterestValue)
235263
.plus(totalPerpsVaultInterestValue)
264+
.plus(totalPerpsFundingInterestValue)
236265
.minus(totalDebtInterestValue)
237266

238267
if (totalInterestValue.isEqualTo(0)) return BN_ZERO
@@ -443,6 +472,7 @@ export function getAccountSummaryStats(
443472
astroLpAprs: Apr[],
444473
assetParams: AssetParamsBaseForAddr[] | undefined,
445474
perpsVaultApy: number,
475+
perpsMarketStates?: MarketResponse[],
446476
) {
447477
const totalValue = getAccountTotalValue(account, assets)
448478

@@ -472,6 +502,7 @@ export function getAccountSummaryStats(
472502
vaultAprs,
473503
astroLpAprs,
474504
perpsVaultApy,
505+
perpsMarketStates,
475506
)
476507
const leverage = calculateAccountLeverage(account, assets)
477508

src/utils/generateToast.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ export async function generateToast(
119119
}
120120

121121
export function beautifyErrorMessage(error: string) {
122+
console.error(error)
122123
if (error.includes('too old'))
123124
return 'The oracle prices are stale. Please wait until the prices in the oracle contract are updated again.'
124125

0 commit comments

Comments
 (0)