@0dotxyz/p0-ts-sdk 2.7.1-alpha.1 → 2.7.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 +2 -9
- package/dist/index.cjs +30 -301
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -229
- package/dist/index.d.ts +10 -229
- package/dist/index.js +31 -286
- package/dist/index.js.map +1 -1
- package/dist/instructions.cjs.map +1 -1
- package/dist/instructions.d.cts +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.js.map +1 -1
- package/dist/{types-B5SGXpex.d.ts → types-Ctm1kvCr.d.ts} +1 -1
- package/dist/{types-BFLi0Ozl.d.cts → types-DzbVhEfo.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
|
|
102
102
|
const maxBorrow = wrappedAccount.computeMaxBorrowForBank(usdcBank.address);
|
|
103
103
|
console.log(`Max borrow: $${maxBorrow.toString()}`);
|
|
104
104
|
|
|
@@ -289,16 +289,9 @@ const health = wrapped.computeHealthComponents(
|
|
|
289
289
|
MarginRequirementType.Initial // or Maintenance
|
|
290
290
|
);
|
|
291
291
|
|
|
292
|
-
// Max amounts
|
|
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)
|
|
292
|
+
// Max amounts
|
|
297
293
|
const maxBorrow = wrapped.computeMaxBorrowForBank(bankAddress);
|
|
298
294
|
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
|
|
302
295
|
```
|
|
303
296
|
|
|
304
297
|
## 🧪 Testing
|
package/dist/index.cjs
CHANGED
|
@@ -27746,11 +27746,6 @@ 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
|
-
|
|
27754
27749
|
// src/vendor/drift/idl/drift.json
|
|
27755
27750
|
var drift_default = {
|
|
27756
27751
|
address: "dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH",
|
|
@@ -42116,34 +42111,6 @@ function deriveDriftSpotMarketVault(marketIndex, programId = DRIFT_PROGRAM_ID) {
|
|
|
42116
42111
|
programId
|
|
42117
42112
|
);
|
|
42118
42113
|
}
|
|
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
|
-
}
|
|
42147
42114
|
|
|
42148
42115
|
// src/vendor/drift/utils/rewards.utils.ts
|
|
42149
42116
|
async function getDriftRewards(spotMarkets, userStates, connection) {
|
|
@@ -69542,6 +69509,7 @@ function makeEndFlashLoanIx2(programId, accounts, remainingAccounts = []) {
|
|
|
69542
69509
|
{ pubkey: accounts.group, isSigner: false, isWritable: false },
|
|
69543
69510
|
{ pubkey: accounts.authority, isSigner: true, isWritable: false }
|
|
69544
69511
|
];
|
|
69512
|
+
if (!isMarginfiV0110Live(programId)) keys.splice(1, 1);
|
|
69545
69513
|
keys.push(...remainingAccounts);
|
|
69546
69514
|
return new web3_js.TransactionInstruction({
|
|
69547
69515
|
keys,
|
|
@@ -69751,6 +69719,7 @@ function makePulseHealthIx3(programId, accounts, remainingAccounts = []) {
|
|
|
69751
69719
|
{ pubkey: accounts.marginfiAccount, isSigner: false, isWritable: true },
|
|
69752
69720
|
{ pubkey: accounts.group, isSigner: false, isWritable: false }
|
|
69753
69721
|
];
|
|
69722
|
+
if (!isMarginfiV0110Live(programId)) keys.splice(1, 1);
|
|
69754
69723
|
keys.push(...remainingAccounts);
|
|
69755
69724
|
return new web3_js.TransactionInstruction({
|
|
69756
69725
|
keys,
|
|
@@ -69770,6 +69739,7 @@ function makeAccountTransferToNewAccountIx2(programId, accounts) {
|
|
|
69770
69739
|
{ pubkey: accounts.feeState, isSigner: false, isWritable: false },
|
|
69771
69740
|
{ pubkey: web3_js.SystemProgram.programId, isSigner: false, isWritable: false }
|
|
69772
69741
|
];
|
|
69742
|
+
if (!isMarginfiV0110Live(programId)) keys.splice(7, 1);
|
|
69773
69743
|
return new web3_js.TransactionInstruction({
|
|
69774
69744
|
keys,
|
|
69775
69745
|
programId,
|
|
@@ -73918,20 +73888,6 @@ var MarginfiAccount = class _MarginfiAccount {
|
|
|
73918
73888
|
...params
|
|
73919
73889
|
});
|
|
73920
73890
|
}
|
|
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
|
-
}
|
|
73935
73891
|
/**
|
|
73936
73892
|
* Gets the banks required for health check calculations.
|
|
73937
73893
|
*
|
|
@@ -77791,9 +77747,7 @@ function computeMaxBorrowForBank(params) {
|
|
|
77791
77747
|
assetShareValueMultiplierByBank,
|
|
77792
77748
|
emodeImpactStatus,
|
|
77793
77749
|
volatilityFactor,
|
|
77794
|
-
activePair
|
|
77795
|
-
groupRateLimiter,
|
|
77796
|
-
ignoreBankLimits
|
|
77750
|
+
activePair
|
|
77797
77751
|
} = params;
|
|
77798
77752
|
const bank = banksMap.get(bankAddress.toBase58());
|
|
77799
77753
|
if (!bank) throw Error(`Bank ${bankAddress.toBase58()} not found`);
|
|
@@ -77853,67 +77807,15 @@ function computeMaxBorrowForBank(params) {
|
|
|
77853
77807
|
assetShareValueMultiplier
|
|
77854
77808
|
});
|
|
77855
77809
|
const liabWeight = getLiabilityWeight(bank.config, 0 /* Initial */);
|
|
77856
|
-
|
|
77857
|
-
bank.
|
|
77858
|
-
|
|
77859
|
-
|
|
77860
|
-
|
|
77861
|
-
freeCollateral.minus(untiedCollateralForBank).div(
|
|
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));
|
|
77810
|
+
if (assetWeight.eq(0)) {
|
|
77811
|
+
return computeQuantityUi(balance, bank, assetShareValueMultiplier).assets.plus(
|
|
77812
|
+
freeCollateral.minus(untiedCollateralForBank).div(priceHighestBias.times(liabWeight))
|
|
77813
|
+
);
|
|
77814
|
+
} else {
|
|
77815
|
+
return untiedCollateralForBank.div(priceLowestBias.times(assetWeight)).plus(freeCollateral.minus(untiedCollateralForBank).div(priceHighestBias.times(liabWeight)));
|
|
77886
77816
|
}
|
|
77887
|
-
return remaining;
|
|
77888
77817
|
}
|
|
77889
77818
|
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) {
|
|
77917
77819
|
const {
|
|
77918
77820
|
account,
|
|
77919
77821
|
banksMap,
|
|
@@ -78009,17 +77911,6 @@ function computeHealthMaxWithdrawForBank(params) {
|
|
|
78009
77911
|
const maxWithdraw = initUntiedCollateralForBank.div(initWeightedPrice);
|
|
78010
77912
|
return maxWithdraw;
|
|
78011
77913
|
}
|
|
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
|
-
}
|
|
78023
77914
|
|
|
78024
77915
|
// src/services/account/utils/misc.utils.ts
|
|
78025
77916
|
function floor(value, decimals) {
|
|
@@ -79692,21 +79583,6 @@ var fetchMultipleBanks = async (program, opts) => {
|
|
|
79692
79583
|
}
|
|
79693
79584
|
return bankDatas;
|
|
79694
79585
|
};
|
|
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
|
-
}
|
|
79710
79586
|
function computeInterestRates(bank) {
|
|
79711
79587
|
const { insuranceFeeFixedApr, insuranceIrFee, protocolFixedFeeApr, protocolIrFee } = bank.config.interestRateConfig;
|
|
79712
79588
|
const fixedFee = insuranceFeeFixedApr.plus(protocolFixedFeeApr);
|
|
@@ -79801,34 +79677,25 @@ function computeUtilizationRate(bank) {
|
|
|
79801
79677
|
return liabilities.div(assets);
|
|
79802
79678
|
}
|
|
79803
79679
|
var SECONDS_PER_DAY = 24 * 60 * 60;
|
|
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
|
-
}
|
|
79680
|
+
var SECONDS_PER_YEAR = SECONDS_PER_DAY * 365.25;
|
|
79810
79681
|
function computeRemainingCapacity(bank) {
|
|
79811
79682
|
const totalDeposits = getTotalAssetQuantity(bank);
|
|
79812
|
-
const remainingCapacity =
|
|
79813
|
-
0,
|
|
79814
|
-
getEffectiveDepositLimit(bank).minus(totalDeposits).minus(1).integerValue(BigNumber3__default.default.ROUND_FLOOR)
|
|
79815
|
-
) : U64_MAX;
|
|
79683
|
+
const remainingCapacity = BigNumber3__default.default.max(0, bank.config.depositLimit.minus(totalDeposits));
|
|
79816
79684
|
const totalBorrows = getTotalLiabilityQuantity(bank);
|
|
79817
|
-
const remainingBorrowCapacity =
|
|
79818
|
-
|
|
79819
|
-
bank.config.borrowLimit.minus(totalBorrows).minus(1).integerValue(BigNumber3__default.default.ROUND_FLOOR)
|
|
79820
|
-
) : U64_MAX;
|
|
79821
|
-
const projectionSeconds = computeAccrualProjectionSeconds(bank);
|
|
79685
|
+
const remainingBorrowCapacity = BigNumber3__default.default.max(0, bank.config.borrowLimit.minus(totalBorrows));
|
|
79686
|
+
const durationSinceLastAccrual = Date.now() / 1e3 - bank.lastUpdate;
|
|
79822
79687
|
const { lendingRate, borrowingRate } = computeInterestRates(bank);
|
|
79823
|
-
const
|
|
79824
|
-
const
|
|
79825
|
-
const depositCapacity = remainingCapacity.minus(
|
|
79826
|
-
const borrowCapacity = remainingBorrowCapacity.minus(
|
|
79688
|
+
const outstandingLendingInterest = lendingRate.times(durationSinceLastAccrual).dividedBy(SECONDS_PER_YEAR).times(totalDeposits);
|
|
79689
|
+
const outstandingBorrowInterest = borrowingRate.times(durationSinceLastAccrual).dividedBy(SECONDS_PER_YEAR).times(totalBorrows);
|
|
79690
|
+
const depositCapacity = remainingCapacity.minus(outstandingLendingInterest.times(2));
|
|
79691
|
+
const borrowCapacity = remainingBorrowCapacity.minus(outstandingBorrowInterest.times(2));
|
|
79827
79692
|
return {
|
|
79828
79693
|
depositCapacity,
|
|
79829
79694
|
borrowCapacity
|
|
79830
79695
|
};
|
|
79831
79696
|
}
|
|
79697
|
+
|
|
79698
|
+
// src/services/bank/utils/bank-metrics.utils.ts
|
|
79832
79699
|
function isStandardBorrowable(bank) {
|
|
79833
79700
|
const { assetTag, operationalState, borrowLimit } = bank.config;
|
|
79834
79701
|
return (assetTag === 0 /* DEFAULT */ || assetTag === 1 /* SOL */) && operationalState === "Operational" /* Operational */ && borrowLimit.gt(0);
|
|
@@ -79838,7 +79705,9 @@ function isStandardDepositable(bank) {
|
|
|
79838
79705
|
return (assetTag === 0 /* DEFAULT */ || assetTag === 1 /* SOL */) && operationalState === "Operational" /* Operational */;
|
|
79839
79706
|
}
|
|
79840
79707
|
function computeBankTotalDeposits(bank, assetShareValueMultiplier) {
|
|
79841
|
-
const totalAssets = getTotalAssetQuantity(bank).times(
|
|
79708
|
+
const totalAssets = getTotalAssetQuantity(bank).times(
|
|
79709
|
+
assetShareValueMultiplier ?? 1
|
|
79710
|
+
);
|
|
79842
79711
|
return nativeToUi(totalAssets, bank.mintDecimals);
|
|
79843
79712
|
}
|
|
79844
79713
|
function computeBankTotalBorrows(bank) {
|
|
@@ -79869,35 +79738,14 @@ function computeBankPoolSize(bank, assetShareValueMultiplier) {
|
|
|
79869
79738
|
const borrowCap = nativeToUi(bank.config.borrowLimit, bank.mintDecimals);
|
|
79870
79739
|
return Math.max(0, Math.min(totalDeposits, borrowCap) - totalBorrows);
|
|
79871
79740
|
}
|
|
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
|
-
}
|
|
79877
79741
|
function computeBankDepositCapRemaining(bank) {
|
|
79878
|
-
if (!isDepositLimitActive(bank)) return Infinity;
|
|
79879
79742
|
const { depositCapacity } = computeRemainingCapacity(bank);
|
|
79880
79743
|
return Math.max(0, nativeToUi(depositCapacity, bank.mintDecimals));
|
|
79881
79744
|
}
|
|
79882
79745
|
function computeBankBorrowCapRemaining(bank) {
|
|
79883
|
-
if (!isBorrowLimitActive(bank)) return Infinity;
|
|
79884
79746
|
const { borrowCapacity } = computeRemainingCapacity(bank);
|
|
79885
79747
|
return Math.max(0, nativeToUi(borrowCapacity, bank.mintDecimals));
|
|
79886
79748
|
}
|
|
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
|
-
}
|
|
79901
79749
|
function computeBankSupplyApy(bank) {
|
|
79902
79750
|
return aprToApy(computeInterestRates(bank).lendingRate.toNumber());
|
|
79903
79751
|
}
|
|
@@ -79910,7 +79758,11 @@ function computeBankMetrics(params) {
|
|
|
79910
79758
|
symbol,
|
|
79911
79759
|
totalDeposits: computeBankTotalDeposits(bank, assetShareValueMultiplier),
|
|
79912
79760
|
totalBorrows: computeBankTotalBorrows(bank),
|
|
79913
|
-
totalDepositsUsd: computeBankTotalDepositsUsd(
|
|
79761
|
+
totalDepositsUsd: computeBankTotalDepositsUsd(
|
|
79762
|
+
bank,
|
|
79763
|
+
oraclePrice,
|
|
79764
|
+
assetShareValueMultiplier
|
|
79765
|
+
),
|
|
79914
79766
|
totalBorrowsUsd: computeBankTotalBorrowsUsd(bank, oraclePrice),
|
|
79915
79767
|
utilizationRate: computeUtilizationRate(bank).toNumber(),
|
|
79916
79768
|
poolSize: computeBankPoolSize(bank, assetShareValueMultiplier),
|
|
@@ -79938,92 +79790,6 @@ function requireTokenProgram(tokenProgramsByBank, address, makeError = (message)
|
|
|
79938
79790
|
}
|
|
79939
79791
|
return tokenProgram;
|
|
79940
79792
|
}
|
|
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
|
-
}
|
|
80027
79793
|
|
|
80028
79794
|
// src/services/bank/bank.service.ts
|
|
80029
79795
|
async function freezeBankConfigIx(program, bankAddress, bankConfigOpt) {
|
|
@@ -82848,9 +82614,7 @@ var MarginfiAccountWrapper = class {
|
|
|
82848
82614
|
assetShareValueMultiplierByBank: this.client.assetShareValueMultiplierByBank,
|
|
82849
82615
|
emodeImpactStatus: borrowImpact?.status,
|
|
82850
82616
|
activePair: borrowImpact?.activePair,
|
|
82851
|
-
volatilityFactor: opts?.volatilityFactor
|
|
82852
|
-
groupRateLimiter: this.client.group.rateLimiter,
|
|
82853
|
-
ignoreBankLimits: opts?.ignoreBankLimits
|
|
82617
|
+
volatilityFactor: opts?.volatilityFactor
|
|
82854
82618
|
});
|
|
82855
82619
|
}
|
|
82856
82620
|
/**
|
|
@@ -82868,26 +82632,7 @@ var MarginfiAccountWrapper = class {
|
|
|
82868
82632
|
bankAddress,
|
|
82869
82633
|
assetShareValueMultiplierByBank: this.client.assetShareValueMultiplierByBank,
|
|
82870
82634
|
activePair,
|
|
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
|
|
82635
|
+
volatilityFactor: opts?.volatilityFactor
|
|
82891
82636
|
});
|
|
82892
82637
|
}
|
|
82893
82638
|
/**
|
|
@@ -83320,7 +83065,6 @@ exports.DEFAULT_ORACLE_MAX_AGE = DEFAULT_ORACLE_MAX_AGE;
|
|
|
83320
83065
|
exports.DEFAULT_REPAY_ALL_EXTRA_BUFFER_BPS = DEFAULT_REPAY_ALL_EXTRA_BUFFER_BPS;
|
|
83321
83066
|
exports.DISABLED_FLAG = DISABLED_FLAG;
|
|
83322
83067
|
exports.EMPTY_HEALTH_CACHE = EMPTY_HEALTH_CACHE;
|
|
83323
|
-
exports.EXECUTION_HEADROOM_SECONDS = EXECUTION_HEADROOM_SECONDS;
|
|
83324
83068
|
exports.EmodeEntryFlags = EmodeEntryFlags;
|
|
83325
83069
|
exports.EmodeFlags = EmodeFlags;
|
|
83326
83070
|
exports.EmodeImpactStatus = EmodeImpactStatus;
|
|
@@ -83369,7 +83113,6 @@ exports.PYTH_SPONSORED_SHARD_ID = PYTH_SPONSORED_SHARD_ID;
|
|
|
83369
83113
|
exports.PriceBias = PriceBias;
|
|
83370
83114
|
exports.Project0Client = Project0Client;
|
|
83371
83115
|
exports.RiskTier = RiskTier;
|
|
83372
|
-
exports.SECONDS_PER_YEAR = SECONDS_PER_YEAR;
|
|
83373
83116
|
exports.SINGLE_POOL_PROGRAM_ID = SINGLE_POOL_PROGRAM_ID;
|
|
83374
83117
|
exports.STAKED_ORACLE_DISABLED_FLAG = STAKED_ORACLE_DISABLED_FLAG;
|
|
83375
83118
|
exports.STAKED_ORACLE_USES_ONRAMP_FLAG = STAKED_ORACLE_USES_ONRAMP_FLAG;
|
|
@@ -83388,11 +83131,9 @@ exports.TransactionBuildingError = TransactionBuildingError;
|
|
|
83388
83131
|
exports.TransactionBuildingErrorCode = TransactionBuildingErrorCode;
|
|
83389
83132
|
exports.TransactionConfigMap = TransactionConfigMap;
|
|
83390
83133
|
exports.TransactionType = TransactionType;
|
|
83391
|
-
exports.U64_MAX = U64_MAX;
|
|
83392
83134
|
exports.USDC_DECIMALS = USDC_DECIMALS;
|
|
83393
83135
|
exports.USDC_MINT = USDC_MINT;
|
|
83394
83136
|
exports.USDT_MINT = USDT_MINT;
|
|
83395
|
-
exports.VENUE_AVAILABLE_LIQUIDITY_BUFFER = VENUE_AVAILABLE_LIQUIDITY_BUFFER;
|
|
83396
83137
|
exports.WSOL_MINT = WSOL_MINT;
|
|
83397
83138
|
exports.ZERO_ORACLE_KEY = ZERO_ORACLE_KEY;
|
|
83398
83139
|
exports.accountConflictsWithBridgeBank = accountConflictsWithBridgeBank;
|
|
@@ -83428,19 +83169,15 @@ exports.compileFlashloanPrecheck = compileFlashloanPrecheck;
|
|
|
83428
83169
|
exports.composeBridgedSwap = composeBridgedSwap;
|
|
83429
83170
|
exports.composeRemainingAccounts = composeRemainingAccounts;
|
|
83430
83171
|
exports.computeAccountValue = computeAccountValue;
|
|
83431
|
-
exports.computeAccrualProjectionSeconds = computeAccrualProjectionSeconds;
|
|
83432
83172
|
exports.computeActiveEmodePairs = computeActiveEmodePairs;
|
|
83433
83173
|
exports.computeAssetHealthComponent = computeAssetHealthComponent;
|
|
83434
83174
|
exports.computeAssetUsdValue = computeAssetUsdValue;
|
|
83435
83175
|
exports.computeBalanceUsdValue = computeBalanceUsdValue;
|
|
83436
|
-
exports.computeBankAvailableLiquidity = computeBankAvailableLiquidity;
|
|
83437
83176
|
exports.computeBankBorrowApy = computeBankBorrowApy;
|
|
83438
83177
|
exports.computeBankBorrowCapRemaining = computeBankBorrowCapRemaining;
|
|
83439
83178
|
exports.computeBankDepositCapRemaining = computeBankDepositCapRemaining;
|
|
83440
83179
|
exports.computeBankMetrics = computeBankMetrics;
|
|
83441
83180
|
exports.computeBankPoolSize = computeBankPoolSize;
|
|
83442
|
-
exports.computeBankProjectedAvailableLiquidity = computeBankProjectedAvailableLiquidity;
|
|
83443
|
-
exports.computeBankRateLimitRemaining = computeBankRateLimitRemaining;
|
|
83444
83181
|
exports.computeBankSupplyApy = computeBankSupplyApy;
|
|
83445
83182
|
exports.computeBankTotalBorrows = computeBankTotalBorrows;
|
|
83446
83183
|
exports.computeBankTotalBorrowsUsd = computeBankTotalBorrowsUsd;
|
|
@@ -83455,7 +83192,6 @@ exports.computeFlashLoanNonSwapBudget = computeFlashLoanNonSwapBudget;
|
|
|
83455
83192
|
exports.computeFlashloanSwapConstraints = computeFlashloanSwapConstraints;
|
|
83456
83193
|
exports.computeFreeCollateralFromBalances = computeFreeCollateralFromBalances;
|
|
83457
83194
|
exports.computeFreeCollateralFromCache = computeFreeCollateralFromCache;
|
|
83458
|
-
exports.computeGroupRateLimitRemainingUsd = computeGroupRateLimitRemainingUsd;
|
|
83459
83195
|
exports.computeHealthAccountMetas = computeHealthAccountMetas;
|
|
83460
83196
|
exports.computeHealthCacheStatus = computeHealthCacheStatus;
|
|
83461
83197
|
exports.computeHealthCheckAccounts = computeHealthCheckAccounts;
|
|
@@ -83468,7 +83204,6 @@ exports.computeLiquidationPriceForBank = computeLiquidationPriceForBank;
|
|
|
83468
83204
|
exports.computeLoopingParams = computeLoopingParams;
|
|
83469
83205
|
exports.computeLowestEmodeWeights = computeLowestEmodeWeights;
|
|
83470
83206
|
exports.computeMaxBorrowForBank = computeMaxBorrowForBank;
|
|
83471
|
-
exports.computeMaxDepositForBank = computeMaxDepositForBank;
|
|
83472
83207
|
exports.computeMaxLeverage = computeMaxLeverage;
|
|
83473
83208
|
exports.computeMaxWithdrawForBank = computeMaxWithdrawForBank;
|
|
83474
83209
|
exports.computeNetApy = computeNetApy;
|
|
@@ -83476,8 +83211,6 @@ exports.computeProjectedActiveBalancesNoCpi = computeProjectedActiveBalancesNoCp
|
|
|
83476
83211
|
exports.computeProjectedActiveBanksNoCpi = computeProjectedActiveBanksNoCpi;
|
|
83477
83212
|
exports.computeQuantity = computeQuantity;
|
|
83478
83213
|
exports.computeQuantityUi = computeQuantityUi;
|
|
83479
|
-
exports.computeRateLimitWindowRemainingCapacity = computeRateLimitWindowRemainingCapacity;
|
|
83480
|
-
exports.computeRateLimiterRemainingCapacity = computeRateLimiterRemainingCapacity;
|
|
83481
83214
|
exports.computeRemainingCapacity = computeRemainingCapacity;
|
|
83482
83215
|
exports.computeSmartCrank = computeSmartCrank;
|
|
83483
83216
|
exports.computeStakedBankMultipliers = computeStakedBankMultipliers;
|
|
@@ -83486,7 +83219,6 @@ exports.computeTvl = computeTvl;
|
|
|
83486
83219
|
exports.computeUsdValue = computeUsdValue;
|
|
83487
83220
|
exports.computeUtilizationRate = computeUtilizationRate;
|
|
83488
83221
|
exports.computeV0TxSize = computeV0TxSize;
|
|
83489
|
-
exports.computeVenueAvailableLiquidity = computeVenueAvailableLiquidity;
|
|
83490
83222
|
exports.convertVoteAccCoeffsToBankCoeffs = convertVoteAccCoeffsToBankCoeffs;
|
|
83491
83223
|
exports.createActiveEmodePairFromPairs = createActiveEmodePairFromPairs;
|
|
83492
83224
|
exports.createEmptyBalance = createEmptyBalance;
|
|
@@ -83572,7 +83304,6 @@ exports.getConfig = getConfig;
|
|
|
83572
83304
|
exports.getDriftCTokenMultiplier = getDriftCTokenMultiplier;
|
|
83573
83305
|
exports.getDriftMetadata = getDriftMetadata;
|
|
83574
83306
|
exports.getDriftStatesDto = getDriftStatesDto;
|
|
83575
|
-
exports.getEffectiveDepositLimit = getEffectiveDepositLimit;
|
|
83576
83307
|
exports.getEmodePairs = getEmodePairs;
|
|
83577
83308
|
exports.getExactOutEstimate = getExactOutEstimate;
|
|
83578
83309
|
exports.getFallbackPricesByFeedId = getFallbackPricesByFeedId;
|
|
@@ -83612,11 +83343,9 @@ exports.hasEmodeEntryFlag = hasEmodeEntryFlag;
|
|
|
83612
83343
|
exports.hasEmodeFlag = hasEmodeFlag;
|
|
83613
83344
|
exports.hasHealthCacheFlag = hasHealthCacheFlag;
|
|
83614
83345
|
exports.healthCacheToDto = healthCacheToDto;
|
|
83615
|
-
exports.isBorrowLimitActive = isBorrowLimitActive;
|
|
83616
83346
|
exports.isBridgeConflictError = isBridgeConflictError;
|
|
83617
83347
|
exports.isDecomposableSwapError = isDecomposableSwapError;
|
|
83618
83348
|
exports.isDepositIx = isDepositIx;
|
|
83619
|
-
exports.isDepositLimitActive = isDepositLimitActive;
|
|
83620
83349
|
exports.isFlashloan = isFlashloan;
|
|
83621
83350
|
exports.isGroupRateLimiterEnabled = isGroupRateLimiterEnabled;
|
|
83622
83351
|
exports.isMarginfiV0110Live = isMarginfiV0110Live;
|