ts vault use fixes
This commit is contained in:
parent
a8a1c97856
commit
f962294dc2
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
);
|
||||
|
|
Loading…
Reference in New Issue