mars-v2-frontend/src/components/perps/Module/usePerpsModule.ts

64 lines
2.0 KiB
TypeScript

import { useMemo } from 'react'
import { BN_ZERO } from 'constants/math'
import useCurrentAccount from 'hooks/accounts/useCurrentAccount'
import useAllAssets from 'hooks/assets/useAllAssets'
import usePerpPosition from 'hooks/perps/usePerpPosition'
import usePerpsAsset from 'hooks/perps/usePerpsAsset'
import usePrice from 'hooks/usePrice'
import usePrices from 'hooks/usePrices'
import { getAccountNetValue } from 'utils/accounts'
import { byDenom } from 'utils/array'
import { demagnify } from 'utils/formatters'
export default function usePerpsModule(amount: BigNumber | null) {
const { perpsAsset } = usePerpsAsset()
const perpPosition = usePerpPosition(perpsAsset.denom)
const { data: prices } = usePrices()
const assets = useAllAssets()
const account = useCurrentAccount()
const price = usePrice(perpsAsset.denom)
const hasActivePosition = useMemo(
() => !!account?.perps.find(byDenom(perpsAsset.denom)),
[account?.perps, perpsAsset.denom],
)
const accountNetValue = useMemo(() => {
if (!account || !prices || !assets) return BN_ZERO
return getAccountNetValue(account, prices, assets)
}, [account, assets, prices])
const previousAmount = useMemo(() => perpPosition?.amount ?? BN_ZERO, [perpPosition?.amount])
const previousTradeDirection = useMemo(
() => perpPosition?.tradeDirection || 'long',
[perpPosition?.tradeDirection],
)
const previousLeverage = useMemo(
() =>
previousAmount
? price.times(demagnify(previousAmount, perpsAsset)).div(accountNetValue).plus(1).toNumber()
: null,
[accountNetValue, perpsAsset, previousAmount, price],
)
const leverage = useMemo(
() =>
price
.times(demagnify(previousAmount.plus(amount ?? BN_ZERO), perpsAsset))
.div(accountNetValue)
.plus(1)
.toNumber(),
[accountNetValue, amount, perpsAsset, previousAmount, price],
)
return {
previousAmount,
previousTradeDirection,
previousLeverage,
leverage,
hasActivePosition,
}
}