import type { Address } from "@solana/kit"; import { fetchVault } from "../generated"; import { fetchAllStrategyInitReceiptAccountsOfVault } from "./batchFetchers"; import { convertDecimalBitsToNumber } from "./decimal"; import type { ExtensionsRpc } from "./rpc"; export type StrategyPositionInfo = { strategyId: Address; /** Position value in raw asset base units. */ amount: bigint; }; export type VaultPositionAndTotalValues = { /** Total value of the vault in raw asset base units. */ totalValue: bigint; strategies: StrategyPositionInfo[]; }; export async function getPositionAndTotalValuesForVault( rpc: ExtensionsRpc, vault: Address, ): Promise { const [vaultAccount, strategyAccounts] = await Promise.all([ fetchVault(rpc, vault), fetchAllStrategyInitReceiptAccountsOfVault(rpc, vault), ]); return { totalValue: vaultAccount.data.asset.totalValue, strategies: strategyAccounts.map((account) => ({ strategyId: account.data.strategy, amount: account.data.positionValue, })), }; } export type HighWaterMarkInfo = { highestAssetPerLp: number; lastUpdatedTs: bigint; }; export async function getHighWaterMarkForVault( rpc: ExtensionsRpc, vault: Address, ): Promise { const account = await fetchVault(rpc, vault); return { highestAssetPerLp: convertDecimalBitsToNumber( account.data.highWaterMark.highestAssetPerLpDecimalBits, ), lastUpdatedTs: account.data.highWaterMark.lastUpdatedTs, }; }