ts vault use fixes

This commit is contained in:
Christian Kamm 2024-03-18 09:58:25 +01:00
parent a8a1c97856
commit f962294dc2
3 changed files with 45 additions and 21 deletions

View File

@ -597,7 +597,7 @@ export class Group {
const totalAmount = new BN(0);
for (const bank of banks) {
const amount = this.vaultAmountsMap.get(bank.vault.toBase58());
if (!amount) {
if (amount === undefined) {
throw new Error(
`Vault balance not found for bank ${bank.name} ${bank.bankNum}!`,
);
@ -608,6 +608,28 @@ export class Group {
return totalAmount;
}
/**
* If allowLending is true, the withdrawer has a lendable position (and can withdraw less
* than the full vault amount)
*/
public getTokenVaultWithdrawableByBank(
bank: Bank,
allowLending: boolean,
): BN {
const amount = this.vaultAmountsMap.get(bank.vault.toBase58());
if (amount === undefined) {
throw new Error(
`Vault balance not found for bank ${bank.name} ${bank.bankNum}!`,
);
}
if (allowLending) {
return amount.sub(bank.unlendableDeposts);
} else {
return amount;
}
}
/**
*
* @param mintPk

View File

@ -194,9 +194,9 @@ describe('maxWithdraw', () => {
getFirstBankForPerpSettlement() {
return bank0;
},
vaultAmountsMap: new Map<string, BN>([
[bank0.vault.toBase58(), new BN(vaultAmount)],
]),
getTokenVaultWithdrawableByBank(bank: Bank, allowLending: boolean): BN {
return new BN(vaultAmount);
},
} as any as Group;
}
@ -281,10 +281,11 @@ describe('maxWithdraw', () => {
it('pure borrow limited utilization', (done) => {
const [group, bank0, bank1, account] = setup(1000000);
account.tokens[0].disableLending = false;
const other = deepClone(account);
deposit(bank0, other, 50);
deposit(bank1, account, 100);
expect(maxWithdraw(group, account)).equal(44); // due to origination fees!
expect(maxWithdraw(group, account)).equal(44); // not 45 due to origination fees!
bank0.loanOriginationFeeRate = ZERO_I80F48();
expect(maxWithdraw(group, account)).equal(45);
@ -306,8 +307,10 @@ describe('maxWithdraw', () => {
const [group, bank0, bank1, account] = setup(1000000);
bank0.scaledInitAssetWeight = function (price) {
const startScale = I80F48.fromNumber(50);
if (this.nativeDeposits().gt(startScale)) {
return this.initAssetWeight.div(this.nativeDeposits().div(startScale));
if (this.nativeLendableDeposits().gt(startScale)) {
return this.initAssetWeight.div(
this.nativeLendableDeposits().div(startScale),
);
}
return this.initAssetWeight;
};

View File

@ -571,7 +571,7 @@ export class MangoAccount {
.mul(tokenBank.scaledInitLiabWeight(tokenBank.getLiabPrice()));
let upperBound = existingTokenDeposits;
if (allowLending) {
upperBound.iadd(initHealth.div(lowerBoundBorrowHealthFactor));
upperBound = upperBound.add(initHealth.div(lowerBoundBorrowHealthFactor));
}
// Step 2: Find the maximum withdraw amount
@ -669,13 +669,9 @@ export class MangoAccount {
}
// Step 5: also limit by vault funds
const vaultAmount = group.vaultAmountsMap.get(tokenBank.vault.toBase58());
if (!vaultAmount) {
throw new Error(
`No vault amount found for ${tokenBank.name} vault ${tokenBank.vault}!`,
);
}
const vaultLimit = I80F48.fromU64(vaultAmount);
const vaultLimit = I80F48.fromU64(
group.getTokenVaultWithdrawableByBank(tokenBank, allowLending),
);
return amount.min(vaultLimit).max(ZERO_I80F48());
}
@ -730,9 +726,10 @@ export class MangoAccount {
),
);
const sourceBalance = this.getEffectiveTokenBalance(group, sourceBank);
const sourceAllowsLending = this.getToken(sourceBank.tokenIndex)?.allowLending() ?? true;
const sourceAllowsLending =
this.getToken(sourceBank.tokenIndex)?.allowLending() ?? true;
const maxWithdrawNative = sourceBank.getMaxWithdraw(
group.getTokenVaultBalanceByMint(sourceBank.mint),
group.getTokenVaultWithdrawableByBank(sourceBank, sourceAllowsLending),
sourceBalance,
sourceAllowsLending,
);
@ -890,9 +887,10 @@ export class MangoAccount {
let quoteAmount = nativeAmount.div(quoteBank.price);
const quoteBalance = this.getEffectiveTokenBalance(group, quoteBank);
const quoteAllowsLending = this.getToken(quoteBank.tokenIndex)?.allowLending() ?? true;
const quoteAllowsLending =
this.getToken(quoteBank.tokenIndex)?.allowLending() ?? true;
const maxWithdrawNative = quoteBank.getMaxWithdraw(
group.getTokenVaultBalanceByMint(quoteBank.mint),
group.getTokenVaultWithdrawableByBank(quoteBank, quoteAllowsLending),
quoteBalance,
quoteAllowsLending,
);
@ -947,9 +945,10 @@ export class MangoAccount {
let baseAmount = nativeAmount.div(baseBank.price);
const baseBalance = this.getEffectiveTokenBalance(group, baseBank);
const baseAllowsLending = this.getToken(baseBank.tokenIndex)?.allowLending() ?? true;
const baseAllowsLending =
this.getToken(baseBank.tokenIndex)?.allowLending() ?? true;
const maxWithdrawNative = baseBank.getMaxWithdraw(
group.getTokenVaultBalanceByMint(baseBank.mint),
group.getTokenVaultWithdrawableByBank(baseBank, baseAllowsLending),
baseBalance,
baseAllowsLending,
);