Skip to content

Commit 3d7206c

Browse files
authored
sdk: high leverage mode updates (#1605)
* sdk: high leverage mode updates * add optional param for fee calc * update changelog
1 parent 64feb12 commit 3d7206c

File tree

3 files changed

+41
-13
lines changed

3 files changed

+41
-13
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Features
1111

12+
- sdk: fees and max perp trade size calculation functions allow an optional parameter for a user using bitFlags to enter high leverage mode
13+
1214
### Fixes
1315

1416
### Breaking

sdk/src/driftClient.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4429,6 +4429,16 @@ export class DriftClient {
44294429
useMarketLastSlotCache: true,
44304430
});
44314431

4432+
for (const param of params) {
4433+
if (isUpdateHighLeverageMode(param.bitFlags)) {
4434+
remainingAccounts.push({
4435+
pubkey: getHighLeverageModeConfigPublicKey(this.program.programId),
4436+
isWritable: true,
4437+
isSigner: false,
4438+
});
4439+
}
4440+
}
4441+
44324442
const formattedParams = params.map((item) => getOrderParams(item));
44334443

44344444
return await this.program.instruction.placeOrders(formattedParams, {
@@ -9008,7 +9018,8 @@ export class DriftClient {
90089018
public getMarketFees(
90099019
marketType: MarketType,
90109020
marketIndex?: number,
9011-
user?: User
9021+
user?: User,
9022+
enteringHighLeverageMode?: boolean
90129023
) {
90139024
let feeTier;
90149025
if (user) {
@@ -9033,7 +9044,7 @@ export class DriftClient {
90339044
}
90349045

90359046
takerFee += (takerFee * marketAccount.feeAdjustment) / 100;
9036-
if (user && user.isHighLeverageMode()) {
9047+
if (user && (user.isHighLeverageMode() || enteringHighLeverageMode)) {
90379048
takerFee *= 2;
90389049
}
90399050
makerFee += (makerFee * marketAccount.feeAdjustment) / 100;

sdk/src/user.ts

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,11 @@ export class User {
655655
* calculates Buying Power = free collateral / initial margin ratio
656656
* @returns : Precision QUOTE_PRECISION
657657
*/
658-
public getPerpBuyingPower(marketIndex: number, collateralBuffer = ZERO): BN {
658+
public getPerpBuyingPower(
659+
marketIndex: number,
660+
collateralBuffer = ZERO,
661+
enterHighLeverageMode = false
662+
): BN {
659663
const perpPosition = this.getPerpPositionWithLPSettle(
660664
marketIndex,
661665
undefined,
@@ -677,21 +681,23 @@ export class User {
677681
return this.getPerpBuyingPowerFromFreeCollateralAndBaseAssetAmount(
678682
marketIndex,
679683
freeCollateral,
680-
worstCaseBaseAssetAmount
684+
worstCaseBaseAssetAmount,
685+
enterHighLeverageMode
681686
);
682687
}
683688

684689
getPerpBuyingPowerFromFreeCollateralAndBaseAssetAmount(
685690
marketIndex: number,
686691
freeCollateral: BN,
687-
baseAssetAmount: BN
692+
baseAssetAmount: BN,
693+
enterHighLeverageMode = false
688694
): BN {
689695
const marginRatio = calculateMarketMarginRatio(
690696
this.driftClient.getPerpMarketAccount(marketIndex),
691697
baseAssetAmount,
692698
'Initial',
693699
this.getUserAccount().maxMarginRatio,
694-
this.isHighLeverageMode()
700+
enterHighLeverageMode || this.isHighLeverageMode()
695701
);
696702

697703
return freeCollateral.mul(MARGIN_PRECISION).div(new BN(marginRatio));
@@ -1860,12 +1866,14 @@ export class User {
18601866
* for large sizes where imf factor activates, result is a lower bound
18611867
* @param marginCategory {Initial, Maintenance}
18621868
* @param isLp if calculating max leveraging for adding lp, need to add buffer
1869+
* @param enterHighLeverageMode can pass this as true to calculate max leverage if the user was to enter high leverage mode
18631870
* @returns : Precision TEN_THOUSAND
18641871
*/
18651872
public getMaxLeverageForPerp(
18661873
perpMarketIndex: number,
18671874
marginCategory: MarginCategory = 'Initial',
1868-
isLp = false
1875+
isLp = false,
1876+
enterHighLeverageMode = false
18691877
): BN {
18701878
const market = this.driftClient.getPerpMarketAccount(perpMarketIndex);
18711879
const marketPrice =
@@ -1923,7 +1931,7 @@ export class User {
19231931
maxSize,
19241932
marginCategory,
19251933
this.getUserAccount().maxMarginRatio,
1926-
this.isHighLeverageMode()
1934+
enterHighLeverageMode || this.isHighLeverageMode()
19271935
);
19281936

19291937
// use more fesible size since imf factor activated
@@ -1945,7 +1953,7 @@ export class User {
19451953
targetSize,
19461954
marginCategory,
19471955
this.getUserAccount().maxMarginRatio,
1948-
this.isHighLeverageMode()
1956+
enterHighLeverageMode || this.isHighLeverageMode()
19491957
);
19501958
attempts += 1;
19511959
}
@@ -2633,7 +2641,8 @@ export class User {
26332641
public getMaxTradeSizeUSDCForPerp(
26342642
targetMarketIndex: number,
26352643
tradeSide: PositionDirection,
2636-
isLp = false
2644+
isLp = false,
2645+
enterHighLeverageMode = false
26372646
): { tradeSize: BN; oppositeSideTradeSize: BN } {
26382647
let tradeSize = ZERO;
26392648
let oppositeSideTradeSize = ZERO;
@@ -2673,7 +2682,8 @@ export class User {
26732682

26742683
const maxPositionSize = this.getPerpBuyingPower(
26752684
targetMarketIndex,
2676-
lpBuffer
2685+
lpBuffer,
2686+
enterHighLeverageMode
26772687
);
26782688

26792689
if (maxPositionSize.gte(ZERO)) {
@@ -3491,12 +3501,17 @@ export class User {
34913501
* @param quoteAmount
34923502
* @returns feeForQuote : Precision QUOTE_PRECISION
34933503
*/
3494-
public calculateFeeForQuoteAmount(quoteAmount: BN, marketIndex?: number): BN {
3504+
public calculateFeeForQuoteAmount(
3505+
quoteAmount: BN,
3506+
marketIndex?: number,
3507+
enteringHighLeverageMode?: boolean
3508+
): BN {
34953509
if (marketIndex !== undefined) {
34963510
const takerFeeMultiplier = this.driftClient.getMarketFees(
34973511
MarketType.PERP,
34983512
marketIndex,
3499-
this
3513+
this,
3514+
enteringHighLeverageMode
35003515
).takerFee;
35013516
const feeAmountNum =
35023517
BigNum.from(quoteAmount, QUOTE_PRECISION_EXP).toNum() *

0 commit comments

Comments
 (0)