@0dotxyz/p0-ts-sdk 2.7.0 → 2.7.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -98,7 +98,7 @@ console.log(`Compute units: ${simulation.value.unitsConsumed}`);
98
98
  ### 5. Borrow Against Collateral
99
99
 
100
100
  ```typescript
101
- // Check how much you can borrow
101
+ // Check how much you can borrow (account health + bank borrow cap + bank liquidity)
102
102
  const maxBorrow = wrappedAccount.computeMaxBorrowForBank(usdcBank.address);
103
103
  console.log(`Max borrow: $${maxBorrow.toString()}`);
104
104
 
@@ -289,9 +289,16 @@ const health = wrapped.computeHealthComponents(
289
289
  MarginRequirementType.Initial // or Maintenance
290
290
  );
291
291
 
292
- // Max amounts
292
+ // Max amounts — bank-aware:
293
+ // borrow = min(health-based, remaining borrow cap, available bank liquidity, rate-limit headroom)
294
+ // withdraw = min(health-based, available bank liquidity, rate-limit headroom)
295
+ // deposit = remaining deposit cap (optionally min'd with your wallet balance)
296
+ // (rate-limit headroom = bank net-outflow limiter in tokens + group USD limiter, if enabled)
293
297
  const maxBorrow = wrapped.computeMaxBorrowForBank(bankAddress);
294
298
  const maxWithdraw = wrapped.computeMaxWithdrawForBank(bankAddress);
299
+ const maxDeposit = wrapped.computeMaxDepositForBank(bankAddress, { walletBalance: 1_000 });
300
+
301
+ // Pass { ignoreBankLimits: true } to get the purely health-based borrow/withdraw amount
295
302
  ```
296
303
 
297
304
  ## 🧪 Testing
package/dist/index.cjs CHANGED
@@ -27746,6 +27746,11 @@ var klendInstructions = {
27746
27746
  };
27747
27747
  var instructions_default2 = klendInstructions;
27748
27748
 
27749
+ // src/vendor/drift/types/drift-spot-market/drift-spot-market.types.ts
27750
+ function isSpotBalanceTypeVariant(value, variant) {
27751
+ return value === variant;
27752
+ }
27753
+
27749
27754
  // src/vendor/drift/idl/drift.json
27750
27755
  var drift_default = {
27751
27756
  address: "dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH",
@@ -42111,6 +42116,34 @@ function deriveDriftSpotMarketVault(marketIndex, programId = DRIFT_PROGRAM_ID) {
42111
42116
  programId
42112
42117
  );
42113
42118
  }
42119
+ var ZERO = new BN9__default.default(0);
42120
+ var ONE = new BN9__default.default(1);
42121
+ var TEN = new BN9__default.default(10);
42122
+ var PERCENTAGE_PRECISION_EXP = new BN9__default.default(6);
42123
+ new BN9__default.default(10).pow(PERCENTAGE_PRECISION_EXP);
42124
+ var SPOT_MARKET_RATE_PRECISION_EXP = new BN9__default.default(6);
42125
+ new BN9__default.default(10).pow(SPOT_MARKET_RATE_PRECISION_EXP);
42126
+ var SPOT_MARKET_UTILIZATION_PRECISION_EXP = new BN9__default.default(6);
42127
+ new BN9__default.default(10).pow(
42128
+ SPOT_MARKET_UTILIZATION_PRECISION_EXP
42129
+ );
42130
+ new BN9__default.default(31536e3);
42131
+ function divCeil(a, b) {
42132
+ const quotient = a.div(b);
42133
+ const remainder = a.mod(b);
42134
+ if (remainder.gt(ZERO)) {
42135
+ return quotient.add(ONE);
42136
+ }
42137
+ return quotient;
42138
+ }
42139
+ function getDriftTokenAmount(balanceAmount, spotMarket, balanceType) {
42140
+ const precisionDecrease = TEN.pow(new BN9__default.default(19 - spotMarket.decimals));
42141
+ if (isSpotBalanceTypeVariant(balanceType, "deposit")) {
42142
+ return balanceAmount.mul(spotMarket.cumulativeDepositInterest).div(precisionDecrease);
42143
+ } else {
42144
+ return divCeil(balanceAmount.mul(spotMarket.cumulativeBorrowInterest), precisionDecrease);
42145
+ }
42146
+ }
42114
42147
 
42115
42148
  // src/vendor/drift/utils/rewards.utils.ts
42116
42149
  async function getDriftRewards(spotMarkets, userStates, connection) {
@@ -73885,6 +73918,20 @@ var MarginfiAccount = class _MarginfiAccount {
73885
73918
  ...params
73886
73919
  });
73887
73920
  }
