@0dotxyz/p0-ts-sdk 2.7.0 → 2.7.1-alpha.0
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 +9 -2
- package/dist/index.cjs +216 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +181 -5
- package/dist/index.d.ts +181 -5
- package/dist/index.js +203 -28
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.cts +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/{types-Ctm1kvCr.d.ts → types-B5SGXpex.d.ts} +1 -1
- package/dist/{types-DzbVhEfo.d.cts → types-BFLi0Ozl.d.cts} +1 -1
- package/package.json +1 -1
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
|
@@ -73885,6 +73885,20 @@ var MarginfiAccount = class _MarginfiAccount {
|
|
|
73885
73885
|
...params
|
|
73886
73886
|
});
|
|
73887
73887
|
}
|
|
73888
|
+
/**
|
|
73889
|
+
* Calculates the maximum amount that can be deposited into a bank.
|
|
73890
|
+
*
|
|
73891
|
+
* Deposits are not constrained by account health, only by the bank's remaining deposit cap
|
|
73892
|
+
* and (optionally) the wallet balance.
|
|
73893
|
+
*
|
|
73894
|
+
* @param params - Configuration for max deposit computation
|
|
73895
|
+
* @returns Maximum depositable amount in UI units
|
|
73896
|
+
*
|
|
73897
|
+
* @see {@link computeMaxDepositForBank} for implementation details
|
|
73898
|
+
*/
|
|
73899
|
+
computeMaxDepositForBank(params) {
|
|
73900
|
+
return computeMaxDepositForBank(params);
|
|
73901
|
+
}
|
|
73888
73902
|
/**
|
|
73889
73903
|
* Gets the banks required for health check calculations.
|
|
73890
73904
|
*
|
|
@@ -77744,7 +77758,9 @@ function computeMaxBorrowForBank(params) {
|
|
|
77744
77758
|
assetShareValueMultiplierByBank,
|
|
77745
77759
|
emodeImpactStatus,
|
|
77746
77760
|
volatilityFactor,
|
|
77747
|
-
activePair
|
|
77761
|
+
activePair,
|
|
77762
|
+
groupRateLimiter,
|
|
77763
|
+
ignoreBankLimits
|
|
77748
77764
|
} = params;
|
|
77749
77765
|
const bank = banksMap.get(bankAddress.toBase58());
|
|
77750
77766
|
if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);
|
|
@@ -77804,15 +77820,63 @@ function computeMaxBorrowForBank(params) {
|
|
|
77804
77820
|
assetShareValueMultiplier
|
|
77805
77821
|
});
|
|
77806
77822
|
const liabWeight = getLiabilityWeight(bank.config, 0 /* Initial */);
|
|
77807
|
-
|
|
77808
|
-
|
|
77809
|
-
|
|
77810
|
-
|
|
77811
|
-
|
|
77812
|
-
|
|
77823
|
+
const originationFeeFactor = new BigNumber3__default.default(1).plus(
|
|
77824
|
+
bank.config.interestRateConfig.protocolOriginationFee
|
|
77825
|
+
);
|
|
77826
|
+
const liabPriceWeighted = priceHighestBias.times(liabWeight).times(originationFeeFactor);
|
|
77827
|
+
const healthMaxBorrow = assetWeight.eq(0) ? computeQuantityUi(balance, bank, assetShareValueMultiplier).assets.plus(
|
|
77828
|
+
freeCollateral.minus(untiedCollateralForBank).div(liabPriceWeighted)
|
|
77829
|
+
) : untiedCollateralForBank.div(priceLowestBias.times(assetWeight)).plus(freeCollateral.minus(untiedCollateralForBank).div(liabPriceWeighted));
|
|
77830
|
+
if (ignoreBankLimits) return healthMaxBorrow;
|
|
77831
|
+
const borrowCapRemaining = new BigNumber3__default.default(computeBankBorrowCapRemaining(bank)).div(
|
|
77832
|
+
originationFeeFactor
|
|
77833
|
+
);
|
|
77834
|
+
const availableLiquidity = computeBankProjectedAvailableLiquidity(
|
|
77835
|
+
bank,
|
|
77836
|
+
assetShareValueMultiplier
|
|
77837
|
+
).div(originationFeeFactor);
|
|
77838
|
+
const rateLimitRemaining = computeOutflowRateLimitRemaining(bank, oraclePrice, groupRateLimiter);
|
|
77839
|
+
return BigNumber3__default.default.max(
|
|
77840
|
+
0,
|
|
77841
|
+
BigNumber3__default.default.min(healthMaxBorrow, borrowCapRemaining, availableLiquidity, rateLimitRemaining)
|
|
77842
|
+
);
|
|
77843
|
+
}
|
|
77844
|
+
function computeOutflowRateLimitRemaining(bank, oraclePrice, groupRateLimiter) {
|
|
77845
|
+
const nowSeconds = Date.now() / 1e3;
|
|
77846
|
+
let remaining = new BigNumber3__default.default(Infinity);
|
|
77847
|
+
const bankRemaining = computeBankRateLimitRemaining(bank, nowSeconds);
|
|
77848
|
+
if (bankRemaining !== null) remaining = BigNumber3__default.default.min(remaining, bankRemaining);
|
|
77849
|
+
const groupRemainingUsd = computeGroupRateLimitRemainingUsd(groupRateLimiter, nowSeconds);
|
|
77850
|
+
if (groupRemainingUsd !== null) {
|
|
77851
|
+
const price = getPrice(oraclePrice, 1 /* None */, false);
|
|
77852
|
+
if (price.gt(0)) remaining = BigNumber3__default.default.min(remaining, groupRemainingUsd.div(price));
|
|
77813
77853
|
}
|
|
77854
|
+
return remaining;
|
|
77814
77855
|
}
|
|
77815
77856
|
function computeMaxWithdrawForBank(params) {
|
|
77857
|
+
const {
|
|
77858
|
+
banksMap,
|
|
77859
|
+
bankAddress,
|
|
77860
|
+
oraclePricesByBank,
|
|
77861
|
+
assetShareValueMultiplierByBank,
|
|
77862
|
+
groupRateLimiter,
|
|
77863
|
+
ignoreBankLimits
|
|
77864
|
+
} = params;
|
|
77865
|
+
const bank = banksMap.get(bankAddress.toBase58());
|
|
77866
|
+
if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);
|
|
77867
|
+
const healthMaxWithdraw = computeHealthMaxWithdrawForBank(params);
|
|
77868
|
+
if (ignoreBankLimits) return healthMaxWithdraw;
|
|
77869
|
+
const oraclePrice = oraclePricesByBank.get(bankAddress.toBase58());
|
|
77870
|
+
if (!oraclePrice) throw Error(`Oracle price for ${bankAddress.toBase58()} not found`);
|
|
77871
|
+
const assetShareValueMultiplier = assetShareValueMultiplierByBank?.get(bankAddress.toBase58());
|
|
77872
|
+
const availableLiquidity = computeBankProjectedAvailableLiquidity(
|
|
77873
|
+
bank,
|
|
77874
|
+
assetShareValueMultiplier
|
|
77875
|
+
);
|
|
77876
|
+
const rateLimitRemaining = computeOutflowRateLimitRemaining(bank, oraclePrice, groupRateLimiter);
|
|
77877
|
+
return BigNumber3__default.default.max(0, BigNumber3__default.default.min(healthMaxWithdraw, availableLiquidity, rateLimitRemaining));
|
|
77878
|
+
}
|
|
77879
|
+
function computeHealthMaxWithdrawForBank(params) {
|
|
77816
77880
|
const {
|
|
77817
77881
|
account,
|
|
77818
77882
|
banksMap,
|
|
@@ -77908,6 +77972,17 @@ function computeMaxWithdrawForBank(params) {
|
|
|
77908
77972
|
const maxWithdraw = initUntiedCollateralForBank.div(initWeightedPrice);
|
|
77909
77973
|
return maxWithdraw;
|
|
77910
77974
|
}
|
|
77975
|
+
function computeMaxDepositForBank(params) {
|
|
77976
|
+
const { banksMap, bankAddress, assetShareValueMultiplierByBank, walletBalance } = params;
|
|
77977
|
+
const bank = banksMap.get(bankAddress.toBase58());
|
|
77978
|
+
if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);
|
|
77979
|
+
const assetShareValueMultiplier = assetShareValueMultiplierByBank?.get(bankAddress.toBase58());
|
|
77980
|
+
const depositCapRemaining = new BigNumber3__default.default(computeBankDepositCapRemaining(bank)).times(
|
|
77981
|
+
assetShareValueMultiplier ?? 1
|
|
77982
|
+
);
|
|
77983
|
+
if (walletBalance === void 0) return depositCapRemaining;
|
|
77984
|
+
return BigNumber3__default.default.max(0, BigNumber3__default.default.min(depositCapRemaining, new BigNumber3__default.default(walletBalance)));
|
|
77985
|
+
}
|
|
77911
77986
|
|
|
77912
77987
|
// src/services/account/utils/misc.utils.ts
|
|
77913
77988
|
function floor(value, decimals) {
|
|
@@ -79580,6 +79655,21 @@ var fetchMultipleBanks = async (program, opts) => {
|
|
|
79580
79655
|
}
|
|
79581
79656
|
return bankDatas;
|
|
79582
79657
|
};
|
|
79658
|
+
var U64_MAX = new BigNumber3__default.default("18446744073709551615");
|
|
79659
|
+
var DRIFT_SCALED_BALANCE_DECIMALS = 9;
|
|
79660
|
+
function isDepositLimitActive(bank) {
|
|
79661
|
+
return !bank.config.depositLimit.eq(U64_MAX);
|
|
79662
|
+
}
|
|
79663
|
+
function isBorrowLimitActive(bank) {
|
|
79664
|
+
return !bank.config.borrowLimit.eq(U64_MAX);
|
|
79665
|
+
}
|
|
79666
|
+
function getEffectiveDepositLimit(bank) {
|
|
79667
|
+
const limit = bank.config.depositLimit;
|
|
79668
|
+
if (bank.config.assetTag !== 4 /* DRIFT */) return limit;
|
|
79669
|
+
const diff = DRIFT_SCALED_BALANCE_DECIMALS - bank.mintDecimals;
|
|
79670
|
+
if (diff === 0) return limit;
|
|
79671
|
+
return diff > 0 ? limit.times(10 ** diff) : limit.div(10 ** -diff);
|
|
79672
|
+
}
|
|
79583
79673
|
function computeInterestRates(bank) {
|
|
79584
79674
|
const { insuranceFeeFixedApr, insuranceIrFee, protocolFixedFeeApr, protocolIrFee } = bank.config.interestRateConfig;
|
|
79585
79675
|
const fixedFee = insuranceFeeFixedApr.plus(protocolFixedFeeApr);
|
|
@@ -79674,25 +79764,34 @@ function computeUtilizationRate(bank) {
|
|
|
79674
79764
|
return liabilities.div(assets);
|
|
79675
79765
|
}
|
|
79676
79766
|
var SECONDS_PER_DAY = 24 * 60 * 60;
|
|
79677
|
-
var SECONDS_PER_YEAR = SECONDS_PER_DAY * 365
|
|
79767
|
+
var SECONDS_PER_YEAR = SECONDS_PER_DAY * 365;
|
|
79768
|
+
var EXECUTION_HEADROOM_SECONDS = 120;
|
|
79769
|
+
function computeAccrualProjectionSeconds(bank, nowSeconds = Date.now() / 1e3) {
|
|
79770
|
+
const age = Math.max(0, nowSeconds - bank.lastUpdate);
|
|
79771
|
+
return Math.max(2 * age, age + EXECUTION_HEADROOM_SECONDS);
|
|
79772
|
+
}
|
|
79678
79773
|
function computeRemainingCapacity(bank) {
|
|
79679
79774
|
const totalDeposits = getTotalAssetQuantity(bank);
|
|
79680
|
-
const remainingCapacity = BigNumber3__default.default.max(
|
|
79775
|
+
const remainingCapacity = isDepositLimitActive(bank) ? BigNumber3__default.default.max(
|
|
79776
|
+
0,
|
|
79777
|
+
getEffectiveDepositLimit(bank).minus(totalDeposits).minus(1).integerValue(BigNumber3__default.default.ROUND_FLOOR)
|
|
79778
|
+
) : U64_MAX;
|
|
79681
79779
|
const totalBorrows = getTotalLiabilityQuantity(bank);
|
|
79682
|
-
const remainingBorrowCapacity = BigNumber3__default.default.max(
|
|
79683
|
-
|
|
79780
|
+
const remainingBorrowCapacity = isBorrowLimitActive(bank) ? BigNumber3__default.default.max(
|
|
79781
|
+
0,
|
|
79782
|
+
bank.config.borrowLimit.minus(totalBorrows).minus(1).integerValue(BigNumber3__default.default.ROUND_FLOOR)
|
|
79783
|
+
) : U64_MAX;
|
|
79784
|
+
const projectionSeconds = computeAccrualProjectionSeconds(bank);
|
|
79684
79785
|
const { lendingRate, borrowingRate } = computeInterestRates(bank);
|
|
79685
|
-
const
|
|
79686
|
-
const
|
|
79687
|
-
const depositCapacity = remainingCapacity.minus(
|
|
79688
|
-
const borrowCapacity = remainingBorrowCapacity.minus(
|
|
79786
|
+
const projectedLendingInterest = lendingRate.times(projectionSeconds).dividedBy(SECONDS_PER_YEAR).times(totalDeposits);
|
|
79787
|
+
const projectedBorrowInterest = borrowingRate.times(projectionSeconds).dividedBy(SECONDS_PER_YEAR).times(totalBorrows);
|
|
79788
|
+
const depositCapacity = remainingCapacity.minus(projectedLendingInterest);
|
|
79789
|
+
const borrowCapacity = remainingBorrowCapacity.minus(projectedBorrowInterest);
|
|
79689
79790
|
return {
|
|
79690
79791
|
depositCapacity,
|
|
79691
79792
|
borrowCapacity
|
|
79692
79793
|
};
|
|
79693
79794
|
}
|
|
79694
|
-
|
|
79695
|
-
// src/services/bank/utils/bank-metrics.utils.ts
|
|
79696
79795
|
function isStandardBorrowable(bank) {
|
|
79697
79796
|
const { assetTag, operationalState, borrowLimit } = bank.config;
|
|
79698
79797
|
return (assetTag === 0 /* DEFAULT */ || assetTag === 1 /* SOL */) && operationalState === "Operational" /* Operational */ && borrowLimit.gt(0);
|
|
@@ -79702,9 +79801,7 @@ function isStandardDepositable(bank) {
|
|
|
79702
79801
|
return (assetTag === 0 /* DEFAULT */ || assetTag === 1 /* SOL */) && operationalState === "Operational" /* Operational */;
|
|
79703
79802
|
}
|
|
79704
79803
|
function computeBankTotalDeposits(bank, assetShareValueMultiplier) {
|
|
79705
|
-
const totalAssets = getTotalAssetQuantity(bank).times(
|
|
79706
|
-
assetShareValueMultiplier ?? 1
|
|
79707
|
-
);
|
|
79804
|
+
const totalAssets = getTotalAssetQuantity(bank).times(assetShareValueMultiplier ?? 1);
|
|
79708
79805
|
return nativeToUi(totalAssets, bank.mintDecimals);
|
|
79709
79806
|
}
|
|
79710
79807
|
function computeBankTotalBorrows(bank) {
|
|
@@ -79735,14 +79832,35 @@ function computeBankPoolSize(bank, assetShareValueMultiplier) {
|
|
|
79735
79832
|
const borrowCap = nativeToUi(bank.config.borrowLimit, bank.mintDecimals);
|
|
79736
79833
|
return Math.max(0, Math.min(totalDeposits, borrowCap) - totalBorrows);
|
|
79737
79834
|
}
|
|
79835
|
+
function computeBankAvailableLiquidity(bank, assetShareValueMultiplier) {
|
|
79836
|
+
const totalDeposits = computeBankTotalDeposits(bank, assetShareValueMultiplier);
|
|
79837
|
+
const totalBorrows = computeBankTotalBorrows(bank);
|
|
79838
|
+
return BigNumber3__default.default.max(0, new BigNumber3__default.default(totalDeposits).minus(totalBorrows));
|
|
79839
|
+
}
|
|
79738
79840
|
function computeBankDepositCapRemaining(bank) {
|
|
79841
|
+
if (!isDepositLimitActive(bank)) return Infinity;
|
|
79739
79842
|
const { depositCapacity } = computeRemainingCapacity(bank);
|
|
79740
79843
|
return Math.max(0, nativeToUi(depositCapacity, bank.mintDecimals));
|
|
79741
79844
|
}
|
|
79742
79845
|
function computeBankBorrowCapRemaining(bank) {
|
|
79846
|
+
if (!isBorrowLimitActive(bank)) return Infinity;
|
|
79743
79847
|
const { borrowCapacity } = computeRemainingCapacity(bank);
|
|
79744
79848
|
return Math.max(0, nativeToUi(borrowCapacity, bank.mintDecimals));
|
|
79745
79849
|
}
|
|
79850
|
+
function computeBankProjectedAvailableLiquidity(bank, assetShareValueMultiplier) {
|
|
79851
|
+
const liquidity = computeBankAvailableLiquidity(bank, assetShareValueMultiplier);
|
|
79852
|
+
const totalDeposits = computeBankTotalDeposits(bank, assetShareValueMultiplier);
|
|
79853
|
+
const totalBorrows = computeBankTotalBorrows(bank);
|
|
79854
|
+
const projectionYears = computeAccrualProjectionSeconds(bank) / SECONDS_PER_YEAR;
|
|
79855
|
+
const { lendingRate, borrowingRate } = computeInterestRates(bank);
|
|
79856
|
+
const projectedBorrowInterest = borrowingRate.times(totalBorrows).times(projectionYears);
|
|
79857
|
+
const projectedLendingInterest = lendingRate.times(totalDeposits).times(projectionYears);
|
|
79858
|
+
const liquidityLostToAccrual = BigNumber3__default.default.max(
|
|
79859
|
+
0,
|
|
79860
|
+
projectedBorrowInterest.minus(projectedLendingInterest)
|
|
79861
|
+
);
|
|
79862
|
+
return BigNumber3__default.default.max(0, liquidity.minus(liquidityLostToAccrual));
|
|
79863
|
+
}
|
|
79746
79864
|
function computeBankSupplyApy(bank) {
|
|
79747
79865
|
return aprToApy(computeInterestRates(bank).lendingRate.toNumber());
|
|
79748
79866
|
}
|
|
@@ -79755,11 +79873,7 @@ function computeBankMetrics(params) {
|
|
|
79755
79873
|
symbol,
|
|
79756
79874
|
totalDeposits: computeBankTotalDeposits(bank, assetShareValueMultiplier),
|
|
79757
79875
|
totalBorrows: computeBankTotalBorrows(bank),
|
|
79758
|
-
totalDepositsUsd: computeBankTotalDepositsUsd(
|
|
79759
|
-
bank,
|
|
79760
|
-
oraclePrice,
|
|
79761
|
-
assetShareValueMultiplier
|
|
79762
|
-
),
|
|
79876
|
+
totalDepositsUsd: computeBankTotalDepositsUsd(bank, oraclePrice, assetShareValueMultiplier),
|
|
79763
79877
|
totalBorrowsUsd: computeBankTotalBorrowsUsd(bank, oraclePrice),
|
|
79764
79878
|
utilizationRate: computeUtilizationRate(bank).toNumber(),
|
|
79765
79879
|
poolSize: computeBankPoolSize(bank, assetShareValueMultiplier),
|
|
@@ -79787,6 +79901,47 @@ function requireTokenProgram(tokenProgramsByBank, address, makeError = (message)
|
|
|
79787
79901
|
}
|
|
79788
79902
|
return tokenProgram;
|
|
79789
79903
|
}
|
|
79904
|
+
function computeRateLimitWindowRemainingCapacity(window, nowSeconds) {
|
|
79905
|
+
const { maxOutflow, windowDuration } = window;
|
|
79906
|
+
if (maxOutflow.lte(0)) return null;
|
|
79907
|
+
if (windowDuration === 0) return maxOutflow;
|
|
79908
|
+
let { windowStart, prevWindowOutflow, curWindowOutflow } = window;
|
|
79909
|
+
const elapsedRaw = Math.floor(nowSeconds) - windowStart;
|
|
79910
|
+
if (elapsedRaw >= windowDuration * 2) {
|
|
79911
|
+
windowStart = Math.floor(nowSeconds);
|
|
79912
|
+
prevWindowOutflow = new BigNumber3__default.default(0);
|
|
79913
|
+
curWindowOutflow = new BigNumber3__default.default(0);
|
|
79914
|
+
} else if (elapsedRaw >= windowDuration) {
|
|
79915
|
+
windowStart = windowStart + windowDuration;
|
|
79916
|
+
prevWindowOutflow = curWindowOutflow;
|
|
79917
|
+
curWindowOutflow = new BigNumber3__default.default(0);
|
|
79918
|
+
}
|
|
79919
|
+
const elapsed = Math.floor(nowSeconds) - windowStart;
|
|
79920
|
+
if (elapsed < 0) return new BigNumber3__default.default(0);
|
|
79921
|
+
if (elapsed >= windowDuration) return maxOutflow;
|
|
79922
|
+
const remainingTime = windowDuration - elapsed;
|
|
79923
|
+
const weightedPrev = prevWindowOutflow.abs().times(remainingTime).idiv(windowDuration).times(prevWindowOutflow.isNegative() ? -1 : 1);
|
|
79924
|
+
const totalNetOutflow = weightedPrev.plus(curWindowOutflow);
|
|
79925
|
+
return maxOutflow.minus(totalNetOutflow);
|
|
79926
|
+
}
|
|
79927
|
+
function computeRateLimiterRemainingCapacity(rateLimiter, nowSeconds) {
|
|
79928
|
+
if (!rateLimiter) return null;
|
|
79929
|
+
const hourly = computeRateLimitWindowRemainingCapacity(rateLimiter.hourly, nowSeconds);
|
|
79930
|
+
const daily = computeRateLimitWindowRemainingCapacity(rateLimiter.daily, nowSeconds);
|
|
79931
|
+
if (hourly === null) return daily;
|
|
79932
|
+
if (daily === null) return hourly;
|
|
79933
|
+
return BigNumber3__default.default.min(hourly, daily);
|
|
79934
|
+
}
|
|
79935
|
+
function computeBankRateLimitRemaining(bank, nowSeconds = Date.now() / 1e3) {
|
|
79936
|
+
const remaining = computeRateLimiterRemainingCapacity(bank.rateLimiter, nowSeconds);
|
|
79937
|
+
if (remaining === null) return null;
|
|
79938
|
+
return BigNumber3__default.default.max(0, nativeToUi(remaining, bank.mintDecimals));
|
|
79939
|
+
}
|
|
79940
|
+
function computeGroupRateLimitRemainingUsd(rateLimiter, nowSeconds = Date.now() / 1e3) {
|
|
79941
|
+
const remaining = computeRateLimiterRemainingCapacity(rateLimiter, nowSeconds);
|
|
79942
|
+
if (remaining === null) return null;
|
|
79943
|
+
return BigNumber3__default.default.max(0, remaining);
|
|
79944
|
+
}
|
|
79790
79945
|
|
|
79791
79946
|
// src/services/bank/bank.service.ts
|
|
79792
79947
|
async function freezeBankConfigIx(program, bankAddress, bankConfigOpt) {
|
|
@@ -82611,7 +82766,9 @@ var MarginfiAccountWrapper = class {
|
|
|
82611
82766
|
assetShareValueMultiplierByBank: this.client.assetShareValueMultiplierByBank,
|
|
82612
82767
|
emodeImpactStatus: borrowImpact?.status,
|
|
82613
82768
|
activePair: borrowImpact?.activePair,
|
|
82614
|
-
volatilityFactor: opts?.volatilityFactor
|
|
82769
|
+
volatilityFactor: opts?.volatilityFactor,
|
|
82770
|
+
groupRateLimiter: this.client.group.rateLimiter,
|
|
82771
|
+
ignoreBankLimits: opts?.ignoreBankLimits
|
|
82615
82772
|
});
|
|
82616
82773
|
}
|
|
82617
82774
|
/**
|
|
@@ -82629,7 +82786,25 @@ var MarginfiAccountWrapper = class {
|
|
|
82629
82786
|
bankAddress,
|
|
82630
82787
|
assetShareValueMultiplierByBank: this.client.assetShareValueMultiplierByBank,
|
|
82631
82788
|
activePair,
|
|
82632
|
-
volatilityFactor: opts?.volatilityFactor
|
|
82789
|
+
volatilityFactor: opts?.volatilityFactor,
|
|
82790
|
+
groupRateLimiter: this.client.group.rateLimiter,
|
|
82791
|
+
ignoreBankLimits: opts?.ignoreBankLimits
|
|
82792
|
+
});
|
|
82793
|
+
}
|
|
82794
|
+
/**
|
|
82795
|
+
* Computes max deposit for a bank with auto-injected client data.
|
|
82796
|
+
*
|
|
82797
|
+
* Bounded by the bank's remaining deposit cap and, if provided, the wallet balance.
|
|
82798
|
+
*
|
|
82799
|
+
* @param bankAddress - Bank address to check max deposit for
|
|
82800
|
+
* @param opts - Optional wallet balance (UI units) to cap the result
|
|
82801
|
+
*/
|
|
82802
|
+
computeMaxDepositForBank(bankAddress, opts) {
|
|
82803
|
+
return this.account.computeMaxDepositForBank({
|
|
82804
|
+
banksMap: this.client.bankMap,
|
|
82805
|
+
bankAddress,
|
|
82806
|
+
assetShareValueMultiplierByBank: this.client.assetShareValueMultiplierByBank,
|
|
82807
|
+
walletBalance: opts?.walletBalance
|
|
82633
82808
|
});
|
|
82634
82809
|
}
|
|
82635
82810
|
/**
|
|
@@ -83062,6 +83237,7 @@ exports.DEFAULT_ORACLE_MAX_AGE = DEFAULT_ORACLE_MAX_AGE;
|
|
|
83062
83237
|
exports.DEFAULT_REPAY_ALL_EXTRA_BUFFER_BPS = DEFAULT_REPAY_ALL_EXTRA_BUFFER_BPS;
|
|
83063
83238
|
exports.DISABLED_FLAG = DISABLED_FLAG;
|
|
83064
83239
|
exports.EMPTY_HEALTH_CACHE = EMPTY_HEALTH_CACHE;
|
|
83240
|
+
exports.EXECUTION_HEADROOM_SECONDS = EXECUTION_HEADROOM_SECONDS;
|
|
83065
83241
|
exports.EmodeEntryFlags = EmodeEntryFlags;
|
|
83066
83242
|
exports.EmodeFlags = EmodeFlags;
|
|
83067
83243
|
exports.EmodeImpactStatus = EmodeImpactStatus;
|
|
@@ -83110,6 +83286,7 @@ exports.PYTH_SPONSORED_SHARD_ID = PYTH_SPONSORED_SHARD_ID;
|
|
|
83110
83286
|
exports.PriceBias = PriceBias;
|
|
83111
83287
|
exports.Project0Client = Project0Client;
|
|
83112
83288
|
exports.RiskTier = RiskTier;
|
|
83289
|
+
exports.SECONDS_PER_YEAR = SECONDS_PER_YEAR;
|
|
83113
83290
|
exports.SINGLE_POOL_PROGRAM_ID = SINGLE_POOL_PROGRAM_ID;
|
|
83114
83291
|
exports.STAKED_ORACLE_DISABLED_FLAG = STAKED_ORACLE_DISABLED_FLAG;
|
|
83115
83292
|
exports.STAKED_ORACLE_USES_ONRAMP_FLAG = STAKED_ORACLE_USES_ONRAMP_FLAG;
|
|
@@ -83128,6 +83305,7 @@ exports.TransactionBuildingError = TransactionBuildingError;
|
|
|
83128
83305
|
exports.TransactionBuildingErrorCode = TransactionBuildingErrorCode;
|
|
83129
83306
|
exports.TransactionConfigMap = TransactionConfigMap;
|
|
83130
83307
|
exports.TransactionType = TransactionType;
|
|
83308
|
+
exports.U64_MAX = U64_MAX;
|
|
83131
83309
|
exports.USDC_DECIMALS = USDC_DECIMALS;
|
|
83132
83310
|
exports.USDC_MINT = USDC_MINT;
|
|
83133
83311
|
exports.USDT_MINT = USDT_MINT;
|
|
@@ -83166,15 +83344,19 @@ exports.compileFlashloanPrecheck = compileFlashloanPrecheck;
|
|
|
83166
83344
|
exports.composeBridgedSwap = composeBridgedSwap;
|
|
83167
83345
|
exports.composeRemainingAccounts = composeRemainingAccounts;
|
|
83168
83346
|
exports.computeAccountValue = computeAccountValue;
|
|
83347
|
+
exports.computeAccrualProjectionSeconds = computeAccrualProjectionSeconds;
|
|
83169
83348
|
exports.computeActiveEmodePairs = computeActiveEmodePairs;
|
|
83170
83349
|
exports.computeAssetHealthComponent = computeAssetHealthComponent;
|
|
83171
83350
|
exports.computeAssetUsdValue = computeAssetUsdValue;
|
|
83172
83351
|
exports.computeBalanceUsdValue = computeBalanceUsdValue;
|
|
83352
|
+
exports.computeBankAvailableLiquidity = computeBankAvailableLiquidity;
|
|
83173
83353
|
exports.computeBankBorrowApy = computeBankBorrowApy;
|
|
83174
83354
|
exports.computeBankBorrowCapRemaining = computeBankBorrowCapRemaining;
|
|
83175
83355
|
exports.computeBankDepositCapRemaining = computeBankDepositCapRemaining;
|
|
83176
83356
|
exports.computeBankMetrics = computeBankMetrics;
|
|
83177
83357
|
exports.computeBankPoolSize = computeBankPoolSize;
|
|
83358
|
+
exports.computeBankProjectedAvailableLiquidity = computeBankProjectedAvailableLiquidity;
|
|
83359
|
+
exports.computeBankRateLimitRemaining = computeBankRateLimitRemaining;
|
|
83178
83360
|
exports.computeBankSupplyApy = computeBankSupplyApy;
|
|
83179
83361
|
exports.computeBankTotalBorrows = computeBankTotalBorrows;
|
|
83180
83362
|
exports.computeBankTotalBorrowsUsd = computeBankTotalBorrowsUsd;
|
|
@@ -83189,6 +83371,7 @@ exports.computeFlashLoanNonSwapBudget = computeFlashLoanNonSwapBudget;
|
|
|
83189
83371
|
exports.computeFlashloanSwapConstraints = computeFlashloanSwapConstraints;
|
|
83190
83372
|
exports.computeFreeCollateralFromBalances = computeFreeCollateralFromBalances;
|
|
83191
83373
|
exports.computeFreeCollateralFromCache = computeFreeCollateralFromCache;
|
|
83374
|
+
exports.computeGroupRateLimitRemainingUsd = computeGroupRateLimitRemainingUsd;
|
|
83192
83375
|
exports.computeHealthAccountMetas = computeHealthAccountMetas;
|
|
83193
83376
|
exports.computeHealthCacheStatus = computeHealthCacheStatus;
|
|
83194
83377
|
exports.computeHealthCheckAccounts = computeHealthCheckAccounts;
|
|
@@ -83201,6 +83384,7 @@ exports.computeLiquidationPriceForBank = computeLiquidationPriceForBank;
|
|
|
83201
83384
|
exports.computeLoopingParams = computeLoopingParams;
|
|
83202
83385
|
exports.computeLowestEmodeWeights = computeLowestEmodeWeights;
|
|
83203
83386
|
exports.computeMaxBorrowForBank = computeMaxBorrowForBank;
|
|
83387
|
+
exports.computeMaxDepositForBank = computeMaxDepositForBank;
|
|
83204
83388
|
exports.computeMaxLeverage = computeMaxLeverage;
|
|
83205
83389
|
exports.computeMaxWithdrawForBank = computeMaxWithdrawForBank;
|
|
83206
83390
|
exports.computeNetApy = computeNetApy;
|
|
@@ -83208,6 +83392,8 @@ exports.computeProjectedActiveBalancesNoCpi = computeProjectedActiveBalancesNoCp
|
|
|
83208
83392
|
exports.computeProjectedActiveBanksNoCpi = computeProjectedActiveBanksNoCpi;
|
|
83209
83393
|
exports.computeQuantity = computeQuantity;
|
|
83210
83394
|
exports.computeQuantityUi = computeQuantityUi;
|
|
83395
|
+
exports.computeRateLimitWindowRemainingCapacity = computeRateLimitWindowRemainingCapacity;
|
|
83396
|
+
exports.computeRateLimiterRemainingCapacity = computeRateLimiterRemainingCapacity;
|
|
83211
83397
|
exports.computeRemainingCapacity = computeRemainingCapacity;
|
|
83212
83398
|
exports.computeSmartCrank = computeSmartCrank;
|
|
83213
83399
|
exports.computeStakedBankMultipliers = computeStakedBankMultipliers;
|
|
@@ -83301,6 +83487,7 @@ exports.getConfig = getConfig;
|
|
|
83301
83487
|
exports.getDriftCTokenMultiplier = getDriftCTokenMultiplier;
|
|
83302
83488
|
exports.getDriftMetadata = getDriftMetadata;
|
|
83303
83489
|
exports.getDriftStatesDto = getDriftStatesDto;
|
|
83490
|
+
exports.getEffectiveDepositLimit = getEffectiveDepositLimit;
|
|
83304
83491
|
exports.getEmodePairs = getEmodePairs;
|
|
83305
83492
|
exports.getExactOutEstimate = getExactOutEstimate;
|
|
83306
83493
|
exports.getFallbackPricesByFeedId = getFallbackPricesByFeedId;
|
|
@@ -83340,9 +83527,11 @@ exports.hasEmodeEntryFlag = hasEmodeEntryFlag;
|
|
|
83340
83527
|
exports.hasEmodeFlag = hasEmodeFlag;
|
|
83341
83528
|
exports.hasHealthCacheFlag = hasHealthCacheFlag;
|
|
83342
83529
|
exports.healthCacheToDto = healthCacheToDto;
|
|
83530
|
+
exports.isBorrowLimitActive = isBorrowLimitActive;
|
|
83343
83531
|
exports.isBridgeConflictError = isBridgeConflictError;
|
|
83344
83532
|
exports.isDecomposableSwapError = isDecomposableSwapError;
|
|
83345
83533
|
exports.isDepositIx = isDepositIx;
|
|
83534
|
+
exports.isDepositLimitActive = isDepositLimitActive;
|
|
83346
83535
|
exports.isFlashloan = isFlashloan;
|
|
83347
83536
|
exports.isGroupRateLimiterEnabled = isGroupRateLimiterEnabled;
|
|
83348
83537
|
exports.isMarginfiV0110Live = isMarginfiV0110Live;
|