@drift-labs/sdk 2.129.0-beta.1 → 2.129.0-beta.3
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/math/amm.js +22 -1
- package/lib/node/math/amm.d.ts.map +1 -1
- package/lib/node/math/amm.js +22 -1
- package/package.json +1 -1
- package/src/adminClient.ts +124 -13
- package/src/dlob/orderBookLevels.ts +18 -5
- package/src/driftClient.ts +10 -1
- package/src/idl/drift.json +24 -18
- package/src/math/amm.ts +58 -24
- package/src/math/funding.ts +26 -12
- package/src/math/market.ts +16 -15
- package/src/math/oracles.ts +9 -13
- package/src/math/orders.ts +13 -9
- package/src/math/position.ts +4 -4
- package/src/math/trade.ts +46 -20
- package/src/oracles/types.ts +6 -0
- package/src/oracles/utils.ts +60 -0
- package/src/tx/utils.ts +10 -0
- package/src/types.ts +3 -4
- package/src/user.ts +11 -7
- package/tsconfig.browser.json +4 -1
- package/tsconfig.json +4 -1
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.129.0-beta.
|
|
1
|
+
2.129.0-beta.3
|
package/lib/browser/math/amm.js
CHANGED
|
@@ -529,7 +529,28 @@ function calculateSpreadReserves(amm, oraclePriceData, now, isPrediction = false
|
|
|
529
529
|
const liquidityFractionSigned = liquidityFraction.mul((0, __1.sigNum)(amm.baseAssetAmountWithAmm.add(amm.baseAssetAmountWithUnsettledLp)));
|
|
530
530
|
referencePriceOffset = calculateReferencePriceOffset(reservePrice, amm.last24HAvgFundingRate, liquidityFractionSigned, amm.historicalOracleData.lastOraclePriceTwap5Min, amm.lastMarkPriceTwap5Min, amm.historicalOracleData.lastOraclePriceTwap, amm.lastMarkPriceTwap, maxOffset).toNumber();
|
|
531
531
|
}
|
|
532
|
-
|
|
532
|
+
let [longSpread, shortSpread] = calculateSpread(amm, oraclePriceData, now, reservePrice);
|
|
533
|
+
const doReferencePricOffsetSmooth = Math.sign(referencePriceOffset) !== Math.sign(amm.referencePriceOffset) &&
|
|
534
|
+
amm.curveUpdateIntensity > 100;
|
|
535
|
+
if (doReferencePricOffsetSmooth) {
|
|
536
|
+
if (oraclePriceData.slot !== amm.lastUpdateSlot) {
|
|
537
|
+
const slotsPassed = oraclePriceData.slot.toNumber() - amm.lastUpdateSlot.toNumber();
|
|
538
|
+
const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
|
|
539
|
+
const raw = Math.trunc(Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10);
|
|
540
|
+
const maxAllowed = Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
|
|
541
|
+
const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
|
|
542
|
+
const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
|
|
543
|
+
referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
|
|
544
|
+
if (referencePriceDelta < 0) {
|
|
545
|
+
longSpread += Math.abs(referencePriceDelta);
|
|
546
|
+
shortSpread += Math.abs(referencePriceOffset);
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
shortSpread += Math.abs(referencePriceDelta);
|
|
550
|
+
longSpread += Math.abs(referencePriceOffset);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
533
554
|
const askReserves = calculateSpreadReserve(longSpread + referencePriceOffset, types_1.PositionDirection.LONG, amm);
|
|
534
555
|
const bidReserves = calculateSpreadReserve(-shortSpread + referencePriceOffset, types_1.PositionDirection.SHORT, amm);
|
|
535
556
|
return [bidReserves, askReserves];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amm.d.ts","sourceRoot":"","sources":["../../../src/math/amm.ts"],"names":[],"mappings":"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
|
|
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
|
@@ -529,7 +529,28 @@ function calculateSpreadReserves(amm, oraclePriceData, now, isPrediction = false
|
|
|
529
529
|
const liquidityFractionSigned = liquidityFraction.mul((0, __1.sigNum)(amm.baseAssetAmountWithAmm.add(amm.baseAssetAmountWithUnsettledLp)));
|
|
530
530
|
referencePriceOffset = calculateReferencePriceOffset(reservePrice, amm.last24HAvgFundingRate, liquidityFractionSigned, amm.historicalOracleData.lastOraclePriceTwap5Min, amm.lastMarkPriceTwap5Min, amm.historicalOracleData.lastOraclePriceTwap, amm.lastMarkPriceTwap, maxOffset).toNumber();
|
|
531
531
|
}
|
|
532
|
-
|
|
532
|
+
let [longSpread, shortSpread] = calculateSpread(amm, oraclePriceData, now, reservePrice);
|
|
533
|
+
const doReferencePricOffsetSmooth = Math.sign(referencePriceOffset) !== Math.sign(amm.referencePriceOffset) &&
|
|
534
|
+
amm.curveUpdateIntensity > 100;
|
|
535
|
+
if (doReferencePricOffsetSmooth) {
|
|
536
|
+
if (oraclePriceData.slot !== amm.lastUpdateSlot) {
|
|
537
|
+
const slotsPassed = oraclePriceData.slot.toNumber() - amm.lastUpdateSlot.toNumber();
|
|
538
|
+
const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
|
|
539
|
+
const raw = Math.trunc(Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10);
|
|
540
|
+
const maxAllowed = Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
|
|
541
|
+
const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
|
|
542
|
+
const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
|
|
543
|
+
referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
|
|
544
|
+
if (referencePriceDelta < 0) {
|
|
545
|
+
longSpread += Math.abs(referencePriceDelta);
|
|
546
|
+
shortSpread += Math.abs(referencePriceOffset);
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
shortSpread += Math.abs(referencePriceDelta);
|
|
550
|
+
longSpread += Math.abs(referencePriceOffset);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
533
554
|
const askReserves = calculateSpreadReserve(longSpread + referencePriceOffset, types_1.PositionDirection.LONG, amm);
|
|
534
555
|
const bidReserves = calculateSpreadReserve(-shortSpread + referencePriceOffset, types_1.PositionDirection.SHORT, amm);
|
|
535
556
|
return [bidReserves, askReserves];
|
package/package.json
CHANGED
package/src/adminClient.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PublicKey,
|
|
3
3
|
SystemProgram,
|
|
4
|
+
SYSVAR_CLOCK_PUBKEY,
|
|
4
5
|
SYSVAR_RENT_PUBKEY,
|
|
5
6
|
TransactionInstruction,
|
|
6
7
|
TransactionSignature,
|
|
@@ -57,6 +58,7 @@ import { PROGRAM_ID as PHOENIX_PROGRAM_ID } from '@ellipsis-labs/phoenix-sdk';
|
|
|
57
58
|
import { DRIFT_ORACLE_RECEIVER_ID } from './config';
|
|
58
59
|
import { getFeedIdUint8Array } from './util/pythOracleUtils';
|
|
59
60
|
import { FUEL_RESET_LOG_ACCOUNT } from './constants/txConstants';
|
|
61
|
+
import { createNativeInstructionDiscriminatorBuffer } from './tx/utils';
|
|
60
62
|
|
|
61
63
|
const OPENBOOK_PROGRAM_ID = new PublicKey(
|
|
62
64
|
'opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb'
|
|
@@ -4552,27 +4554,136 @@ export class AdminClient extends DriftClient {
|
|
|
4552
4554
|
});
|
|
4553
4555
|
}
|
|
4554
4556
|
|
|
4555
|
-
public async
|
|
4556
|
-
marketIndex: number
|
|
4557
|
+
public async updateMmOracleNative(
|
|
4558
|
+
marketIndex: number,
|
|
4559
|
+
oraclePrice: BN,
|
|
4560
|
+
oracleSequenceId: BN
|
|
4557
4561
|
): Promise<TransactionSignature> {
|
|
4558
|
-
const
|
|
4559
|
-
|
|
4560
|
-
|
|
4561
|
-
|
|
4562
|
+
const updateMmOracleIx = await this.getUpdateMmOracleNativeIx(
|
|
4563
|
+
marketIndex,
|
|
4564
|
+
oraclePrice,
|
|
4565
|
+
oracleSequenceId
|
|
4566
|
+
);
|
|
4562
4567
|
|
|
4568
|
+
const tx = await this.buildTransaction(updateMmOracleIx, {
|
|
4569
|
+
computeUnits: 5000,
|
|
4570
|
+
computeUnitsPrice: 0,
|
|
4571
|
+
});
|
|
4563
4572
|
const { txSig } = await this.sendTransaction(tx, [], this.opts);
|
|
4564
4573
|
|
|
4565
4574
|
return txSig;
|
|
4566
4575
|
}
|
|
4567
4576
|
|
|
4568
|
-
public async
|
|
4569
|
-
marketIndex: number
|
|
4577
|
+
public async getUpdateMmOracleNativeIx(
|
|
4578
|
+
marketIndex: number,
|
|
4579
|
+
oraclePrice: BN,
|
|
4580
|
+
oracleSequenceId: BN
|
|
4570
4581
|
): Promise<TransactionInstruction> {
|
|
4571
|
-
|
|
4572
|
-
|
|
4573
|
-
|
|
4574
|
-
|
|
4575
|
-
|
|
4582
|
+
const discriminatorBuffer = createNativeInstructionDiscriminatorBuffer(0);
|
|
4583
|
+
const data = Buffer.alloc(discriminatorBuffer.length + 16);
|
|
4584
|
+
data.set(discriminatorBuffer, 0);
|
|
4585
|
+
data.set(oraclePrice.toArrayLike(Buffer, 'le', 8), 5); // next 8 bytes
|
|
4586
|
+
data.set(oracleSequenceId.toArrayLike(Buffer, 'le', 8), 13); // next 8 bytes
|
|
4587
|
+
|
|
4588
|
+
// Build the instruction manually
|
|
4589
|
+
return new TransactionInstruction({
|
|
4590
|
+
programId: this.program.programId,
|
|
4591
|
+
keys: [
|
|
4592
|
+
{
|
|
4593
|
+
pubkey: this.getPerpMarketAccount(marketIndex).pubkey,
|
|
4594
|
+
isWritable: true,
|
|
4595
|
+
isSigner: false,
|
|
4596
|
+
},
|
|
4597
|
+
{
|
|
4598
|
+
pubkey: this.wallet.publicKey,
|
|
4599
|
+
isWritable: false,
|
|
4600
|
+
isSigner: true,
|
|
4601
|
+
},
|
|
4602
|
+
{
|
|
4603
|
+
pubkey: SYSVAR_CLOCK_PUBKEY,
|
|
4604
|
+
isWritable: false,
|
|
4605
|
+
isSigner: false,
|
|
4606
|
+
},
|
|
4607
|
+
{
|
|
4608
|
+
pubkey: await this.getStatePublicKey(),
|
|
4609
|
+
isWritable: false,
|
|
4610
|
+
isSigner: false,
|
|
4611
|
+
},
|
|
4612
|
+
],
|
|
4613
|
+
data,
|
|
4614
|
+
});
|
|
4615
|
+
}
|
|
4616
|
+
|
|
4617
|
+
public async updateAmmSpreadAdjustmentNative(
|
|
4618
|
+
marketIndex: number,
|
|
4619
|
+
ammSpreadAdjustment: number
|
|
4620
|
+
): Promise<TransactionSignature> {
|
|
4621
|
+
const updateMmOracleIx = await this.getUpdateAmmSpreadAdjustmentNativeIx(
|
|
4622
|
+
marketIndex,
|
|
4623
|
+
ammSpreadAdjustment
|
|
4624
|
+
);
|
|
4625
|
+
|
|
4626
|
+
const tx = await this.buildTransaction(updateMmOracleIx, {
|
|
4627
|
+
computeUnits: 1000,
|
|
4628
|
+
computeUnitsPrice: 0,
|
|
4629
|
+
});
|
|
4630
|
+
const { txSig } = await this.sendTransaction(tx, [], this.opts);
|
|
4631
|
+
|
|
4632
|
+
return txSig;
|
|
4633
|
+
}
|
|
4634
|
+
|
|
4635
|
+
public getUpdateAmmSpreadAdjustmentNativeIx(
|
|
4636
|
+
marketIndex: number,
|
|
4637
|
+
ammSpreadAdjustment: number // i8
|
|
4638
|
+
): TransactionInstruction {
|
|
4639
|
+
const discriminatorBuffer = createNativeInstructionDiscriminatorBuffer(1);
|
|
4640
|
+
const data = Buffer.alloc(discriminatorBuffer.length + 4);
|
|
4641
|
+
data.set(discriminatorBuffer, 0);
|
|
4642
|
+
data.writeInt8(ammSpreadAdjustment, 5); // next byte
|
|
4643
|
+
|
|
4644
|
+
// Build the instruction manually
|
|
4645
|
+
return new TransactionInstruction({
|
|
4646
|
+
programId: this.program.programId,
|
|
4647
|
+
keys: [
|
|
4648
|
+
{
|
|
4649
|
+
pubkey: this.getPerpMarketAccount(marketIndex).pubkey,
|
|
4650
|
+
isWritable: true,
|
|
4651
|
+
isSigner: false,
|
|
4652
|
+
},
|
|
4653
|
+
{
|
|
4654
|
+
pubkey: this.wallet.publicKey,
|
|
4655
|
+
isWritable: false,
|
|
4656
|
+
isSigner: true,
|
|
4657
|
+
},
|
|
4658
|
+
],
|
|
4659
|
+
data,
|
|
4576
4660
|
});
|
|
4577
4661
|
}
|
|
4662
|
+
|
|
4663
|
+
public async updateDisableBitFlagsMMOracle(
|
|
4664
|
+
disable: boolean
|
|
4665
|
+
): Promise<TransactionSignature> {
|
|
4666
|
+
const updateDisableBitFlagsMMOracleIx =
|
|
4667
|
+
await this.getUpdateDisableBitFlagsMMOracleIx(disable);
|
|
4668
|
+
|
|
4669
|
+
const tx = await this.buildTransaction(updateDisableBitFlagsMMOracleIx);
|
|
4670
|
+
const { txSig } = await this.sendTransaction(tx, [], this.opts);
|
|
4671
|
+
|
|
4672
|
+
return txSig;
|
|
4673
|
+
}
|
|
4674
|
+
public async getUpdateDisableBitFlagsMMOracleIx(
|
|
4675
|
+
disable: boolean
|
|
4676
|
+
): Promise<TransactionInstruction> {
|
|
4677
|
+
return await this.program.instruction.updateDisableBitflagsMmOracle(
|
|
4678
|
+
disable,
|
|
4679
|
+
{
|
|
4680
|
+
accounts: {
|
|
4681
|
+
admin: this.isSubscribed
|
|
4682
|
+
? this.getStateAccount().admin
|
|
4683
|
+
: this.wallet.publicKey,
|
|
4684
|
+
state: await this.getStatePublicKey(),
|
|
4685
|
+
},
|
|
4686
|
+
}
|
|
4687
|
+
);
|
|
4688
|
+
}
|
|
4578
4689
|
}
|
|
@@ -20,8 +20,10 @@ import {
|
|
|
20
20
|
PRICE_PRECISION,
|
|
21
21
|
AMM_TO_QUOTE_PRECISION_RATIO,
|
|
22
22
|
standardizeBaseAssetAmount,
|
|
23
|
+
MMOraclePriceData,
|
|
23
24
|
} from '..';
|
|
24
25
|
import { PublicKey } from '@solana/web3.js';
|
|
26
|
+
import { getOraclePriceFromMMOracleData } from '../oracles/utils';
|
|
25
27
|
|
|
26
28
|
type liquiditySource =
|
|
27
29
|
| 'serum'
|
|
@@ -175,12 +177,23 @@ export function getVammL2Generator({
|
|
|
175
177
|
topOfBookQuoteAmounts = [],
|
|
176
178
|
}: {
|
|
177
179
|
marketAccount: PerpMarketAccount;
|
|
178
|
-
oraclePriceData: OraclePriceData;
|
|
180
|
+
oraclePriceData: OraclePriceData | MMOraclePriceData;
|
|
179
181
|
numOrders: number;
|
|
180
182
|
now?: BN;
|
|
181
183
|
topOfBookQuoteAmounts?: BN[];
|
|
182
184
|
}): L2OrderBookGenerator {
|
|
183
|
-
|
|
185
|
+
let mmOraclePriceData: MMOraclePriceData;
|
|
186
|
+
if ('mmOraclePrice' in mmOraclePriceData) {
|
|
187
|
+
mmOraclePriceData = oraclePriceData as MMOraclePriceData;
|
|
188
|
+
} else {
|
|
189
|
+
mmOraclePriceData = {
|
|
190
|
+
mmOraclePrice: marketAccount.amm.mmOraclePrice,
|
|
191
|
+
mmOracleSlot: marketAccount.amm.mmOracleSlot,
|
|
192
|
+
oraclePriceData: oraclePriceData as OraclePriceData,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const updatedAmm = calculateUpdatedAMM(marketAccount.amm, mmOraclePriceData);
|
|
184
197
|
const paused = isOperationPaused(
|
|
185
198
|
marketAccount.pausedOperations,
|
|
186
199
|
PerpOperation.AMM_FILL
|
|
@@ -200,7 +213,7 @@ export function getVammL2Generator({
|
|
|
200
213
|
|
|
201
214
|
const [bidReserves, askReserves] = calculateSpreadReserves(
|
|
202
215
|
updatedAmm,
|
|
203
|
-
|
|
216
|
+
mmOraclePriceData,
|
|
204
217
|
now,
|
|
205
218
|
isVariant(marketAccount.contractType, 'prediction')
|
|
206
219
|
);
|
|
@@ -209,7 +222,7 @@ export function getVammL2Generator({
|
|
|
209
222
|
const commonOpts = {
|
|
210
223
|
numOrders,
|
|
211
224
|
numBaseOrders,
|
|
212
|
-
|
|
225
|
+
mmOraclePriceData,
|
|
213
226
|
orderTickSize: marketAccount.amm.orderTickSize,
|
|
214
227
|
orderStepSize: marketAccount.amm.orderStepSize,
|
|
215
228
|
pegMultiplier: updatedAmm.pegMultiplier,
|
|
@@ -244,7 +257,7 @@ export function getVammL2Generator({
|
|
|
244
257
|
const raw = commonOpts.topOfBookQuoteAmounts[count]
|
|
245
258
|
.mul(AMM_TO_QUOTE_PRECISION_RATIO)
|
|
246
259
|
.mul(PRICE_PRECISION)
|
|
247
|
-
.div(commonOpts.
|
|
260
|
+
.div(getOraclePriceFromMMOracleData(commonOpts.mmOraclePriceData));
|
|
248
261
|
baseSwap = standardizeBaseAssetAmount(raw, commonOpts.orderStepSize);
|
|
249
262
|
const remaining = openLiquidity.abs().sub(topSize);
|
|
250
263
|
if (remaining.lt(baseSwap)) baseSwap = remaining;
|
package/src/driftClient.ts
CHANGED
|
@@ -130,7 +130,7 @@ import {
|
|
|
130
130
|
import { findDirectionToClose, positionIsAvailable } from './math/position';
|
|
131
131
|
import { getSignedTokenAmount, getTokenAmount } from './math/spotBalance';
|
|
132
132
|
import { decodeName, DEFAULT_USER_NAME, encodeName } from './userName';
|
|
133
|
-
import { OraclePriceData } from './oracles/types';
|
|
133
|
+
import { MMOraclePriceData, OraclePriceData } from './oracles/types';
|
|
134
134
|
import { DriftClientConfig } from './driftClientConfig';
|
|
135
135
|
import { PollingDriftClientAccountSubscriber } from './accounts/pollingDriftClientAccountSubscriber';
|
|
136
136
|
import { WebSocketDriftClientAccountSubscriber } from './accounts/webSocketDriftClientAccountSubscriber';
|
|
@@ -8485,6 +8485,15 @@ export class DriftClient {
|
|
|
8485
8485
|
).data;
|
|
8486
8486
|
}
|
|
8487
8487
|
|
|
8488
|
+
public getMMOracleDataForPerpMarket(marketIndex: number): MMOraclePriceData {
|
|
8489
|
+
const perpMarket = this.getPerpMarketAccount(marketIndex);
|
|
8490
|
+
return {
|
|
8491
|
+
mmOraclePrice: perpMarket.amm.mmOraclePrice,
|
|
8492
|
+
mmOracleSlot: perpMarket.amm.mmOracleSlot,
|
|
8493
|
+
oraclePriceData: this.getOracleDataForPerpMarket(marketIndex),
|
|
8494
|
+
};
|
|
8495
|
+
}
|
|
8496
|
+
|
|
8488
8497
|
public getOracleDataForSpotMarket(marketIndex: number): OraclePriceData {
|
|
8489
8498
|
return this.accountSubscriber.getOraclePriceDataAndSlotForSpotMarket(
|
|
8490
8499
|
marketIndex
|
package/src/idl/drift.json
CHANGED
|
@@ -6730,6 +6730,10 @@
|
|
|
6730
6730
|
{
|
|
6731
6731
|
"name": "ammInventorySpreadAdjustment",
|
|
6732
6732
|
"type": "i8"
|
|
6733
|
+
},
|
|
6734
|
+
{
|
|
6735
|
+
"name": "referencePriceOffset",
|
|
6736
|
+
"type": "i32"
|
|
6733
6737
|
}
|
|
6734
6738
|
]
|
|
6735
6739
|
},
|
|
@@ -7525,20 +7529,25 @@
|
|
|
7525
7529
|
]
|
|
7526
7530
|
},
|
|
7527
7531
|
{
|
|
7528
|
-
"name": "
|
|
7532
|
+
"name": "updateDisableBitflagsMmOracle",
|
|
7529
7533
|
"accounts": [
|
|
7530
7534
|
{
|
|
7531
7535
|
"name": "admin",
|
|
7532
|
-
"isMut":
|
|
7536
|
+
"isMut": false,
|
|
7533
7537
|
"isSigner": true
|
|
7534
7538
|
},
|
|
7535
7539
|
{
|
|
7536
|
-
"name": "
|
|
7540
|
+
"name": "state",
|
|
7537
7541
|
"isMut": true,
|
|
7538
7542
|
"isSigner": false
|
|
7539
7543
|
}
|
|
7540
7544
|
],
|
|
7541
|
-
"args": [
|
|
7545
|
+
"args": [
|
|
7546
|
+
{
|
|
7547
|
+
"name": "disable",
|
|
7548
|
+
"type": "bool"
|
|
7549
|
+
}
|
|
7550
|
+
]
|
|
7542
7551
|
}
|
|
7543
7552
|
],
|
|
7544
7553
|
"accounts": [
|
|
@@ -9027,12 +9036,16 @@
|
|
|
9027
9036
|
"name": "maxInitializeUserFee",
|
|
9028
9037
|
"type": "u16"
|
|
9029
9038
|
},
|
|
9039
|
+
{
|
|
9040
|
+
"name": "disableBitFlags",
|
|
9041
|
+
"type": "u8"
|
|
9042
|
+
},
|
|
9030
9043
|
{
|
|
9031
9044
|
"name": "padding",
|
|
9032
9045
|
"type": {
|
|
9033
9046
|
"array": [
|
|
9034
9047
|
"u8",
|
|
9035
|
-
|
|
9048
|
+
9
|
|
9036
9049
|
]
|
|
9037
9050
|
}
|
|
9038
9051
|
}
|
|
@@ -10841,7 +10854,7 @@
|
|
|
10841
10854
|
"type": "u64"
|
|
10842
10855
|
},
|
|
10843
10856
|
{
|
|
10844
|
-
"name": "
|
|
10857
|
+
"name": "mmOracleSlot",
|
|
10845
10858
|
"docs": [
|
|
10846
10859
|
"the max base size a single user can have",
|
|
10847
10860
|
"precision: BASE_PRECISION"
|
|
@@ -10929,18 +10942,11 @@
|
|
|
10929
10942
|
"type": "u32"
|
|
10930
10943
|
},
|
|
10931
10944
|
{
|
|
10932
|
-
"name": "
|
|
10945
|
+
"name": "mmOraclePrice",
|
|
10933
10946
|
"docs": [
|
|
10934
|
-
"
|
|
10947
|
+
"MM oracle price"
|
|
10935
10948
|
],
|
|
10936
|
-
"type": "
|
|
10937
|
-
},
|
|
10938
|
-
{
|
|
10939
|
-
"name": "shortIntensityCount",
|
|
10940
|
-
"docs": [
|
|
10941
|
-
"the count intensity of short fills against AMM"
|
|
10942
|
-
],
|
|
10943
|
-
"type": "u32"
|
|
10949
|
+
"type": "i64"
|
|
10944
10950
|
},
|
|
10945
10951
|
{
|
|
10946
10952
|
"name": "maxFillReserveFraction",
|
|
@@ -11022,7 +11028,7 @@
|
|
|
11022
11028
|
"type": "i8"
|
|
11023
11029
|
},
|
|
11024
11030
|
{
|
|
11025
|
-
"name": "
|
|
11031
|
+
"name": "mmOracleSequenceId",
|
|
11026
11032
|
"type": "u64"
|
|
11027
11033
|
},
|
|
11028
11034
|
{
|
|
@@ -15947,4 +15953,4 @@
|
|
|
15947
15953
|
"metadata": {
|
|
15948
15954
|
"address": "dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH"
|
|
15949
15955
|
}
|
|
15950
|
-
}
|
|
15956
|
+
}
|
package/src/math/amm.ts
CHANGED
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
import { assert } from '../assert/assert';
|
|
26
26
|
import { squareRootBN, sigNum, clampBN, standardizeBaseAssetAmount } from '..';
|
|
27
27
|
|
|
28
|
-
import {
|
|
28
|
+
import { MMOraclePriceData } from '../oracles/types';
|
|
29
29
|
import {
|
|
30
30
|
calculateRepegCost,
|
|
31
31
|
calculateAdjustKCost,
|
|
@@ -33,6 +33,10 @@ import {
|
|
|
33
33
|
} from './repeg';
|
|
34
34
|
|
|
35
35
|
import { calculateLiveOracleStd, getNewOracleConfPct } from './oracles';
|
|
36
|
+
import {
|
|
37
|
+
getOracleConfidenceFromMMOracleData,
|
|
38
|
+
getOraclePriceFromMMOracleData,
|
|
39
|
+
} from '../oracles/utils';
|
|
36
40
|
|
|
37
41
|
export function calculatePegFromTargetPrice(
|
|
38
42
|
targetPrice: BN,
|
|
@@ -51,14 +55,14 @@ export function calculatePegFromTargetPrice(
|
|
|
51
55
|
|
|
52
56
|
export function calculateOptimalPegAndBudget(
|
|
53
57
|
amm: AMM,
|
|
54
|
-
|
|
58
|
+
mmOraclePriceData: MMOraclePriceData
|
|
55
59
|
): [BN, BN, BN, boolean] {
|
|
56
60
|
const reservePriceBefore = calculatePrice(
|
|
57
61
|
amm.baseAssetReserve,
|
|
58
62
|
amm.quoteAssetReserve,
|
|
59
63
|
amm.pegMultiplier
|
|
60
64
|
);
|
|
61
|
-
const targetPrice =
|
|
65
|
+
const targetPrice = getOraclePriceFromMMOracleData(mmOraclePriceData);
|
|
62
66
|
const newPeg = calculatePegFromTargetPrice(
|
|
63
67
|
targetPrice,
|
|
64
68
|
amm.baseAssetReserve,
|
|
@@ -112,13 +116,13 @@ export function calculateOptimalPegAndBudget(
|
|
|
112
116
|
|
|
113
117
|
export function calculateNewAmm(
|
|
114
118
|
amm: AMM,
|
|
115
|
-
|
|
119
|
+
mmOraclePriceData: MMOraclePriceData
|
|
116
120
|
): [BN, BN, BN, BN] {
|
|
117
121
|
let pKNumer = new BN(1);
|
|
118
122
|
let pKDenom = new BN(1);
|
|
119
123
|
|
|
120
124
|
const [targetPrice, _newPeg, budget, _checkLowerBound] =
|
|
121
|
-
calculateOptimalPegAndBudget(amm,
|
|
125
|
+
calculateOptimalPegAndBudget(amm, mmOraclePriceData);
|
|
122
126
|
let prePegCost = calculateRepegCost(amm, _newPeg);
|
|
123
127
|
let newPeg = _newPeg;
|
|
124
128
|
|
|
@@ -154,15 +158,15 @@ export function calculateNewAmm(
|
|
|
154
158
|
|
|
155
159
|
export function calculateUpdatedAMM(
|
|
156
160
|
amm: AMM,
|
|
157
|
-
|
|
161
|
+
mmOraclePriceData: MMOraclePriceData
|
|
158
162
|
): AMM {
|
|
159
|
-
if (amm.curveUpdateIntensity == 0 ||
|
|
163
|
+
if (amm.curveUpdateIntensity == 0 || mmOraclePriceData === undefined) {
|
|
160
164
|
return amm;
|
|
161
165
|
}
|
|
162
166
|
const newAmm = Object.assign({}, amm);
|
|
163
167
|
const [prepegCost, pKNumer, pKDenom, newPeg] = calculateNewAmm(
|
|
164
168
|
amm,
|
|
165
|
-
|
|
169
|
+
mmOraclePriceData
|
|
166
170
|
);
|
|
167
171
|
|
|
168
172
|
newAmm.baseAssetReserve = newAmm.baseAssetReserve.mul(pKNumer).div(pKDenom);
|
|
@@ -195,13 +199,13 @@ export function calculateUpdatedAMM(
|
|
|
195
199
|
export function calculateUpdatedAMMSpreadReserves(
|
|
196
200
|
amm: AMM,
|
|
197
201
|
direction: PositionDirection,
|
|
198
|
-
|
|
202
|
+
mmOraclePriceData: MMOraclePriceData,
|
|
199
203
|
isPrediction = false
|
|
200
204
|
): { baseAssetReserve: BN; quoteAssetReserve: BN; sqrtK: BN; newPeg: BN } {
|
|
201
|
-
const newAmm = calculateUpdatedAMM(amm,
|
|
205
|
+
const newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
|
|
202
206
|
const [shortReserves, longReserves] = calculateSpreadReserves(
|
|
203
207
|
newAmm,
|
|
204
|
-
|
|
208
|
+
mmOraclePriceData,
|
|
205
209
|
undefined,
|
|
206
210
|
isPrediction
|
|
207
211
|
);
|
|
@@ -222,20 +226,20 @@ export function calculateUpdatedAMMSpreadReserves(
|
|
|
222
226
|
|
|
223
227
|
export function calculateBidAskPrice(
|
|
224
228
|
amm: AMM,
|
|
225
|
-
|
|
229
|
+
mmOraclePriceData: MMOraclePriceData,
|
|
226
230
|
withUpdate = true,
|
|
227
231
|
isPrediction = false
|
|
228
232
|
): [BN, BN] {
|
|
229
233
|
let newAmm: AMM;
|
|
230
234
|
if (withUpdate) {
|
|
231
|
-
newAmm = calculateUpdatedAMM(amm,
|
|
235
|
+
newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
|
|
232
236
|
} else {
|
|
233
237
|
newAmm = amm;
|
|
234
238
|
}
|
|
235
239
|
|
|
236
240
|
const [bidReserves, askReserves] = calculateSpreadReserves(
|
|
237
241
|
newAmm,
|
|
238
|
-
|
|
242
|
+
mmOraclePriceData,
|
|
239
243
|
undefined,
|
|
240
244
|
isPrediction
|
|
241
245
|
);
|
|
@@ -824,7 +828,7 @@ export function calculateSpreadBN(
|
|
|
824
828
|
|
|
825
829
|
export function calculateSpread(
|
|
826
830
|
amm: AMM,
|
|
827
|
-
|
|
831
|
+
mmOraclePriceData: MMOraclePriceData,
|
|
828
832
|
now?: BN,
|
|
829
833
|
reservePrice?: BN
|
|
830
834
|
): [number, number] {
|
|
@@ -839,18 +843,18 @@ export function calculateSpread(
|
|
|
839
843
|
amm.pegMultiplier
|
|
840
844
|
);
|
|
841
845
|
}
|
|
842
|
-
|
|
843
|
-
const targetPrice =
|
|
846
|
+
const oraclePrice = getOraclePriceFromMMOracleData(mmOraclePriceData);
|
|
847
|
+
const targetPrice = oraclePrice || reservePrice;
|
|
844
848
|
const targetMarkSpreadPct = reservePrice
|
|
845
849
|
.sub(targetPrice)
|
|
846
850
|
.mul(BID_ASK_SPREAD_PRECISION)
|
|
847
851
|
.div(reservePrice);
|
|
848
852
|
|
|
849
853
|
now = now || new BN(new Date().getTime() / 1000); //todo
|
|
850
|
-
const liveOracleStd = calculateLiveOracleStd(amm,
|
|
854
|
+
const liveOracleStd = calculateLiveOracleStd(amm, oraclePrice, now);
|
|
851
855
|
const confIntervalPct = getNewOracleConfPct(
|
|
852
856
|
amm,
|
|
853
|
-
|
|
857
|
+
getOracleConfidenceFromMMOracleData(mmOraclePriceData),
|
|
854
858
|
reservePrice,
|
|
855
859
|
now
|
|
856
860
|
);
|
|
@@ -936,7 +940,7 @@ export function getQuoteAssetReservePredictionMarketBounds(
|
|
|
936
940
|
|
|
937
941
|
export function calculateSpreadReserves(
|
|
938
942
|
amm: AMM,
|
|
939
|
-
|
|
943
|
+
mmOraclePriceData: MMOraclePriceData,
|
|
940
944
|
now?: BN,
|
|
941
945
|
isPrediction = false
|
|
942
946
|
) {
|
|
@@ -1028,13 +1032,43 @@ export function calculateSpreadReserves(
|
|
|
1028
1032
|
).toNumber();
|
|
1029
1033
|
}
|
|
1030
1034
|
|
|
1031
|
-
|
|
1035
|
+
let [longSpread, shortSpread] = calculateSpread(
|
|
1032
1036
|
amm,
|
|
1033
|
-
|
|
1037
|
+
mmOraclePriceData,
|
|
1034
1038
|
now,
|
|
1035
1039
|
reservePrice
|
|
1036
1040
|
);
|
|
1037
1041
|
|
|
1042
|
+
const doReferencePricOffsetSmooth =
|
|
1043
|
+
Math.sign(referencePriceOffset) !== Math.sign(amm.referencePriceOffset) &&
|
|
1044
|
+
amm.curveUpdateIntensity > 100;
|
|
1045
|
+
|
|
1046
|
+
if (doReferencePricOffsetSmooth) {
|
|
1047
|
+
if (oraclePriceData.slot !== amm.lastUpdateSlot) {
|
|
1048
|
+
const slotsPassed =
|
|
1049
|
+
oraclePriceData.slot.toNumber() - amm.lastUpdateSlot.toNumber();
|
|
1050
|
+
const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
|
|
1051
|
+
const raw = Math.trunc(
|
|
1052
|
+
Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10
|
|
1053
|
+
);
|
|
1054
|
+
const maxAllowed =
|
|
1055
|
+
Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
|
|
1056
|
+
|
|
1057
|
+
const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
|
|
1058
|
+
const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
|
|
1059
|
+
|
|
1060
|
+
referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
|
|
1061
|
+
|
|
1062
|
+
if (referencePriceDelta < 0) {
|
|
1063
|
+
longSpread += Math.abs(referencePriceDelta);
|
|
1064
|
+
shortSpread += Math.abs(referencePriceOffset);
|
|
1065
|
+
} else {
|
|
1066
|
+
shortSpread += Math.abs(referencePriceDelta);
|
|
1067
|
+
longSpread += Math.abs(referencePriceOffset);
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1038
1072
|
const askReserves = calculateSpreadReserve(
|
|
1039
1073
|
longSpread + referencePriceOffset,
|
|
1040
1074
|
PositionDirection.LONG,
|
|
@@ -1127,7 +1161,7 @@ export function calculateMaxBaseAssetAmountToTrade(
|
|
|
1127
1161
|
amm: AMM,
|
|
1128
1162
|
limit_price: BN,
|
|
1129
1163
|
direction: PositionDirection,
|
|
1130
|
-
|
|
1164
|
+
mmOraclePriceData?: MMOraclePriceData,
|
|
1131
1165
|
now?: BN,
|
|
1132
1166
|
isPrediction = false
|
|
1133
1167
|
): [BN, PositionDirection] {
|
|
@@ -1142,7 +1176,7 @@ export function calculateMaxBaseAssetAmountToTrade(
|
|
|
1142
1176
|
const newBaseAssetReserve = squareRootBN(newBaseAssetReserveSquared);
|
|
1143
1177
|
const [shortSpreadReserves, longSpreadReserves] = calculateSpreadReserves(
|
|
1144
1178
|
amm,
|
|
1145
|
-
|
|
1179
|
+
mmOraclePriceData,
|
|
1146
1180
|
now,
|
|
1147
1181
|
isPrediction
|
|
1148
1182
|
);
|