import type { AggregatorClient as CetusSdk } from "@cetusprotocol/aggregator-sdk"; import { SuiClientTypes } from "@mysten/sui/client"; import { SuiGrpcClient } from "@mysten/sui/grpc"; import { Transaction, TransactionArgument, TransactionObjectInput } from "@mysten/sui/transactions"; import BigNumber from "bignumber.js"; import { LstClient } from "@suilend/springsui-sdk"; import { LiquidStakingInfo } from "@suilend/springsui-sdk/_generated/liquid_staking/liquid-staking/structs"; import { SuilendClient } from "./client"; import { RewardsMap } from "./lib"; import { RewardMap } from "./lib/liquidityMining"; import { StrategyType } from "./lib/strategyOwnerCap"; import { ParsedObligation, ParsedReserve } from "./parsers"; export declare const STRATEGY_E: number; export declare const STRATEGY_FLASH_REPAY_MAX_RESIDUAL_USD = 0.1; export declare const STRATEGY_RATE_LIMITED_ERROR_MESSAGE = "This withdrawal exceeds the lending market's outflow limit for now. Withdraw a smaller amount, or wait and try again."; /** * Below this, a levered position is uneconomic no matter what the slippage * tolerance says. The aggregator's dust regime dominates: routes go multi-hop * through thin venues, quote 0.3-1.3% above the honest single-hop rate and then * deliver 2-8% below par, and a levered round trip runs ~20 of them — measured on * mainnet, a 36-cent position at 4x lost 19% opening and closing. The one-cent * absolute allowance that makes those swaps executable at all is itself 11-17% of * a seven-cent swap. * * Refusing to OPEN one is the only guard that helps, because the alternative — * capping the allowance so dust cannot authorise a large percentage — would strand * every position already below the line with no way to exit. So the loose * tolerance stays available on the unwind path, and entry is what gets blocked. */ export declare const STRATEGY_MIN_POSITION_USD = 10; export declare const USD_DISPLAY_DECIMAL_PLACES = 2; export declare const LST_DECIMALS = 9; export type StrategyDeposit = { coinType: string; depositedAmount: BigNumber; }; export type StrategyWithdraw = { coinType: string; withdrawnAmount: BigNumber; }; export declare enum StrategyFlashLoanProvider { MMT = "mmt" } export declare const STRATEGY_TYPE_FLASH_LOAN_OBJ_MAP: Record; export declare const getReserveSafeDepositLimit: (reserve: ParsedReserve) => { safeDepositLimit: BigNumber; safeDepositLimitUsd: BigNumber; }; export declare const addOrInsertStrategyDeposit: (_deposits: StrategyDeposit[], deposit: StrategyDeposit) => StrategyDeposit[]; export declare const hasStrategyPosition: (obligation: ParsedObligation) => boolean; export declare const getStrategySuiReserve: (reserveMap: Record) => { config: { $typeName: `${string}::reserve_config::ReserveConfig`; openLtvPct: number; closeLtvPct: number; maxCloseLtvPct: number; borrowWeightBps: BigNumber; depositLimit: BigNumber; borrowLimit: BigNumber; liquidationBonusBps: number; maxLiquidationBonusBps: number; depositLimitUsd: BigNumber; borrowLimitUsd: BigNumber; borrowFeeBps: number; spreadFeeBps: number; protocolLiquidationFeeBps: number; isolated: boolean; openAttributedBorrowLimitUsd: number; closeAttributedBorrowLimitUsd: number; additionalFields: import("./_generated/_dependencies/sui/bag/structs").Bag; interestRate: { id: string; utilPercent: BigNumber; aprPercent: BigNumber; }[]; }; $typeName: `${string}::reserve::Reserve`; id: string; arrayIndex: bigint; coinType: string; mintDecimals: number; priceIdentifier: string; price: BigNumber; smoothedPrice: BigNumber; minPrice: BigNumber; maxPrice: BigNumber; priceLastUpdateTimestampS: bigint; availableAmount: BigNumber; ctokenSupply: BigNumber; borrowedAmount: BigNumber; cumulativeBorrowRate: BigNumber; interestLastUpdateTimestampS: bigint; unclaimedSpreadFees: BigNumber; attributedBorrowValue: BigNumber; depositsPoolRewardManager: { $typeName: `${string}::liquidity_mining::PoolRewardManager`; id: string; totalShares: bigint; poolRewards: { $typeName: `${string}::liquidity_mining::PoolReward`; id: string; poolRewardManagerId: string; coinType: string; startTimeMs: number; endTimeMs: number; totalRewards: BigNumber; allocatedRewards: BigNumber; cumulativeRewardsPerShare: BigNumber; numUserRewardManagers: bigint; rewardIndex: number; symbol: string; mintDecimals: number; }[]; lastUpdateTimeMs: bigint; }; borrowsPoolRewardManager: { $typeName: `${string}::liquidity_mining::PoolRewardManager`; id: string; totalShares: bigint; poolRewards: { $typeName: `${string}::liquidity_mining::PoolReward`; id: string; poolRewardManagerId: string; coinType: string; startTimeMs: number; endTimeMs: number; totalRewards: BigNumber; allocatedRewards: BigNumber; cumulativeRewardsPerShare: BigNumber; numUserRewardManagers: bigint; rewardIndex: number; symbol: string; mintDecimals: number; }[]; lastUpdateTimeMs: bigint; }; availableAmountUsd: BigNumber; borrowedAmountUsd: BigNumber; depositedAmount: BigNumber; depositedAmountUsd: BigNumber; cTokenExchangeRate: BigNumber; borrowAprPercent: BigNumber; depositAprPercent: BigNumber; utilizationPercent: BigNumber; token: { id: string | null; decimals: number; name: string; symbol: string; description: string; iconUrl: string | null; coinType: string; }; symbol: string; name: string; iconUrl: string | null; description: string; totalDeposits: BigNumber; }; export type StrategyLstMap = Record; mintFeePercent: BigNumber; redeemFeePercent: BigNumber; suiToLstExchangeRate: BigNumber; lstToSuiExchangeRate: BigNumber; }>; export declare const fetchStrategyLstMap: (suiGrpcClient: SuiGrpcClient) => Promise; export declare const getStrategyLstMintFee: (lstMap: StrategyLstMap, lstCoinType: string, suiAmount: BigNumber) => BigNumber; export declare const getStrategyLstRedeemFee: (lstMap: StrategyLstMap, lstCoinType: string, lstAmount: BigNumber) => BigNumber; export declare const STRATEGY_TYPE_EXPOSURE_MAP: Record; export declare const getStrategyDepositReserves: (reserveMap: Record, strategyType: StrategyType) => { base?: ParsedReserve; lst?: ParsedReserve; }; export declare const getStrategyBorrowReserve: (reserveMap: Record, strategyType: StrategyType) => ParsedReserve; export declare const getStrategyDefaultCurrencyReserve: (reserveMap: Record, strategyType: StrategyType) => { config: { $typeName: `${string}::reserve_config::ReserveConfig`; openLtvPct: number; closeLtvPct: number; maxCloseLtvPct: number; borrowWeightBps: BigNumber; depositLimit: BigNumber; borrowLimit: BigNumber; liquidationBonusBps: number; maxLiquidationBonusBps: number; depositLimitUsd: BigNumber; borrowLimitUsd: BigNumber; borrowFeeBps: number; spreadFeeBps: number; protocolLiquidationFeeBps: number; isolated: boolean; openAttributedBorrowLimitUsd: number; closeAttributedBorrowLimitUsd: number; additionalFields: import("./_generated/_dependencies/sui/bag/structs").Bag; interestRate: { id: string; utilPercent: BigNumber; aprPercent: BigNumber; }[]; }; $typeName: `${string}::reserve::Reserve`; id: string; arrayIndex: bigint; coinType: string; mintDecimals: number; priceIdentifier: string; price: BigNumber; smoothedPrice: BigNumber; minPrice: BigNumber; maxPrice: BigNumber; priceLastUpdateTimestampS: bigint; availableAmount: BigNumber; ctokenSupply: BigNumber; borrowedAmount: BigNumber; cumulativeBorrowRate: BigNumber; interestLastUpdateTimestampS: bigint; unclaimedSpreadFees: BigNumber; attributedBorrowValue: BigNumber; depositsPoolRewardManager: { $typeName: `${string}::liquidity_mining::PoolRewardManager`; id: string; totalShares: bigint; poolRewards: { $typeName: `${string}::liquidity_mining::PoolReward`; id: string; poolRewardManagerId: string; coinType: string; startTimeMs: number; endTimeMs: number; totalRewards: BigNumber; allocatedRewards: BigNumber; cumulativeRewardsPerShare: BigNumber; numUserRewardManagers: bigint; rewardIndex: number; symbol: string; mintDecimals: number; }[]; lastUpdateTimeMs: bigint; }; borrowsPoolRewardManager: { $typeName: `${string}::liquidity_mining::PoolRewardManager`; id: string; totalShares: bigint; poolRewards: { $typeName: `${string}::liquidity_mining::PoolReward`; id: string; poolRewardManagerId: string; coinType: string; startTimeMs: number; endTimeMs: number; totalRewards: BigNumber; allocatedRewards: BigNumber; cumulativeRewardsPerShare: BigNumber; numUserRewardManagers: bigint; rewardIndex: number; symbol: string; mintDecimals: number; }[]; lastUpdateTimeMs: bigint; }; availableAmountUsd: BigNumber; borrowedAmountUsd: BigNumber; depositedAmount: BigNumber; depositedAmountUsd: BigNumber; cTokenExchangeRate: BigNumber; borrowAprPercent: BigNumber; depositAprPercent: BigNumber; utilizationPercent: BigNumber; token: { id: string | null; decimals: number; name: string; symbol: string; description: string; iconUrl: string | null; coinType: string; }; symbol: string; name: string; iconUrl: string | null; description: string; totalDeposits: BigNumber; }; export declare const getStrategySimulatedObligation: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, deposits: StrategyDeposit[], _borrowedAmount: BigNumber) => ParsedObligation; export declare const getStrategyDepositedAmount: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation) => BigNumber; export declare const getStrategyBorrowedAmount: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation) => BigNumber; export declare const getStrategyTvlAmount: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation) => BigNumber; export declare const getStrategyExposure: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation) => BigNumber; export declare const getStrategyStepMaxBorrowedAmount: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, deposits: StrategyDeposit[], borrowedAmount: BigNumber) => BigNumber; export declare const getStrategyStepMaxWithdrawnAmount: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, deposits: StrategyDeposit[], borrowedAmount: BigNumber, withdrawCoinType: string, headroomBuffer?: number) => BigNumber; export declare const getStrategyRebalanceDepositAmount: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, deposits: StrategyDeposit[], borrowedAmount: BigNumber) => BigNumber; export declare const strategySimulateLoopToExposure: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, _targetBorrowedAmount: BigNumber | undefined, _targetExposure: BigNumber | undefined) => { deposits: StrategyDeposit[]; borrowedAmount: BigNumber; obligation: ParsedObligation; }; export declare const strategySimulateDeposit: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, deposit: StrategyDeposit) => { deposits: StrategyDeposit[]; borrowedAmount: BigNumber; obligation: ParsedObligation; }; export declare const strategySimulateDepositAndLoopToExposure: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, deposit: StrategyDeposit, targetExposure: BigNumber) => { deposits: StrategyDeposit[]; borrowedAmount: BigNumber; obligation: ParsedObligation; }; export declare const fetchStrategyGlobalTvlAmountUsdMap: () => Promise | undefined>; export declare const getStrategyUnclaimedRewardsAmount: (reserveMap: Record, rewardPriceMap: Record, rewardCoinMetadataMap: Record, rewardMap: RewardMap, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation) => BigNumber; export declare const getStrategyAprPercent: (reserveMap: Record, lstStatsMap: Record, rewardMap: RewardMap, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation, exposure?: BigNumber) => BigNumber; export declare const getStrategyHealthPercent: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation, exposure?: BigNumber) => BigNumber; export declare const getStrategyLiquidationPrice: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, obligation?: ParsedObligation, exposure?: BigNumber) => BigNumber | null; export declare const strategyLoopToExposureTx: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, suiGrpcClient: SuiGrpcClient, suilendClient: SuilendClient, cetusSdk: CetusSdk, cetusPartnerId: string, _address: string, strategyOwnerCapId: TransactionObjectInput, obligationId: string | undefined, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, _targetBorrowedAmount: BigNumber | undefined, _targetExposure: BigNumber | undefined, // Must be defined if _targetBorrowedAmount is undefined transaction: Transaction) => Promise<{ deposits: StrategyDeposit[]; borrowedAmount: BigNumber; transaction: Transaction; }>; declare const strategyUnloopToExposureStepwiseTx: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, suiGrpcClient: SuiGrpcClient, suilendClient: SuilendClient, cetusSdk: CetusSdk, cetusPartnerId: string, _address: string, strategyOwnerCapId: TransactionObjectInput, obligationId: string, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, _targetBorrowedAmount: BigNumber | undefined, _targetExposure: BigNumber | undefined, // Must be defined if _targetBorrowedAmount is undefined transaction: Transaction, dryRunTransaction: (transaction: Transaction) => Promise) => Promise<{ deposits: StrategyDeposit[]; borrowedAmount: BigNumber; transaction: Transaction; }>; export declare const strategyUnloopToExposureTx: (...args: Parameters) => Promise<{ deposits: StrategyDeposit[]; borrowedAmount: BigNumber; transaction: Transaction; }>; export declare const strategyDepositTx: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, suiGrpcClient: SuiGrpcClient, suilendClient: SuilendClient, cetusSdk: CetusSdk, cetusPartnerId: string, _address: string, strategyOwnerCapId: TransactionObjectInput, obligationId: string | undefined, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, deposit: StrategyDeposit, transaction: Transaction, dryRunTransaction: (transaction: Transaction, setGasBudget?: boolean) => Promise>) => Promise<{ deposits: StrategyDeposit[]; borrowedAmount: BigNumber; transaction: Transaction; }>; export declare const strategyDepositAndLoopToExposureTx: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, suiGrpcClient: SuiGrpcClient, suilendClient: SuilendClient, cetusSdk: CetusSdk, cetusPartnerId: string, _address: string, strategyOwnerCapId: TransactionObjectInput, obligationId: string | undefined, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, deposit: StrategyDeposit, targetExposure: BigNumber, transaction: Transaction, dryRunTransaction: (transaction: Transaction, setGasBudget?: boolean) => Promise>) => Promise<{ deposits: StrategyDeposit[]; borrowedAmount: BigNumber; transaction: Transaction; }>; export declare const strategyWithdrawTx: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, suiGrpcClient: SuiGrpcClient, suilendClient: SuilendClient, cetusSdk: CetusSdk, cetusPartnerId: string, _address: string, strategyOwnerCapId: TransactionObjectInput, obligationId: string, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, withdraw: StrategyWithdraw, transaction: Transaction, dryRunTransaction: (transaction: Transaction, setGasBudget?: boolean) => Promise>, returnWithdrawnCoin?: boolean, rewardsMap?: RewardsMap) => Promise<{ deposits: StrategyDeposit[]; borrowedAmount: BigNumber; transaction: Transaction; withdrawnCoin?: TransactionArgument; }>; export declare const strategyMaxWithdrawTx: (reserveMap: Record, rewardsMap: RewardsMap, lstMap: StrategyLstMap, strategyType: StrategyType, suiGrpcClient: SuiGrpcClient, suilendClient: SuilendClient, cetusSdk: CetusSdk, cetusPartnerId: string, _address: string, strategyOwnerCapId: TransactionObjectInput, obligationId: string, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, withdrawCoinType: string, transaction: Transaction, _dryRunTransaction: (transaction: Transaction, setGasBudget?: boolean) => Promise>) => Promise<{ deposits: StrategyDeposit[]; borrowedAmount: BigNumber; transaction: Transaction; }>; export declare const strategyAdjustRepayTx: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, suiGrpcClient: SuiGrpcClient, suilendClient: SuilendClient, cetusSdk: CetusSdk, cetusPartnerId: string, _address: string, strategyOwnerCapId: TransactionObjectInput, obligationId: string, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, flashLoanBorrowedAmount: BigNumber, transaction: Transaction, dryRunTransaction: (transaction: Transaction, setGasBudget?: boolean) => Promise>) => Promise<{ deposits: StrategyDeposit[]; borrowedAmount: BigNumber; transaction: Transaction; }>; export declare const strategyDepositAdjustWithdrawTx: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, suiGrpcClient: SuiGrpcClient, suilendClient: SuilendClient, cetusSdk: CetusSdk, cetusPartnerId: string, _address: string, strategyOwnerCapId: TransactionObjectInput, obligationId: string, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, flashLoanBorrowedAmount: BigNumber, transaction: Transaction, dryRunTransaction: (transaction: Transaction, setGasBudget?: boolean) => Promise>) => Promise<{ deposits: StrategyDeposit[]; borrowedAmount: BigNumber; transaction: Transaction; }>; export declare const strategyAdjustTx: (reserveMap: Record, lstMap: StrategyLstMap, strategyType: StrategyType, suiGrpcClient: SuiGrpcClient, suilendClient: SuilendClient, cetusSdk: CetusSdk, cetusPartnerId: string, _address: string, strategyOwnerCapId: TransactionObjectInput, obligation: ParsedObligation, _deposits: StrategyDeposit[], _borrowedAmount: BigNumber, targetExposure: BigNumber, transaction: Transaction, _dryRunTransaction: (transaction: Transaction, setGasBudget?: boolean) => Promise>) => Promise<{ deposits: StrategyDeposit[]; borrowedAmount: BigNumber; transaction: Transaction; }>; export {};