@drift-labs/sdk 2.135.0-beta.6 → 2.135.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/VERSION +1 -1
- package/lib/browser/dlob/orderBookLevels.d.ts +2 -1
- package/lib/browser/dlob/orderBookLevels.js +2 -2
- package/lib/browser/math/amm.d.ts +3 -3
- package/lib/browser/math/amm.js +21 -21
- package/lib/browser/math/market.d.ts +2 -2
- package/lib/browser/math/market.js +4 -4
- package/lib/browser/math/position.d.ts +1 -1
- package/lib/browser/math/position.js +2 -2
- package/lib/browser/math/trade.d.ts +3 -3
- package/lib/browser/math/trade.js +7 -7
- package/lib/node/dlob/orderBookLevels.d.ts +2 -1
- package/lib/node/dlob/orderBookLevels.d.ts.map +1 -1
- package/lib/node/dlob/orderBookLevels.js +2 -2
- package/lib/node/math/amm.d.ts +3 -3
- package/lib/node/math/amm.d.ts.map +1 -1
- package/lib/node/math/amm.js +21 -21
- package/lib/node/math/market.d.ts +2 -2
- package/lib/node/math/market.d.ts.map +1 -1
- package/lib/node/math/market.js +4 -4
- package/lib/node/math/position.d.ts +1 -1
- package/lib/node/math/position.d.ts.map +1 -1
- package/lib/node/math/position.js +2 -2
- package/lib/node/math/trade.d.ts +3 -3
- package/lib/node/math/trade.d.ts.map +1 -1
- package/lib/node/math/trade.js +7 -7
- package/package.json +1 -1
- package/src/dlob/orderBookLevels.ts +4 -1
- package/src/math/amm.ts +29 -24
- package/src/math/market.ts +10 -4
- package/src/math/position.ts +5 -2
- package/src/math/trade.ts +22 -7
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.135.0-beta.
|
|
1
|
+
2.135.0-beta.7
|
|
@@ -43,12 +43,13 @@ export declare const MAJORS_TOP_OF_BOOK_QUOTE_AMOUNTS: BN[];
|
|
|
43
43
|
export declare function getL2GeneratorFromDLOBNodes(dlobNodes: Generator<DLOBNode>, oraclePriceData: OraclePriceData, slot: number): Generator<L2Level>;
|
|
44
44
|
export declare function mergeL2LevelGenerators(l2LevelGenerators: Generator<L2Level>[], compare: (a: L2Level, b: L2Level) => boolean): Generator<L2Level>;
|
|
45
45
|
export declare function createL2Levels(generator: Generator<L2Level>, depth: number): L2Level[];
|
|
46
|
-
export declare function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now, topOfBookQuoteAmounts, }: {
|
|
46
|
+
export declare function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now, topOfBookQuoteAmounts, latestSlot, }: {
|
|
47
47
|
marketAccount: PerpMarketAccount;
|
|
48
48
|
mmOraclePriceData: MMOraclePriceData;
|
|
49
49
|
numOrders: number;
|
|
50
50
|
now?: BN;
|
|
51
51
|
topOfBookQuoteAmounts?: BN[];
|
|
52
|
+
latestSlot?: BN;
|
|
52
53
|
}): L2OrderBookGenerator;
|
|
53
54
|
export declare function groupL2(l2: L2OrderBook, grouping: BN, depth: number): L2OrderBook;
|
|
54
55
|
/**
|
|
@@ -101,7 +101,7 @@ function createL2Levels(generator, depth) {
|
|
|
101
101
|
return levels;
|
|
102
102
|
}
|
|
103
103
|
exports.createL2Levels = createL2Levels;
|
|
104
|
-
function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now = new anchor_1.BN(Math.floor(Date.now() / 1000)), topOfBookQuoteAmounts = [], }) {
|
|
104
|
+
function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now = new anchor_1.BN(Math.floor(Date.now() / 1000)), topOfBookQuoteAmounts = [], latestSlot, }) {
|
|
105
105
|
const updatedAmm = (0, amm_1.calculateUpdatedAMM)(marketAccount.amm, mmOraclePriceData);
|
|
106
106
|
const paused = (0, exchangeStatus_1.isOperationPaused)(marketAccount.pausedOperations, types_1.PerpOperation.AMM_FILL);
|
|
107
107
|
let [openBids, openAsks] = paused
|
|
@@ -111,7 +111,7 @@ function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now =
|
|
|
111
111
|
openBids = numericConstants_1.ZERO;
|
|
112
112
|
if (openAsks.abs().lt(marketAccount.amm.minOrderSize.muln(2)))
|
|
113
113
|
openAsks = numericConstants_1.ZERO;
|
|
114
|
-
const [bidReserves, askReserves] = (0, amm_1.calculateSpreadReserves)(updatedAmm, mmOraclePriceData, now, (0, types_1.isVariant)(marketAccount.contractType, 'prediction'));
|
|
114
|
+
const [bidReserves, askReserves] = (0, amm_1.calculateSpreadReserves)(updatedAmm, mmOraclePriceData, now, (0, types_1.isVariant)(marketAccount.contractType, 'prediction'), latestSlot);
|
|
115
115
|
const numBaseOrders = Math.max(1, numOrders - topOfBookQuoteAmounts.length);
|
|
116
116
|
const commonOpts = {
|
|
117
117
|
numOrders,
|
|
@@ -6,13 +6,13 @@ export declare function calculatePegFromTargetPrice(targetPrice: BN, baseAssetRe
|
|
|
6
6
|
export declare function calculateOptimalPegAndBudget(amm: AMM, mmOraclePriceData: MMOraclePriceData): [BN, BN, BN, boolean];
|
|
7
7
|
export declare function calculateNewAmm(amm: AMM, mmOraclePriceData: MMOraclePriceData): [BN, BN, BN, BN];
|
|
8
8
|
export declare function calculateUpdatedAMM(amm: AMM, mmOraclePriceData: MMOraclePriceData): AMM;
|
|
9
|
-
export declare function calculateUpdatedAMMSpreadReserves(amm: AMM, direction: PositionDirection, mmOraclePriceData: MMOraclePriceData, isPrediction?: boolean): {
|
|
9
|
+
export declare function calculateUpdatedAMMSpreadReserves(amm: AMM, direction: PositionDirection, mmOraclePriceData: MMOraclePriceData, isPrediction?: boolean, latestSlot?: BN): {
|
|
10
10
|
baseAssetReserve: BN;
|
|
11
11
|
quoteAssetReserve: BN;
|
|
12
12
|
sqrtK: BN;
|
|
13
13
|
newPeg: BN;
|
|
14
14
|
};
|
|
15
|
-
export declare function calculateBidAskPrice(amm: AMM, mmOraclePriceData: MMOraclePriceData, withUpdate?: boolean, isPrediction?: boolean): [BN, BN];
|
|
15
|
+
export declare function calculateBidAskPrice(amm: AMM, mmOraclePriceData: MMOraclePriceData, withUpdate?: boolean, isPrediction?: boolean, latestSlot?: BN): [BN, BN];
|
|
16
16
|
/**
|
|
17
17
|
* Calculates a price given an arbitrary base and quote amount (they must have the same precision)
|
|
18
18
|
*
|
|
@@ -65,7 +65,7 @@ export declare function calculateSpreadBN(baseSpread: number, lastOracleReserveP
|
|
|
65
65
|
};
|
|
66
66
|
export declare function calculateSpread(amm: AMM, oraclePriceData: OraclePriceData, now?: BN, reservePrice?: BN): [number, number];
|
|
67
67
|
export declare function getQuoteAssetReservePredictionMarketBounds(amm: AMM, direction: PositionDirection): [BN, BN];
|
|
68
|
-
export declare function calculateSpreadReserves(amm: AMM, mmOraclePriceData: MMOraclePriceData, now?: BN, isPrediction?: boolean): {
|
|
68
|
+
export declare function calculateSpreadReserves(amm: AMM, mmOraclePriceData: MMOraclePriceData, now?: BN, isPrediction?: boolean, latestSlot?: BN): {
|
|
69
69
|
baseAssetReserve: any;
|
|
70
70
|
quoteAssetReserve: any;
|
|
71
71
|
}[];
|
package/lib/browser/math/amm.js
CHANGED
|
@@ -104,9 +104,9 @@ function calculateUpdatedAMM(amm, mmOraclePriceData) {
|
|
|
104
104
|
return newAmm;
|
|
105
105
|
}
|
|
106
106
|
exports.calculateUpdatedAMM = calculateUpdatedAMM;
|
|
107
|
-
function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, isPrediction = false) {
|
|
107
|
+
function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, isPrediction = false, latestSlot) {
|
|
108
108
|
const newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
|
|
109
|
-
const [shortReserves, longReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction);
|
|
109
|
+
const [shortReserves, longReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction, latestSlot);
|
|
110
110
|
const dirReserves = (0, types_1.isVariant)(direction, 'long')
|
|
111
111
|
? longReserves
|
|
112
112
|
: shortReserves;
|
|
@@ -119,7 +119,7 @@ function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, is
|
|
|
119
119
|
return result;
|
|
120
120
|
}
|
|
121
121
|
exports.calculateUpdatedAMMSpreadReserves = calculateUpdatedAMMSpreadReserves;
|
|
122
|
-
function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPrediction = false) {
|
|
122
|
+
function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPrediction = false, latestSlot) {
|
|
123
123
|
let newAmm;
|
|
124
124
|
if (withUpdate) {
|
|
125
125
|
newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
|
|
@@ -127,7 +127,7 @@ function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPredi
|
|
|
127
127
|
else {
|
|
128
128
|
newAmm = amm;
|
|
129
129
|
}
|
|
130
|
-
const [bidReserves, askReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction);
|
|
130
|
+
const [bidReserves, askReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction, latestSlot);
|
|
131
131
|
const askPrice = calculatePrice(askReserves.baseAssetReserve, askReserves.quoteAssetReserve, newAmm.pegMultiplier);
|
|
132
132
|
const bidPrice = calculatePrice(bidReserves.baseAssetReserve, bidReserves.quoteAssetReserve, newAmm.pegMultiplier);
|
|
133
133
|
return [bidPrice, askPrice];
|
|
@@ -488,7 +488,7 @@ function getQuoteAssetReservePredictionMarketBounds(amm, direction) {
|
|
|
488
488
|
return [quoteAssetReserveLowerBound, quoteAssetReserveUpperBound];
|
|
489
489
|
}
|
|
490
490
|
exports.getQuoteAssetReservePredictionMarketBounds = getQuoteAssetReservePredictionMarketBounds;
|
|
491
|
-
function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = false) {
|
|
491
|
+
function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = false, latestSlot) {
|
|
492
492
|
function calculateSpreadReserve(spread, direction, amm) {
|
|
493
493
|
if (spread === 0) {
|
|
494
494
|
return {
|
|
@@ -534,22 +534,22 @@ function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = fal
|
|
|
534
534
|
const doReferencePricOffsetSmooth = Math.sign(referencePriceOffset) !== Math.sign(amm.referencePriceOffset) &&
|
|
535
535
|
amm.curveUpdateIntensity > 100;
|
|
536
536
|
if (doReferencePricOffsetSmooth) {
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
537
|
+
const slotsPassed = latestSlot != null
|
|
538
|
+
? anchor_1.BN.max(latestSlot.sub(amm.lastUpdateSlot), numericConstants_1.ZERO).toNumber()
|
|
539
|
+
: 0;
|
|
540
|
+
const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
|
|
541
|
+
const raw = Math.trunc(Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10);
|
|
542
|
+
const maxAllowed = Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
|
|
543
|
+
const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
|
|
544
|
+
const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
|
|
545
|
+
referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
|
|
546
|
+
if (referencePriceDelta < 0) {
|
|
547
|
+
longSpread += Math.abs(referencePriceDelta);
|
|
548
|
+
shortSpread += Math.abs(referencePriceOffset);
|
|
549
|
+
}
|
|
550
|
+
else {
|
|
551
|
+
shortSpread += Math.abs(referencePriceDelta);
|
|
552
|
+
longSpread += Math.abs(referencePriceOffset);
|
|
553
553
|
}
|
|
554
554
|
}
|
|
555
555
|
const askReserves = calculateSpreadReserve(longSpread + referencePriceOffset, types_1.PositionDirection.LONG, amm);
|
|
@@ -16,14 +16,14 @@ export declare function calculateReservePrice(market: PerpMarketAccount, mmOracl
|
|
|
16
16
|
* @param market
|
|
17
17
|
* @return bidPrice : Precision PRICE_PRECISION
|
|
18
18
|
*/
|
|
19
|
-
export declare function calculateBidPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
|
|
19
|
+
export declare function calculateBidPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData, latestSlot?: BN): BN;
|
|
20
20
|
/**
|
|
21
21
|
* Calculates market ask price
|
|
22
22
|
*
|
|
23
23
|
* @param market
|
|
24
24
|
* @return askPrice : Precision PRICE_PRECISION
|
|
25
25
|
*/
|
|
26
|
-
export declare function calculateAskPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
|
|
26
|
+
export declare function calculateAskPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData, latestSlot?: BN): BN;
|
|
27
27
|
export declare function calculateNewMarketAfterTrade(baseAssetAmount: BN, direction: PositionDirection, market: PerpMarketAccount): PerpMarketAccount;
|
|
28
28
|
export declare function calculateOracleReserveSpread(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
|
|
29
29
|
export declare function calculateOracleSpread(price: BN, oraclePriceData: OraclePriceData): BN;
|
|
@@ -25,8 +25,8 @@ exports.calculateReservePrice = calculateReservePrice;
|
|
|
25
25
|
* @param market
|
|
26
26
|
* @return bidPrice : Precision PRICE_PRECISION
|
|
27
27
|
*/
|
|
28
|
-
function calculateBidPrice(market, mmOraclePriceData) {
|
|
29
|
-
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.SHORT, mmOraclePriceData);
|
|
28
|
+
function calculateBidPrice(market, mmOraclePriceData, latestSlot) {
|
|
29
|
+
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.SHORT, mmOraclePriceData, undefined, latestSlot);
|
|
30
30
|
return (0, amm_1.calculatePrice)(baseAssetReserve, quoteAssetReserve, newPeg);
|
|
31
31
|
}
|
|
32
32
|
exports.calculateBidPrice = calculateBidPrice;
|
|
@@ -36,8 +36,8 @@ exports.calculateBidPrice = calculateBidPrice;
|
|
|
36
36
|
* @param market
|
|
37
37
|
* @return askPrice : Precision PRICE_PRECISION
|
|
38
38
|
*/
|
|
39
|
-
function calculateAskPrice(market, mmOraclePriceData) {
|
|
40
|
-
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.LONG, mmOraclePriceData);
|
|
39
|
+
function calculateAskPrice(market, mmOraclePriceData, latestSlot) {
|
|
40
|
+
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.LONG, mmOraclePriceData, undefined, latestSlot);
|
|
41
41
|
return (0, amm_1.calculatePrice)(baseAssetReserve, quoteAssetReserve, newPeg);
|
|
42
42
|
}
|
|
43
43
|
exports.calculateAskPrice = calculateAskPrice;
|
|
@@ -10,7 +10,7 @@ import { PerpMarketAccount, PositionDirection, PerpPosition, SpotMarketAccount }
|
|
|
10
10
|
* @param oraclePriceData
|
|
11
11
|
* @returns Base Asset Value. : Precision QUOTE_PRECISION
|
|
12
12
|
*/
|
|
13
|
-
export declare function calculateBaseAssetValue(market: PerpMarketAccount, userPosition: PerpPosition, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, skipUpdate?: boolean): BN;
|
|
13
|
+
export declare function calculateBaseAssetValue(market: PerpMarketAccount, userPosition: PerpPosition, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, skipUpdate?: boolean, latestSlot?: BN): BN;
|
|
14
14
|
/**
|
|
15
15
|
* calculatePositionPNL
|
|
16
16
|
* = BaseAssetAmount * (Avg Exit Price - Avg Entry Price)
|
|
@@ -15,7 +15,7 @@ const market_1 = require("./market");
|
|
|
15
15
|
* @param oraclePriceData
|
|
16
16
|
* @returns Base Asset Value. : Precision QUOTE_PRECISION
|
|
17
17
|
*/
|
|
18
|
-
function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpread = true, skipUpdate = false) {
|
|
18
|
+
function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpread = true, skipUpdate = false, latestSlot) {
|
|
19
19
|
if (userPosition.baseAssetAmount.eq(numericConstants_1.ZERO)) {
|
|
20
20
|
return numericConstants_1.ZERO;
|
|
21
21
|
}
|
|
@@ -23,7 +23,7 @@ function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpr
|
|
|
23
23
|
let prepegAmm;
|
|
24
24
|
if (!skipUpdate) {
|
|
25
25
|
if (market.amm.baseSpread > 0 && useSpread) {
|
|
26
|
-
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, directionToClose, mmOraclePriceData);
|
|
26
|
+
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, directionToClose, mmOraclePriceData, undefined, latestSlot);
|
|
27
27
|
prepegAmm = {
|
|
28
28
|
baseAssetReserve,
|
|
29
29
|
quoteAssetReserve,
|
|
@@ -28,7 +28,7 @@ export type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' | 'priceD
|
|
|
28
28
|
*
|
|
29
29
|
* 'newPrice' => the price of the asset after the trade : Precision PRICE_PRECISION
|
|
30
30
|
*/
|
|
31
|
-
export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean): [BN, BN, BN, BN];
|
|
31
|
+
export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [BN, BN, BN, BN];
|
|
32
32
|
/**
|
|
33
33
|
* Calculates acquired amounts for trade executed
|
|
34
34
|
* @param direction
|
|
@@ -40,7 +40,7 @@ export declare function calculateTradeSlippage(direction: PositionDirection, amo
|
|
|
40
40
|
* | 'acquiredBase' => positive/negative change in user's base : BN AMM_RESERVE_PRECISION
|
|
41
41
|
* | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
|
|
42
42
|
*/
|
|
43
|
-
export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean): [BN, BN, BN];
|
|
43
|
+
export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [BN, BN, BN];
|
|
44
44
|
/**
|
|
45
45
|
* calculateTargetPriceTrade
|
|
46
46
|
* simple function for finding arbitraging trades
|
|
@@ -61,7 +61,7 @@ export declare function calculateTradeAcquiredAmounts(direction: PositionDirecti
|
|
|
61
61
|
* targetPrice => the target price PRICE_PRECISION
|
|
62
62
|
* ]
|
|
63
63
|
*/
|
|
64
|
-
export declare function calculateTargetPriceTrade(market: PerpMarketAccount, targetPrice: BN, pct?: BN, outputAssetType?: AssetType, mmOraclePriceData?: MMOraclePriceData, useSpread?: boolean): [PositionDirection, BN, BN, BN];
|
|
64
|
+
export declare function calculateTargetPriceTrade(market: PerpMarketAccount, targetPrice: BN, pct?: BN, outputAssetType?: AssetType, mmOraclePriceData?: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [PositionDirection, BN, BN, BN];
|
|
65
65
|
/**
|
|
66
66
|
* Calculates the estimated entry price and price impact of order, in base or quote
|
|
67
67
|
* Price impact is based on the difference between the entry price and the best bid/ask price (whether it's dlob or vamm)
|
|
@@ -30,7 +30,7 @@ const MAXPCT = new anchor_1.BN(1000); //percentage units are [0,1000] => [0,1]
|
|
|
30
30
|
*
|
|
31
31
|
* 'newPrice' => the price of the asset after the trade : Precision PRICE_PRECISION
|
|
32
32
|
*/
|
|
33
|
-
function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
|
|
33
|
+
function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
|
|
34
34
|
let oldPrice;
|
|
35
35
|
if (useSpread && market.amm.baseSpread > 0) {
|
|
36
36
|
if ((0, types_2.isVariant)(direction, 'long')) {
|
|
@@ -53,7 +53,7 @@ function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quo
|
|
|
53
53
|
.div(acquiredBaseReserve.abs());
|
|
54
54
|
let amm;
|
|
55
55
|
if (useSpread && market.amm.baseSpread > 0) {
|
|
56
|
-
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
|
|
56
|
+
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
|
|
57
57
|
amm = {
|
|
58
58
|
baseAssetReserve,
|
|
59
59
|
quoteAssetReserve,
|
|
@@ -95,14 +95,14 @@ exports.calculateTradeSlippage = calculateTradeSlippage;
|
|
|
95
95
|
* | 'acquiredBase' => positive/negative change in user's base : BN AMM_RESERVE_PRECISION
|
|
96
96
|
* | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
|
|
97
97
|
*/
|
|
98
|
-
function calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
|
|
98
|
+
function calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
|
|
99
99
|
if (amount.eq(numericConstants_1.ZERO)) {
|
|
100
100
|
return [numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO];
|
|
101
101
|
}
|
|
102
102
|
const swapDirection = (0, amm_1.getSwapDirection)(inputAssetType, direction);
|
|
103
103
|
let amm;
|
|
104
104
|
if (useSpread && market.amm.baseSpread > 0) {
|
|
105
|
-
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
|
|
105
|
+
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
|
|
106
106
|
amm = {
|
|
107
107
|
baseAssetReserve,
|
|
108
108
|
quoteAssetReserve,
|
|
@@ -140,7 +140,7 @@ exports.calculateTradeAcquiredAmounts = calculateTradeAcquiredAmounts;
|
|
|
140
140
|
* targetPrice => the target price PRICE_PRECISION
|
|
141
141
|
* ]
|
|
142
142
|
*/
|
|
143
|
-
function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
|
|
143
|
+
function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
|
|
144
144
|
(0, assert_1.assert)(market.amm.baseAssetReserve.gt(numericConstants_1.ZERO));
|
|
145
145
|
(0, assert_1.assert)(targetPrice.gt(numericConstants_1.ZERO));
|
|
146
146
|
(0, assert_1.assert)(pct.lte(MAXPCT) && pct.gt(numericConstants_1.ZERO));
|
|
@@ -166,7 +166,7 @@ function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAsse
|
|
|
166
166
|
let quoteAssetReserveBefore;
|
|
167
167
|
let peg = market.amm.pegMultiplier;
|
|
168
168
|
if (useSpread && market.amm.baseSpread > 0) {
|
|
169
|
-
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
|
|
169
|
+
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
|
|
170
170
|
baseAssetReserveBefore = baseAssetReserve;
|
|
171
171
|
quoteAssetReserveBefore = quoteAssetReserve;
|
|
172
172
|
peg = newPeg;
|
|
@@ -280,7 +280,7 @@ function calculateEstimatedPerpEntryPrice(assetType, amount, direction, market,
|
|
|
280
280
|
const takerIsLong = (0, types_2.isVariant)(direction, 'long');
|
|
281
281
|
const limitOrders = dlob[takerIsLong ? 'getRestingLimitAsks' : 'getRestingLimitBids'](market.marketIndex, slot, types_1.MarketType.PERP, mmOraclePriceData);
|
|
282
282
|
const swapDirection = (0, amm_1.getSwapDirection)(assetType, direction);
|
|
283
|
-
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
|
|
283
|
+
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, new anchor_1.BN(slot));
|
|
284
284
|
const amm = {
|
|
285
285
|
baseAssetReserve,
|
|
286
286
|
quoteAssetReserve,
|
|
@@ -43,12 +43,13 @@ export declare const MAJORS_TOP_OF_BOOK_QUOTE_AMOUNTS: BN[];
|
|
|
43
43
|
export declare function getL2GeneratorFromDLOBNodes(dlobNodes: Generator<DLOBNode>, oraclePriceData: OraclePriceData, slot: number): Generator<L2Level>;
|
|
44
44
|
export declare function mergeL2LevelGenerators(l2LevelGenerators: Generator<L2Level>[], compare: (a: L2Level, b: L2Level) => boolean): Generator<L2Level>;
|
|
45
45
|
export declare function createL2Levels(generator: Generator<L2Level>, depth: number): L2Level[];
|
|
46
|
-
export declare function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now, topOfBookQuoteAmounts, }: {
|
|
46
|
+
export declare function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now, topOfBookQuoteAmounts, latestSlot, }: {
|
|
47
47
|
marketAccount: PerpMarketAccount;
|
|
48
48
|
mmOraclePriceData: MMOraclePriceData;
|
|
49
49
|
numOrders: number;
|
|
50
50
|
now?: BN;
|
|
51
51
|
topOfBookQuoteAmounts?: BN[];
|
|
52
|
+
latestSlot?: BN;
|
|
52
53
|
}): L2OrderBookGenerator;
|
|
53
54
|
export declare function groupL2(l2: L2OrderBook, grouping: BN, depth: number): L2OrderBook;
|
|
54
55
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderBookLevels.d.ts","sourceRoot":"","sources":["../../../src/dlob/orderBookLevels.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAevC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAEN,iBAAiB,EAIjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,KAAK,eAAe,GACjB,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,GACT,UAAU,GACV,YAAY,CAAC;AAEhB,MAAM,MAAM,OAAO,GAAG;IACrB,KAAK,EAAE,EAAE,CAAC;IACV,IAAI,EAAE,EAAE,CAAC;IACT,OAAO,EAAE;SAAG,GAAG,IAAI,eAAe,CAAC,CAAC,EAAE,EAAE;KAAE,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACpC,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,OAAO,GAAG;IACrB,KAAK,EAAE,EAAE,CAAC;IACV,IAAI,EAAE,EAAE,CAAC;IACT,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,iCAAiC,MAK7C,CAAC;AAEF,eAAO,MAAM,gCAAgC,MAK5C,CAAC;AAIF;;;;;GAKG;AACH,wBAAiB,2BAA2B,CAC3C,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAC9B,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE,MAAM,GACV,SAAS,CAAC,OAAO,CAAC,CAqBpB;AAED,wBAAiB,sBAAsB,CACtC,iBAAiB,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,EACvC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,KAAK,OAAO,GAC1C,SAAS,CAAC,OAAO,CAAC,CA+BpB;AAED,wBAAgB,cAAc,CAC7B,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,GACX,OAAO,EAAE,CAsBX;AAED,wBAAgB,kBAAkB,CAAC,EAClC,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,GAA2C,EAC3C,qBAA0B,
|
|
1
|
+
{"version":3,"file":"orderBookLevels.d.ts","sourceRoot":"","sources":["../../../src/dlob/orderBookLevels.ts"],"names":[],"mappings":"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"}
|
|
@@ -101,7 +101,7 @@ function createL2Levels(generator, depth) {
|
|
|
101
101
|
return levels;
|
|
102
102
|
}
|
|
103
103
|
exports.createL2Levels = createL2Levels;
|
|
104
|
-
function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now = new anchor_1.BN(Math.floor(Date.now() / 1000)), topOfBookQuoteAmounts = [], }) {
|
|
104
|
+
function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now = new anchor_1.BN(Math.floor(Date.now() / 1000)), topOfBookQuoteAmounts = [], latestSlot, }) {
|
|
105
105
|
const updatedAmm = (0, amm_1.calculateUpdatedAMM)(marketAccount.amm, mmOraclePriceData);
|
|
106
106
|
const paused = (0, exchangeStatus_1.isOperationPaused)(marketAccount.pausedOperations, types_1.PerpOperation.AMM_FILL);
|
|
107
107
|
let [openBids, openAsks] = paused
|
|
@@ -111,7 +111,7 @@ function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now =
|
|
|
111
111
|
openBids = numericConstants_1.ZERO;
|
|
112
112
|
if (openAsks.abs().lt(marketAccount.amm.minOrderSize.muln(2)))
|
|
113
113
|
openAsks = numericConstants_1.ZERO;
|
|
114
|
-
const [bidReserves, askReserves] = (0, amm_1.calculateSpreadReserves)(updatedAmm, mmOraclePriceData, now, (0, types_1.isVariant)(marketAccount.contractType, 'prediction'));
|
|
114
|
+
const [bidReserves, askReserves] = (0, amm_1.calculateSpreadReserves)(updatedAmm, mmOraclePriceData, now, (0, types_1.isVariant)(marketAccount.contractType, 'prediction'), latestSlot);
|
|
115
115
|
const numBaseOrders = Math.max(1, numOrders - topOfBookQuoteAmounts.length);
|
|
116
116
|
const commonOpts = {
|
|
117
117
|
numOrders,
|
package/lib/node/math/amm.d.ts
CHANGED
|
@@ -6,13 +6,13 @@ export declare function calculatePegFromTargetPrice(targetPrice: BN, baseAssetRe
|
|
|
6
6
|
export declare function calculateOptimalPegAndBudget(amm: AMM, mmOraclePriceData: MMOraclePriceData): [BN, BN, BN, boolean];
|
|
7
7
|
export declare function calculateNewAmm(amm: AMM, mmOraclePriceData: MMOraclePriceData): [BN, BN, BN, BN];
|
|
8
8
|
export declare function calculateUpdatedAMM(amm: AMM, mmOraclePriceData: MMOraclePriceData): AMM;
|
|
9
|
-
export declare function calculateUpdatedAMMSpreadReserves(amm: AMM, direction: PositionDirection, mmOraclePriceData: MMOraclePriceData, isPrediction?: boolean): {
|
|
9
|
+
export declare function calculateUpdatedAMMSpreadReserves(amm: AMM, direction: PositionDirection, mmOraclePriceData: MMOraclePriceData, isPrediction?: boolean, latestSlot?: BN): {
|
|
10
10
|
baseAssetReserve: BN;
|
|
11
11
|
quoteAssetReserve: BN;
|
|
12
12
|
sqrtK: BN;
|
|
13
13
|
newPeg: BN;
|
|
14
14
|
};
|
|
15
|
-
export declare function calculateBidAskPrice(amm: AMM, mmOraclePriceData: MMOraclePriceData, withUpdate?: boolean, isPrediction?: boolean): [BN, BN];
|
|
15
|
+
export declare function calculateBidAskPrice(amm: AMM, mmOraclePriceData: MMOraclePriceData, withUpdate?: boolean, isPrediction?: boolean, latestSlot?: BN): [BN, BN];
|
|
16
16
|
/**
|
|
17
17
|
* Calculates a price given an arbitrary base and quote amount (they must have the same precision)
|
|
18
18
|
*
|
|
@@ -65,7 +65,7 @@ export declare function calculateSpreadBN(baseSpread: number, lastOracleReserveP
|
|
|
65
65
|
};
|
|
66
66
|
export declare function calculateSpread(amm: AMM, oraclePriceData: OraclePriceData, now?: BN, reservePrice?: BN): [number, number];
|
|
67
67
|
export declare function getQuoteAssetReservePredictionMarketBounds(amm: AMM, direction: PositionDirection): [BN, BN];
|
|
68
|
-
export declare function calculateSpreadReserves(amm: AMM, mmOraclePriceData: MMOraclePriceData, now?: BN, isPrediction?: boolean): {
|
|
68
|
+
export declare function calculateSpreadReserves(amm: AMM, mmOraclePriceData: MMOraclePriceData, now?: BN, isPrediction?: boolean, latestSlot?: BN): {
|
|
69
69
|
baseAssetReserve: any;
|
|
70
70
|
quoteAssetReserve: any;
|
|
71
71
|
}[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amm.d.ts","sourceRoot":"","sources":["../../../src/math/amm.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAiBvC,OAAO,EACN,GAAG,EACH,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EAEjB,MAAM,UAAU,CAAC;AAKlB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAStE,wBAAgB,2BAA2B,CAC1C,WAAW,EAAE,EAAE,EACf,gBAAgB,EAAE,EAAE,EACpB,iBAAiB,EAAE,EAAE,GACnB,EAAE,CASJ;AAED,wBAAgB,4BAA4B,CAC3C,GAAG,EAAE,GAAG,EACR,iBAAiB,EAAE,iBAAiB,GAClC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAwDvB;AAED,wBAAgB,eAAe,CAC9B,GAAG,EAAE,GAAG,EACR,iBAAiB,EAAE,iBAAiB,GAClC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAqClB;AAED,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,GAAG,EACR,iBAAiB,EAAE,iBAAiB,GAClC,GAAG,CAmCL;AAED,wBAAgB,iCAAiC,CAChD,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,iBAAiB,EAC5B,iBAAiB,EAAE,iBAAiB,EACpC,YAAY,UAAQ,
|
|
1
|
+
{"version":3,"file":"amm.d.ts","sourceRoot":"","sources":["../../../src/math/amm.ts"],"names":[],"mappings":"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"}
|
package/lib/node/math/amm.js
CHANGED
|
@@ -104,9 +104,9 @@ function calculateUpdatedAMM(amm, mmOraclePriceData) {
|
|
|
104
104
|
return newAmm;
|
|
105
105
|
}
|
|
106
106
|
exports.calculateUpdatedAMM = calculateUpdatedAMM;
|
|
107
|
-
function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, isPrediction = false) {
|
|
107
|
+
function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, isPrediction = false, latestSlot) {
|
|
108
108
|
const newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
|
|
109
|
-
const [shortReserves, longReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction);
|
|
109
|
+
const [shortReserves, longReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction, latestSlot);
|
|
110
110
|
const dirReserves = (0, types_1.isVariant)(direction, 'long')
|
|
111
111
|
? longReserves
|
|
112
112
|
: shortReserves;
|
|
@@ -119,7 +119,7 @@ function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, is
|
|
|
119
119
|
return result;
|
|
120
120
|
}
|
|
121
121
|
exports.calculateUpdatedAMMSpreadReserves = calculateUpdatedAMMSpreadReserves;
|
|
122
|
-
function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPrediction = false) {
|
|
122
|
+
function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPrediction = false, latestSlot) {
|
|
123
123
|
let newAmm;
|
|
124
124
|
if (withUpdate) {
|
|
125
125
|
newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
|
|
@@ -127,7 +127,7 @@ function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPredi
|
|
|
127
127
|
else {
|
|
128
128
|
newAmm = amm;
|
|
129
129
|
}
|
|
130
|
-
const [bidReserves, askReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction);
|
|
130
|
+
const [bidReserves, askReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction, latestSlot);
|
|
131
131
|
const askPrice = calculatePrice(askReserves.baseAssetReserve, askReserves.quoteAssetReserve, newAmm.pegMultiplier);
|
|
132
132
|
const bidPrice = calculatePrice(bidReserves.baseAssetReserve, bidReserves.quoteAssetReserve, newAmm.pegMultiplier);
|
|
133
133
|
return [bidPrice, askPrice];
|
|
@@ -488,7 +488,7 @@ function getQuoteAssetReservePredictionMarketBounds(amm, direction) {
|
|
|
488
488
|
return [quoteAssetReserveLowerBound, quoteAssetReserveUpperBound];
|
|
489
489
|
}
|
|
490
490
|
exports.getQuoteAssetReservePredictionMarketBounds = getQuoteAssetReservePredictionMarketBounds;
|
|
491
|
-
function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = false) {
|
|
491
|
+
function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = false, latestSlot) {
|
|
492
492
|
function calculateSpreadReserve(spread, direction, amm) {
|
|
493
493
|
if (spread === 0) {
|
|
494
494
|
return {
|
|
@@ -534,22 +534,22 @@ function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = fal
|
|
|
534
534
|
const doReferencePricOffsetSmooth = Math.sign(referencePriceOffset) !== Math.sign(amm.referencePriceOffset) &&
|
|
535
535
|
amm.curveUpdateIntensity > 100;
|
|
536
536
|
if (doReferencePricOffsetSmooth) {
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
537
|
+
const slotsPassed = latestSlot != null
|
|
538
|
+
? anchor_1.BN.max(latestSlot.sub(amm.lastUpdateSlot), numericConstants_1.ZERO).toNumber()
|
|
539
|
+
: 0;
|
|
540
|
+
const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
|
|
541
|
+
const raw = Math.trunc(Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10);
|
|
542
|
+
const maxAllowed = Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
|
|
543
|
+
const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
|
|
544
|
+
const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
|
|
545
|
+
referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
|
|
546
|
+
if (referencePriceDelta < 0) {
|
|
547
|
+
longSpread += Math.abs(referencePriceDelta);
|
|
548
|
+
shortSpread += Math.abs(referencePriceOffset);
|
|
549
|
+
}
|
|
550
|
+
else {
|
|
551
|
+
shortSpread += Math.abs(referencePriceDelta);
|
|
552
|
+
longSpread += Math.abs(referencePriceOffset);
|
|
553
553
|
}
|
|
554
554
|
}
|
|
555
555
|
const askReserves = calculateSpreadReserve(longSpread + referencePriceOffset, types_1.PositionDirection.LONG, amm);
|
|
@@ -16,14 +16,14 @@ export declare function calculateReservePrice(market: PerpMarketAccount, mmOracl
|
|
|
16
16
|
* @param market
|
|
17
17
|
* @return bidPrice : Precision PRICE_PRECISION
|
|
18
18
|
*/
|
|
19
|
-
export declare function calculateBidPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
|
|
19
|
+
export declare function calculateBidPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData, latestSlot?: BN): BN;
|
|
20
20
|
/**
|
|
21
21
|
* Calculates market ask price
|
|
22
22
|
*
|
|
23
23
|
* @param market
|
|
24
24
|
* @return askPrice : Precision PRICE_PRECISION
|
|
25
25
|
*/
|
|
26
|
-
export declare function calculateAskPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
|
|
26
|
+
export declare function calculateAskPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData, latestSlot?: BN): BN;
|
|
27
27
|
export declare function calculateNewMarketAfterTrade(baseAssetAmount: BN, direction: PositionDirection, market: PerpMarketAccount): PerpMarketAccount;
|
|
28
28
|
export declare function calculateOracleReserveSpread(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
|
|
29
29
|
export declare function calculateOracleSpread(price: BN, oraclePriceData: OraclePriceData): BN;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../../src/math/market.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EAIjB,MAAM,UAAU,CAAC;AAalB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAYtE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,GAClC,EAAE,CAOJ;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../../src/math/market.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EAIjB,MAAM,UAAU,CAAC;AAalB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAYtE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,GAClC,EAAE,CAOJ;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,CAAC,EAAE,EAAE,GACb,EAAE,CAWJ;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,CAAC,EAAE,EAAE,GACb,EAAE,CAWJ;AAED,wBAAgB,4BAA4B,CAC3C,eAAe,EAAE,EAAE,EACnB,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,iBAAiB,GACvB,iBAAiB,CAgBnB;AAED,wBAAgB,4BAA4B,CAC3C,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,GAClC,EAAE,CAGJ;AAED,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,EAAE,EACT,eAAe,EAAE,eAAe,GAC9B,EAAE,CAEJ;AAED,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,EAAE,EACR,cAAc,EAAE,cAAc,EAC9B,iBAAiB,SAAI,EACrB,oBAAoB,UAAQ,GAC1B,MAAM,CA2CR;AAED,wBAAgB,8BAA8B,CAC7C,MAAM,EAAE,iBAAiB,EACzB,eAAe,EAAE,iBAAiB,EAClC,aAAa,EAAE,EAAE,EACjB,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CA+BJ;AAED,wBAAgB,2BAA2B,CAC1C,UAAU,EAAE,iBAAiB,EAC7B,UAAU,EAAE,iBAAiB,GAC3B,EAAE,CAMJ;AAED,wBAAgB,oCAAoC,CACnD,UAAU,EAAE,iBAAiB,EAC7B,UAAU,EAAE,iBAAiB,GAC3B,EAAE,CAcJ;AAED,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,iBAAiB,EAC7B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CAcJ;AAED,wBAAgB,4BAA4B,CAC3C,UAAU,EAAE,iBAAiB,EAC7B,UAAU,EAAE,iBAAiB,EAC7B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,EAC/C,oBAAoB,UAAO,GACzB,EAAE,CAoBJ;AAED,wBAAgB,+BAA+B,CAC9C,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,EACpC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,GACV;IAAE,IAAI,EAAE,EAAE,CAAC;IAAC,IAAI,EAAE,EAAE,CAAA;CAAE,CAoCxB;AAED,wBAAgB,oCAAoC,CACnD,MAAM,EAAE,iBAAiB,EACzB,oBAAoB,EAAE,OAAO,GAC3B,MAAM,CAWR;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC9B,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,EAAE,EACf,GAAG,EAAE,EAAE,EACP,cAAc,EAAE,OAAO,GACrB,EAAE,CA2BJ"}
|
package/lib/node/math/market.js
CHANGED
|
@@ -25,8 +25,8 @@ exports.calculateReservePrice = calculateReservePrice;
|
|
|
25
25
|
* @param market
|
|
26
26
|
* @return bidPrice : Precision PRICE_PRECISION
|
|
27
27
|
*/
|
|
28
|
-
function calculateBidPrice(market, mmOraclePriceData) {
|
|
29
|
-
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.SHORT, mmOraclePriceData);
|
|
28
|
+
function calculateBidPrice(market, mmOraclePriceData, latestSlot) {
|
|
29
|
+
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.SHORT, mmOraclePriceData, undefined, latestSlot);
|
|
30
30
|
return (0, amm_1.calculatePrice)(baseAssetReserve, quoteAssetReserve, newPeg);
|
|
31
31
|
}
|
|
32
32
|
exports.calculateBidPrice = calculateBidPrice;
|
|
@@ -36,8 +36,8 @@ exports.calculateBidPrice = calculateBidPrice;
|
|
|
36
36
|
* @param market
|
|
37
37
|
* @return askPrice : Precision PRICE_PRECISION
|
|
38
38
|
*/
|
|
39
|
-
function calculateAskPrice(market, mmOraclePriceData) {
|
|
40
|
-
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.LONG, mmOraclePriceData);
|
|
39
|
+
function calculateAskPrice(market, mmOraclePriceData, latestSlot) {
|
|
40
|
+
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.LONG, mmOraclePriceData, undefined, latestSlot);
|
|
41
41
|
return (0, amm_1.calculatePrice)(baseAssetReserve, quoteAssetReserve, newPeg);
|
|
42
42
|
}
|
|
43
43
|
exports.calculateAskPrice = calculateAskPrice;
|
|
@@ -10,7 +10,7 @@ import { PerpMarketAccount, PositionDirection, PerpPosition, SpotMarketAccount }
|
|
|
10
10
|
* @param oraclePriceData
|
|
11
11
|
* @returns Base Asset Value. : Precision QUOTE_PRECISION
|
|
12
12
|
*/
|
|
13
|
-
export declare function calculateBaseAssetValue(market: PerpMarketAccount, userPosition: PerpPosition, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, skipUpdate?: boolean): BN;
|
|
13
|
+
export declare function calculateBaseAssetValue(market: PerpMarketAccount, userPosition: PerpPosition, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, skipUpdate?: boolean, latestSlot?: BN): BN;
|
|
14
14
|
/**
|
|
15
15
|
* calculatePositionPNL
|
|
16
16
|
* = BaseAssetAmount * (Avg Exit Price - Avg Entry Price)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../../src/math/position.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAUvC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,MAAM,UAAU,CAAC;AAUlB;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,UAAO,EAChB,UAAU,UAAQ,
|
|
1
|
+
{"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../../src/math/position.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAUvC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,MAAM,UAAU,CAAC;AAUlB;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,UAAO,EAChB,UAAU,UAAQ,EAClB,UAAU,CAAC,EAAE,EAAE,GACb,EAAE,CAoDJ;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,WAAW,SAAQ,EACnB,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CAyBJ;AAED,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,iBAAiB,EAC7B,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CAyBJ;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,gBAAgB,UAAO,GACrB,EAAE,CAeJ;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC3C,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,GACxB,EAAE,CAoBJ;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,GACxB,EAAE,CAEJ;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAOnE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,YAAY,GAAG,EAAE,CAUtE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,YAAY,GAAG,EAAE,CAUlE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,YAAY,EAAE,YAAY,EAC1B,iBAAiB,UAAQ,GACvB,EAAE,CAWJ;AAED,wBAAgB,oBAAoB,CACnC,YAAY,EAAE,YAAY,GACxB,iBAAiB,CAInB;AAED,wBAAgB,wBAAwB,CACvC,YAAY,EAAE,YAAY,GACxB,iBAAiB,CAInB;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAEnE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAM7D"}
|
|
@@ -15,7 +15,7 @@ const market_1 = require("./market");
|
|
|
15
15
|
* @param oraclePriceData
|
|
16
16
|
* @returns Base Asset Value. : Precision QUOTE_PRECISION
|
|
17
17
|
*/
|
|
18
|
-
function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpread = true, skipUpdate = false) {
|
|
18
|
+
function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpread = true, skipUpdate = false, latestSlot) {
|
|
19
19
|
if (userPosition.baseAssetAmount.eq(numericConstants_1.ZERO)) {
|
|
20
20
|
return numericConstants_1.ZERO;
|
|
21
21
|
}
|
|
@@ -23,7 +23,7 @@ function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpr
|
|
|
23
23
|
let prepegAmm;
|
|
24
24
|
if (!skipUpdate) {
|
|
25
25
|
if (market.amm.baseSpread > 0 && useSpread) {
|
|
26
|
-
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, directionToClose, mmOraclePriceData);
|
|
26
|
+
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, directionToClose, mmOraclePriceData, undefined, latestSlot);
|
|
27
27
|
prepegAmm = {
|
|
28
28
|
baseAssetReserve,
|
|
29
29
|
quoteAssetReserve,
|
package/lib/node/math/trade.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ export type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' | 'priceD
|
|
|
28
28
|
*
|
|
29
29
|
* 'newPrice' => the price of the asset after the trade : Precision PRICE_PRECISION
|
|
30
30
|
*/
|
|
31
|
-
export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean): [BN, BN, BN, BN];
|
|
31
|
+
export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [BN, BN, BN, BN];
|
|
32
32
|
/**
|
|
33
33
|
* Calculates acquired amounts for trade executed
|
|
34
34
|
* @param direction
|
|
@@ -40,7 +40,7 @@ export declare function calculateTradeSlippage(direction: PositionDirection, amo
|
|
|
40
40
|
* | 'acquiredBase' => positive/negative change in user's base : BN AMM_RESERVE_PRECISION
|
|
41
41
|
* | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
|
|
42
42
|
*/
|
|
43
|
-
export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean): [BN, BN, BN];
|
|
43
|
+
export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [BN, BN, BN];
|
|
44
44
|
/**
|
|
45
45
|
* calculateTargetPriceTrade
|
|
46
46
|
* simple function for finding arbitraging trades
|
|
@@ -61,7 +61,7 @@ export declare function calculateTradeAcquiredAmounts(direction: PositionDirecti
|
|
|
61
61
|
* targetPrice => the target price PRICE_PRECISION
|
|
62
62
|
* ]
|
|
63
63
|
*/
|
|
64
|
-
export declare function calculateTargetPriceTrade(market: PerpMarketAccount, targetPrice: BN, pct?: BN, outputAssetType?: AssetType, mmOraclePriceData?: MMOraclePriceData, useSpread?: boolean): [PositionDirection, BN, BN, BN];
|
|
64
|
+
export declare function calculateTargetPriceTrade(market: PerpMarketAccount, targetPrice: BN, pct?: BN, outputAssetType?: AssetType, mmOraclePriceData?: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [PositionDirection, BN, BN, BN];
|
|
65
65
|
/**
|
|
66
66
|
* Calculates the estimated entry price and price impact of order, in base or quote
|
|
67
67
|
* Price impact is based on the difference between the entry price and the best bid/ask price (whether it's dlob or vamm)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trade.d.ts","sourceRoot":"","sources":["../../../src/math/trade.ts"],"names":[],"mappings":";AAAA,OAAO,EAEN,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAevC,OAAO,EAIN,SAAS,EAIT,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAItD,MAAM,MAAM,eAAe,GACxB,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,oBAAoB,GACpB,QAAQ,GACR,QAAQ,GACR,kBAAkB,GAClB,qBAAqB,GACrB,yBAAyB,GACzB,0BAA0B,GAC1B,KAAK,CAAC;AAET;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,EAAE,EACV,MAAM,EAAE,iBAAiB,EACzB,cAAc,EAAE,SAAmB,EACnC,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,UAAO,
|
|
1
|
+
{"version":3,"file":"trade.d.ts","sourceRoot":"","sources":["../../../src/math/trade.ts"],"names":[],"mappings":"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"}
|
package/lib/node/math/trade.js
CHANGED
|
@@ -30,7 +30,7 @@ const MAXPCT = new anchor_1.BN(1000); //percentage units are [0,1000] => [0,1]
|
|
|
30
30
|
*
|
|
31
31
|
* 'newPrice' => the price of the asset after the trade : Precision PRICE_PRECISION
|
|
32
32
|
*/
|
|
33
|
-
function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
|
|
33
|
+
function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
|
|
34
34
|
let oldPrice;
|
|
35
35
|
if (useSpread && market.amm.baseSpread > 0) {
|
|
36
36
|
if ((0, types_2.isVariant)(direction, 'long')) {
|
|
@@ -53,7 +53,7 @@ function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quo
|
|
|
53
53
|
.div(acquiredBaseReserve.abs());
|
|
54
54
|
let amm;
|
|
55
55
|
if (useSpread && market.amm.baseSpread > 0) {
|
|
56
|
-
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
|
|
56
|
+
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
|
|
57
57
|
amm = {
|
|
58
58
|
baseAssetReserve,
|
|
59
59
|
quoteAssetReserve,
|
|
@@ -95,14 +95,14 @@ exports.calculateTradeSlippage = calculateTradeSlippage;
|
|
|
95
95
|
* | 'acquiredBase' => positive/negative change in user's base : BN AMM_RESERVE_PRECISION
|
|
96
96
|
* | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
|
|
97
97
|
*/
|
|
98
|
-
function calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
|
|
98
|
+
function calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
|
|
99
99
|
if (amount.eq(numericConstants_1.ZERO)) {
|
|
100
100
|
return [numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO];
|
|
101
101
|
}
|
|
102
102
|
const swapDirection = (0, amm_1.getSwapDirection)(inputAssetType, direction);
|
|
103
103
|
let amm;
|
|
104
104
|
if (useSpread && market.amm.baseSpread > 0) {
|
|
105
|
-
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
|
|
105
|
+
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
|
|
106
106
|
amm = {
|
|
107
107
|
baseAssetReserve,
|
|
108
108
|
quoteAssetReserve,
|
|
@@ -140,7 +140,7 @@ exports.calculateTradeAcquiredAmounts = calculateTradeAcquiredAmounts;
|
|
|
140
140
|
* targetPrice => the target price PRICE_PRECISION
|
|
141
141
|
* ]
|
|
142
142
|
*/
|
|
143
|
-
function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
|
|
143
|
+
function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
|
|
144
144
|
(0, assert_1.assert)(market.amm.baseAssetReserve.gt(numericConstants_1.ZERO));
|
|
145
145
|
(0, assert_1.assert)(targetPrice.gt(numericConstants_1.ZERO));
|
|
146
146
|
(0, assert_1.assert)(pct.lte(MAXPCT) && pct.gt(numericConstants_1.ZERO));
|
|
@@ -166,7 +166,7 @@ function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAsse
|
|
|
166
166
|
let quoteAssetReserveBefore;
|
|
167
167
|
let peg = market.amm.pegMultiplier;
|
|
168
168
|
if (useSpread && market.amm.baseSpread > 0) {
|
|
169
|
-
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
|
|
169
|
+
const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
|
|
170
170
|
baseAssetReserveBefore = baseAssetReserve;
|
|
171
171
|
quoteAssetReserveBefore = quoteAssetReserve;
|
|
172
172
|
peg = newPeg;
|
|
@@ -280,7 +280,7 @@ function calculateEstimatedPerpEntryPrice(assetType, amount, direction, market,
|
|
|
280
280
|
const takerIsLong = (0, types_2.isVariant)(direction, 'long');
|
|
281
281
|
const limitOrders = dlob[takerIsLong ? 'getRestingLimitAsks' : 'getRestingLimitBids'](market.marketIndex, slot, types_1.MarketType.PERP, mmOraclePriceData);
|
|
282
282
|
const swapDirection = (0, amm_1.getSwapDirection)(assetType, direction);
|
|
283
|
-
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
|
|
283
|
+
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, new anchor_1.BN(slot));
|
|
284
284
|
const amm = {
|
|
285
285
|
baseAssetReserve,
|
|
286
286
|
quoteAssetReserve,
|
package/package.json
CHANGED
|
@@ -182,12 +182,14 @@ export function getVammL2Generator({
|
|
|
182
182
|
numOrders,
|
|
183
183
|
now = new BN(Math.floor(Date.now() / 1000)),
|
|
184
184
|
topOfBookQuoteAmounts = [],
|
|
185
|
+
latestSlot,
|
|
185
186
|
}: {
|
|
186
187
|
marketAccount: PerpMarketAccount;
|
|
187
188
|
mmOraclePriceData: MMOraclePriceData;
|
|
188
189
|
numOrders: number;
|
|
189
190
|
now?: BN;
|
|
190
191
|
topOfBookQuoteAmounts?: BN[];
|
|
192
|
+
latestSlot?: BN;
|
|
191
193
|
}): L2OrderBookGenerator {
|
|
192
194
|
const updatedAmm = calculateUpdatedAMM(marketAccount.amm, mmOraclePriceData);
|
|
193
195
|
const paused = isOperationPaused(
|
|
@@ -211,7 +213,8 @@ export function getVammL2Generator({
|
|
|
211
213
|
updatedAmm,
|
|
212
214
|
mmOraclePriceData,
|
|
213
215
|
now,
|
|
214
|
-
isVariant(marketAccount.contractType, 'prediction')
|
|
216
|
+
isVariant(marketAccount.contractType, 'prediction'),
|
|
217
|
+
latestSlot
|
|
215
218
|
);
|
|
216
219
|
|
|
217
220
|
const numBaseOrders = Math.max(1, numOrders - topOfBookQuoteAmounts.length);
|
package/src/math/amm.ts
CHANGED
|
@@ -197,14 +197,16 @@ export function calculateUpdatedAMMSpreadReserves(
|
|
|
197
197
|
amm: AMM,
|
|
198
198
|
direction: PositionDirection,
|
|
199
199
|
mmOraclePriceData: MMOraclePriceData,
|
|
200
|
-
isPrediction = false
|
|
200
|
+
isPrediction = false,
|
|
201
|
+
latestSlot?: BN
|
|
201
202
|
): { baseAssetReserve: BN; quoteAssetReserve: BN; sqrtK: BN; newPeg: BN } {
|
|
202
203
|
const newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
|
|
203
204
|
const [shortReserves, longReserves] = calculateSpreadReserves(
|
|
204
205
|
newAmm,
|
|
205
206
|
mmOraclePriceData,
|
|
206
207
|
undefined,
|
|
207
|
-
isPrediction
|
|
208
|
+
isPrediction,
|
|
209
|
+
latestSlot
|
|
208
210
|
);
|
|
209
211
|
|
|
210
212
|
const dirReserves = isVariant(direction, 'long')
|
|
@@ -225,7 +227,8 @@ export function calculateBidAskPrice(
|
|
|
225
227
|
amm: AMM,
|
|
226
228
|
mmOraclePriceData: MMOraclePriceData,
|
|
227
229
|
withUpdate = true,
|
|
228
|
-
isPrediction = false
|
|
230
|
+
isPrediction = false,
|
|
231
|
+
latestSlot?: BN
|
|
229
232
|
): [BN, BN] {
|
|
230
233
|
let newAmm: AMM;
|
|
231
234
|
if (withUpdate) {
|
|
@@ -238,7 +241,8 @@ export function calculateBidAskPrice(
|
|
|
238
241
|
newAmm,
|
|
239
242
|
mmOraclePriceData,
|
|
240
243
|
undefined,
|
|
241
|
-
isPrediction
|
|
244
|
+
isPrediction,
|
|
245
|
+
latestSlot
|
|
242
246
|
);
|
|
243
247
|
|
|
244
248
|
const askPrice = calculatePrice(
|
|
@@ -939,7 +943,8 @@ export function calculateSpreadReserves(
|
|
|
939
943
|
amm: AMM,
|
|
940
944
|
mmOraclePriceData: MMOraclePriceData,
|
|
941
945
|
now?: BN,
|
|
942
|
-
isPrediction = false
|
|
946
|
+
isPrediction = false,
|
|
947
|
+
latestSlot?: BN
|
|
943
948
|
) {
|
|
944
949
|
function calculateSpreadReserve(
|
|
945
950
|
spread: number,
|
|
@@ -1041,28 +1046,28 @@ export function calculateSpreadReserves(
|
|
|
1041
1046
|
amm.curveUpdateIntensity > 100;
|
|
1042
1047
|
|
|
1043
1048
|
if (doReferencePricOffsetSmooth) {
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
)
|
|
1051
|
-
|
|
1052
|
-
|
|
1049
|
+
const slotsPassed =
|
|
1050
|
+
latestSlot != null
|
|
1051
|
+
? BN.max(latestSlot.sub(amm.lastUpdateSlot), ZERO).toNumber()
|
|
1052
|
+
: 0;
|
|
1053
|
+
const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
|
|
1054
|
+
const raw = Math.trunc(
|
|
1055
|
+
Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10
|
|
1056
|
+
);
|
|
1057
|
+
const maxAllowed =
|
|
1058
|
+
Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
|
|
1053
1059
|
|
|
1054
|
-
|
|
1055
|
-
|
|
1060
|
+
const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
|
|
1061
|
+
const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
|
|
1056
1062
|
|
|
1057
|
-
|
|
1063
|
+
referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
|
|
1058
1064
|
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
}
|
|
1065
|
+
if (referencePriceDelta < 0) {
|
|
1066
|
+
longSpread += Math.abs(referencePriceDelta);
|
|
1067
|
+
shortSpread += Math.abs(referencePriceOffset);
|
|
1068
|
+
} else {
|
|
1069
|
+
shortSpread += Math.abs(referencePriceDelta);
|
|
1070
|
+
longSpread += Math.abs(referencePriceOffset);
|
|
1066
1071
|
}
|
|
1067
1072
|
}
|
|
1068
1073
|
|
package/src/math/market.ts
CHANGED
|
@@ -61,13 +61,16 @@ export function calculateReservePrice(
|
|
|
61
61
|
*/
|
|
62
62
|
export function calculateBidPrice(
|
|
63
63
|
market: PerpMarketAccount,
|
|
64
|
-
mmOraclePriceData: MMOraclePriceData
|
|
64
|
+
mmOraclePriceData: MMOraclePriceData,
|
|
65
|
+
latestSlot?: BN
|
|
65
66
|
): BN {
|
|
66
67
|
const { baseAssetReserve, quoteAssetReserve, newPeg } =
|
|
67
68
|
calculateUpdatedAMMSpreadReserves(
|
|
68
69
|
market.amm,
|
|
69
70
|
PositionDirection.SHORT,
|
|
70
|
-
mmOraclePriceData
|
|
71
|
+
mmOraclePriceData,
|
|
72
|
+
undefined,
|
|
73
|
+
latestSlot
|
|
71
74
|
);
|
|
72
75
|
|
|
73
76
|
return calculatePrice(baseAssetReserve, quoteAssetReserve, newPeg);
|
|
@@ -81,13 +84,16 @@ export function calculateBidPrice(
|
|
|
81
84
|
*/
|
|
82
85
|
export function calculateAskPrice(
|
|
83
86
|
market: PerpMarketAccount,
|
|
84
|
-
mmOraclePriceData: MMOraclePriceData
|
|
87
|
+
mmOraclePriceData: MMOraclePriceData,
|
|
88
|
+
latestSlot?: BN
|
|
85
89
|
): BN {
|
|
86
90
|
const { baseAssetReserve, quoteAssetReserve, newPeg } =
|
|
87
91
|
calculateUpdatedAMMSpreadReserves(
|
|
88
92
|
market.amm,
|
|
89
93
|
PositionDirection.LONG,
|
|
90
|
-
mmOraclePriceData
|
|
94
|
+
mmOraclePriceData,
|
|
95
|
+
undefined,
|
|
96
|
+
latestSlot
|
|
91
97
|
);
|
|
92
98
|
|
|
93
99
|
return calculatePrice(baseAssetReserve, quoteAssetReserve, newPeg);
|
package/src/math/position.ts
CHANGED
|
@@ -37,7 +37,8 @@ export function calculateBaseAssetValue(
|
|
|
37
37
|
userPosition: PerpPosition,
|
|
38
38
|
mmOraclePriceData: MMOraclePriceData,
|
|
39
39
|
useSpread = true,
|
|
40
|
-
skipUpdate = false
|
|
40
|
+
skipUpdate = false,
|
|
41
|
+
latestSlot?: BN
|
|
41
42
|
): BN {
|
|
42
43
|
if (userPosition.baseAssetAmount.eq(ZERO)) {
|
|
43
44
|
return ZERO;
|
|
@@ -52,7 +53,9 @@ export function calculateBaseAssetValue(
|
|
|
52
53
|
calculateUpdatedAMMSpreadReserves(
|
|
53
54
|
market.amm,
|
|
54
55
|
directionToClose,
|
|
55
|
-
mmOraclePriceData
|
|
56
|
+
mmOraclePriceData,
|
|
57
|
+
undefined,
|
|
58
|
+
latestSlot
|
|
56
59
|
);
|
|
57
60
|
prepegAmm = {
|
|
58
61
|
baseAssetReserve,
|
package/src/math/trade.ts
CHANGED
|
@@ -78,7 +78,8 @@ export function calculateTradeSlippage(
|
|
|
78
78
|
market: PerpMarketAccount,
|
|
79
79
|
inputAssetType: AssetType = 'quote',
|
|
80
80
|
mmOraclePriceData: MMOraclePriceData,
|
|
81
|
-
useSpread = true
|
|
81
|
+
useSpread = true,
|
|
82
|
+
latestSlot?: BN
|
|
82
83
|
): [BN, BN, BN, BN] {
|
|
83
84
|
let oldPrice: BN;
|
|
84
85
|
|
|
@@ -115,7 +116,9 @@ export function calculateTradeSlippage(
|
|
|
115
116
|
calculateUpdatedAMMSpreadReserves(
|
|
116
117
|
market.amm,
|
|
117
118
|
direction,
|
|
118
|
-
mmOraclePriceData
|
|
119
|
+
mmOraclePriceData,
|
|
120
|
+
undefined,
|
|
121
|
+
latestSlot
|
|
119
122
|
);
|
|
120
123
|
amm = {
|
|
121
124
|
baseAssetReserve,
|
|
@@ -170,7 +173,8 @@ export function calculateTradeAcquiredAmounts(
|
|
|
170
173
|
market: PerpMarketAccount,
|
|
171
174
|
inputAssetType: AssetType = 'quote',
|
|
172
175
|
mmOraclePriceData: MMOraclePriceData,
|
|
173
|
-
useSpread = true
|
|
176
|
+
useSpread = true,
|
|
177
|
+
latestSlot?: BN
|
|
174
178
|
): [BN, BN, BN] {
|
|
175
179
|
if (amount.eq(ZERO)) {
|
|
176
180
|
return [ZERO, ZERO, ZERO];
|
|
@@ -184,7 +188,9 @@ export function calculateTradeAcquiredAmounts(
|
|
|
184
188
|
calculateUpdatedAMMSpreadReserves(
|
|
185
189
|
market.amm,
|
|
186
190
|
direction,
|
|
187
|
-
mmOraclePriceData
|
|
191
|
+
mmOraclePriceData,
|
|
192
|
+
undefined,
|
|
193
|
+
latestSlot
|
|
188
194
|
);
|
|
189
195
|
amm = {
|
|
190
196
|
baseAssetReserve,
|
|
@@ -236,7 +242,8 @@ export function calculateTargetPriceTrade(
|
|
|
236
242
|
pct: BN = MAXPCT,
|
|
237
243
|
outputAssetType: AssetType = 'quote',
|
|
238
244
|
mmOraclePriceData?: MMOraclePriceData,
|
|
239
|
-
useSpread = true
|
|
245
|
+
useSpread = true,
|
|
246
|
+
latestSlot?: BN
|
|
240
247
|
): [PositionDirection, BN, BN, BN] {
|
|
241
248
|
assert(market.amm.baseAssetReserve.gt(ZERO));
|
|
242
249
|
assert(targetPrice.gt(ZERO));
|
|
@@ -272,7 +279,9 @@ export function calculateTargetPriceTrade(
|
|
|
272
279
|
calculateUpdatedAMMSpreadReserves(
|
|
273
280
|
market.amm,
|
|
274
281
|
direction,
|
|
275
|
-
mmOraclePriceData
|
|
282
|
+
mmOraclePriceData,
|
|
283
|
+
undefined,
|
|
284
|
+
latestSlot
|
|
276
285
|
);
|
|
277
286
|
baseAssetReserveBefore = baseAssetReserve;
|
|
278
287
|
quoteAssetReserveBefore = quoteAssetReserve;
|
|
@@ -430,7 +439,13 @@ export function calculateEstimatedPerpEntryPrice(
|
|
|
430
439
|
const swapDirection = getSwapDirection(assetType, direction);
|
|
431
440
|
|
|
432
441
|
const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } =
|
|
433
|
-
calculateUpdatedAMMSpreadReserves(
|
|
442
|
+
calculateUpdatedAMMSpreadReserves(
|
|
443
|
+
market.amm,
|
|
444
|
+
direction,
|
|
445
|
+
mmOraclePriceData,
|
|
446
|
+
undefined,
|
|
447
|
+
new BN(slot)
|
|
448
|
+
);
|
|
434
449
|
const amm = {
|
|
435
450
|
baseAssetReserve,
|
|
436
451
|
quoteAssetReserve,
|