Skip to content

Commit c5c28bc

Browse files
authored
Merge pull request #54 from curvefi/feat/add-future-leverage-for-remove-and-add-collateral
feat: add future leverage for add and remove collateral
2 parents 9c4ff3b + fe151ca commit c5c28bc

File tree

4 files changed

+71
-2
lines changed

4 files changed

+71
-2
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@curvefi/llamalend-api",
3-
"version": "1.0.40",
3+
"version": "1.0.41",
44
"description": "JavaScript library for Curve Lending",
55
"main": "lib/index.js",
66
"author": "Macket",

src/lendMarkets/LendMarketTemplate.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
_getUsdRate,
2222
DIGas,
2323
smartNumber,
24+
calculateFutureLeverage,
2425
} from "../utils.js";
2526
import {IDict, TGas, TAmount, IReward, IQuoteOdos, IOneWayMarket, IPartialFrac} from "../interfaces.js";
2627
import { _getExpectedOdos, _getQuoteOdos, _assembleTxOdos, _getUserCollateral, _getUserCollateralForce, _getMarketsData } from "../external-api.js";
@@ -1747,6 +1748,18 @@ export class LendMarketTemplate {
17471748
return await this._addCollateral(collateral, address, false) as string;
17481749
}
17491750

1751+
public async addCollateralFutureLeverage(collateral: number | string, userAddress = ''): Promise<string> {
1752+
userAddress = _getAddress.call(this.llamalend, userAddress);
1753+
const [userCollateral, {collateral: currentCollateral}] = await Promise.all([
1754+
_getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
1755+
this.userState(userAddress),
1756+
]);
1757+
1758+
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise;
1759+
1760+
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'add');
1761+
}
1762+
17501763
// ---------------- REMOVE COLLATERAL ----------------
17511764

17521765
public async maxRemovable(): Promise<string> {
@@ -1813,6 +1826,18 @@ export class LendMarketTemplate {
18131826
return await this._removeCollateral(collateral, false) as string;
18141827
}
18151828

1829+
public async removeCollateralFutureLeverage(collateral: number | string, userAddress = ''): Promise<string> {
1830+
userAddress = _getAddress.call(this.llamalend, userAddress);
1831+
const [userCollateral, {collateral: currentCollateral}] = await Promise.all([
1832+
_getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
1833+
this.userState(userAddress),
1834+
]);
1835+
1836+
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise;
1837+
1838+
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'remove');
1839+
}
1840+
18161841
// ---------------- REPAY ----------------
18171842

18181843
private async _repayBands(debt: number | string, address: string): Promise<[bigint, bigint]> {

src/mintMarkets/MintMarketTemplate.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
MAX_ACTIVE_BAND,
2020
_mulBy1_3,
2121
DIGas,
22+
calculateFutureLeverage,
2223
} from "../utils.js";
2324
import {IDict, ILlamma, TGas} from "../interfaces.js";
2425
import {_getUserCollateralCrvUsd, _getUserCollateralCrvUsdFull} from "../external-api.js";
@@ -1001,6 +1002,19 @@ export class MintMarketTemplate {
10011002
return await this._addCollateral(collateral, address, false) as string;
10021003
}
10031004

1005+
public async addCollateralFutureLeverage(collateral: number | string, userAddress = ''): Promise<string> {
1006+
this._checkLeverageForStats();
1007+
userAddress = _getAddress.call(this.llamalend, userAddress);
1008+
const [userCollateral, {collateral: currentCollateral}] = await Promise.all([
1009+
_getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
1010+
this.userState(userAddress),
1011+
]);
1012+
1013+
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise ?? userCollateral.total_deposit_precise;
1014+
1015+
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'add');
1016+
}
1017+
10041018
// ---------------- REMOVE COLLATERAL ----------------
10051019

10061020
public async maxRemovable(): Promise<string> {
@@ -1069,6 +1083,19 @@ export class MintMarketTemplate {
10691083
return await this._removeCollateral(collateral, false) as string;
10701084
}
10711085

1086+
public async removeCollateralFutureLeverage(collateral: number | string, userAddress = ''): Promise<string> {
1087+
this._checkLeverageForStats();
1088+
userAddress = _getAddress.call(this.llamalend, userAddress);
1089+
const [userCollateral, {collateral: currentCollateral}] = await Promise.all([
1090+
_getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
1091+
this.userState(userAddress),
1092+
]);
1093+
1094+
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise ?? userCollateral.total_deposit_precise;
1095+
1096+
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'remove');
1097+
}
1098+
10721099
// ---------------- REPAY ----------------
10731100

10741101
private async _repayBands(debt: number | string, address: string): Promise<[bigint, bigint]> {

src/utils.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,4 +498,21 @@ export const getLsdApy = memoize(async(name: 'wstETH' | 'sfrxETH'): Promise<{
498498
{
499499
promise: true,
500500
maxAge: 60 * 1000, // 1m
501-
});
501+
});
502+
503+
export const calculateFutureLeverage = (
504+
currentCollateral: number | string,
505+
totalDepositFromUser: number | string,
506+
collateral: number | string,
507+
operation: 'add' | 'remove'
508+
): string => {
509+
const collateralBN = BN(collateral);
510+
const currentCollateralBN = BN(currentCollateral);
511+
const totalDepositBN = BN(totalDepositFromUser);
512+
513+
if (operation === 'add') {
514+
return currentCollateralBN.plus(collateralBN).div(totalDepositBN.plus(collateralBN)).toString();
515+
} else {
516+
return currentCollateralBN.minus(collateralBN).div(totalDepositBN.minus(collateralBN)).toString();
517+
}
518+
};

0 commit comments

Comments
 (0)