@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,155 +0,0 @@
1
- import { Context, PublicKey } from '@solana/web3.js';
2
- import { Buffer } from 'buffer';
3
- import { grpcProgramAccountSubscriber } from '../accounts/grpcProgramAccountSubscriber';
4
- import { OrderSubscriber } from './OrderSubscriber';
5
- import { GrpcConfigs, ResubOpts } from '../accounts/types';
6
- import { UserAccount } from '../types';
7
- import { getUserFilter, getNonIdleUserFilter } from '../memcmp';
8
- import { LaserstreamProgramAccountSubscriber } from '../accounts/laserProgramAccountSubscriber';
9
-
10
- /**
11
- * `OrderSubscriber` transport backed by a gRPC Geyser stream — either the
12
- * standard `grpcProgramAccountSubscriber` or, when `grpcConfigs.client ===
13
- * 'laser'`, `LaserstreamProgramAccountSubscriber` — filtered to non-idle
14
- * `User` accounts. Same initial-load/resync semantics as `WebsocketSubscription`.
15
- */
16
- export class grpcSubscription {
17
- private orderSubscriber: OrderSubscriber;
18
- private skipInitialLoad: boolean;
19
- private resubOpts?: ResubOpts;
20
- private resyncIntervalMs?: number;
21
-
22
- private subscriber?:
23
- | grpcProgramAccountSubscriber<UserAccount>
24
- | LaserstreamProgramAccountSubscriber<UserAccount>;
25
- private resyncTimeoutId?: ReturnType<typeof setTimeout>;
26
-
27
- private decoded?: boolean;
28
-
29
- private grpcConfigs: GrpcConfigs;
30
-
31
- /**
32
- * @param grpcConfigs gRPC/Geyser endpoint config; `client: 'laser'` selects the Laserstream implementation, otherwise the standard gRPC subscriber is used.
33
- * @param orderSubscriber The `OrderSubscriber` to feed with updates.
34
- * @param skipInitialLoad Skip the initial full `fetch()` snapshot after subscribing; defaults to `false`.
35
- * @param resubOpts Reconnect behavior for the underlying gRPC subscriber.
36
- * @param resyncIntervalMs If set, runs a periodic full `fetch()` resync at this interval.
37
- * @param decoded Whether updates are delivered already Anchor-decoded (`true`, default) or as raw buffers for `OrderSubscriber` to decode itself.
38
- */
39
- constructor({
40
- grpcConfigs,
41
- orderSubscriber,
42
- skipInitialLoad = false,
43
- resubOpts,
44
- resyncIntervalMs,
45
- decoded = true,
46
- }: {
47
- grpcConfigs: GrpcConfigs;
48
- orderSubscriber: OrderSubscriber;
49
- skipInitialLoad?: boolean;
50
- resubOpts?: ResubOpts;
51
- resyncIntervalMs?: number;
52
- decoded?: boolean;
53
- }) {
54
- this.orderSubscriber = orderSubscriber;
55
- this.skipInitialLoad = skipInitialLoad;
56
- this.resubOpts = resubOpts;
57
- this.resyncIntervalMs = resyncIntervalMs;
58
- this.decoded = decoded;
59
- this.grpcConfigs = grpcConfigs;
60
- }
61
-
62
- /** Establishes the gRPC/Laserstream program-account subscription (idempotent), optionally backfills with `fetch()`, and starts the resync timer if configured. */
63
- public async subscribe(): Promise<void> {
64
- if (this.subscriber) {
65
- return;
66
- }
67
-
68
- if (this.grpcConfigs.client === 'laser') {
69
- this.subscriber =
70
- await LaserstreamProgramAccountSubscriber.create<UserAccount>(
71
- this.grpcConfigs,
72
- 'OrderSubscriber',
73
- 'user',
74
- this.orderSubscriber.velocityClient.program,
75
- this.orderSubscriber.decodeFn,
76
- {
77
- filters: [getUserFilter(), getNonIdleUserFilter()],
78
- },
79
- this.resubOpts
80
- );
81
- } else {
82
- this.subscriber = await grpcProgramAccountSubscriber.create<UserAccount>(
83
- this.grpcConfigs,
84
- 'OrderSubscriber',
85
- 'user',
86
- this.orderSubscriber.velocityClient.program,
87
- this.orderSubscriber.decodeFn,
88
- {
89
- filters: [getUserFilter(), getNonIdleUserFilter()],
90
- },
91
- this.resubOpts
92
- );
93
- }
94
-
95
- await this.subscriber.subscribe(
96
- (
97
- accountId: PublicKey,
98
- account: UserAccount,
99
- context: Context,
100
- buffer: Buffer
101
- ) => {
102
- const userKey = accountId.toBase58();
103
- if (this.decoded ?? true) {
104
- this.orderSubscriber.tryUpdateUserAccount(
105
- userKey,
106
- 'decoded',
107
- account,
108
- context.slot
109
- );
110
- } else {
111
- this.orderSubscriber.tryUpdateUserAccount(
112
- userKey,
113
- 'buffer',
114
- buffer,
115
- context.slot
116
- );
117
- }
118
- }
119
- );
120
-
121
- if (!this.skipInitialLoad) {
122
- await this.orderSubscriber.fetch();
123
- }
124
-
125
- if (this.resyncIntervalMs) {
126
- const recursiveResync = () => {
127
- this.resyncTimeoutId = setTimeout(() => {
128
- this.orderSubscriber
129
- .fetch()
130
- .catch((e) => {
131
- console.error('Failed to resync in OrderSubscriber');
132
- console.log(e);
133
- })
134
- .finally(() => {
135
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
136
- if (!this.resyncTimeoutId) return;
137
- recursiveResync();
138
- });
139
- }, this.resyncIntervalMs);
140
- };
141
- recursiveResync();
142
- }
143
- }
144
-
145
- /** Tears down the gRPC subscription and cancels the resync timer, if any. No-op if not subscribed. */
146
- public async unsubscribe(): Promise<void> {
147
- if (!this.subscriber) return;
148
- await this.subscriber.unsubscribe();
149
- this.subscriber = undefined;
150
- if (this.resyncTimeoutId !== undefined) {
151
- clearTimeout(this.resyncTimeoutId);
152
- this.resyncTimeoutId = undefined;
153
- }
154
- }
155
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * OrderSubscriber — streams all open orders across all users from on-chain state.
3
- * Used by keeper bots and the DLOB to maintain a live view of the full order book
4
- * without subscribing to every individual User account separately.
5
- */
6
- export * from './OrderSubscriber';
7
- export * from './types';
@@ -1,64 +0,0 @@
1
- import { Commitment, PublicKey } from '@solana/web3.js';
2
- import { Order, UserAccount } from '../types';
3
- import { VelocityClient } from '../velocityClient';
4
- import { GrpcConfigs } from '../accounts/types';
5
-
6
- /** Configuration for `OrderSubscriber`. */
7
- export type OrderSubscriberConfig = {
8
- velocityClient?: VelocityClient;
9
- /** Selects the update transport: `'polling'` (interval `getProgramAccounts`), `'websocket'` (program-account subscription), or `'grpc'` (Geyser/Laserstream). `commitment` defaults to `'processed'` if unset; `skipInitialLoad` (websocket/grpc only) skips the initial `fetch()` full snapshot; `resubTimeoutMs`/`logResubMessages` control websocket/grpc reconnect behavior; `resyncIntervalMs` (websocket/grpc only) triggers a periodic full `fetch()` resync on top of the live subscription. */
10
- subscriptionConfig:
11
- | {
12
- type: 'polling';
13
- frequency: number;
14
- commitment?: Commitment;
15
- }
16
- | {
17
- type: 'websocket';
18
- skipInitialLoad?: boolean;
19
- resubTimeoutMs?: number;
20
- logResubMessages?: boolean;
21
- resyncIntervalMs?: number;
22
- commitment?: Commitment;
23
- }
24
- | {
25
- type: 'grpc';
26
- grpcConfigs: GrpcConfigs;
27
- skipInitialLoad?: boolean;
28
- resubTimeoutMs?: number;
29
- logResubMessages?: boolean;
30
- resyncIntervalMs?: number;
31
- commitment?: Commitment;
32
- };
33
- /** Use the hand-written `decodeUser` fast-path decoder instead of the Anchor account coder. Defaults to `true`. */
34
- fastDecode?: boolean;
35
- /** For websocket/grpc transports, whether the subscriber's own subscription decodes accounts itself (`true`, default) or passes raw buffers for the caller to decode. */
36
- decodeData?: boolean;
37
- /** Widen the account filter from "has at least one order" to "any non-idle user", so idle-but-non-empty accounts are also tracked. Defaults to `false`. */
38
- fetchAllNonIdleUsers?: boolean;
39
- };
40
-
41
- /** Events emitted on `OrderSubscriber.eventEmitter`. */
42
- export interface OrderSubscriberEvents {
43
- /** Fired when a `User` account update introduces one or more orders newly placed in `(previousObservedSlot, slot]`. */
44
- orderCreated: (
45
- account: UserAccount,
46
- updatedOrders: Order[],
47
- pubkey: PublicKey,
48
- slot: number,
49
- dataType: 'raw' | 'decoded' | 'buffer'
50
- ) => void;
51
- /** Fired whenever a `User` account update is accepted (i.e. not rejected by the staleness/slot check). */
52
- userUpdated: (
53
- account: UserAccount,
54
- pubkey: PublicKey,
55
- slot: number,
56
- dataType: 'raw' | 'decoded' | 'buffer'
57
- ) => void;
58
- /** Fired for every incoming update, even ones ultimately rejected as stale. */
59
- updateReceived: (
60
- pubkey: PublicKey,
61
- slot: number,
62
- dataType: 'raw' | 'decoded' | 'buffer'
63
- ) => void;
64
- }
@@ -1,17 +0,0 @@
1
- import { SolanaPriorityFeeResponse } from './solanaPriorityFeeMethod';
2
- import { PriorityFeeStrategy } from './types';
3
-
4
- /** `PriorityFeeStrategy` that averages `prioritizationFee` across all samples in the lookback window. Returns `0` for an empty sample set. */
5
- export class AverageOverSlotsStrategy implements PriorityFeeStrategy {
6
- calculate(samples: SolanaPriorityFeeResponse[]): number {
7
- if (samples.length === 0) {
8
- return 0;
9
- }
10
- let runningSumFees = 0;
11
-
12
- for (let i = 0; i < samples.length; i++) {
13
- runningSumFees += samples[i].prioritizationFee;
14
- }
15
- return runningSumFees / samples.length;
16
- }
17
- }
@@ -1,13 +0,0 @@
1
- import { SolanaPriorityFeeResponse } from './solanaPriorityFeeMethod';
2
- import { PriorityFeeStrategy } from './types';
3
-
4
- /** `PriorityFeeStrategy` that averages `prioritizationFee` across all samples. Unlike `AverageOverSlotsStrategy`, does not guard the empty-sample case — calling with `samples.length === 0` returns `NaN`. */
5
- export class AverageStrategy implements PriorityFeeStrategy {
6
- calculate(samples: SolanaPriorityFeeResponse[]): number {
7
- return (
8
- samples.reduce((a, b) => {
9
- return a + b.prioritizationFee;
10
- }, 0) / samples.length
11
- );
12
- }
13
- }
@@ -1,51 +0,0 @@
1
- import { SolanaPriorityFeeResponse } from './solanaPriorityFeeMethod';
2
- import { PriorityFeeStrategy } from './types';
3
-
4
- /**
5
- * `PriorityFeeStrategy` that computes an exponentially-weighted moving
6
- * average of `prioritizationFee` over slots, so more recent samples are
7
- * weighted more heavily and larger slot gaps decay the older sample's
8
- * influence faster.
9
- */
10
- class EwmaStrategy implements PriorityFeeStrategy {
11
- private halfLife: number;
12
-
13
- /**
14
- * @param halfLife The half life of the EWMA in slots. Default is 25 slots, approx 10 seconds.
15
- */
16
- constructor(halfLife = 25) {
17
- this.halfLife = halfLife;
18
- }
19
-
20
- // samples provided in desc slot order
21
- /**
22
- * @param samples Fee samples sorted descending by slot (as returned by `fetchSolanaPriorityFee`). Reversed internally to process oldest-first.
23
- * @returns `0` for an empty sample set; the single sample's fee if only one is provided; otherwise the EWMA, decayed per-step by `1 - exp(ln(0.5) / halfLife * slotGap)`.
24
- */
25
- calculate(samples: SolanaPriorityFeeResponse[]): number {
26
- if (samples.length === 0) {
27
- return 0;
28
- }
29
- if (samples.length === 1) {
30
- return samples[0].prioritizationFee;
31
- }
32
-
33
- let ewma = 0;
34
-
35
- const samplesReversed = samples.slice().reverse();
36
- for (let i = 0; i < samplesReversed.length; i++) {
37
- if (i === 0) {
38
- ewma = samplesReversed[i].prioritizationFee;
39
- continue;
40
- }
41
- const gap = samplesReversed[i].slot - samplesReversed[i - 1].slot;
42
- const alpha = 1 - Math.exp((Math.log(0.5) / this.halfLife) * gap);
43
-
44
- ewma = alpha * samplesReversed[i].prioritizationFee + (1 - alpha) * ewma;
45
- }
46
-
47
- return ewma;
48
- }
49
- }
50
-
51
- export { EwmaStrategy };
@@ -1,68 +0,0 @@
1
- import fetch from 'node-fetch';
2
-
3
- /** Percentile buckets returned by Helius's `getPriorityFeeEstimate` (`includeAllPriorityFeeLevels`). */
4
- export enum HeliusPriorityLevel {
5
- MIN = 'min', // 25th percentile
6
- LOW = 'low', // 25th percentile
7
- MEDIUM = 'medium', // 50th percentile
8
- HIGH = 'high', // 75th percentile
9
- VERY_HIGH = 'veryHigh', // 95th percentile
10
- UNSAFE_MAX = 'unsafeMax', // 100th percentile
11
- }
12
-
13
- /** Priority fee (micro-lamports/CU) at each `HeliusPriorityLevel` percentile. */
14
- export type HeliusPriorityFeeLevels = {
15
- [key in HeliusPriorityLevel]: number;
16
- };
17
-
18
- /** Raw JSON-RPC response from Helius's `getPriorityFeeEstimate`. */
19
- export type HeliusPriorityFeeResponse = {
20
- jsonrpc: string;
21
- result: {
22
- /** Single-value estimate; only populated when `includeAllPriorityFeeLevels` was not requested. */
23
- priorityFeeEstimate?: number;
24
- /** Per-percentile estimates; populated when `includeAllPriorityFeeLevels: true` is requested (as `fetchHeliusPriorityFee` does). */
25
- priorityFeeLevels?: HeliusPriorityFeeLevels;
26
- };
27
- id: string;
28
- };
29
-
30
- /**
31
- * Fetches priority fee estimates from the Helius `getPriorityFeeEstimate` API
32
- * (https://docs.helius.dev/solana-rpc-nodes/alpha-priority-fee-api).
33
- * @param heliusRpcUrl Helius RPC URL to POST the `getPriorityFeeEstimate` request to.
34
- * @param lookbackDistance Number of recent slots to consider (`lookbackSlots` option).
35
- * @param addresses Account keys to scope the estimate to (accounts the transaction will write-lock).
36
- * @returns The full Helius response (with `includeAllPriorityFeeLevels: true`), or `undefined` if the request failed (error is logged, not thrown).
37
- */
38
- export async function fetchHeliusPriorityFee(
39
- heliusRpcUrl: string,
40
- lookbackDistance: number,
41
- addresses: string[]
42
- ): Promise<HeliusPriorityFeeResponse | undefined> {
43
- try {
44
- const response = await fetch(heliusRpcUrl, {
45
- method: 'POST',
46
- headers: { 'Content-Type': 'application/json' },
47
- body: JSON.stringify({
48
- jsonrpc: '2.0',
49
- id: '1',
50
- method: 'getPriorityFeeEstimate',
51
- params: [
52
- {
53
- accountKeys: addresses,
54
- options: {
55
- includeAllPriorityFeeLevels: true,
56
- lookbackSlots: lookbackDistance,
57
- },
58
- },
59
- ],
60
- }),
61
- });
62
- return await response.json();
63
- } catch (err) {
64
- console.error(err);
65
- }
66
-
67
- return undefined;
68
- }
@@ -1,16 +0,0 @@
1
- /**
2
- * Priority fee estimation strategies for Solana transactions.
3
- * Implementations: average, EWMA, max-over-slots, max. Injected via VelocityClientConfig.
4
- * Select a strategy based on congestion tolerance vs. cost sensitivity.
5
- */
6
- export * from './averageOverSlotsStrategy';
7
- export * from './averageStrategy';
8
- export * from './ewmaStrategy';
9
- export * from './maxOverSlotsStrategy';
10
- export * from './maxStrategy';
11
- export * from './priorityFeeSubscriber';
12
- export * from './priorityFeeSubscriberMap';
13
- export * from './solanaPriorityFeeMethod';
14
- export * from './heliusPriorityFeeMethod';
15
- export * from './velocityPriorityFeeMethod';
16
- export * from './types';
@@ -1,18 +0,0 @@
1
- import { SolanaPriorityFeeResponse } from './solanaPriorityFeeMethod';
2
- import { PriorityFeeStrategy } from './types';
3
-
4
- /** `PriorityFeeStrategy` that takes the max `prioritizationFee` across all samples in the lookback window. Returns `0` for an empty sample set. */
5
- export class MaxOverSlotsStrategy implements PriorityFeeStrategy {
6
- calculate(samples: SolanaPriorityFeeResponse[]): number {
7
- if (samples.length === 0) {
8
- return 0;
9
- }
10
- // Assuming samples are sorted in descending order of slot.
11
- let currMaxFee = samples[0].prioritizationFee;
12
-
13
- for (let i = 0; i < samples.length; i++) {
14
- currMaxFee = Math.max(samples[i].prioritizationFee, currMaxFee);
15
- }
16
- return currMaxFee;
17
- }
18
- }
@@ -1,8 +0,0 @@
1
- import { PriorityFeeStrategy } from './types';
2
-
3
- /** `PriorityFeeStrategy` that takes the max `prioritizationFee` across all samples. Unlike `MaxOverSlotsStrategy`, does not guard the empty-sample case — calling with an empty array returns `-Infinity`. */
4
- export class MaxStrategy implements PriorityFeeStrategy {
5
- calculate(samples: { slot: number; prioritizationFee: number }[]): number {
6
- return Math.max(...samples.map((result) => result.prioritizationFee));
7
- }
8
- }