Skip to content

Commit 2779e32

Browse files
committed
sdk: add calculateBaseAssetAmountToCoverMarginShortage
1 parent e720394 commit 2779e32

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

sdk/src/constants/numericConstants.ts

+3
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ export const MARGIN_PRECISION = TEN_THOUSAND;
8484
export const BID_ASK_SPREAD_PRECISION = new BN(1000000); // 10^6
8585
export const LIQUIDATION_PCT_PRECISION = TEN_THOUSAND;
8686
export const FUNDING_RATE_OFFSET_DENOMINATOR = new BN(5000);
87+
export const PRICE_TIMES_AMM_TO_QUOTE_PRECISION_RATIO = PRICE_PRECISION.mul(
88+
AMM_TO_QUOTE_PRECISION_RATIO
89+
);
8790

8891
export const FIVE_MINUTE = new BN(60 * 5);
8992
export const ONE_HOUR = new BN(60 * 60);

sdk/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export * from './math/amm';
5858
export * from './math/trade';
5959
export * from './math/orders';
6060
export * from './math/repeg';
61+
export * from './math/liquidation';
6162
export * from './math/margin';
6263
export * from './math/insurance';
6364
export * from './math/superStake';

sdk/src/math/liquidation.ts

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { BN } from '@coral-xyz/anchor';
2+
import {
3+
PRICE_PRECISION,
4+
LIQUIDATION_FEE_PRECISION,
5+
MARGIN_PRECISION,
6+
PRICE_TIMES_AMM_TO_QUOTE_PRECISION_RATIO,
7+
} from '../constants/numericConstants';
8+
9+
export function calculateBaseAssetAmountToCoverMarginShortage(
10+
marginShortage: BN,
11+
marginRatio: number,
12+
liquidationFee: number,
13+
ifLiquidationFee: number,
14+
oraclePrice: BN,
15+
quoteOraclePrice: BN
16+
): BN | undefined {
17+
const marginRatioBN = new BN(marginRatio)
18+
.mul(LIQUIDATION_FEE_PRECISION)
19+
.div(MARGIN_PRECISION);
20+
const liquidationFeeBN = new BN(liquidationFee);
21+
22+
if (oraclePrice.eq(new BN(0)) || marginRatioBN.lte(liquidationFeeBN)) {
23+
// undefined is max
24+
return undefined;
25+
}
26+
27+
return marginShortage.mul(PRICE_TIMES_AMM_TO_QUOTE_PRECISION_RATIO).div(
28+
oraclePrice
29+
.mul(quoteOraclePrice)
30+
.div(PRICE_PRECISION)
31+
.mul(marginRatioBN.sub(liquidationFeeBN))
32+
.div(LIQUIDATION_FEE_PRECISION)
33+
.sub(
34+
oraclePrice.mul(new BN(ifLiquidationFee)).div(LIQUIDATION_FEE_PRECISION)
35+
)
36+
);
37+
}

0 commit comments

Comments
 (0)