@velocity-exchange/sdk 0.4.0 → 0.6.0

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.
Files changed (323) hide show
  1. package/README.md +3 -3
  2. package/lib/browser/adminClient.d.ts +35 -0
  3. package/lib/browser/adminClient.js +65 -0
  4. package/lib/browser/config.js +6 -7
  5. package/lib/browser/constants/numericConstants.d.ts +1 -1
  6. package/lib/browser/constants/numericConstants.js +1 -1
  7. package/lib/browser/decode/user.js +5 -1
  8. package/lib/browser/idl/velocity.d.ts +146 -3
  9. package/lib/browser/idl/velocity.json +147 -4
  10. package/lib/browser/orderSubscriber/OrderSubscriber.js +3 -0
  11. package/lib/browser/pyth/pythLazerSubscriber.js +37 -27
  12. package/lib/browser/types.d.ts +4 -0
  13. package/lib/browser/user.d.ts +15 -0
  14. package/lib/browser/user.js +37 -1
  15. package/lib/browser/velocityClient.d.ts +46 -10
  16. package/lib/browser/velocityClient.js +107 -35
  17. package/lib/node/adminClient.d.ts +35 -0
  18. package/lib/node/adminClient.d.ts.map +1 -1
  19. package/lib/node/adminClient.js +65 -0
  20. package/lib/node/config.d.ts.map +1 -1
  21. package/lib/node/config.js +6 -7
  22. package/lib/node/constants/numericConstants.d.ts +1 -1
  23. package/lib/node/constants/numericConstants.d.ts.map +1 -1
  24. package/lib/node/constants/numericConstants.js +1 -1
  25. package/lib/node/decode/user.d.ts.map +1 -1
  26. package/lib/node/decode/user.js +5 -1
  27. package/lib/node/idl/velocity.d.ts +146 -3
  28. package/lib/node/idl/velocity.d.ts.map +1 -1
  29. package/lib/node/idl/velocity.json +147 -4
  30. package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
  31. package/lib/node/orderSubscriber/OrderSubscriber.js +3 -0
  32. package/lib/node/pyth/pythLazerSubscriber.d.ts.map +1 -1
  33. package/lib/node/pyth/pythLazerSubscriber.js +37 -27
  34. package/lib/node/types.d.ts +4 -0
  35. package/lib/node/types.d.ts.map +1 -1
  36. package/lib/node/user.d.ts +15 -0
  37. package/lib/node/user.d.ts.map +1 -1
  38. package/lib/node/user.js +37 -1
  39. package/lib/node/velocityClient.d.ts +46 -10
  40. package/lib/node/velocityClient.d.ts.map +1 -1
  41. package/lib/node/velocityClient.js +107 -35
  42. package/package.json +7 -3
  43. package/.prettierignore +0 -1
  44. package/CHANGELOG.md +0 -132
  45. package/build-browser.js +0 -58
  46. package/bunfig.toml +0 -3
  47. package/esbuild-shims.js +0 -12
  48. package/scripts/deposit-isolated-positions.ts +0 -110
  49. package/scripts/find-flagged-users.ts +0 -213
  50. package/scripts/grpc-client-test-comparison.ts +0 -372
  51. package/scripts/grpc-multiuser-client-test-comparison.ts +0 -158
  52. package/scripts/postbuild.js +0 -95
  53. package/scripts/single-grpc-client-test.ts +0 -284
  54. package/scripts/withdraw-isolated-positions.ts +0 -174
  55. package/src/accounts/README_WebSocketAccountSubscriberV2.md +0 -95
  56. package/src/accounts/README_WebSocketProgramAccountSubscriberV2.md +0 -135
  57. package/src/accounts/basicUserAccountSubscriber.ts +0 -79
  58. package/src/accounts/basicUserStatsAccountSubscriber.ts +0 -87
  59. package/src/accounts/bulkAccountLoader.ts +0 -358
  60. package/src/accounts/bulkUserStatsSubscription.ts +0 -40
  61. package/src/accounts/bulkUserSubscription.ts +0 -39
  62. package/src/accounts/customizedCadenceBulkAccountLoader.ts +0 -250
  63. package/src/accounts/fetch.ts +0 -200
  64. package/src/accounts/grpcAccountSubscriber.ts +0 -225
  65. package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +0 -73
  66. package/src/accounts/grpcMultiAccountSubscriber.ts +0 -566
  67. package/src/accounts/grpcMultiUserAccountSubscriber.ts +0 -328
  68. package/src/accounts/grpcProgramAccountSubscriber.ts +0 -264
  69. package/src/accounts/grpcUserAccountSubscriber.ts +0 -63
  70. package/src/accounts/grpcUserStatsAccountSubscriber.ts +0 -65
  71. package/src/accounts/grpcVelocityClientAccountSubscriber.ts +0 -257
  72. package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +0 -941
  73. package/src/accounts/laserProgramAccountSubscriber.ts +0 -266
  74. package/src/accounts/oneShotUserAccountSubscriber.ts +0 -88
  75. package/src/accounts/oneShotUserStatsAccountSubscriber.ts +0 -94
  76. package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +0 -223
  77. package/src/accounts/pollingOracleAccountSubscriber.ts +0 -151
  78. package/src/accounts/pollingTokenAccountSubscriber.ts +0 -147
  79. package/src/accounts/pollingUserAccountSubscriber.ts +0 -198
  80. package/src/accounts/pollingUserStatsAccountSubscriber.ts +0 -180
  81. package/src/accounts/pollingVelocityClientAccountSubscriber.ts +0 -774
  82. package/src/accounts/testBulkAccountLoader.ts +0 -59
  83. package/src/accounts/types.ts +0 -428
  84. package/src/accounts/utils.ts +0 -90
  85. package/src/accounts/webSocketAccountSubscriber.ts +0 -304
  86. package/src/accounts/webSocketAccountSubscriberV2.ts +0 -536
  87. package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +0 -171
  88. package/src/accounts/webSocketProgramAccountSubscriber.ts +0 -244
  89. package/src/accounts/webSocketProgramAccountSubscriberV2.ts +0 -1048
  90. package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +0 -1042
  91. package/src/accounts/webSocketUserAccountSubscriber.ts +0 -139
  92. package/src/accounts/webSocketUserStatsAccountSubsriber.ts +0 -131
  93. package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +0 -865
  94. package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +0 -897
  95. package/src/accounts/websocketProgramUserAccountSubscriber.ts +0 -127
  96. package/src/addresses/marketAddresses.ts +0 -28
  97. package/src/addresses/pda.ts +0 -620
  98. package/src/adminClient.ts +0 -8136
  99. package/src/assert/assert.ts +0 -5
  100. package/src/auctionSubscriber/auctionSubscriber.ts +0 -86
  101. package/src/auctionSubscriber/auctionSubscriberGrpc.ts +0 -99
  102. package/src/auctionSubscriber/index.ts +0 -9
  103. package/src/auctionSubscriber/types.ts +0 -30
  104. package/src/bankrun/bankrunConnection.ts +0 -630
  105. package/src/blockhashSubscriber/BlockhashSubscriber.ts +0 -160
  106. package/src/blockhashSubscriber/index.ts +0 -6
  107. package/src/blockhashSubscriber/types.ts +0 -13
  108. package/src/clock/clockSubscriber.ts +0 -146
  109. package/src/config.ts +0 -312
  110. package/src/constants/index.ts +0 -9
  111. package/src/constants/numericConstants.ts +0 -194
  112. package/src/constants/perpMarkets.ts +0 -127
  113. package/src/constants/spotMarkets.ts +0 -104
  114. package/src/constants/txConstants.ts +0 -2
  115. package/src/constituentMap/constituentMap.ts +0 -305
  116. package/src/constituentMap/pollingConstituentAccountSubscriber.ts +0 -99
  117. package/src/constituentMap/webSocketConstituentAccountSubscriber.ts +0 -121
  118. package/src/core/VelocityCore.ts +0 -606
  119. package/src/core/index.ts +0 -12
  120. package/src/core/instructions/deposit.ts +0 -64
  121. package/src/core/instructions/fill.ts +0 -51
  122. package/src/core/instructions/funding.ts +0 -33
  123. package/src/core/instructions/liquidation.ts +0 -55
  124. package/src/core/instructions/orders.ts +0 -84
  125. package/src/core/instructions/perpOrders.ts +0 -312
  126. package/src/core/instructions/settlement.ts +0 -40
  127. package/src/core/instructions/trigger.ts +0 -41
  128. package/src/core/instructions/withdraw.ts +0 -65
  129. package/src/core/remainingAccounts.ts +0 -320
  130. package/src/core/signedMsg.ts +0 -109
  131. package/src/decode/customCoder.ts +0 -148
  132. package/src/decode/user.ts +0 -401
  133. package/src/dlob/DLOB.ts +0 -2793
  134. package/src/dlob/DLOBNode.ts +0 -305
  135. package/src/dlob/DLOBSubscriber.ts +0 -269
  136. package/src/dlob/NodeList.ts +0 -244
  137. package/src/dlob/orderBookLevels.ts +0 -695
  138. package/src/dlob/types.ts +0 -37
  139. package/src/events/eventList.ts +0 -114
  140. package/src/events/eventSubscriber.ts +0 -521
  141. package/src/events/eventsServerLogProvider.ts +0 -189
  142. package/src/events/fetchLogs.ts +0 -219
  143. package/src/events/parse.ts +0 -271
  144. package/src/events/pollingLogProvider.ts +0 -113
  145. package/src/events/sort.ts +0 -51
  146. package/src/events/txEventCache.ts +0 -92
  147. package/src/events/types.ts +0 -337
  148. package/src/events/webSocketLogProvider.ts +0 -152
  149. package/src/factory/bigNum.ts +0 -709
  150. package/src/factory/oracleClient.ts +0 -73
  151. package/src/idl/pyth.json +0 -142
  152. package/src/idl/pyth.ts +0 -97
  153. package/src/idl/pyth_solana_receiver.json +0 -628
  154. package/src/idl/token_faucet.json +0 -229
  155. package/src/idl/token_faucet.ts +0 -197
  156. package/src/idl/velocity.json +0 -23974
  157. package/src/idl/velocity.ts +0 -23980
  158. package/src/index.ts +0 -150
  159. package/src/indicative-quotes/indicativeQuotesSender.ts +0 -233
  160. package/src/isomorphic/README.md +0 -19
  161. package/src/isomorphic/anchor.browser.ts +0 -44
  162. package/src/isomorphic/anchor.node.ts +0 -1
  163. package/src/isomorphic/anchor.ts +0 -1
  164. package/src/isomorphic/anchor29.browser.ts +0 -24
  165. package/src/isomorphic/anchor29.node.ts +0 -1
  166. package/src/isomorphic/anchor29.ts +0 -1
  167. package/src/isomorphic/grpc.browser.ts +0 -4
  168. package/src/isomorphic/grpc.node.ts +0 -130
  169. package/src/isomorphic/grpc.ts +0 -1
  170. package/src/jupiter/jupiterClient.ts +0 -502
  171. package/src/keypair.ts +0 -32
  172. package/src/margin/README.md +0 -138
  173. package/src/marginCalculation.ts +0 -407
  174. package/src/marinade/idl/idl.json +0 -1962
  175. package/src/marinade/index.ts +0 -73
  176. package/src/marinade/types.ts +0 -3925
  177. package/src/math/amm.ts +0 -1758
  178. package/src/math/auction.ts +0 -480
  179. package/src/math/bankruptcy.ts +0 -138
  180. package/src/math/builder.ts +0 -130
  181. package/src/math/conversion.ts +0 -45
  182. package/src/math/exchangeStatus.ts +0 -261
  183. package/src/math/funding.ts +0 -498
  184. package/src/math/insurance.ts +0 -171
  185. package/src/math/liquidation.ts +0 -433
  186. package/src/math/margin.ts +0 -327
  187. package/src/math/market.ts +0 -487
  188. package/src/math/oracles.ts +0 -477
  189. package/src/math/orders.ts +0 -500
  190. package/src/math/position.ts +0 -381
  191. package/src/math/repeg.ts +0 -223
  192. package/src/math/spotBalance.ts +0 -996
  193. package/src/math/spotMarket.ts +0 -115
  194. package/src/math/spotPosition.ts +0 -263
  195. package/src/math/state.ts +0 -71
  196. package/src/math/superStake.ts +0 -602
  197. package/src/math/tiers.ts +0 -73
  198. package/src/math/trade.ts +0 -879
  199. package/src/math/utils.ts +0 -183
  200. package/src/memcmp.ts +0 -279
  201. package/src/oracles/oracleClientCache.ts +0 -41
  202. package/src/oracles/oracleId.ts +0 -99
  203. package/src/oracles/prelaunchOracleClient.ts +0 -63
  204. package/src/oracles/pythClient.ts +0 -125
  205. package/src/oracles/pythLazerClient.ts +0 -141
  206. package/src/oracles/quoteAssetOracleClient.ts +0 -43
  207. package/src/oracles/strictOraclePrice.ts +0 -40
  208. package/src/oracles/types.ts +0 -82
  209. package/src/oracles/utils.ts +0 -45
  210. package/src/orderParams.ts +0 -117
  211. package/src/orderSubscriber/OrderSubscriber.ts +0 -378
  212. package/src/orderSubscriber/PollingSubscription.ts +0 -50
  213. package/src/orderSubscriber/WebsocketSubscription.ts +0 -137
  214. package/src/orderSubscriber/grpcSubscription.ts +0 -155
  215. package/src/orderSubscriber/index.ts +0 -7
  216. package/src/orderSubscriber/types.ts +0 -64
  217. package/src/priorityFee/averageOverSlotsStrategy.ts +0 -17
  218. package/src/priorityFee/averageStrategy.ts +0 -13
  219. package/src/priorityFee/ewmaStrategy.ts +0 -51
  220. package/src/priorityFee/heliusPriorityFeeMethod.ts +0 -68
  221. package/src/priorityFee/index.ts +0 -16
  222. package/src/priorityFee/maxOverSlotsStrategy.ts +0 -18
  223. package/src/priorityFee/maxStrategy.ts +0 -8
  224. package/src/priorityFee/priorityFeeSubscriber.ts +0 -328
  225. package/src/priorityFee/priorityFeeSubscriberMap.ts +0 -134
  226. package/src/priorityFee/solanaPriorityFeeMethod.ts +0 -46
  227. package/src/priorityFee/types.ts +0 -82
  228. package/src/priorityFee/velocityPriorityFeeMethod.ts +0 -53
  229. package/src/pyth/constants.ts +0 -9
  230. package/src/pyth/index.ts +0 -15
  231. package/src/pyth/pythLazerSubscriber.ts +0 -365
  232. package/src/pyth/types.ts +0 -4451
  233. package/src/pyth/utils.ts +0 -13
  234. package/src/slot/SlotSubscriber.ts +0 -126
  235. package/src/slot/SlothashSubscriber.ts +0 -163
  236. package/src/swap/UnifiedSwapClient.ts +0 -315
  237. package/src/swift/grpcSignedMsgUserAccountSubscriber.ts +0 -81
  238. package/src/swift/index.ts +0 -10
  239. package/src/swift/signedMsgUserAccountSubscriber.ts +0 -251
  240. package/src/swift/swiftOrderSubscriber.ts +0 -351
  241. package/src/testClient.ts +0 -42
  242. package/src/titan/titanClient.ts +0 -438
  243. package/src/token/index.ts +0 -13
  244. package/src/tokenFaucet.ts +0 -296
  245. package/src/tx/baseTxSender.ts +0 -651
  246. package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +0 -31
  247. package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +0 -105
  248. package/src/tx/blockhashFetcher/types.ts +0 -9
  249. package/src/tx/fastSingleTxSender.ts +0 -200
  250. package/src/tx/forwardOnlyTxSender.ts +0 -193
  251. package/src/tx/priorityFeeCalculator.ts +0 -117
  252. package/src/tx/reportTransactionError.ts +0 -176
  253. package/src/tx/retryTxSender.ts +0 -177
  254. package/src/tx/txHandler.ts +0 -1009
  255. package/src/tx/txParamProcessor.ts +0 -225
  256. package/src/tx/types.ts +0 -117
  257. package/src/tx/utils.ts +0 -133
  258. package/src/tx/whileValidTxSender.ts +0 -377
  259. package/src/types.ts +0 -2575
  260. package/src/user.ts +0 -5316
  261. package/src/userConfig.ts +0 -38
  262. package/src/userMap/PollingSubscription.ts +0 -61
  263. package/src/userMap/WebsocketSubscription.ts +0 -93
  264. package/src/userMap/grpcSubscription.ts +0 -93
  265. package/src/userMap/referrerMap.ts +0 -360
  266. package/src/userMap/revenueShareEscrowMap.ts +0 -342
  267. package/src/userMap/userMap.ts +0 -784
  268. package/src/userMap/userMapConfig.ts +0 -82
  269. package/src/userMap/userStatsMap.ts +0 -393
  270. package/src/userName.ts +0 -37
  271. package/src/userStats.ts +0 -159
  272. package/src/userStatsConfig.ts +0 -35
  273. package/src/util/TransactionConfirmationManager.ts +0 -333
  274. package/src/util/chainClock.ts +0 -65
  275. package/src/util/computeUnits.ts +0 -101
  276. package/src/util/digest.ts +0 -33
  277. package/src/util/ed25519Utils.ts +0 -95
  278. package/src/util/promiseTimeout.ts +0 -23
  279. package/src/velocityClient.ts +0 -14802
  280. package/src/velocityClientConfig.ts +0 -119
  281. package/src/wallet.ts +0 -91
  282. package/tests/VelocityCore/builder_escrow.test.ts +0 -121
  283. package/tests/VelocityCore/decode.test.ts +0 -16
  284. package/tests/VelocityCore/fill_trigger.test.ts +0 -73
  285. package/tests/VelocityCore/instructions.test.ts +0 -46
  286. package/tests/VelocityCore/pdas.test.ts +0 -30
  287. package/tests/VelocityCore/perp_orders.test.ts +0 -205
  288. package/tests/VelocityCore/remainingAccounts.test.ts +0 -72
  289. package/tests/VelocityCore/settlement_liquidation.test.ts +0 -69
  290. package/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +0 -211
  291. package/tests/amm/test.ts +0 -2402
  292. package/tests/auctions/test.ts +0 -81
  293. package/tests/bn/test.ts +0 -355
  294. package/tests/builder/builderFee.test.ts +0 -42
  295. package/tests/ci/verifyConstants.ts +0 -393
  296. package/tests/decode/test.ts +0 -262
  297. package/tests/decode/userAccountBufferStrings.ts +0 -102
  298. package/tests/dlob/helpers.ts +0 -748
  299. package/tests/dlob/test.ts +0 -6969
  300. package/tests/dlob/tickSizeStandardization.ts +0 -545
  301. package/tests/events/parseLogsForCuUsage.ts +0 -139
  302. package/tests/exchangeStatus/test.ts +0 -45
  303. package/tests/insurance/test.ts +0 -40
  304. package/tests/liquidation/test.ts +0 -125
  305. package/tests/oracles/mmOracleGate.test.ts +0 -379
  306. package/tests/oracles/pythPegSnap.test.ts +0 -76
  307. package/tests/sdkParity/enumParity.test.ts +0 -84
  308. package/tests/sdkParity/marginCategoryFill.test.ts +0 -143
  309. package/tests/sdkParity/memcmpOffsets.test.ts +0 -139
  310. package/tests/spot/test.ts +0 -281
  311. package/tests/tx/TransactionConfirmationManager.test.ts +0 -312
  312. package/tests/tx/cachedBlockhashFetcher.test.ts +0 -96
  313. package/tests/tx/priorityFeeCalculator.ts +0 -77
  314. package/tests/tx/priorityFeeStrategy.ts +0 -95
  315. package/tests/user/bankruptcy.ts +0 -165
  316. package/tests/user/feeAndWithdrawLimits.ts +0 -284
  317. package/tests/user/getMarginCalculation.ts +0 -586
  318. package/tests/user/helpers.ts +0 -184
  319. package/tests/user/liquidations.ts +0 -129
  320. package/tests/user/marginCalculations.test.ts +0 -321
  321. package/tests/user/test.ts +0 -833
  322. package/tsconfig.browser.json +0 -18
  323. package/tsconfig.json +0 -36