73921
+ /**
73922
+ * Calculates the maximum amount that can be deposited into a bank.
73923
+ *
73924
+ * Deposits are not constrained by account health, only by the bank's remaining deposit cap
73925
+ * and (optionally) the wallet balance.
73926
+ *
73927
+ * @param params - Configuration for max deposit computation
73928
+ * @returns Maximum depositable amount in UI units
73929
+ *
73930
+ * @see {@link computeMaxDepositForBank} for implementation details
73931
+ */
73932
+ computeMaxDepositForBank(params) {
73933
+ return computeMaxDepositForBank(params);
73934
+ }
73888
73935
  /**
73889
73936
  * Gets the banks required for health check calculations.
73890
73937
  *
@@ -77744,7 +77791,9 @@ function computeMaxBorrowForBank(params) {
77744
77791
  assetShareValueMultiplierByBank,
77745
77792
  emodeImpactStatus,
77746
77793
  volatilityFactor,
77747
- activePair
77794
+ activePair,
77795
+ groupRateLimiter,
77796
+ ignoreBankLimits
77748
77797
  } = params;
77749
77798
  const bank = banksMap.get(bankAddress.toBase58());
77750
77799
  if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);
@@ -77804,15 +77853,67 @@ function computeMaxBorrowForBank(params) {
77804
77853
  assetShareValueMultiplier
77805
77854
  });
77806
77855
  const liabWeight = getLiabilityWeight(bank.config, 0 /* Initial */);
77807
- if (assetWeight.eq(0)) {
77808
- return computeQuantityUi(balance, bank, assetShareValueMultiplier).assets.plus(
77809
- freeCollateral.minus(untiedCollateralForBank).div(priceHighestBias.times(liabWeight))
77810
- );
77811
- } else {
77812
- return untiedCollateralForBank.div(priceLowestBias.times(assetWeight)).plus(freeCollateral.minus(untiedCollateralForBank).div(priceHighestBias.times(liabWeight)));
77856
+ const originationFeeFactor = new BigNumber3__default.default(1).plus(
77857
+ bank.config.interestRateConfig.protocolOriginationFee
77858
+ );
77859
+ const liabPriceWeighted = priceHighestBias.times(liabWeight).times(originationFeeFactor);
77860
+ const healthMaxBorrow = assetWeight.eq(0) ? computeQuantityUi(balance, bank, assetShareValueMultiplier).assets.plus(
77861
+ freeCollateral.minus(untiedCollateralForBank).div(liabPriceWeighted)
77862
+ ) : untiedCollateralForBank.div(priceLowestBias.times(assetWeight)).plus(freeCollateral.minus(untiedCollateralForBank).div(liabPriceWeighted));
77863
+ if (ignoreBankLimits) return healthMaxBorrow;
77864
+ const borrowCapRemaining = new BigNumber3__default.default(computeBankBorrowCapRemaining(bank)).div(
77865
+ originationFeeFactor
77866
+ );
77867
+ const availableLiquidity = computeBankProjectedAvailableLiquidity(
77868
+ bank,
77869
+ assetShareValueMultiplier
77870
+ ).div(originationFeeFactor);
77871
+ const rateLimitRemaining = computeOutflowRateLimitRemaining(bank, oraclePrice, groupRateLimiter);
77872
+ return BigNumber3__default.default.max(
77873
+ 0,
77874
+ BigNumber3__default.default.min(healthMaxBorrow, borrowCapRemaining, availableLiquidity, rateLimitRemaining)
77875
+ );
77876
+ }
77877
+ function computeOutflowRateLimitRemaining(bank, oraclePrice, groupRateLimiter) {
77878
+ const nowSeconds = Date.now() / 1e3;
77879
+ let remaining = new BigNumber3__default.default(Infinity);
77880
+ const bankRemaining = computeBankRateLimitRemaining(bank, nowSeconds);
77881
+ if (bankRemaining !== null) remaining = BigNumber3__default.default.min(remaining, bankRemaining);
77882
+ const groupRemainingUsd = computeGroupRateLimitRemainingUsd(groupRateLimiter, nowSeconds);
77883
+ if (groupRemainingUsd !== null) {
77884
+ const price = getPrice(oraclePrice, 1 /* None */, false);
77885
+ if (price.gt(0)) remaining = BigNumber3__default.default.min(remaining, groupRemainingUsd.div(price));
77813
77886
  }
77887
+ return remaining;
77814
77888
  }
