diff --git a/src/graphql/subgraph/boost/aavePositionsQuery.graphql b/src/graphql/subgraph/boost/aavePositionsQuery.graphql new file mode 100644 index 00000000..2a38f7c4 --- /dev/null +++ b/src/graphql/subgraph/boost/aavePositionsQuery.graphql @@ -0,0 +1,5 @@ +query AavePositions($proxyAddress: Bytes!) { + aavePositions(where: { user: $proxyAddress }) { + borrowedAssets + } +} diff --git a/src/graphql/subgraph/boost/boostMainDataQuery.graphql b/src/graphql/subgraph/boost/boostMainDataQuery.graphql index 4d779a72..b1f3d208 100644 --- a/src/graphql/subgraph/boost/boostMainDataQuery.graphql +++ b/src/graphql/subgraph/boost/boostMainDataQuery.graphql @@ -8,6 +8,8 @@ query BoostMainData( user: $userAddress } ) { + proxy + borrowLtv osTokenShares exitingPercent boostRewardAssets: assets diff --git a/src/graphql/subgraph/boost/index.ts b/src/graphql/subgraph/boost/index.ts index 534333a4..74ac512b 100644 --- a/src/graphql/subgraph/boost/index.ts +++ b/src/graphql/subgraph/boost/index.ts @@ -1,5 +1,8 @@ export { fetchBoostMainDataQuery } from './boostMainDataQuery.graphql' export type { BoostMainDataQueryPayload, BoostMainDataQueryVariables } from './boostMainDataQuery.graphql' +export { fetchAavePositionsQuery } from './aavePositionsQuery.graphql' +export type { AavePositionsQueryPayload, AavePositionsQueryVariables } from './aavePositionsQuery.graphql' + export { fetchBoostQueuePositionsQuery } from './boostQueuePositionsQuery.graphql' export type { BoostQueuePositionsQueryPayload, BoostQueuePositionsQueryVariables } from './boostQueuePositionsQuery.graphql' diff --git a/src/methods/boost/requests/getData/index.ts b/src/methods/boost/requests/getData/index.ts index 4f7f2ba0..0447ee96 100644 --- a/src/methods/boost/requests/getData/index.ts +++ b/src/methods/boost/requests/getData/index.ts @@ -1,6 +1,6 @@ import graphql from '../../../../graphql' import { wrapAbortPromise } from '../../../../modules/gql-module' -import { validateArgs, apiUrls, Network, constants } from '../../../../utils' +import { validateArgs, apiUrls, Network, constants, BorrowStatus } from '../../../../utils' type GetBoostInput = { @@ -13,9 +13,12 @@ type GetBoostInput = { type Output = { shares: bigint vaultApy: number + totalShares: bigint + borrowStatus: BorrowStatus rewardAssets: bigint maxMintShares: bigint exitingPercent: number + borrowedAssets: bigint allocatorMaxBoostApy: number osTokenHolderMaxBoostApy: number } @@ -28,15 +31,18 @@ const getData = async (values: GetBoostInput) => { const boost: Output = { shares: 0n, vaultApy: 0, + totalShares: 0n, + borrowStatus: BorrowStatus.Healthy, rewardAssets: 0n, exitingPercent: 0, maxMintShares: 0n, + borrowedAssets: 0n, allocatorMaxBoostApy: 0, osTokenHolderMaxBoostApy: 0, } if ([ Network.Mainnet, Network.Holesky ].includes(options.network)) { - const response = await graphql.subgraph.boost.fetchBoostMainDataQuery({ + const boostMainData = await graphql.subgraph.boost.fetchBoostMainDataQuery({ url: apiUrls.getSubgraphqlUrl(options), variables: { userAddress: userAddress.toLowerCase(), @@ -44,7 +50,7 @@ const getData = async (values: GetBoostInput) => { }, }) - const { leverageStrategyPositions, vaults, allocators } = response + const { leverageStrategyPositions, vaults, allocators } = boostMainData if (!vaults.length) { return boost @@ -59,20 +65,47 @@ const getData = async (values: GetBoostInput) => { const leverageStrategyPosition = leverageStrategyPositions[0] + const aaveData = await graphql.subgraph.boost.fetchAavePositionsQuery({ + url: apiUrls.getSubgraphqlUrl(options), + variables: { + proxyAddress: (leverageStrategyPosition?.proxy || '').toLowerCase(), + }, + }) + const stakedAssets = BigInt(allocators[0]?.assets || 0) const ltvPercent = BigInt(osTokenConfig.ltvPercent || 0) + const borrowLtv = Number(leverageStrategyPosition?.borrowLtv || 0) const shares = BigInt(leverageStrategyPosition?.osTokenShares || 0) const exitingPercent = Number(leverageStrategyPosition?.exitingPercent || 0) const rewardAssets = BigInt(leverageStrategyPosition?.boostRewardAssets || 0) + const borrowedAssets = BigInt(aaveData?.aavePositions[0]?.borrowedAssets || 0) const maxMintAssets = stakedAssets * ltvPercent / constants.blockchain.amount1 const maxMintShares = await contracts.base.mintTokenController.convertToShares(maxMintAssets) + const rewardShares = await contracts.base.mintTokenController.convertToShares(rewardAssets) + + let borrowStatus: BorrowStatus + + if (borrowLtv <= 0.938) { + borrowStatus = BorrowStatus.Healthy + } + else if (borrowLtv <= 0.945) { + borrowStatus = BorrowStatus.Moderate + } + else { + borrowStatus = BorrowStatus.Risky + } + + const totalShares = shares + rewardShares return { shares, + totalShares, + borrowStatus, rewardAssets, maxMintShares, exitingPercent, + borrowedAssets, vaultApy: Number(apy), allocatorMaxBoostApy: Number(allocatorMaxBoostApy), osTokenHolderMaxBoostApy: Number(osTokenHolderMaxBoostApy), diff --git a/src/utils/enums.ts b/src/utils/enums.ts index c1ba969e..1df2b961 100644 --- a/src/utils/enums.ts +++ b/src/utils/enums.ts @@ -34,3 +34,9 @@ export enum OsTokenPositionHealth { Healthy, Risky, } + +export enum BorrowStatus { + Healthy, + Moderate, + Risky, +}