@@ -1,327 +0,0 @@
1
- /**
2
- * Margin calculation helpers — TypeScript mirror of `programs/velocity/src/math/margin.rs`.
3
- * Computes initial/maintenance margin requirements, free collateral, and account health.
4
- * Used by `User` for leverage queries and by keeper bots for liquidation eligibility checks.
5
- */
6
- import { squareRootBN } from './utils';
7
- import {
8
- SPOT_MARKET_WEIGHT_PRECISION,
9
- SPOT_MARKET_IMF_PRECISION,
10
- ZERO,
11
- AMM_RESERVE_PRECISION,
12
- BASE_PRECISION,
13
- MARGIN_PRECISION,
14
- PRICE_PRECISION,
15
- QUOTE_PRECISION,
16
- } from '../constants/numericConstants';
17
- import { BN } from '../isomorphic/anchor';
18
- import { OraclePriceData } from '../oracles/types';
19
- import { calculateMarketMarginRatio } from './market';
20
- import { calculateScaledInitialAssetWeight } from './spotBalance';
21
- import { VelocityClient } from '../velocityClient';
22
- import { PerpMarketAccount, PerpPosition } from '../types';
23
- import { isVariant } from '../types';
24
- import { assert } from '../assert/assert';
25
-
26
- /**
27
- * Applies the IMF (initial margin factor) size premium to a base liability weight, mirroring
28
- * `calculate_size_premium_liability_weight` in `programs/velocity/src/math/margin.rs`. Larger
29
- * positions get a higher (worse) liability weight, scaling with `sqrt(size)`, so leverage
30
- * effectively decreases as position size grows. Returns `liabilityWeight` unchanged when
31
- * `imfFactor` is zero (IMF scaling disabled for the market).
32
- * @param size Position size driving the premium, AMM_RESERVE_PRECISION (1e9).
33
- * @param imfFactor Market's IMF factor, SPOT_MARKET_IMF_PRECISION (1e6) or the margin-ratio-scaled equivalent depending on caller.
34
- * @param liabilityWeight Base liability weight before the size premium, same precision as `precision`.
35
- * @param precision Precision `liabilityWeight` is expressed in (e.g. `MARGIN_PRECISION` 1e4 for perp margin ratios, `SPOT_MARKET_WEIGHT_PRECISION` 1e4 for spot weights).
36
- * @param isBounded If true (default), the result is floored at `liabilityWeight` (the premium can only increase it); if false, returns the raw (possibly lower) premium-adjusted value.
37
- * @returns Size-adjusted liability weight, same precision as `liabilityWeight`.
38
- */
39
- export function calculateSizePremiumLiabilityWeight(
40
- size: BN, // AMM_RESERVE_PRECISION
41
- imfFactor: BN,
42
- liabilityWeight: BN,
43
- precision: BN,
44
- isBounded = true
45
- ): BN {
46
- if (imfFactor.eq(ZERO)) {
47
- return liabilityWeight;
48
- }
49
-
50
- const sizeSqrt = squareRootBN(size.abs().mul(new BN(10)).add(new BN(1))); //1e9 -> 1e10 -> 1e5
51
-
52
- const liabilityWeightNumerator = liabilityWeight.sub(
53
- liabilityWeight.div(new BN(5))
54
- );
55
-
56
- const denom = new BN(100_000).mul(SPOT_MARKET_IMF_PRECISION).div(precision);
57
- assert(denom.gt(ZERO));
58
-
59
- const sizePremiumLiabilityWeight = liabilityWeightNumerator.add(
60
- sizeSqrt // 1e5
61
- .mul(imfFactor)
62
- .div(denom) // 1e5
63
- );
64
-
65
- let maxLiabilityWeight;
66
- if (isBounded) {
67
- maxLiabilityWeight = BN.max(liabilityWeight, sizePremiumLiabilityWeight);
68
- } else {
69
- maxLiabilityWeight = sizePremiumLiabilityWeight;
70
- }
71
-
72
- return maxLiabilityWeight;
73
- }
74
-
75
- /**
76
- * Applies the IMF size discount to a base asset weight, mirroring
77
- * `calculate_size_discount_asset_weight` in `programs/velocity/src/math/margin.rs`. Larger
78
- * deposits get a lower (worse) asset weight, scaling down with `sqrt(size)`, capping how much
79
- * collateral credit a single large position can contribute. Returns `assetWeight` unchanged
80
- * when `imfFactor` is zero.
81
- * @param size Deposit size driving the discount, AMM_RESERVE_PRECISION (1e9).
82
- * @param imfFactor Market's IMF factor, SPOT_MARKET_IMF_PRECISION (1e6).
83
- * @param assetWeight Base asset weight before the size discount, SPOT_MARKET_WEIGHT_PRECISION (1e4).
84
- * @returns `min(assetWeight, sizeDiscountedWeight)`, SPOT_MARKET_WEIGHT_PRECISION (1e4).
85
- */
86
- export function calculateSizeDiscountAssetWeight(
87
- size: BN, // AMM_RESERVE_PRECISION
88
- imfFactor: BN,
89
- assetWeight: BN
90
- ): BN {
91
- if (imfFactor.eq(ZERO)) {
92
- return assetWeight;
93
- }
94
-
95
- const sizeSqrt = squareRootBN(size.abs().mul(new BN(10)).add(new BN(1))); //1e9 -> 1e10 -> 1e5
96
- const imfNumerator = SPOT_MARKET_IMF_PRECISION.add(
97
- SPOT_MARKET_IMF_PRECISION.div(new BN(10))
98
- );
99
-
100
- const sizeDiscountAssetWeight = imfNumerator
101
- .mul(SPOT_MARKET_WEIGHT_PRECISION)
102
- .div(
103
- SPOT_MARKET_IMF_PRECISION.add(
104
- sizeSqrt // 1e5
105
- .mul(imfFactor)
106
- .div(new BN(100_000)) // 1e5
107
- )
108
- );
109
-
110
- const minAssetWeight = BN.min(assetWeight, sizeDiscountAssetWeight);
111
-
112
- return minAssetWeight;
113
- }
114
-
115
- /**
116
- * Marks a perp position (or its worst-case size including open orders) to the oracle price:
117
- * `abs(baseAssetAmount) * price / AMM_RESERVE_PRECISION`. Used for margin/health
118
- * calculations, not close-value simulation (see `calculateBaseAssetValue` in `position.ts`
119
- * for the AMM-simulated close value). This is a base *asset value*, not necessarily the same
120
- * as liability value in every case — see `calculatePerpLiabilityValue` to get the liability
121
- * value used directly in margin requirement math.
122
- * @param market Perp market the position belongs to; uses `market.expiryPrice` instead of the oracle price when the market is in `settlement` status.
123
- * @param perpPosition Position to value.
124
- * @param oraclePriceData Must provide `price`, PRICE_PRECISION (1e6).
125
- * @param includeOpenOrders If true, values the worst-case base amount including open bids/asks (via `calculateWorstCaseBaseAssetAmount`) instead of just the current position (default false).
126
- * @returns Base asset value, QUOTE_PRECISION (1e6).
127
- */
128
- export function calculateBaseAssetValueWithOracle(
129
- market: PerpMarketAccount,
130
- perpPosition: PerpPosition,
131
- oraclePriceData: Pick<OraclePriceData, 'price'>,
132
- includeOpenOrders = false
133
- ): BN {
134
- let price = oraclePriceData.price;
135
- if (isVariant(market.status, 'settlement')) {
136
- price = market.expiryPrice;
137
- }
138
-
139
- const baseAssetAmount = includeOpenOrders
140
- ? calculateWorstCaseBaseAssetAmount(
141
- perpPosition,
142
- market,
143
- oraclePriceData.price
144
- )
145
- : perpPosition.baseAssetAmount;
146
-
147
- return baseAssetAmount.abs().mul(price).div(AMM_RESERVE_PRECISION);
148
- }
149
-
150
- /** Convenience wrapper returning just `worstCaseBaseAssetAmount` from `calculateWorstCasePerpLiabilityValue` — see that function for semantics and units (AMM_RESERVE_PRECISION, 1e9, signed). */
151
- export function calculateWorstCaseBaseAssetAmount(
152
- perpPosition: PerpPosition,
153
- perpMarket: PerpMarketAccount,
154
- oraclePrice: BN
155
- ): BN {
156
- return calculateWorstCasePerpLiabilityValue(
157
- perpPosition,
158
- perpMarket,
159
- oraclePrice
160
- ).worstCaseBaseAssetAmount;
161
- }
162
-
163
- /**
164
- * Computes the worst-case base position and liability value if all of a position's resting
165
- * orders on the more-adverse side were to fill, mirroring the program's worst-case-liability
166
- * margin methodology: compares the liability value of `baseAssetAmount + openBids` against
167
- * `baseAssetAmount + openAsks` and returns whichever is larger (i.e. whichever side, if
168
- * filled, would leave the user with more liability exposure). This is what margin
169
- * requirements are sized against, not the position's current base amount alone.
170
- * @param perpPosition Position providing `baseAssetAmount`, `openBids`, `openAsks`.
171
- * @param perpMarket Unused by this function (accepted for call-site symmetry with other market-scoped valuation helpers).
172
- * @param oraclePrice Oracle price, PRICE_PRECISION (1e6).
173
- * @param includeOpenOrders If false, skips the bids/asks comparison and returns the position's actual base amount/liability value as-is (default true).
174
- * @returns `worstCaseBaseAssetAmount` (AMM_RESERVE_PRECISION 1e9, signed) and `worstCaseLiabilityValue` (QUOTE_PRECISION 1e6) for the more-adverse side.
175
- */
176
- export function calculateWorstCasePerpLiabilityValue(
177
- perpPosition: PerpPosition,
178
- perpMarket: PerpMarketAccount,
179
- oraclePrice: BN,
180
- includeOpenOrders: boolean = true
181
- ): { worstCaseBaseAssetAmount: BN; worstCaseLiabilityValue: BN } {
182
- // return early if no open orders required
183
- if (!includeOpenOrders) {
184
- return {
185
- worstCaseBaseAssetAmount: perpPosition.baseAssetAmount,
186
- worstCaseLiabilityValue: calculatePerpLiabilityValue(
187
- perpPosition.baseAssetAmount,
188
- oraclePrice
189
- ),
190
- };
191
- }
192
- const allBids = perpPosition.baseAssetAmount.add(perpPosition.openBids);
193
- const allAsks = perpPosition.baseAssetAmount.add(perpPosition.openAsks);
194
-
195
- const allBidsLiabilityValue = calculatePerpLiabilityValue(
196
- allBids,
197
- oraclePrice
198
- );
199
- const allAsksLiabilityValue = calculatePerpLiabilityValue(
200
- allAsks,
201
- oraclePrice
202
- );
203
-
204
- if (allAsksLiabilityValue.gte(allBidsLiabilityValue)) {
205
- return {
206
- worstCaseBaseAssetAmount: allAsks,
207
- worstCaseLiabilityValue: allAsksLiabilityValue,
208
- };
209
- } else {
210
- return {
211
- worstCaseBaseAssetAmount: allBids,
212
- worstCaseLiabilityValue: allBidsLiabilityValue,
213
- };
214
- }
215
- }
216
-
217
- /**
218
- * Liability value of a base amount at a given price: `abs(baseAssetAmount) * price / BASE_PRECISION`.
219
- * This is the value margin requirements are computed against.
220
- * @param baseAssetAmount Base amount, BASE_PRECISION (1e9, signed).
221
- * @param price Price, PRICE_PRECISION (1e6).
222
- * @returns Liability value, QUOTE_PRECISION (1e6).
223
- */
224
- export function calculatePerpLiabilityValue(
225
- baseAssetAmount: BN,
226
- price: BN
227
- ): BN {
228
- return baseAssetAmount.abs().mul(price).div(BASE_PRECISION);
229
- }
230
-
231
- /**
232
- * Calculates the margin required to open a trade, in quote amount. Only accounts for the
233
- * trade size as a scalar value — does not account for the trade direction, current open
234
- * positions, or whether the trade would _actually_ be risk-increasing and use any extra
235
- * collateral (i.e. it's an upper-bound estimate for a standalone new position, not a
236
- * risk-increase delta).
237
- * @param velocityClient Client used to look up the target market and its oracle price.
238
- * @param targetMarketIndex Perp market index of the trade.
239
- * @param baseSize Trade size, BASE_PRECISION (1e9).
240
- * @param userMaxMarginRatio Optional per-user max margin ratio override (MARGIN_PRECISION, 1e4) — forwarded to `calculateMarketMarginRatio`; if omitted, the market's default initial margin ratio is used (subject to the size premium).
241
- * @param entryPrice Optional price to value the trade at instead of the current oracle price, PRICE_PRECISION (1e6).
242
- * @returns Margin required, QUOTE_PRECISION (1e6).
243
- */
244
- export function calculateMarginUSDCRequiredForTrade(
245
- velocityClient: VelocityClient,
246
- targetMarketIndex: number,
247
- baseSize: BN,
248
- userMaxMarginRatio?: number,
249
- entryPrice?: BN
250
- ): BN {
251
- const targetMarket =
252
- velocityClient.getPerpMarketAccountOrThrow(targetMarketIndex);
253
-
254
- const price =
255
- entryPrice ??
256
- velocityClient.getOracleDataForPerpMarket(targetMarket.marketIndex).price;
257
-
258
- const perpLiabilityValue = calculatePerpLiabilityValue(baseSize, price);
259
-
260
- const marginRequired = new BN(
261
- calculateMarketMarginRatio(
262
- targetMarket,
263
- baseSize.abs(),
264
- 'Initial',
265
- userMaxMarginRatio
266
- )
267
- )
268
- .mul(perpLiabilityValue)
269
- .div(MARGIN_PRECISION);
270
-
271
- return marginRequired;
272
- }
273
-
274
- /**
275
- * Similar to `calculateMarginUSDCRequiredForTrade`, but calculates how much of a given
276
- * collateral asset is required to cover the margin requirement for a given trade —
277
- * additionally accounts for the collateral's scaled initial asset weight (via
278
- * `calculateScaledInitialAssetWeight`), so a lower-weight collateral (e.g. a volatile asset)
279
- * requires depositing more than its face USDC value would suggest.
280
- * @param velocityClient Client used to look up the target/collateral markets and oracle prices.
281
- * @param targetMarketIndex Perp market index of the trade.
282
- * @param baseSize Trade size, BASE_PRECISION (1e9).
283
- * @param collateralIndex Spot market index of the collateral asset to deposit.
284
- * @param userMaxMarginRatio Optional per-user max margin ratio override (MARGIN_PRECISION, 1e4), forwarded to `calculateMarginUSDCRequiredForTrade`.
285
- * @param estEntryPrice Optional price to value the trade at instead of the current oracle price, PRICE_PRECISION (1e6).
286
- * @returns Collateral amount required, in `collateralIndex`'s own spot-market precision (via `velocityClient.convertToSpotPrecision`).
287
- */
288
- export function calculateCollateralDepositRequiredForTrade(
289
- velocityClient: VelocityClient,
290
- targetMarketIndex: number,
291
- baseSize: BN,
292
- collateralIndex: number,
293
- userMaxMarginRatio?: number,
294
- estEntryPrice?: BN
295
- ): BN {
296
- const marginRequiredUsdc = calculateMarginUSDCRequiredForTrade(
297
- velocityClient,
298
- targetMarketIndex,
299
- baseSize,
300
- userMaxMarginRatio,
301
- estEntryPrice
302
- );
303
-
304
- const collateralMarket =
305
- velocityClient.getSpotMarketAccountOrThrow(collateralIndex);
306
-
307
- const collateralOracleData =
308
- velocityClient.getOracleDataForSpotMarket(collateralIndex);
309
-
310
- const scaledAssetWeight = calculateScaledInitialAssetWeight(
311
- collateralMarket,
312
- collateralOracleData.price
313
- );
314
-
315
- // Base amount required to deposit = (marginRequiredUsdc / priceOfAsset) / assetWeight .. (E.g. $100 required / $10000 price / 0.5 weight)
316
- const baseAmountRequired = velocityClient
317
- .convertToSpotPrecision(collateralIndex, marginRequiredUsdc)
318
- .mul(PRICE_PRECISION) // adjust for division by oracle price
319
- .mul(SPOT_MARKET_WEIGHT_PRECISION) // adjust for division by scaled asset weight
320
- .div(collateralOracleData.price)
321
- .div(scaledAssetWeight)
322
- .div(QUOTE_PRECISION); // adjust for marginRequiredUsdc value's QUOTE_PRECISION
323
-
324
- // TODO : Round by step size?
325
-
326
- return baseAmountRequired;
327
- }