77815
77889
  function computeMaxWithdrawForBank(params) {
77890
+ const {
77891
+ banksMap,
77892
+ bankAddress,
77893
+ oraclePricesByBank,
77894
+ assetShareValueMultiplierByBank,
77895
+ groupRateLimiter,
77896
+ venueStates,
77897
+ ignoreBankLimits
77898
+ } = params;
77899
+ const bank = banksMap.get(bankAddress.toBase58());
77900
+ if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);
77901
+ const healthMaxWithdraw = computeHealthMaxWithdrawForBank(params);
77902
+ if (ignoreBankLimits) return healthMaxWithdraw;
77903
+ const oraclePrice = oraclePricesByBank.get(bankAddress.toBase58());
77904
+ if (!oraclePrice) throw Error(`Oracle price for ${bankAddress.toBase58()} not found`);
77905
+ const assetShareValueMultiplier = assetShareValueMultiplierByBank?.get(bankAddress.toBase58());
77906
+ const availableLiquidity = computeBankProjectedAvailableLiquidity(
77907
+ bank,
77908
+ assetShareValueMultiplier
77909
+ );
77910
+ const rateLimitRemaining = computeOutflowRateLimitRemaining(bank, oraclePrice, groupRateLimiter);
77911
+ const clamps = [healthMaxWithdraw, availableLiquidity, rateLimitRemaining];
77912
+ const venueLiquidity = computeVenueAvailableLiquidity(bank, venueStates);
77913
+ if (venueLiquidity !== void 0) clamps.push(venueLiquidity);
77914
+ return BigNumber3__default.default.max(0, BigNumber3__default.default.min(...clamps));
77915
+ }
77916
+ function computeHealthMaxWithdrawForBank(params) {
77816
77917
  const {
77817
77918
  account,
77818
77919
  banksMap,
@@ -77908,6 +78009,17 @@ function computeMaxWithdrawForBank(params) {
77908
78009
  const maxWithdraw = initUntiedCollateralForBank.div(initWeightedPrice);
77909
78010
  return maxWithdraw;
77910
78011
  }
78012
+ function computeMaxDepositForBank(params) {
78013
+ const { banksMap, bankAddress, assetShareValueMultiplierByBank, walletBalance } = params;
78014
+ const bank = banksMap.get(bankAddress.toBase58());
78015
+ if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);
78016
+ const assetShareValueMultiplier = assetShareValueMultiplierByBank?.get(bankAddress.toBase58());
78017
+ const depositCapRemaining = new BigNumber3__default.default(computeBankDepositCapRemaining(bank)).times(
78018
+ assetShareValueMultiplier ?? 1
78019
+ );
78020
+ if (walletBalance === void 0) return depositCapRemaining;
78021
+ return BigNumber3__default.default.max(0, BigNumber3__default.default.min(depositCapRemaining, new BigNumber3__default.default(walletBalance)));
78022
+ }
77911
78023
 
77912
78024
  // src/services/account/utils/misc.utils.ts
77913
78025
  function floor(value, decimals) {
@@ -79580,6 +79692,21 @@ var fetchMultipleBanks = async (program, opts) => {
79580
79692
  }
79581
79693
  return bankDatas;
79582
79694
  };
79695
+ var U64_MAX = new BigNumber3__default.default("18446744073709551615");
79696
+ var DRIFT_SCALED_BALANCE_DECIMALS = 9;
79697
+ function isDepositLimitActive(bank) {
79698
+ return !bank.config.depositLimit.eq(U64_MAX);
79699
+ }
79700
+ function isBorrowLimitActive(bank) {
79701
+ return !bank.config.borrowLimit.eq(U64_MAX);
79702
+ }
79703
+ function getEffectiveDepositLimit(bank) {
79704
+ const limit = bank.config.depositLimit;
79705
+ if (bank.config.assetTag !== 4 /* DRIFT */) return limit;
79706
+ const diff = DRIFT_SCALED_BALANCE_DECIMALS - bank.mintDecimals;
79707
+ if (diff === 0) return limit;
79708
+ return diff > 0 ? limit.times(10 ** diff) : limit.div(10 ** -diff);
79709
+ }
79583
79710
  function computeInterestRates(bank) {
79584
79711
  const { insuranceFeeFixedApr, insuranceIrFee, protocolFixedFeeApr, protocolIrFee } = bank.config.interestRateConfig;
79585
79712
  const fixedFee = insuranceFeeFixedApr.plus(protocolFixedFeeApr);
@@ -79674,25 +79801,34 @@ function computeUtilizationRate(bank) {
79674
79801
  return liabilities.div(assets);
79675
79802
  }
79676
79803
  var SECONDS_PER_DAY = 24 * 60 * 60;
79677
- var SECONDS_PER_YEAR = SECONDS_PER_DAY * 365.25;
79804
+ var SECONDS_PER_YEAR = SECONDS_PER_DAY * 365;
79805
+ var EXECUTION_HEADROOM_SECONDS = 120;
79806
+ function computeAccrualProjectionSeconds(bank, nowSeconds = Date.now() / 1e3) {
79807
+ const age = Math.max(0, nowSeconds - bank.lastUpdate);
79808
+ return Math.max(2 * age, age + EXECUTION_HEADROOM_SECONDS);
79809
+ }
79678
79810
  function computeRemainingCapacity(bank) {
79679
79811
  const totalDeposits = getTotalAssetQuantity(bank);
79680
- const remainingCapacity = BigNumber3__default.default.max(0, bank.config.depositLimit.minus(totalDeposits));
79812
+ const remainingCapacity = isDepositLimitActive(bank) ? BigNumber3__default.default.max(
79813
+ 0,
79814
+ getEffectiveDepositLimit(bank).minus(totalDeposits).minus(1).integerValue(BigNumber3__default.default.ROUND_FLOOR)
79815
+ ) : U64_MAX;
79681
79816
  const totalBorrows = getTotalLiabilityQuantity(bank);
79682
- const remainingBorrowCapacity = BigNumber3__default.default.max(0, bank.config.borrowLimit.minus(totalBorrows));
79683
- const durationSinceLastAccrual = Date.now() / 1e3 - bank.lastUpdate;
79817
+ const remainingBorrowCapacity = isBorrowLimitActive(bank) ? BigNumber3__default.default.max(
79818
+ 0,
79819
+ bank.config.borrowLimit.minus(totalBorrows).minus(1).integerValue(BigNumber3__default.default.ROUND_FLOOR)
79820
+ ) : U64_MAX;
79821
+ const projectionSeconds = computeAccrualProjectionSeconds(bank);
79684
79822
  const { lendingRate, borrowingRate } = computeInterestRates(bank);
79685
- const outstandingLendingInterest = lendingRate.times(durationSinceLastAccrual).dividedBy(SECONDS_PER_YEAR).times(totalDeposits);
79686
- const outstandingBorrowInterest = borrowingRate.times(durationSinceLastAccrual).dividedBy(SECONDS_PER_YEAR).times(totalBorrows);
79687
- const depositCapacity = remainingCapacity.minus(outstandingLendingInterest.times(2));
79688
- const borrowCapacity = remainingBorrowCapacity.minus(outstandingBorrowInterest.times(2));
79823
+ const projectedLendingInterest = lendingRate.times(projectionSeconds).dividedBy(SECONDS_PER_YEAR).times(totalDeposits);
79824
+ const projectedBorrowInterest = borrowingRate.times(projectionSeconds).dividedBy(SECONDS_PER_YEAR).times(totalBorrows);
79825
+ const depositCapacity = remainingCapacity.minus(projectedLendingInterest);
79826
+ const borrowCapacity = remainingBorrowCapacity.minus(projectedBorrowInterest);
79689
79827
  return {
79690
79828
  depositCapacity,
79691
79829
  borrowCapacity
79692
79830
  };
79693
79831
  }
79694
-
79695
- // src/services/bank/utils/bank-metrics.utils.ts
79696
79832
  function isStandardBorrowable(bank) {
79697
79833
  const { assetTag, operationalState, borrowLimit } = bank.config;
79698
79834
  return (assetTag === 0 /* DEFAULT */ || assetTag === 1 /* SOL */) && operationalState === "Operational" /* Operational */ && borrowLimit.gt(0);
@@ -79702,9 +79838,7 @@ function isStandardDepositable(bank) {
79702
79838
  return (assetTag === 0 /* DEFAULT */ || assetTag === 1 /* SOL */) && operationalState === "Operational" /* Operational */;
79703
79839
  }
79704
79840
  function computeBankTotalDeposits(bank, assetShareValueMultiplier) {
79705
- const totalAssets = getTotalAssetQuantity(bank).times(
79706
- assetShareValueMultiplier ?? 1
79707
- );
79841
+ const totalAssets = getTotalAssetQuantity(bank).times(assetShareValueMultiplier ?? 1);
79708
79842
  return nativeToUi(totalAssets, bank.mintDecimals);
79709
79843
  }
79710
79844
  function computeBankTotalBorrows(bank) {
@@ -79735,14 +79869,35 @@ function computeBankPoolSize(bank, assetShareValueMultiplier) {
79735
79869
  const borrowCap = nativeToUi(bank.config.borrowLimit, bank.mintDecimals);
79736
79870
  return Math.max(0, Math.min(totalDeposits, borrowCap) - totalBorrows);
79737
79871
  }
79872
+ function computeBankAvailableLiquidity(bank, assetShareValueMultiplier) {
79873
+ const totalDeposits = computeBankTotalDeposits(bank, assetShareValueMultiplier);
79874
+ const totalBorrows = computeBankTotalBorrows(bank);
79875
+ return BigNumber3__default.default.max(0, new BigNumber3__default.default(totalDeposits).minus(totalBorrows));
79876
+ }
79738
79877
  function computeBankDepositCapRemaining(bank) {
79878
+ if (!isDepositLimitActive(bank)) return Infinity;
79739
79879
  const { depositCapacity } = computeRemainingCapacity(bank);
79740
79880
  return Math.max(0, nativeToUi(depositCapacity, bank.mintDecimals));
79741
79881
  }
79742
79882
  function computeBankBorrowCapRemaining(bank) {
79883
+ if (!isBorrowLimitActive(bank)) return Infinity;
79743
79884
  const { borrowCapacity } = computeRemainingCapacity(bank);
79744
79885
  return Math.max(0, nativeToUi(borrowCapacity, bank.mintDecimals));
79745
79886
  }
79887
+ function computeBankProjectedAvailableLiquidity(bank, assetShareValueMultiplier) {
79888
+ const liquidity = computeBankAvailableLiquidity(bank, assetShareValueMultiplier);
79889
+ const totalDeposits = computeBankTotalDeposits(bank, assetShareValueMultiplier);
79890
+ const totalBorrows = computeBankTotalBorrows(bank);
79891
+ const projectionYears = computeAccrualProjectionSeconds(bank) / SECONDS_PER_YEAR;
79892
+ const { lendingRate, borrowingRate } = computeInterestRates(bank);
79893
+ const projectedBorrowInterest = borrowingRate.times(totalBorrows).times(projectionYears);
79894
+ const projectedLendingInterest = lendingRate.times(totalDeposits).times(projectionYears);
79895
+ const liquidityLostToAccrual = BigNumber3__default.default.max(
79896
+ 0,
79897
+ projectedBorrowInterest.minus(projectedLendingInterest)
79898
+ );
79899
+ return BigNumber3__default.default.max(0, liquidity.minus(liquidityLostToAccrual));
79900
+ }
79746
79901
  function computeBankSupplyApy(bank) {
79747
79902
  return aprToApy(computeInterestRates(bank).lendingRate.toNumber());
79748
79903
  }
@@ -79755,11 +79910,7 @@ function computeBankMetrics(params) {
79755
79910
  symbol,
79756
79911
  totalDeposits: computeBankTotalDeposits(bank, assetShareValueMultiplier),
79757
79912
  totalBorrows: computeBankTotalBorrows(bank),
79758
- totalDepositsUsd: computeBankTotalDepositsUsd(
79759
- bank,
79760
- oraclePrice,
79761
- assetShareValueMultiplier
79762
- ),
79913
+ totalDepositsUsd: computeBankTotalDepositsUsd(bank, oraclePrice, assetShareValueMultiplier),
79763
79914
  totalBorrowsUsd: computeBankTotalBorrowsUsd(bank, oraclePrice),
79764
79915
  utilizationRate: computeUtilizationRate(bank).toNumber(),
79765
79916
  poolSize: computeBankPoolSize(bank, assetShareValueMultiplier),
@@ -79787,6 +79938,92 @@ function requireTokenProgram(tokenProgramsByBank, address, makeError = (message)
79787
79938
  }
79788
79939
  return tokenProgram;
79789
79940
  }
79941
+ function computeRateLimitWindowRemainingCapacity(window, nowSeconds) {
79942
+ const { maxOutflow, windowDuration } = window;
79943
+ if (maxOutflow.lte(0)) return null;
79944
+ if (windowDuration === 0) return maxOutflow;
79945
+ let { windowStart, prevWindowOutflow, curWindowOutflow } = window;
79946
+ const elapsedRaw = Math.floor(nowSeconds) - windowStart;
79947
+ if (elapsedRaw >= windowDuration * 2) {
79948
+ windowStart = Math.floor(nowSeconds);
79949
+ prevWindowOutflow = new BigNumber3__default.default(0);
79950
+ curWindowOutflow = new BigNumber3__default.default(0);
79951
+ } else if (elapsedRaw >= windowDuration) {
79952
+ windowStart = windowStart + windowDuration;
79953
+ prevWindowOutflow = curWindowOutflow;
79954
+ curWindowOutflow = new BigNumber3__default.default(0);
79955
+ }
79956
+ const elapsed = Math.floor(nowSeconds) - windowStart;
79957
+ if (elapsed < 0) return new BigNumber3__default.default(0);
79958
+ if (elapsed >= windowDuration) return maxOutflow;
79959
+ const remainingTime = windowDuration - elapsed;
79960
+ const weightedPrev = prevWindowOutflow.abs().times(remainingTime).idiv(windowDuration).times(prevWindowOutflow.isNegative() ? -1 : 1);
79961
+ const totalNetOutflow = weightedPrev.plus(curWindowOutflow);
79962
+ return maxOutflow.minus(totalNetOutflow);
79963
+ }
79964
+ function computeRateLimiterRemainingCapacity(rateLimiter, nowSeconds) {
79965
+ if (!rateLimiter) return null;
79966
+ const hourly = computeRateLimitWindowRemainingCapacity(rateLimiter.hourly, nowSeconds);
79967
+ const daily = computeRateLimitWindowRemainingCapacity(rateLimiter.daily, nowSeconds);
79968
+ if (hourly === null) return daily;
79969
+ if (daily === null) return hourly;
79970
+ return BigNumber3__default.default.min(hourly, daily);
79971
+ }
79972
+ function computeBankRateLimitRemaining(bank, nowSeconds = Date.now() / 1e3) {
79973
+ const remaining = computeRateLimiterRemainingCapacity(bank.rateLimiter, nowSeconds);
79974
+ if (remaining === null) return null;
79975
+ return BigNumber3__default.default.max(0, nativeToUi(remaining, bank.mintDecimals));
79976
+ }
79977
+ function computeGroupRateLimitRemainingUsd(rateLimiter, nowSeconds = Date.now() / 1e3) {
79978
+ const remaining = computeRateLimiterRemainingCapacity(rateLimiter, nowSeconds);
79979
+ if (remaining === null) return null;
79980
+ return BigNumber3__default.default.max(0, remaining);
79981
+ }
79982
+ var VENUE_AVAILABLE_LIQUIDITY_BUFFER = 0.995;
79983
+ function computeVenueAvailableLiquidity(bank, venueStates) {
79984
+ const decimals = bank.mintDecimals;
79985
+ switch (bank.config.assetTag) {
79986
+ case 3 /* KAMINO */: {
79987
+ const reserveState = venueStates?.kaminoStates?.reserveState;
79988
+ if (!reserveState) return void 0;
79989
+ return new BigNumber3__default.default(
79990
+ nativeToUi(reserveState.liquidity.availableAmount.toString(), decimals)
79991
+ ).times(VENUE_AVAILABLE_LIQUIDITY_BUFFER);
79992
+ }
79993
+ case 4 /* DRIFT */: {
79994
+ const spotMarketState = venueStates?.driftStates?.spotMarketState;
79995
+ if (!spotMarketState) return void 0;
79996
+ const deposits = getDriftTokenAmount(
79997
+ spotMarketState.depositBalance,
79998
+ spotMarketState,
79999
+ "deposit" /* DEPOSIT */
80000
+ );
80001
+ const borrows = getDriftTokenAmount(
80002
+ spotMarketState.borrowBalance,
80003
+ spotMarketState,
80004
+ "borrow" /* BORROW */
80005
+ );
80006
+ const idle = deposits.sub(borrows);
80007
+ return new BigNumber3__default.default(nativeToUi(idle.isNeg() ? "0" : idle.toString(), decimals)).times(
80008
+ VENUE_AVAILABLE_LIQUIDITY_BUFFER
80009
+ );
80010
+ }
80011
+ case 6 /* JUPLEND */: {
80012
+ const reserveState = venueStates?.jupLendStates?.jupTokenReserveState;
80013
+ if (!reserveState) return void 0;
80014
+ const supplyWithInterestNative = reserveState.totalSupplyWithInterest.mul(reserveState.supplyExchangePrice).div(JUP_EXCHANGE_PRICES_PRECISION);
80015
+ const borrowWithInterestNative = reserveState.totalBorrowWithInterest.mul(reserveState.borrowExchangePrice).div(JUP_EXCHANGE_PRICES_PRECISION);
80016
+ const totalSupply = supplyWithInterestNative.add(reserveState.totalSupplyInterestFree);
80017
+ const totalBorrow = borrowWithInterestNative.add(reserveState.totalBorrowInterestFree);
80018
+ const idle = totalSupply.sub(totalBorrow);
80019
+ return new BigNumber3__default.default(nativeToUi(idle.isNeg() ? "0" : idle.toString(), decimals)).times(
80020
+ VENUE_AVAILABLE_LIQUIDITY_BUFFER
80021
+ );
80022
+ }
80023
+ default:
80024
+ return void 0;
80025
+ }
80026
+ }
79790
80027
 
79791
80028
  // src/services/bank/bank.service.ts
79792
80029
  async function freezeBankConfigIx(program, bankAddress, bankConfigOpt) {
@@ -82611,7 +82848,9 @@ var MarginfiAccountWrapper = class {
82611
82848
  assetShareValueMultiplierByBank: this.client.assetShareValueMultiplierByBank,
82612
82849
  emodeImpactStatus: borrowImpact?.status,
82613
82850
  activePair: borrowImpact?.activePair,
82614
- volatilityFactor: opts?.volatilityFactor
82851
+ volatilityFactor: opts?.volatilityFactor,
82852
+ groupRateLimiter: this.client.group.rateLimiter,
82853
+ ignoreBankLimits: opts?.ignoreBankLimits
82615
82854
  });
82616
82855
  }
82617
82856
  /**
@@ -82629,7 +82868,26 @@ var MarginfiAccountWrapper = class {
82629
82868
  bankAddress,
82630
82869
  assetShareValueMultiplierByBank: this.client.assetShareValueMultiplierByBank,
82631
82870
  activePair,
82632
- volatilityFactor: opts?.volatilityFactor
82871
+ volatilityFactor: opts?.volatilityFactor,
82872
+ groupRateLimiter: this.client.group.rateLimiter,
82873
+ venueStates: this.client.bankIntegrationMap[bankAddress.toBase58()],
82874
+ ignoreBankLimits: opts?.ignoreBankLimits
82875
+ });
82876
+ }
82877
+ /**
82878
+ * Computes max deposit for a bank with auto-injected client data.
82879
+ *
82880
+ * Bounded by the bank's remaining deposit cap and, if provided, the wallet balance.
82881
+ *
82882
+ * @param bankAddress - Bank address to check max deposit for
82883
+ * @param opts - Optional wallet balance (UI units) to cap the result
82884
+ */
82885
+ computeMaxDepositForBank(bankAddress, opts) {
82886
+ return this.account.computeMaxDepositForBank({
82887
+ banksMap: this.client.bankMap,
82888
+ bankAddress,
82889
+ assetShareValueMultiplierByBank: this.client.assetShareValueMultiplierByBank,
82890
+ walletBalance: opts?.walletBalance
82633
82891
  });
82634
82892
  }
82635
82893
  /**
@@ -83062,6 +83320,7 @@ exports.DEFAULT_ORACLE_MAX_AGE = DEFAULT_ORACLE_MAX_AGE;
83062
83320
  exports.DEFAULT_REPAY_ALL_EXTRA_BUFFER_BPS = DEFAULT_REPAY_ALL_EXTRA_BUFFER_BPS;
83063
83321
  exports.DISABLED_FLAG = DISABLED_FLAG;
83064
83322
  exports.EMPTY_HEALTH_CACHE = EMPTY_HEALTH_CACHE;
83323
+ exports.EXECUTION_HEADROOM_SECONDS = EXECUTION_HEADROOM_SECONDS;
83065
83324
  exports.EmodeEntryFlags = EmodeEntryFlags;
83066
83325
  exports.EmodeFlags = EmodeFlags;
83067
83326
  exports.EmodeImpactStatus = EmodeImpactStatus;
@@ -83110,6 +83369,7 @@ exports.PYTH_SPONSORED_SHARD_ID = PYTH_SPONSORED_SHARD_ID;
83110
83369
  exports.PriceBias = PriceBias;
83111
83370
  exports.Project0Client = Project0Client;
83112
83371
  exports.RiskTier = RiskTier;
83372
+ exports.SECONDS_PER_YEAR = SECONDS_PER_YEAR;
83113
83373
  exports.SINGLE_POOL_PROGRAM_ID = SINGLE_POOL_PROGRAM_ID;
83114
83374
  exports.STAKED_ORACLE_DISABLED_FLAG = STAKED_ORACLE_DISABLED_FLAG;
83115
83375
  exports.STAKED_ORACLE_USES_ONRAMP_FLAG = STAKED_ORACLE_USES_ONRAMP_FLAG;
@@ -83128,9 +83388,11 @@ exports.TransactionBuildingError = TransactionBuildingError;
83128
83388
  exports.TransactionBuildingErrorCode = TransactionBuildingErrorCode;
83129
83389
  exports.TransactionConfigMap = TransactionConfigMap;
83130
83390
  exports.TransactionType = TransactionType;
83391
+ exports.U64_MAX = U64_MAX;
83131
83392
  exports.USDC_DECIMALS = USDC_DECIMALS;
83132
83393
  exports.USDC_MINT = USDC_MINT;
83133
83394
  exports.USDT_MINT = USDT_MINT;
83395
+ exports.VENUE_AVAILABLE_LIQUIDITY_BUFFER = VENUE_AVAILABLE_LIQUIDITY_BUFFER;
83134
83396
  exports.WSOL_MINT = WSOL_MINT;
83135
83397
  exports.ZERO_ORACLE_KEY = ZERO_ORACLE_KEY;
83136
83398
  exports.accountConflictsWithBridgeBank = accountConflictsWithBridgeBank;
@@ -83166,15 +83428,19 @@ exports.compileFlashloanPrecheck = compileFlashloanPrecheck;
83166
83428
  exports.composeBridgedSwap = composeBridgedSwap;
83167
83429
  exports.composeRemainingAccounts = composeRemainingAccounts;
83168
83430
  exports.computeAccountValue = computeAccountValue;
83431
+ exports.computeAccrualProjectionSeconds = computeAccrualProjectionSeconds;
83169
83432
  exports.computeActiveEmodePairs = computeActiveEmodePairs;
83170
83433
  exports.computeAssetHealthComponent = computeAssetHealthComponent;
83171
83434
  exports.computeAssetUsdValue = computeAssetUsdValue;
83172
83435
  exports.computeBalanceUsdValue = computeBalanceUsdValue;
83436
+ exports.computeBankAvailableLiquidity = computeBankAvailableLiquidity;
83173
83437
  exports.computeBankBorrowApy = computeBankBorrowApy;
83174
83438
  exports.computeBankBorrowCapRemaining = computeBankBorrowCapRemaining;
83175
83439
  exports.computeBankDepositCapRemaining = computeBankDepositCapRemaining;
83176
83440
  exports.computeBankMetrics = computeBankMetrics;
83177
83441
  exports.computeBankPoolSize = computeBankPoolSize;
83442
+ exports.computeBankProjectedAvailableLiquidity = computeBankProjectedAvailableLiquidity;
83443
+ exports.computeBankRateLimitRemaining = computeBankRateLimitRemaining;
83178
83444
  exports.computeBankSupplyApy = computeBankSupplyApy;
83179
83445
  exports.computeBankTotalBorrows = computeBankTotalBorrows;
83180
83446
  exports.computeBankTotalBorrowsUsd = computeBankTotalBorrowsUsd;
@@ -83189,6 +83455,7 @@ exports.computeFlashLoanNonSwapBudget = computeFlashLoanNonSwapBudget;
83189
83455
  exports.computeFlashloanSwapConstraints = computeFlashloanSwapConstraints;
83190
83456
  exports.computeFreeCollateralFromBalances = computeFreeCollateralFromBalances;
83191
83457
  exports.computeFreeCollateralFromCache = computeFreeCollateralFromCache;
83458
+ exports.computeGroupRateLimitRemainingUsd = computeGroupRateLimitRemainingUsd;
83192
83459
  exports.computeHealthAccountMetas = computeHealthAccountMetas;
83193
83460
  exports.computeHealthCacheStatus = computeHealthCacheStatus;
83194
83461
  exports.computeHealthCheckAccounts = computeHealthCheckAccounts;
@@ -83201,6 +83468,7 @@ exports.computeLiquidationPriceForBank = computeLiquidationPriceForBank;
83201
83468
  exports.computeLoopingParams = computeLoopingParams;
83202
83469
  exports.computeLowestEmodeWeights = computeLowestEmodeWeights;
83203
83470
  exports.computeMaxBorrowForBank = computeMaxBorrowForBank;
83471
+ exports.computeMaxDepositForBank = computeMaxDepositForBank;
83204
83472
  exports.computeMaxLeverage = computeMaxLeverage;
83205
83473
  exports.computeMaxWithdrawForBank = computeMaxWithdrawForBank;
83206
83474
  exports.computeNetApy = computeNetApy;
@@ -83208,6 +83476,8 @@ exports.computeProjectedActiveBalancesNoCpi = computeProjectedActiveBalancesNoCp
83208
83476
  exports.computeProjectedActiveBanksNoCpi = computeProjectedActiveBanksNoCpi;
83209
83477
  exports.computeQuantity = computeQuantity;
83210
83478
  exports.computeQuantityUi = computeQuantityUi;
83479
+ exports.computeRateLimitWindowRemainingCapacity = computeRateLimitWindowRemainingCapacity;
83480
+ exports.computeRateLimiterRemainingCapacity = computeRateLimiterRemainingCapacity;
83211
83481
  exports.computeRemainingCapacity = computeRemainingCapacity;
83212
83482
  exports.computeSmartCrank = computeSmartCrank;
83213
83483
  exports.computeStakedBankMultipliers = computeStakedBankMultipliers;
@@ -83216,6 +83486,7 @@ exports.computeTvl = computeTvl;
83216
83486
  exports.computeUsdValue = computeUsdValue;
83217
83487
  exports.computeUtilizationRate = computeUtilizationRate;
83218
83488
  exports.computeV0TxSize = computeV0TxSize;
83489
+ exports.computeVenueAvailableLiquidity = computeVenueAvailableLiquidity;
83219
83490
  exports.convertVoteAccCoeffsToBankCoeffs = convertVoteAccCoeffsToBankCoeffs;
83220
83491
  exports.createActiveEmodePairFromPairs = createActiveEmodePairFromPairs;
83221
83492
  exports.createEmptyBalance = createEmptyBalance;
@@ -83301,6 +83572,7 @@ exports.getConfig = getConfig;
83301
83572
  exports.getDriftCTokenMultiplier = getDriftCTokenMultiplier;
83302
83573
  exports.getDriftMetadata = getDriftMetadata;
83303
83574
  exports.getDriftStatesDto = getDriftStatesDto;
83575
+ exports.getEffectiveDepositLimit = getEffectiveDepositLimit;
83304
83576
  exports.getEmodePairs = getEmodePairs;
83305
83577
  exports.getExactOutEstimate = getExactOutEstimate;
83306
83578
  exports.getFallbackPricesByFeedId = getFallbackPricesByFeedId;
@@ -83340,9 +83612,11 @@ exports.hasEmodeEntryFlag = hasEmodeEntryFlag;
83340
83612
  exports.hasEmodeFlag = hasEmodeFlag;
83341
83613
  exports.hasHealthCacheFlag = hasHealthCacheFlag;
83342
83614
  exports.healthCacheToDto = healthCacheToDto;
83615
+ exports.isBorrowLimitActive = isBorrowLimitActive;
83343
83616
  exports.isBridgeConflictError = isBridgeConflictError;
83344
83617
  exports.isDecomposableSwapError = isDecomposableSwapError;
83345
83618
  exports.isDepositIx = isDepositIx;
83619
+ exports.isDepositLimitActive = isDepositLimitActive;
83346
83620
  exports.isFlashloan = isFlashloan;
83347
83621
  exports.isGroupRateLimiterEnabled = isGroupRateLimiterEnabled;
83348
83622
  exports.isMarginfiV0110Live = isMarginfiV0110Live;