@velocity-exchange/sdk 0.4.0 → 0.6.1
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/README.md +3 -3
- package/lib/browser/adminClient.d.ts +52 -0
- package/lib/browser/adminClient.js +97 -0
- package/lib/browser/config.js +6 -7
- package/lib/browser/constants/numericConstants.d.ts +1 -1
- package/lib/browser/constants/numericConstants.js +1 -1
- package/lib/browser/decode/user.js +5 -1
- package/lib/browser/idl/velocity.d.ts +191 -15
- package/lib/browser/idl/velocity.json +192 -16
- package/lib/browser/orderSubscriber/OrderSubscriber.d.ts +1 -0
- package/lib/browser/orderSubscriber/OrderSubscriber.js +10 -4
- package/lib/browser/pyth/pythLazerSubscriber.js +37 -27
- package/lib/browser/types.d.ts +6 -0
- package/lib/browser/user.d.ts +20 -3
- package/lib/browser/user.js +52 -4
- package/lib/browser/velocityClient.d.ts +46 -10
- package/lib/browser/velocityClient.js +107 -35
- package/lib/node/adminClient.d.ts +52 -0
- package/lib/node/adminClient.d.ts.map +1 -1
- package/lib/node/adminClient.js +97 -0
- package/lib/node/config.d.ts.map +1 -1
- package/lib/node/config.js +6 -7
- package/lib/node/constants/numericConstants.d.ts +1 -1
- package/lib/node/constants/numericConstants.d.ts.map +1 -1
- package/lib/node/constants/numericConstants.js +1 -1
- package/lib/node/decode/user.d.ts.map +1 -1
- package/lib/node/decode/user.js +5 -1
- package/lib/node/idl/velocity.d.ts +191 -15
- package/lib/node/idl/velocity.d.ts.map +1 -1
- package/lib/node/idl/velocity.json +192 -16
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts +1 -0
- package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
- package/lib/node/orderSubscriber/OrderSubscriber.js +10 -4
- package/lib/node/pyth/pythLazerSubscriber.d.ts.map +1 -1
- package/lib/node/pyth/pythLazerSubscriber.js +37 -27
- package/lib/node/types.d.ts +6 -0
- package/lib/node/types.d.ts.map +1 -1
- package/lib/node/user.d.ts +20 -3
- package/lib/node/user.d.ts.map +1 -1
- package/lib/node/user.js +52 -4
- package/lib/node/velocityClient.d.ts +46 -10
- package/lib/node/velocityClient.d.ts.map +1 -1
- package/lib/node/velocityClient.js +107 -35
- package/package.json +7 -3
- package/.prettierignore +0 -1
- package/CHANGELOG.md +0 -132
- package/build-browser.js +0 -58
- package/bunfig.toml +0 -3
- package/esbuild-shims.js +0 -12
- package/scripts/deposit-isolated-positions.ts +0 -110
- package/scripts/find-flagged-users.ts +0 -213
- package/scripts/grpc-client-test-comparison.ts +0 -372
- package/scripts/grpc-multiuser-client-test-comparison.ts +0 -158
- package/scripts/postbuild.js +0 -95
- package/scripts/single-grpc-client-test.ts +0 -284
- package/scripts/withdraw-isolated-positions.ts +0 -174
- package/src/accounts/README_WebSocketAccountSubscriberV2.md +0 -95
- package/src/accounts/README_WebSocketProgramAccountSubscriberV2.md +0 -135
- package/src/accounts/basicUserAccountSubscriber.ts +0 -79
- package/src/accounts/basicUserStatsAccountSubscriber.ts +0 -87
- package/src/accounts/bulkAccountLoader.ts +0 -358
- package/src/accounts/bulkUserStatsSubscription.ts +0 -40
- package/src/accounts/bulkUserSubscription.ts +0 -39
- package/src/accounts/customizedCadenceBulkAccountLoader.ts +0 -250
- package/src/accounts/fetch.ts +0 -200
- package/src/accounts/grpcAccountSubscriber.ts +0 -225
- package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +0 -73
- package/src/accounts/grpcMultiAccountSubscriber.ts +0 -566
- package/src/accounts/grpcMultiUserAccountSubscriber.ts +0 -328
- package/src/accounts/grpcProgramAccountSubscriber.ts +0 -264
- package/src/accounts/grpcUserAccountSubscriber.ts +0 -63
- package/src/accounts/grpcUserStatsAccountSubscriber.ts +0 -65
- package/src/accounts/grpcVelocityClientAccountSubscriber.ts +0 -257
- package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +0 -941
- package/src/accounts/laserProgramAccountSubscriber.ts +0 -266
- package/src/accounts/oneShotUserAccountSubscriber.ts +0 -88
- package/src/accounts/oneShotUserStatsAccountSubscriber.ts +0 -94
- package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +0 -223
- package/src/accounts/pollingOracleAccountSubscriber.ts +0 -151
- package/src/accounts/pollingTokenAccountSubscriber.ts +0 -147
- package/src/accounts/pollingUserAccountSubscriber.ts +0 -198
- package/src/accounts/pollingUserStatsAccountSubscriber.ts +0 -180
- package/src/accounts/pollingVelocityClientAccountSubscriber.ts +0 -774
- package/src/accounts/testBulkAccountLoader.ts +0 -59
- package/src/accounts/types.ts +0 -428
- package/src/accounts/utils.ts +0 -90
- package/src/accounts/webSocketAccountSubscriber.ts +0 -304
- package/src/accounts/webSocketAccountSubscriberV2.ts +0 -536
- package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +0 -171
- package/src/accounts/webSocketProgramAccountSubscriber.ts +0 -244
- package/src/accounts/webSocketProgramAccountSubscriberV2.ts +0 -1048
- package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +0 -1042
- package/src/accounts/webSocketUserAccountSubscriber.ts +0 -139
- package/src/accounts/webSocketUserStatsAccountSubsriber.ts +0 -131
- package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +0 -865
- package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +0 -897
- package/src/accounts/websocketProgramUserAccountSubscriber.ts +0 -127
- package/src/addresses/marketAddresses.ts +0 -28
- package/src/addresses/pda.ts +0 -620
- package/src/adminClient.ts +0 -8136
- package/src/assert/assert.ts +0 -5
- package/src/auctionSubscriber/auctionSubscriber.ts +0 -86
- package/src/auctionSubscriber/auctionSubscriberGrpc.ts +0 -99
- package/src/auctionSubscriber/index.ts +0 -9
- package/src/auctionSubscriber/types.ts +0 -30
- package/src/bankrun/bankrunConnection.ts +0 -630
- package/src/blockhashSubscriber/BlockhashSubscriber.ts +0 -160
- package/src/blockhashSubscriber/index.ts +0 -6
- package/src/blockhashSubscriber/types.ts +0 -13
- package/src/clock/clockSubscriber.ts +0 -146
- package/src/config.ts +0 -312
- package/src/constants/index.ts +0 -9
- package/src/constants/numericConstants.ts +0 -194
- package/src/constants/perpMarkets.ts +0 -127
- package/src/constants/spotMarkets.ts +0 -104
- package/src/constants/txConstants.ts +0 -2
- package/src/constituentMap/constituentMap.ts +0 -305
- package/src/constituentMap/pollingConstituentAccountSubscriber.ts +0 -99
- package/src/constituentMap/webSocketConstituentAccountSubscriber.ts +0 -121
- package/src/core/VelocityCore.ts +0 -606
- package/src/core/index.ts +0 -12
- package/src/core/instructions/deposit.ts +0 -64
- package/src/core/instructions/fill.ts +0 -51
- package/src/core/instructions/funding.ts +0 -33
- package/src/core/instructions/liquidation.ts +0 -55
- package/src/core/instructions/orders.ts +0 -84
- package/src/core/instructions/perpOrders.ts +0 -312
- package/src/core/instructions/settlement.ts +0 -40
- package/src/core/instructions/trigger.ts +0 -41
- package/src/core/instructions/withdraw.ts +0 -65
- package/src/core/remainingAccounts.ts +0 -320
- package/src/core/signedMsg.ts +0 -109
- package/src/decode/customCoder.ts +0 -148
- package/src/decode/user.ts +0 -401
- package/src/dlob/DLOB.ts +0 -2793
- package/src/dlob/DLOBNode.ts +0 -305
- package/src/dlob/DLOBSubscriber.ts +0 -269
- package/src/dlob/NodeList.ts +0 -244
- package/src/dlob/orderBookLevels.ts +0 -695
- package/src/dlob/types.ts +0 -37
- package/src/events/eventList.ts +0 -114
- package/src/events/eventSubscriber.ts +0 -521
- package/src/events/eventsServerLogProvider.ts +0 -189
- package/src/events/fetchLogs.ts +0 -219
- package/src/events/parse.ts +0 -271
- package/src/events/pollingLogProvider.ts +0 -113
- package/src/events/sort.ts +0 -51
- package/src/events/txEventCache.ts +0 -92
- package/src/events/types.ts +0 -337
- package/src/events/webSocketLogProvider.ts +0 -152
- package/src/factory/bigNum.ts +0 -709
- package/src/factory/oracleClient.ts +0 -73
- package/src/idl/pyth.json +0 -142
- package/src/idl/pyth.ts +0 -97
- package/src/idl/pyth_solana_receiver.json +0 -628
- package/src/idl/token_faucet.json +0 -229
- package/src/idl/token_faucet.ts +0 -197
- package/src/idl/velocity.json +0 -23974
- package/src/idl/velocity.ts +0 -23980
- package/src/index.ts +0 -150
- package/src/indicative-quotes/indicativeQuotesSender.ts +0 -233
- package/src/isomorphic/README.md +0 -19
- package/src/isomorphic/anchor.browser.ts +0 -44
- package/src/isomorphic/anchor.node.ts +0 -1
- package/src/isomorphic/anchor.ts +0 -1
- package/src/isomorphic/anchor29.browser.ts +0 -24
- package/src/isomorphic/anchor29.node.ts +0 -1
- package/src/isomorphic/anchor29.ts +0 -1
- package/src/isomorphic/grpc.browser.ts +0 -4
- package/src/isomorphic/grpc.node.ts +0 -130
- package/src/isomorphic/grpc.ts +0 -1
- package/src/jupiter/jupiterClient.ts +0 -502
- package/src/keypair.ts +0 -32
- package/src/margin/README.md +0 -138
- package/src/marginCalculation.ts +0 -407
- package/src/marinade/idl/idl.json +0 -1962
- package/src/marinade/index.ts +0 -73
- package/src/marinade/types.ts +0 -3925
- package/src/math/amm.ts +0 -1758
- package/src/math/auction.ts +0 -480
- package/src/math/bankruptcy.ts +0 -138
- package/src/math/builder.ts +0 -130
- package/src/math/conversion.ts +0 -45
- package/src/math/exchangeStatus.ts +0 -261
- package/src/math/funding.ts +0 -498
- package/src/math/insurance.ts +0 -171
- package/src/math/liquidation.ts +0 -433
- package/src/math/margin.ts +0 -327
- package/src/math/market.ts +0 -487
- package/src/math/oracles.ts +0 -477
- package/src/math/orders.ts +0 -500
- package/src/math/position.ts +0 -381
- package/src/math/repeg.ts +0 -223
- package/src/math/spotBalance.ts +0 -996
- package/src/math/spotMarket.ts +0 -115
- package/src/math/spotPosition.ts +0 -263
- package/src/math/state.ts +0 -71
- package/src/math/superStake.ts +0 -602
- package/src/math/tiers.ts +0 -73
- package/src/math/trade.ts +0 -879
- package/src/math/utils.ts +0 -183
- package/src/memcmp.ts +0 -279
- package/src/oracles/oracleClientCache.ts +0 -41
- package/src/oracles/oracleId.ts +0 -99
- package/src/oracles/prelaunchOracleClient.ts +0 -63
- package/src/oracles/pythClient.ts +0 -125
- package/src/oracles/pythLazerClient.ts +0 -141
- package/src/oracles/quoteAssetOracleClient.ts +0 -43
- package/src/oracles/strictOraclePrice.ts +0 -40
- package/src/oracles/types.ts +0 -82
- package/src/oracles/utils.ts +0 -45
- package/src/orderParams.ts +0 -117
- package/src/orderSubscriber/OrderSubscriber.ts +0 -378
- package/src/orderSubscriber/PollingSubscription.ts +0 -50
- package/src/orderSubscriber/WebsocketSubscription.ts +0 -137
- package/src/orderSubscriber/grpcSubscription.ts +0 -155
- package/src/orderSubscriber/index.ts +0 -7
- package/src/orderSubscriber/types.ts +0 -64
- package/src/priorityFee/averageOverSlotsStrategy.ts +0 -17
- package/src/priorityFee/averageStrategy.ts +0 -13
- package/src/priorityFee/ewmaStrategy.ts +0 -51
- package/src/priorityFee/heliusPriorityFeeMethod.ts +0 -68
- package/src/priorityFee/index.ts +0 -16
- package/src/priorityFee/maxOverSlotsStrategy.ts +0 -18
- package/src/priorityFee/maxStrategy.ts +0 -8
- package/src/priorityFee/priorityFeeSubscriber.ts +0 -328
- package/src/priorityFee/priorityFeeSubscriberMap.ts +0 -134
- package/src/priorityFee/solanaPriorityFeeMethod.ts +0 -46
- package/src/priorityFee/types.ts +0 -82
- package/src/priorityFee/velocityPriorityFeeMethod.ts +0 -53
- package/src/pyth/constants.ts +0 -9
- package/src/pyth/index.ts +0 -15
- package/src/pyth/pythLazerSubscriber.ts +0 -365
- package/src/pyth/types.ts +0 -4451
- package/src/pyth/utils.ts +0 -13
- package/src/slot/SlotSubscriber.ts +0 -126
- package/src/slot/SlothashSubscriber.ts +0 -163
- package/src/swap/UnifiedSwapClient.ts +0 -315
- package/src/swift/grpcSignedMsgUserAccountSubscriber.ts +0 -81
- package/src/swift/index.ts +0 -10
- package/src/swift/signedMsgUserAccountSubscriber.ts +0 -251
- package/src/swift/swiftOrderSubscriber.ts +0 -351
- package/src/testClient.ts +0 -42
- package/src/titan/titanClient.ts +0 -438
- package/src/token/index.ts +0 -13
- package/src/tokenFaucet.ts +0 -296
- package/src/tx/baseTxSender.ts +0 -651
- package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +0 -31
- package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +0 -105
- package/src/tx/blockhashFetcher/types.ts +0 -9
- package/src/tx/fastSingleTxSender.ts +0 -200
- package/src/tx/forwardOnlyTxSender.ts +0 -193
- package/src/tx/priorityFeeCalculator.ts +0 -117
- package/src/tx/reportTransactionError.ts +0 -176
- package/src/tx/retryTxSender.ts +0 -177
- package/src/tx/txHandler.ts +0 -1009
- package/src/tx/txParamProcessor.ts +0 -225
- package/src/tx/types.ts +0 -117
- package/src/tx/utils.ts +0 -133
- package/src/tx/whileValidTxSender.ts +0 -377
- package/src/types.ts +0 -2575
- package/src/user.ts +0 -5316
- package/src/userConfig.ts +0 -38
- package/src/userMap/PollingSubscription.ts +0 -61
- package/src/userMap/WebsocketSubscription.ts +0 -93
- package/src/userMap/grpcSubscription.ts +0 -93
- package/src/userMap/referrerMap.ts +0 -360
- package/src/userMap/revenueShareEscrowMap.ts +0 -342
- package/src/userMap/userMap.ts +0 -784
- package/src/userMap/userMapConfig.ts +0 -82
- package/src/userMap/userStatsMap.ts +0 -393
- package/src/userName.ts +0 -37
- package/src/userStats.ts +0 -159
- package/src/userStatsConfig.ts +0 -35
- package/src/util/TransactionConfirmationManager.ts +0 -333
- package/src/util/chainClock.ts +0 -65
- package/src/util/computeUnits.ts +0 -101
- package/src/util/digest.ts +0 -33
- package/src/util/ed25519Utils.ts +0 -95
- package/src/util/promiseTimeout.ts +0 -23
- package/src/velocityClient.ts +0 -14802
- package/src/velocityClientConfig.ts +0 -119
- package/src/wallet.ts +0 -91
- package/tests/VelocityCore/builder_escrow.test.ts +0 -121
- package/tests/VelocityCore/decode.test.ts +0 -16
- package/tests/VelocityCore/fill_trigger.test.ts +0 -73
- package/tests/VelocityCore/instructions.test.ts +0 -46
- package/tests/VelocityCore/pdas.test.ts +0 -30
- package/tests/VelocityCore/perp_orders.test.ts +0 -205
- package/tests/VelocityCore/remainingAccounts.test.ts +0 -72
- package/tests/VelocityCore/settlement_liquidation.test.ts +0 -69
- package/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +0 -211
- package/tests/amm/test.ts +0 -2402
- package/tests/auctions/test.ts +0 -81
- package/tests/bn/test.ts +0 -355
- package/tests/builder/builderFee.test.ts +0 -42
- package/tests/ci/verifyConstants.ts +0 -393
- package/tests/decode/test.ts +0 -262
- package/tests/decode/userAccountBufferStrings.ts +0 -102
- package/tests/dlob/helpers.ts +0 -748
- package/tests/dlob/test.ts +0 -6969
- package/tests/dlob/tickSizeStandardization.ts +0 -545
- package/tests/events/parseLogsForCuUsage.ts +0 -139
- package/tests/exchangeStatus/test.ts +0 -45
- package/tests/insurance/test.ts +0 -40
- package/tests/liquidation/test.ts +0 -125
- package/tests/oracles/mmOracleGate.test.ts +0 -379
- package/tests/oracles/pythPegSnap.test.ts +0 -76
- package/tests/sdkParity/enumParity.test.ts +0 -84
- package/tests/sdkParity/marginCategoryFill.test.ts +0 -143
- package/tests/sdkParity/memcmpOffsets.test.ts +0 -139
- package/tests/spot/test.ts +0 -281
- package/tests/tx/TransactionConfirmationManager.test.ts +0 -312
- package/tests/tx/cachedBlockhashFetcher.test.ts +0 -96
- package/tests/tx/priorityFeeCalculator.ts +0 -77
- package/tests/tx/priorityFeeStrategy.ts +0 -95
- package/tests/user/bankruptcy.ts +0 -165
- package/tests/user/feeAndWithdrawLimits.ts +0 -284
- package/tests/user/getMarginCalculation.ts +0 -586
- package/tests/user/helpers.ts +0 -184
- package/tests/user/liquidations.ts +0 -129
- package/tests/user/marginCalculations.test.ts +0 -321
- package/tests/user/test.ts +0 -833
- package/tsconfig.browser.json +0 -18
- package/tsconfig.json +0 -36
package/src/math/market.ts
DELETED
|
@@ -1,487 +0,0 @@
|
|
|
1
|
-
import { BN } from '../isomorphic/anchor';
|
|
2
|
-
import {
|
|
3
|
-
PerpMarketAccount,
|
|
4
|
-
PositionDirection,
|
|
5
|
-
MarginCategory,
|
|
6
|
-
SpotMarketAccount,
|
|
7
|
-
SpotBalanceType,
|
|
8
|
-
isVariant,
|
|
9
|
-
} from '../types';
|
|
10
|
-
import {
|
|
11
|
-
calculatePrice,
|
|
12
|
-
calculateUpdatedAMMSpreadReserves,
|
|
13
|
-
calculateUpdatedAMM,
|
|
14
|
-
} from './amm';
|
|
15
|
-
import {
|
|
16
|
-
calculateSizeDiscountAssetWeight,
|
|
17
|
-
calculateSizePremiumLiabilityWeight,
|
|
18
|
-
} from './margin';
|
|
19
|
-
import { MMOraclePriceData, OraclePriceData } from '../oracles/types';
|
|
20
|
-
import {
|
|
21
|
-
BASE_PRECISION,
|
|
22
|
-
MARGIN_PRECISION,
|
|
23
|
-
PRICE_TO_QUOTE_PRECISION,
|
|
24
|
-
ZERO,
|
|
25
|
-
QUOTE_SPOT_MARKET_INDEX,
|
|
26
|
-
PRICE_PRECISION,
|
|
27
|
-
PERCENTAGE_PRECISION,
|
|
28
|
-
FUNDING_RATE_OFFSET_PERCENTAGE,
|
|
29
|
-
} from '../constants/numericConstants';
|
|
30
|
-
import { getTokenAmount } from './spotBalance';
|
|
31
|
-
import { assert } from '../assert/assert';
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Calculates the perp market's current mark (mid) price from its raw (non-spread) AMM reserves,
|
|
35
|
-
* after first repegging the AMM to the oracle price (`calculateUpdatedAMM`) if `mmOraclePriceData`
|
|
36
|
-
* is provided.
|
|
37
|
-
*
|
|
38
|
-
* @param {PerpMarketAccount} market - The perp market account
|
|
39
|
-
* @param {MMOraclePriceData} [mmOraclePriceData] - Current MM oracle price data; omit to price the
|
|
40
|
-
* AMM's stored reserves as-is without repegging
|
|
41
|
-
* @return {BN} The mark price, PRICE_PRECISION (1e6)
|
|
42
|
-
*/
|
|
43
|
-
export function calculateReservePrice(
|
|
44
|
-
market: PerpMarketAccount,
|
|
45
|
-
mmOraclePriceData?: MMOraclePriceData
|
|
46
|
-
): BN {
|
|
47
|
-
const newAmm = calculateUpdatedAMM(market.amm, mmOraclePriceData);
|
|
48
|
-
return calculatePrice(
|
|
49
|
-
newAmm.baseAssetReserve,
|
|
50
|
-
newAmm.quoteAssetReserve,
|
|
51
|
-
newAmm.pegMultiplier
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Calculates the perp market's current bid price — the price a taker sells into — by repegging
|
|
57
|
-
* the AMM to the oracle price and pricing the short-side spread reserves.
|
|
58
|
-
*
|
|
59
|
-
* @param {PerpMarketAccount} market - The perp market account
|
|
60
|
-
* @param {MMOraclePriceData} [mmOraclePriceData] - Current MM oracle price data, used both to
|
|
61
|
-
* repeg the AMM and to compute the spread reserves
|
|
62
|
-
* @param {BN} [latestSlot] - Current slot, used for reference-price-offset smoothing in the
|
|
63
|
-
* spread calculation
|
|
64
|
-
* @return {BN} The bid price, PRICE_PRECISION (1e6)
|
|
65
|
-
*/
|
|
66
|
-
export function calculateBidPrice(
|
|
67
|
-
market: PerpMarketAccount,
|
|
68
|
-
mmOraclePriceData?: MMOraclePriceData,
|
|
69
|
-
latestSlot?: BN
|
|
70
|
-
): BN {
|
|
71
|
-
const { baseAssetReserve, quoteAssetReserve, newPeg } =
|
|
72
|
-
calculateUpdatedAMMSpreadReserves(
|
|
73
|
-
market.amm,
|
|
74
|
-
market.marketStats,
|
|
75
|
-
PositionDirection.SHORT,
|
|
76
|
-
mmOraclePriceData,
|
|
77
|
-
latestSlot
|
|
78
|
-
);
|
|
79
|
-
|
|
80
|
-
return calculatePrice(baseAssetReserve, quoteAssetReserve, newPeg);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Calculates the perp market's current ask price — the price a taker buys at — by repegging
|
|
85
|
-
* the AMM to the oracle price and pricing the long-side spread reserves.
|
|
86
|
-
*
|
|
87
|
-
* @param {PerpMarketAccount} market - The perp market account
|
|
88
|
-
* @param {MMOraclePriceData} [mmOraclePriceData] - Current MM oracle price data, used both to
|
|
89
|
-
* repeg the AMM and to compute the spread reserves
|
|
90
|
-
* @param {BN} [latestSlot] - Current slot, used for reference-price-offset smoothing in the
|
|
91
|
-
* spread calculation
|
|
92
|
-
* @return {BN} The ask price, PRICE_PRECISION (1e6)
|
|
93
|
-
*/
|
|
94
|
-
export function calculateAskPrice(
|
|
95
|
-
market: PerpMarketAccount,
|
|
96
|
-
mmOraclePriceData?: MMOraclePriceData,
|
|
97
|
-
latestSlot?: BN
|
|
98
|
-
): BN {
|
|
99
|
-
const { baseAssetReserve, quoteAssetReserve, newPeg } =
|
|
100
|
-
calculateUpdatedAMMSpreadReserves(
|
|
101
|
-
market.amm,
|
|
102
|
-
market.marketStats,
|
|
103
|
-
PositionDirection.LONG,
|
|
104
|
-
mmOraclePriceData,
|
|
105
|
-
latestSlot
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
return calculatePrice(baseAssetReserve, quoteAssetReserve, newPeg);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Calculates the signed spread between a price and the oracle price.
|
|
113
|
-
*
|
|
114
|
-
* @param {BN} price - A price, PRICE_PRECISION (1e6)
|
|
115
|
-
* @param {OraclePriceData} oraclePriceData - Oracle price data, PRICE_PRECISION (1e6)
|
|
116
|
-
* @return {BN} `price - oraclePriceData.price`, PRICE_PRECISION (1e6)
|
|
117
|
-
*/
|
|
118
|
-
export function calculateOracleSpread(
|
|
119
|
-
price: BN,
|
|
120
|
-
oraclePriceData: OraclePriceData
|
|
121
|
-
): BN {
|
|
122
|
-
return price.sub(oraclePriceData.price);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Calculates the effective margin ratio for a perp position of a given size, applying the
|
|
127
|
-
* IMF size premium on top of the market's base initial/maintenance ratio. Returns 0 for markets
|
|
128
|
-
* in `'Settlement'` status (no margin is required once a market is settling out).
|
|
129
|
-
*
|
|
130
|
-
* @param {PerpMarketAccount} market - The perp market account
|
|
131
|
-
* @param {BN} size - The position's base asset amount (`abs()` semantics expected), BASE_PRECISION (1e9)
|
|
132
|
-
* @param {MarginCategory} marginCategory - `'Initial'`, `'Maintenance'`, or `'Fill'`; throws for any other value.
|
|
133
|
-
* `'Fill'` uses `(marginRatioInitial + marginRatioMaintenance) / 2` (integer division), mirroring
|
|
134
|
-
* `PerpMarket::get_margin_ratio`.
|
|
135
|
-
* @param {number} [customMarginRatio] - User's custom max margin ratio, `MARGIN_PRECISION` (1e4)
|
|
136
|
-
* units; only applied for `'Initial'`, where the looser (higher) of the computed ratio and
|
|
137
|
-
* this value is used
|
|
138
|
-
* @return {number} The margin ratio, scaled by `MARGIN_PRECISION` (1e4, i.e. 10000 = 100%)
|
|
139
|
-
*/
|
|
140
|
-
export function calculateMarketMarginRatio(
|
|
141
|
-
market: PerpMarketAccount,
|
|
142
|
-
size: BN,
|
|
143
|
-
marginCategory: MarginCategory,
|
|
144
|
-
customMarginRatio = 0
|
|
145
|
-
): number {
|
|
146
|
-
if (market.status === 'Settlement') return 0;
|
|
147
|
-
|
|
148
|
-
let defaultMarginRatio: number;
|
|
149
|
-
switch (marginCategory) {
|
|
150
|
-
case 'Initial':
|
|
151
|
-
defaultMarginRatio = market.marginRatioInitial;
|
|
152
|
-
break;
|
|
153
|
-
case 'Fill':
|
|
154
|
-
// mirrors PerpMarket::get_margin_ratio's Fill branch: integer-divided average
|
|
155
|
-
defaultMarginRatio = Math.floor(
|
|
156
|
-
(market.marginRatioInitial + market.marginRatioMaintenance) / 2
|
|
157
|
-
);
|
|
158
|
-
break;
|
|
159
|
-
case 'Maintenance':
|
|
160
|
-
defaultMarginRatio = market.marginRatioMaintenance;
|
|
161
|
-
break;
|
|
162
|
-
default:
|
|
163
|
-
throw new Error('Invalid margin category');
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
let marginRatio: number;
|
|
167
|
-
|
|
168
|
-
const sizeAdjMarginRatio = calculateSizePremiumLiabilityWeight(
|
|
169
|
-
size,
|
|
170
|
-
new BN(market.imfFactor),
|
|
171
|
-
new BN(defaultMarginRatio),
|
|
172
|
-
MARGIN_PRECISION,
|
|
173
|
-
true
|
|
174
|
-
).toNumber();
|
|
175
|
-
|
|
176
|
-
marginRatio = Math.max(defaultMarginRatio, sizeAdjMarginRatio);
|
|
177
|
-
|
|
178
|
-
if (marginCategory === 'Initial') {
|
|
179
|
-
marginRatio = Math.max(marginRatio, customMarginRatio);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return marginRatio;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Calculates the asset weight applied to a perp position's unrealized (positive) PnL when it
|
|
187
|
-
* counts toward collateral, mirroring `PerpMarket::get_unrealized_asset_weight`'s
|
|
188
|
-
* `Initial`/`Maintenance` branches. Only call this for a positive `unrealizedPnl` — the on-chain
|
|
189
|
-
* equivalent always weights a negative unrealized PnL at `SPOT_MARKET_WEIGHT_PRECISION` (100%,
|
|
190
|
-
* i.e. it's not discounted since it's a liability, not an asset).
|
|
191
|
-
*
|
|
192
|
-
* `'Initial'` weighting applies two independent discounts: (1) if `calculateNetUserPnlImbalance`
|
|
193
|
-
* (net user PnL less the pnl pool and a fifth of the fee pool) exceeds `unrealizedPnlMaxImbalance`,
|
|
194
|
-
* the base weight is first scaled down by `unrealizedPnlMaxImbalance / netUnsettledPnl`; (2) the
|
|
195
|
-
* IMF size-discount (`calculateSizeDiscountAssetWeight`) is then applied to the position's own
|
|
196
|
-
* `unrealizedPnl` size. Two notes for exact parity with the on-chain `get_unrealized_asset_weight`:
|
|
197
|
-
* (a) the Rust gate compares the *raw* `calculate_net_user_pnl` (no pool subtraction) against
|
|
198
|
-
* `unrealized_pnl_max_imbalance`, whereas step (1) here nets out the pnl/fee pool first — a
|
|
199
|
-
* looser (more forgiving) trigger condition; (b) the Rust size-discount rescales `unrealized_pnl`
|
|
200
|
-
* by `AMM_TO_QUOTE_PRECISION_RATIO` (1e3) before step (2), whereas this passes `unrealizedPnl`
|
|
201
|
-
* (QUOTE_PRECISION, 1e6) directly — `calculateSizeDiscountAssetWeight`'s `size` parameter is
|
|
202
|
-
* otherwise documented as `AMM_RESERVE_PRECISION` (1e9) elsewhere in the SDK.
|
|
203
|
-
*
|
|
204
|
-
* @param {PerpMarketAccount} market - The perp market account
|
|
205
|
-
* @param {SpotMarketAccount} quoteSpotMarket - The market's quote spot market account
|
|
206
|
-
* @param {BN} unrealizedPnl - The position's unrealized PnL, expected positive, QUOTE_PRECISION (1e6)
|
|
207
|
-
* @param {MarginCategory} marginCategory - `'Initial'`, `'Maintenance'`, or `'Fill'` (Fill is weighted identically to Initial)
|
|
208
|
-
* @param {Pick<OraclePriceData, 'price'>} oraclePriceData - Oracle price, PRICE_PRECISION (1e6),
|
|
209
|
-
* used only for the imbalance check's `calculateNetUserPnlImbalance` call
|
|
210
|
-
* @return {BN} The asset weight, scaled by `SPOT_MARKET_WEIGHT_PRECISION` (1e4, i.e. 10000 = 100%)
|
|
211
|
-
*/
|
|
212
|
-
export function calculateUnrealizedAssetWeight(
|
|
213
|
-
market: PerpMarketAccount,
|
|
214
|
-
quoteSpotMarket: SpotMarketAccount,
|
|
215
|
-
unrealizedPnl: BN,
|
|
216
|
-
marginCategory: MarginCategory,
|
|
217
|
-
oraclePriceData: Pick<OraclePriceData, 'price'>
|
|
218
|
-
): BN {
|
|
219
|
-
let assetWeight: BN;
|
|
220
|
-
switch (marginCategory) {
|
|
221
|
-
// mirrors get_unrealized_asset_weight: Fill is treated like Initial (same base
|
|
222
|
-
// weight, same imbalance + size-discount adjustments).
|
|
223
|
-
case 'Initial':
|
|
224
|
-
case 'Fill':
|
|
225
|
-
assetWeight = new BN(market.unrealizedPnlInitialAssetWeight);
|
|
226
|
-
|
|
227
|
-
if (market.unrealizedPnlMaxImbalance.gt(ZERO)) {
|
|
228
|
-
const netUnsettledPnl = calculateNetUserPnlImbalance(
|
|
229
|
-
market,
|
|
230
|
-
quoteSpotMarket,
|
|
231
|
-
oraclePriceData
|
|
232
|
-
);
|
|
233
|
-
if (netUnsettledPnl.gt(market.unrealizedPnlMaxImbalance)) {
|
|
234
|
-
assetWeight = assetWeight
|
|
235
|
-
.mul(market.unrealizedPnlMaxImbalance)
|
|
236
|
-
.div(netUnsettledPnl);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
assetWeight = calculateSizeDiscountAssetWeight(
|
|
241
|
-
unrealizedPnl,
|
|
242
|
-
new BN(market.unrealizedPnlImfFactor),
|
|
243
|
-
assetWeight
|
|
244
|
-
);
|
|
245
|
-
break;
|
|
246
|
-
case 'Maintenance':
|
|
247
|
-
assetWeight = new BN(market.unrealizedPnlMaintenanceAssetWeight);
|
|
248
|
-
break;
|
|
249
|
-
default:
|
|
250
|
-
throw new Error('Invalid margin category');
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return assetWeight;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Calculates the perp market's pnl pool balance — the quote tokens on hand to pay out settled
|
|
258
|
-
* user profits before insurance fund draws are needed.
|
|
259
|
-
*
|
|
260
|
-
* @param {PerpMarketAccount} perpMarket - The perp market account
|
|
261
|
-
* @param {SpotMarketAccount} spotMarket - The market's quote spot market account
|
|
262
|
-
* @return {BN} The pnl pool token amount, scaled by `spotMarket.decimals` (quote decimals)
|
|
263
|
-
*/
|
|
264
|
-
export function calculateMarketAvailablePNL(
|
|
265
|
-
perpMarket: PerpMarketAccount,
|
|
266
|
-
spotMarket: SpotMarketAccount
|
|
267
|
-
): BN {
|
|
268
|
-
return getTokenAmount(
|
|
269
|
-
perpMarket.pnlPool.scaledBalance,
|
|
270
|
-
spotMarket,
|
|
271
|
-
SpotBalanceType.DEPOSIT
|
|
272
|
-
);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Calculates the maximum insurance the market could still draw to cover a PnL deficit: the
|
|
277
|
-
* remaining `quoteMaxInsurance` allocation not yet claimed, plus the AMM's own fee pool (which is
|
|
278
|
-
* drawn down before external insurance). `spotMarket` must be the quote spot market — asserts
|
|
279
|
-
* otherwise.
|
|
280
|
-
*
|
|
281
|
-
* @param {PerpMarketAccount} perpMarket - The perp market account
|
|
282
|
-
* @param {SpotMarketAccount} spotMarket - The quote spot market account (must have
|
|
283
|
-
* `marketIndex === QUOTE_SPOT_MARKET_INDEX`)
|
|
284
|
-
* @return {BN} `quoteMaxInsurance - quoteSettledInsurance + ammFeePoolTokenAmount`, scaled by
|
|
285
|
-
* quote decimals
|
|
286
|
-
*/
|
|
287
|
-
export function calculateMarketMaxAvailableInsurance(
|
|
288
|
-
perpMarket: PerpMarketAccount,
|
|
289
|
-
spotMarket: SpotMarketAccount
|
|
290
|
-
): BN {
|
|
291
|
-
assert(spotMarket.marketIndex == QUOTE_SPOT_MARKET_INDEX);
|
|
292
|
-
|
|
293
|
-
// todo: insuranceFundAllocation technically not guaranteed to be in Insurance Fund
|
|
294
|
-
const insuranceFundAllocation =
|
|
295
|
-
perpMarket.insuranceClaim.quoteMaxInsurance.sub(
|
|
296
|
-
perpMarket.insuranceClaim.quoteSettledInsurance
|
|
297
|
-
);
|
|
298
|
-
const ammFeePool = getTokenAmount(
|
|
299
|
-
perpMarket.amm.feePool.scaledBalance,
|
|
300
|
-
spotMarket,
|
|
301
|
-
SpotBalanceType.DEPOSIT
|
|
302
|
-
);
|
|
303
|
-
return insuranceFundAllocation.add(ammFeePool);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* Calculates the net unrealized + unsettled PnL owed to all users of a perp market at a given
|
|
308
|
-
* oracle price, mirroring `calculate_net_user_pnl`: the AMM's net counterparty position valued
|
|
309
|
-
* at `oraclePriceData.price`, plus the market's cost basis (`quoteAssetAmount +
|
|
310
|
-
* netUnsettledFundingPnl`). This is the quantity the pnl pool + insurance fund must be able to
|
|
311
|
-
* cover across all users.
|
|
312
|
-
*
|
|
313
|
-
* @param {PerpMarketAccount} perpMarket - The perp market account
|
|
314
|
-
* @param {Pick<OraclePriceData, 'price'>} oraclePriceData - Oracle price, PRICE_PRECISION (1e6)
|
|
315
|
-
* (callers typically pass the live price or a TWAP depending on the check being performed)
|
|
316
|
-
* @return {BN} Net user PnL, QUOTE_PRECISION (1e6); positive means users are net owed
|
|
317
|
-
*/
|
|
318
|
-
export function calculateNetUserPnl(
|
|
319
|
-
perpMarket: PerpMarketAccount,
|
|
320
|
-
oraclePriceData: Pick<OraclePriceData, 'price'>
|
|
321
|
-
): BN {
|
|
322
|
-
const netUserPositionValue = perpMarket.amm.baseAssetAmountWithAmm
|
|
323
|
-
.mul(oraclePriceData.price)
|
|
324
|
-
.div(BASE_PRECISION)
|
|
325
|
-
.div(PRICE_TO_QUOTE_PRECISION);
|
|
326
|
-
|
|
327
|
-
const netUserCostBasis = perpMarket.quoteAssetAmount.add(
|
|
328
|
-
perpMarket.netUnsettledFundingPnl
|
|
329
|
-
);
|
|
330
|
-
|
|
331
|
-
const netUserPnl = netUserPositionValue.add(netUserCostBasis);
|
|
332
|
-
|
|
333
|
-
return netUserPnl;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
/**
|
|
337
|
-
* Calculates how far `calculateNetUserPnl` exceeds the funds already on hand to pay it out (the
|
|
338
|
-
* pnl pool, plus by default a 20% slice of the AMM fee pool as a conservative haircut on funds
|
|
339
|
-
* not yet swept into the pnl pool). A positive result means the market is short of pnl-pool
|
|
340
|
-
* funds by that amount; a negative result means the pnl pool has surplus.
|
|
341
|
-
*
|
|
342
|
-
* @param {PerpMarketAccount} perpMarket - The perp market account
|
|
343
|
-
* @param {SpotMarketAccount} spotMarket - The market's quote spot market account
|
|
344
|
-
* @param {Pick<OraclePriceData, 'price'>} oraclePriceData - Oracle price, PRICE_PRECISION (1e6),
|
|
345
|
-
* passed through to `calculateNetUserPnl`
|
|
346
|
-
* @param {boolean} [applyFeePoolDiscount] - When true (default), only 1/5 of the AMM fee pool
|
|
347
|
-
* counts toward available funds; when false, the full fee pool counts
|
|
348
|
-
* @return {BN} `netUserPnl - (pnlPool + feePoolContribution)`, QUOTE_PRECISION (1e6)
|
|
349
|
-
*/
|
|
350
|
-
export function calculateNetUserPnlImbalance(
|
|
351
|
-
perpMarket: PerpMarketAccount,
|
|
352
|
-
spotMarket: SpotMarketAccount,
|
|
353
|
-
oraclePriceData: Pick<OraclePriceData, 'price'>,
|
|
354
|
-
applyFeePoolDiscount = true
|
|
355
|
-
): BN {
|
|
356
|
-
const netUserPnl = calculateNetUserPnl(perpMarket, oraclePriceData);
|
|
357
|
-
|
|
358
|
-
const pnlPool = getTokenAmount(
|
|
359
|
-
perpMarket.pnlPool.scaledBalance,
|
|
360
|
-
spotMarket,
|
|
361
|
-
SpotBalanceType.DEPOSIT
|
|
362
|
-
);
|
|
363
|
-
let feePool = getTokenAmount(
|
|
364
|
-
perpMarket.amm.feePool.scaledBalance,
|
|
365
|
-
spotMarket,
|
|
366
|
-
SpotBalanceType.DEPOSIT
|
|
367
|
-
);
|
|
368
|
-
if (applyFeePoolDiscount) {
|
|
369
|
-
feePool = feePool.div(new BN(5));
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
const imbalance = netUserPnl.sub(pnlPool.add(feePool));
|
|
373
|
-
|
|
374
|
-
return imbalance;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/**
|
|
378
|
-
* Calculates the price used to evaluate trigger (stop/take-profit) orders for a perp market,
|
|
379
|
-
* mirroring the Rust `get_trigger_price`. When `useMedianPrice` is true, the trigger price is the
|
|
380
|
-
* median of three candidates — the last fill price (or oracle price if there's been no fill), the
|
|
381
|
-
* oracle price adjusted by the implied funding basis, and the oracle price adjusted by the 5min
|
|
382
|
-
* mark/oracle TWAP basis — then clamped to within a contract-tier-dependent band around the raw
|
|
383
|
-
* oracle price (tier A/B: 20bps, tier C: 100bps, others: 250bps) via `clampTriggerPrice`. This
|
|
384
|
-
* resists a single manipulated print (last fill or a momentary oracle/mark divergence) from
|
|
385
|
-
* triggering orders it shouldn't. When `useMedianPrice` is false, the raw oracle price is used
|
|
386
|
-
* directly with no smoothing.
|
|
387
|
-
*
|
|
388
|
-
* @param {PerpMarketAccount} market - The perp market account
|
|
389
|
-
* @param {BN} oraclePrice - Current oracle price, PRICE_PRECISION (1e6); its absolute value is
|
|
390
|
-
* used throughout
|
|
391
|
-
* @param {BN} now - Current unix timestamp, seconds; used to prorate the implied funding basis
|
|
392
|
-
* over the time remaining until the next funding update
|
|
393
|
-
* @param {boolean} useMedianPrice - Whether to apply the median-of-three + clamp smoothing, or
|
|
394
|
-
* use the raw oracle price directly
|
|
395
|
-
* @returns {BN} The trigger price, PRICE_PRECISION (1e6)
|
|
396
|
-
*/
|
|
397
|
-
export function getTriggerPrice(
|
|
398
|
-
market: PerpMarketAccount,
|
|
399
|
-
oraclePrice: BN,
|
|
400
|
-
now: BN,
|
|
401
|
-
useMedianPrice: boolean
|
|
402
|
-
): BN {
|
|
403
|
-
if (!useMedianPrice) {
|
|
404
|
-
return oraclePrice.abs();
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
const lastFillPrice = market.lastFillPrice;
|
|
408
|
-
|
|
409
|
-
// Calculate 5-minute basis
|
|
410
|
-
const markPrice5minTwap = market.marketStats.lastMarkPriceTwap5Min;
|
|
411
|
-
const lastOraclePriceTwap5min =
|
|
412
|
-
market.marketStats.historicalOracleData.lastOraclePriceTwap5Min;
|
|
413
|
-
const basis5min = markPrice5minTwap.sub(lastOraclePriceTwap5min);
|
|
414
|
-
|
|
415
|
-
const oraclePlusBasis5min = oraclePrice.add(basis5min);
|
|
416
|
-
|
|
417
|
-
// Calculate funding basis
|
|
418
|
-
const lastFundingBasis = getLastFundingBasis(market, oraclePrice, now);
|
|
419
|
-
const oraclePlusFundingBasis = oraclePrice.add(lastFundingBasis);
|
|
420
|
-
|
|
421
|
-
const prices = [
|
|
422
|
-
lastFillPrice.gt(ZERO) ? lastFillPrice : oraclePrice,
|
|
423
|
-
oraclePlusFundingBasis,
|
|
424
|
-
oraclePlusBasis5min,
|
|
425
|
-
].sort((a, b) => a.cmp(b));
|
|
426
|
-
const medianPrice = prices[1];
|
|
427
|
-
|
|
428
|
-
return clampTriggerPrice(market, oraclePrice.abs(), medianPrice);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
/**
|
|
432
|
-
* Calculates the last funding basis for trigger price calculation
|
|
433
|
-
* Implements the same logic as the Rust get_last_funding_basis function
|
|
434
|
-
*/
|
|
435
|
-
function getLastFundingBasis(
|
|
436
|
-
market: PerpMarketAccount,
|
|
437
|
-
oraclePrice: BN,
|
|
438
|
-
now: BN
|
|
439
|
-
): BN {
|
|
440
|
-
if (market.marketStats.lastFundingOracleTwap.gt(ZERO)) {
|
|
441
|
-
const lastFundingRate = market.lastFundingRate
|
|
442
|
-
.mul(PRICE_PRECISION)
|
|
443
|
-
.div(market.marketStats.lastFundingOracleTwap)
|
|
444
|
-
.muln(24);
|
|
445
|
-
const lastFundingRatePreAdj = lastFundingRate.sub(
|
|
446
|
-
FUNDING_RATE_OFFSET_PERCENTAGE
|
|
447
|
-
);
|
|
448
|
-
const timeLeftUntilFundingUpdate = BN.min(
|
|
449
|
-
BN.max(now.sub(market.lastFundingRateTs), ZERO),
|
|
450
|
-
market.marketStats.fundingPeriod
|
|
451
|
-
);
|
|
452
|
-
const lastFundingBasis = oraclePrice
|
|
453
|
-
.mul(lastFundingRatePreAdj)
|
|
454
|
-
.div(PERCENTAGE_PRECISION)
|
|
455
|
-
.mul(market.marketStats.fundingPeriod.sub(timeLeftUntilFundingUpdate))
|
|
456
|
-
.div(market.marketStats.fundingPeriod)
|
|
457
|
-
.div(new BN(1000)); // FUNDING_RATE_BUFFER
|
|
458
|
-
return lastFundingBasis;
|
|
459
|
-
} else {
|
|
460
|
-
return ZERO;
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
/**
|
|
465
|
-
* Clamps trigger price based on contract tier
|
|
466
|
-
* Implements the same logic as the Rust clamp_trigger_price function
|
|
467
|
-
*/
|
|
468
|
-
function clampTriggerPrice(
|
|
469
|
-
market: PerpMarketAccount,
|
|
470
|
-
oraclePrice: BN,
|
|
471
|
-
medianPrice: BN
|
|
472
|
-
): BN {
|
|
473
|
-
let maxBpsDiff: BN;
|
|
474
|
-
const tier = market.contractTier;
|
|
475
|
-
if (isVariant(tier, 'a') || isVariant(tier, 'b')) {
|
|
476
|
-
maxBpsDiff = new BN(500); // 20 BPS
|
|
477
|
-
} else if (isVariant(tier, 'c')) {
|
|
478
|
-
maxBpsDiff = new BN(100); // 100 BPS
|
|
479
|
-
} else {
|
|
480
|
-
maxBpsDiff = new BN(40); // 250 BPS
|
|
481
|
-
}
|
|
482
|
-
const maxOracleDiff = oraclePrice.div(maxBpsDiff);
|
|
483
|
-
return BN.min(
|
|
484
|
-
BN.max(medianPrice, oraclePrice.sub(maxOracleDiff)),
|
|
485
|
-
oraclePrice.add(maxOracleDiff)
|
|
486
|
-
);
|
|
487
|
-
}
|