@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 +9 -2
- package/dist/index.cjs +301 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +226 -6
- package/dist/index.d.ts +226 -6
- package/dist/index.js +286 -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
|
@@ -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
|
-
|
|
77808
|
-
|
|
77809
|
-
|
|
77810
|
-
|
|
77811
|
-
|
|
77812
|
-
|
|
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
|
|
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(
|
|
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(
|
|
79683
|
-
|
|
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
|
|
79686
|
-
const
|
|
79687
|
-
const depositCapacity = remainingCapacity.minus(
|
|
79688
|
-
const borrowCapacity = remainingBorrowCapacity.minus(
|
|
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;
|