mars-v2-frontend/src/utils/resolvers.ts
Linkie Link 2d5efec4cb
List milkTIA (#757)
* tidy: update svgs

* feat: list milkTIA

* env: updated the version

* fix: fixed null return of RedBank

* fix: useMarketEnabledAssets
2024-01-31 14:37:31 +01:00

135 lines
4.0 KiB
TypeScript

import { BN_ZERO } from 'constants/math'
import { BNCoin } from 'types/classes/BNCoin'
import { PnL, Positions } from 'types/generated/mars-credit-manager/MarsCreditManager.types'
import {
AssetParamsBaseForAddr as AssetParams,
AssetParamsBaseForAddr,
TotalDepositResponse,
} from 'types/generated/mars-params/MarsParams.types'
import { Market as RedBankMarket } from 'types/generated/mars-red-bank/MarsRedBank.types'
import { BN, getLeverageFromLTV } from 'utils/helpers'
import { convertAprToApy } from 'utils/parsers'
export function resolveMarketResponse(
asset: Asset,
marketResponse: RedBankMarket & Partial<Market>,
assetParamsResponse: AssetParams,
assetCapResponse: TotalDepositResponse,
): Market {
try {
return {
asset,
apy: {
borrow: convertAprToApy(Number(marketResponse.borrow_rate), 365) * 100,
deposit: convertAprToApy(Number(marketResponse.liquidity_rate), 365) * 100,
},
debt: marketResponse.debt ?? BN_ZERO,
deposits: marketResponse.deposits ?? BN_ZERO,
liquidity: marketResponse.liquidity ?? BN_ZERO,
depositEnabled: assetParamsResponse.red_bank.deposit_enabled,
borrowEnabled: assetParamsResponse.red_bank.borrow_enabled,
cap: {
denom: assetCapResponse.denom,
used: BN(assetCapResponse.amount),
max: BN(assetParamsResponse.deposit_cap),
},
ltv: {
max: Number(assetParamsResponse.max_loan_to_value),
liq: Number(assetParamsResponse.liquidation_threshold),
},
}
} catch (e) {
console.log(e)
return {
asset,
apy: {
borrow: 0,
deposit: 0,
},
debt: BN_ZERO,
deposits: BN_ZERO,
liquidity: BN_ZERO,
depositEnabled: false,
borrowEnabled: false,
cap: {
denom: '',
used: BN_ZERO,
max: BN_ZERO,
},
ltv: {
max: 0,
liq: 0,
},
}
}
}
export function resolveHLSStrategies(
type: 'vault' | 'coin',
assets: AssetParamsBaseForAddr[],
): HLSStrategyNoCap[] {
const HLSStakingStrategies: HLSStrategyNoCap[] = []
assets.forEach((asset) => {
const correlations = asset.credit_manager.hls?.correlations.filter((correlation) => {
return type in correlation
})
let correlatedDenoms: string[] | undefined
if (type === 'coin') {
correlatedDenoms = correlations
?.map((correlation) => (correlation as { coin: { denom: string } }).coin.denom)
.filter((denoms) => !denoms.includes('gamm/pool/'))
} else {
correlatedDenoms = correlations?.map(
(correlation) => (correlation as { vault: { addr: string } }).vault.addr,
)
}
if (!correlatedDenoms?.length) return
correlatedDenoms.forEach((correlatedDenom) =>
HLSStakingStrategies.push({
apy: null,
maxLeverage: getLeverageFromLTV(+asset.credit_manager.hls!.max_loan_to_value),
maxLTV: +asset.credit_manager.hls!.max_loan_to_value,
denoms: {
deposit: asset.denom,
borrow: correlatedDenom,
},
}),
)
})
return HLSStakingStrategies
}
export function resolvePerpsPositions(perpPositions: Positions['perps']): PerpsPosition[] {
if (!perpPositions) return []
return perpPositions.map((position) => {
return {
denom: position.denom,
baseDenom: position.base_denom,
amount: BN(position.size as any).abs(),
tradeDirection: BN(position.size as any).isNegative() ? 'short' : 'long',
closingFee: BNCoin.fromCoin(position.pnl.coins.closing_fee),
pnl: getPnlCoin(position.pnl.coins.pnl, position.base_denom),
entryPrice: BN(position.entry_price),
}
})
}
function getPnlCoin(pnl: PnL, denom: string): BNCoin {
let amount = BN_ZERO
if (pnl === 'break_even') return BNCoin.fromDenomAndBigNumber(denom, amount)
if ('loss' in (pnl as any)) {
amount = BN((pnl as any).loss.amount).times(-1)
} else if ('profit' in (pnl as { profit: Coin })) {
amount = BN((pnl as any).profit.amount)
}
return BNCoin.fromDenomAndBigNumber(denom, amount)
}