@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.
Files changed (325) hide show
  1. package/README.md +3 -3
  2. package/lib/browser/adminClient.d.ts +52 -0
  3. package/lib/browser/adminClient.js +97 -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 +191 -15
  9. package/lib/browser/idl/velocity.json +192 -16
  10. package/lib/browser/orderSubscriber/OrderSubscriber.d.ts +1 -0
  11. package/lib/browser/orderSubscriber/OrderSubscriber.js +10 -4
  12. package/lib/browser/pyth/pythLazerSubscriber.js +37 -27
  13. package/lib/browser/types.d.ts +6 -0
  14. package/lib/browser/user.d.ts +20 -3
  15. package/lib/browser/user.js +52 -4
  16. package/lib/browser/velocityClient.d.ts +46 -10
  17. package/lib/browser/velocityClient.js +107 -35
  18. package/lib/node/adminClient.d.ts +52 -0
  19. package/lib/node/adminClient.d.ts.map +1 -1
  20. package/lib/node/adminClient.js +97 -0
  21. package/lib/node/config.d.ts.map +1 -1
  22. package/lib/node/config.js +6 -7
  23. package/lib/node/constants/numericConstants.d.ts +1 -1
  24. package/lib/node/constants/numericConstants.d.ts.map +1 -1
  25. package/lib/node/constants/numericConstants.js +1 -1
  26. package/lib/node/decode/user.d.ts.map +1 -1
  27. package/lib/node/decode/user.js +5 -1
  28. package/lib/node/idl/velocity.d.ts +191 -15
  29. package/lib/node/idl/velocity.d.ts.map +1 -1
  30. package/lib/node/idl/velocity.json +192 -16
  31. package/lib/node/orderSubscriber/OrderSubscriber.d.ts +1 -0
  32. package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
  33. package/lib/node/orderSubscriber/OrderSubscriber.js +10 -4
  34. package/lib/node/pyth/pythLazerSubscriber.d.ts.map +1 -1
  35. package/lib/node/pyth/pythLazerSubscriber.js +37 -27
  36. package/lib/node/types.d.ts +6 -0
  37. package/lib/node/types.d.ts.map +1 -1
  38. package/lib/node/user.d.ts +20 -3
  39. package/lib/node/user.d.ts.map +1 -1
  40. package/lib/node/user.js +52 -4
  41. package/lib/node/velocityClient.d.ts +46 -10
  42. package/lib/node/velocityClient.d.ts.map +1 -1
  43. package/lib/node/velocityClient.js +107 -35
  44. package/package.json +7 -3
  45. package/.prettierignore +0 -1
  46. package/CHANGELOG.md +0 -132
  47. package/build-browser.js +0 -58
  48. package/bunfig.toml +0 -3
  49. package/esbuild-shims.js +0 -12
  50. package/scripts/deposit-isolated-positions.ts +0 -110
  51. package/scripts/find-flagged-users.ts +0 -213
  52. package/scripts/grpc-client-test-comparison.ts +0 -372
  53. package/scripts/grpc-multiuser-client-test-comparison.ts +0 -158
  54. package/scripts/postbuild.js +0 -95
  55. package/scripts/single-grpc-client-test.ts +0 -284
  56. package/scripts/withdraw-isolated-positions.ts +0 -174
  57. package/src/accounts/README_WebSocketAccountSubscriberV2.md +0 -95
  58. package/src/accounts/README_WebSocketProgramAccountSubscriberV2.md +0 -135
  59. package/src/accounts/basicUserAccountSubscriber.ts +0 -79
  60. package/src/accounts/basicUserStatsAccountSubscriber.ts +0 -87
  61. package/src/accounts/bulkAccountLoader.ts +0 -358
  62. package/src/accounts/bulkUserStatsSubscription.ts +0 -40
  63. package/src/accounts/bulkUserSubscription.ts +0 -39
  64. package/src/accounts/customizedCadenceBulkAccountLoader.ts +0 -250
  65. package/src/accounts/fetch.ts +0 -200
  66. package/src/accounts/grpcAccountSubscriber.ts +0 -225
  67. package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +0 -73
  68. package/src/accounts/grpcMultiAccountSubscriber.ts +0 -566
  69. package/src/accounts/grpcMultiUserAccountSubscriber.ts +0 -328
  70. package/src/accounts/grpcProgramAccountSubscriber.ts +0 -264
  71. package/src/accounts/grpcUserAccountSubscriber.ts +0 -63
  72. package/src/accounts/grpcUserStatsAccountSubscriber.ts +0 -65
  73. package/src/accounts/grpcVelocityClientAccountSubscriber.ts +0 -257
  74. package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +0 -941
  75. package/src/accounts/laserProgramAccountSubscriber.ts +0 -266
  76. package/src/accounts/oneShotUserAccountSubscriber.ts +0 -88
  77. package/src/accounts/oneShotUserStatsAccountSubscriber.ts +0 -94
  78. package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +0 -223
  79. package/src/accounts/pollingOracleAccountSubscriber.ts +0 -151
  80. package/src/accounts/pollingTokenAccountSubscriber.ts +0 -147
  81. package/src/accounts/pollingUserAccountSubscriber.ts +0 -198
  82. package/src/accounts/pollingUserStatsAccountSubscriber.ts +0 -180
  83. package/src/accounts/pollingVelocityClientAccountSubscriber.ts +0 -774
  84. package/src/accounts/testBulkAccountLoader.ts +0 -59
  85. package/src/accounts/types.ts +0 -428
  86. package/src/accounts/utils.ts +0 -90
  87. package/src/accounts/webSocketAccountSubscriber.ts +0 -304
  88. package/src/accounts/webSocketAccountSubscriberV2.ts +0 -536
  89. package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +0 -171
  90. package/src/accounts/webSocketProgramAccountSubscriber.ts +0 -244
  91. package/src/accounts/webSocketProgramAccountSubscriberV2.ts +0 -1048
  92. package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +0 -1042
  93. package/src/accounts/webSocketUserAccountSubscriber.ts +0 -139
  94. package/src/accounts/webSocketUserStatsAccountSubsriber.ts +0 -131
  95. package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +0 -865
  96. package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +0 -897
  97. package/src/accounts/websocketProgramUserAccountSubscriber.ts +0 -127
  98. package/src/addresses/marketAddresses.ts +0 -28
  99. package/src/addresses/pda.ts +0 -620
  100. package/src/adminClient.ts +0 -8136
  101. package/src/assert/assert.ts +0 -5
  102. package/src/auctionSubscriber/auctionSubscriber.ts +0 -86
  103. package/src/auctionSubscriber/auctionSubscriberGrpc.ts +0 -99
  104. package/src/auctionSubscriber/index.ts +0 -9
  105. package/src/auctionSubscriber/types.ts +0 -30
  106. package/src/bankrun/bankrunConnection.ts +0 -630
  107. package/src/blockhashSubscriber/BlockhashSubscriber.ts +0 -160
  108. package/src/blockhashSubscriber/index.ts +0 -6
  109. package/src/blockhashSubscriber/types.ts +0 -13
  110. package/src/clock/clockSubscriber.ts +0 -146
  111. package/src/config.ts +0 -312
  112. package/src/constants/index.ts +0 -9
  113. package/src/constants/numericConstants.ts +0 -194
  114. package/src/constants/perpMarkets.ts +0 -127
  115. package/src/constants/spotMarkets.ts +0 -104
  116. package/src/constants/txConstants.ts +0 -2
  117. package/src/constituentMap/constituentMap.ts +0 -305
  118. package/src/constituentMap/pollingConstituentAccountSubscriber.ts +0 -99
  119. package/src/constituentMap/webSocketConstituentAccountSubscriber.ts +0 -121
  120. package/src/core/VelocityCore.ts +0 -606
  121. package/src/core/index.ts +0 -12
  122. package/src/core/instructions/deposit.ts +0 -64
  123. package/src/core/instructions/fill.ts +0 -51
  124. package/src/core/instructions/funding.ts +0 -33
  125. package/src/core/instructions/liquidation.ts +0 -55
  126. package/src/core/instructions/orders.ts +0 -84
  127. package/src/core/instructions/perpOrders.ts +0 -312
  128. package/src/core/instructions/settlement.ts +0 -40
  129. package/src/core/instructions/trigger.ts +0 -41
  130. package/src/core/instructions/withdraw.ts +0 -65
  131. package/src/core/remainingAccounts.ts +0 -320
  132. package/src/core/signedMsg.ts +0 -109
  133. package/src/decode/customCoder.ts +0 -148
  134. package/src/decode/user.ts +0 -401
  135. package/src/dlob/DLOB.ts +0 -2793
  136. package/src/dlob/DLOBNode.ts +0 -305
  137. package/src/dlob/DLOBSubscriber.ts +0 -269
  138. package/src/dlob/NodeList.ts +0 -244
  139. package/src/dlob/orderBookLevels.ts +0 -695
  140. package/src/dlob/types.ts +0 -37
  141. package/src/events/eventList.ts +0 -114
  142. package/src/events/eventSubscriber.ts +0 -521
  143. package/src/events/eventsServerLogProvider.ts +0 -189
  144. package/src/events/fetchLogs.ts +0 -219
  145. package/src/events/parse.ts +0 -271
  146. package/src/events/pollingLogProvider.ts +0 -113
  147. package/src/events/sort.ts +0 -51
  148. package/src/events/txEventCache.ts +0 -92
  149. package/src/events/types.ts +0 -337
  150. package/src/events/webSocketLogProvider.ts +0 -152
  151. package/src/factory/bigNum.ts +0 -709
  152. package/src/factory/oracleClient.ts +0 -73
  153. package/src/idl/pyth.json +0 -142
  154. package/src/idl/pyth.ts +0 -97
  155. package/src/idl/pyth_solana_receiver.json +0 -628
  156. package/src/idl/token_faucet.json +0 -229
  157. package/src/idl/token_faucet.ts +0 -197
  158. package/src/idl/velocity.json +0 -23974
  159. package/src/idl/velocity.ts +0 -23980
  160. package/src/index.ts +0 -150
  161. package/src/indicative-quotes/indicativeQuotesSender.ts +0 -233
  162. package/src/isomorphic/README.md +0 -19
  163. package/src/isomorphic/anchor.browser.ts +0 -44
  164. package/src/isomorphic/anchor.node.ts +0 -1
  165. package/src/isomorphic/anchor.ts +0 -1
  166. package/src/isomorphic/anchor29.browser.ts +0 -24
  167. package/src/isomorphic/anchor29.node.ts +0 -1
  168. package/src/isomorphic/anchor29.ts +0 -1
  169. package/src/isomorphic/grpc.browser.ts +0 -4
  170. package/src/isomorphic/grpc.node.ts +0 -130
  171. package/src/isomorphic/grpc.ts +0 -1
  172. package/src/jupiter/jupiterClient.ts +0 -502
  173. package/src/keypair.ts +0 -32
  174. package/src/margin/README.md +0 -138
  175. package/src/marginCalculation.ts +0 -407
  176. package/src/marinade/idl/idl.json +0 -1962
  177. package/src/marinade/index.ts +0 -73
  178. package/src/marinade/types.ts +0 -3925
  179. package/src/math/amm.ts +0 -1758
  180. package/src/math/auction.ts +0 -480
  181. package/src/math/bankruptcy.ts +0 -138
  182. package/src/math/builder.ts +0 -130
  183. package/src/math/conversion.ts +0 -45
  184. package/src/math/exchangeStatus.ts +0 -261
  185. package/src/math/funding.ts +0 -498
  186. package/src/math/insurance.ts +0 -171
  187. package/src/math/liquidation.ts +0 -433
  188. package/src/math/margin.ts +0 -327
  189. package/src/math/market.ts +0 -487
  190. package/src/math/oracles.ts +0 -477
  191. package/src/math/orders.ts +0 -500
  192. package/src/math/position.ts +0 -381
  193. package/src/math/repeg.ts +0 -223
  194. package/src/math/spotBalance.ts +0 -996
  195. package/src/math/spotMarket.ts +0 -115
  196. package/src/math/spotPosition.ts +0 -263
  197. package/src/math/state.ts +0 -71
  198. package/src/math/superStake.ts +0 -602
  199. package/src/math/tiers.ts +0 -73
  200. package/src/math/trade.ts +0 -879
  201. package/src/math/utils.ts +0 -183
  202. package/src/memcmp.ts +0 -279
  203. package/src/oracles/oracleClientCache.ts +0 -41
  204. package/src/oracles/oracleId.ts +0 -99
  205. package/src/oracles/prelaunchOracleClient.ts +0 -63
  206. package/src/oracles/pythClient.ts +0 -125
  207. package/src/oracles/pythLazerClient.ts +0 -141
  208. package/src/oracles/quoteAssetOracleClient.ts +0 -43
  209. package/src/oracles/strictOraclePrice.ts +0 -40
  210. package/src/oracles/types.ts +0 -82
  211. package/src/oracles/utils.ts +0 -45
  212. package/src/orderParams.ts +0 -117
  213. package/src/orderSubscriber/OrderSubscriber.ts +0 -378
  214. package/src/orderSubscriber/PollingSubscription.ts +0 -50
  215. package/src/orderSubscriber/WebsocketSubscription.ts +0 -137
  216. package/src/orderSubscriber/grpcSubscription.ts +0 -155
  217. package/src/orderSubscriber/index.ts +0 -7
  218. package/src/orderSubscriber/types.ts +0 -64
  219. package/src/priorityFee/averageOverSlotsStrategy.ts +0 -17
  220. package/src/priorityFee/averageStrategy.ts +0 -13
  221. package/src/priorityFee/ewmaStrategy.ts +0 -51
  222. package/src/priorityFee/heliusPriorityFeeMethod.ts +0 -68
  223. package/src/priorityFee/index.ts +0 -16
  224. package/src/priorityFee/maxOverSlotsStrategy.ts +0 -18
  225. package/src/priorityFee/maxStrategy.ts +0 -8
  226. package/src/priorityFee/priorityFeeSubscriber.ts +0 -328
  227. package/src/priorityFee/priorityFeeSubscriberMap.ts +0 -134
  228. package/src/priorityFee/solanaPriorityFeeMethod.ts +0 -46
  229. package/src/priorityFee/types.ts +0 -82
  230. package/src/priorityFee/velocityPriorityFeeMethod.ts +0 -53
  231. package/src/pyth/constants.ts +0 -9
  232. package/src/pyth/index.ts +0 -15
  233. package/src/pyth/pythLazerSubscriber.ts +0 -365
  234. package/src/pyth/types.ts +0 -4451
  235. package/src/pyth/utils.ts +0 -13
  236. package/src/slot/SlotSubscriber.ts +0 -126
  237. package/src/slot/SlothashSubscriber.ts +0 -163
  238. package/src/swap/UnifiedSwapClient.ts +0 -315
  239. package/src/swift/grpcSignedMsgUserAccountSubscriber.ts +0 -81
  240. package/src/swift/index.ts +0 -10
  241. package/src/swift/signedMsgUserAccountSubscriber.ts +0 -251
  242. package/src/swift/swiftOrderSubscriber.ts +0 -351
  243. package/src/testClient.ts +0 -42
  244. package/src/titan/titanClient.ts +0 -438
  245. package/src/token/index.ts +0 -13
  246. package/src/tokenFaucet.ts +0 -296
  247. package/src/tx/baseTxSender.ts +0 -651
  248. package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +0 -31
  249. package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +0 -105
  250. package/src/tx/blockhashFetcher/types.ts +0 -9
  251. package/src/tx/fastSingleTxSender.ts +0 -200
  252. package/src/tx/forwardOnlyTxSender.ts +0 -193
  253. package/src/tx/priorityFeeCalculator.ts +0 -117
  254. package/src/tx/reportTransactionError.ts +0 -176
  255. package/src/tx/retryTxSender.ts +0 -177
  256. package/src/tx/txHandler.ts +0 -1009
  257. package/src/tx/txParamProcessor.ts +0 -225
  258. package/src/tx/types.ts +0 -117
  259. package/src/tx/utils.ts +0 -133
  260. package/src/tx/whileValidTxSender.ts +0 -377
  261. package/src/types.ts +0 -2575
  262. package/src/user.ts +0 -5316
  263. package/src/userConfig.ts +0 -38
  264. package/src/userMap/PollingSubscription.ts +0 -61
  265. package/src/userMap/WebsocketSubscription.ts +0 -93
  266. package/src/userMap/grpcSubscription.ts +0 -93
  267. package/src/userMap/referrerMap.ts +0 -360
  268. package/src/userMap/revenueShareEscrowMap.ts +0 -342
  269. package/src/userMap/userMap.ts +0 -784
  270. package/src/userMap/userMapConfig.ts +0 -82
  271. package/src/userMap/userStatsMap.ts +0 -393
  272. package/src/userName.ts +0 -37
  273. package/src/userStats.ts +0 -159
  274. package/src/userStatsConfig.ts +0 -35
  275. package/src/util/TransactionConfirmationManager.ts +0 -333
  276. package/src/util/chainClock.ts +0 -65
  277. package/src/util/computeUnits.ts +0 -101
  278. package/src/util/digest.ts +0 -33
  279. package/src/util/ed25519Utils.ts +0 -95
  280. package/src/util/promiseTimeout.ts +0 -23
  281. package/src/velocityClient.ts +0 -14802
  282. package/src/velocityClientConfig.ts +0 -119
  283. package/src/wallet.ts +0 -91
  284. package/tests/VelocityCore/builder_escrow.test.ts +0 -121
  285. package/tests/VelocityCore/decode.test.ts +0 -16
  286. package/tests/VelocityCore/fill_trigger.test.ts +0 -73
  287. package/tests/VelocityCore/instructions.test.ts +0 -46
  288. package/tests/VelocityCore/pdas.test.ts +0 -30
  289. package/tests/VelocityCore/perp_orders.test.ts +0 -205
  290. package/tests/VelocityCore/remainingAccounts.test.ts +0 -72
  291. package/tests/VelocityCore/settlement_liquidation.test.ts +0 -69
  292. package/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +0 -211
  293. package/tests/amm/test.ts +0 -2402
  294. package/tests/auctions/test.ts +0 -81
  295. package/tests/bn/test.ts +0 -355
  296. package/tests/builder/builderFee.test.ts +0 -42
  297. package/tests/ci/verifyConstants.ts +0 -393
  298. package/tests/decode/test.ts +0 -262
  299. package/tests/decode/userAccountBufferStrings.ts +0 -102
  300. package/tests/dlob/helpers.ts +0 -748
  301. package/tests/dlob/test.ts +0 -6969
  302. package/tests/dlob/tickSizeStandardization.ts +0 -545
  303. package/tests/events/parseLogsForCuUsage.ts +0 -139
  304. package/tests/exchangeStatus/test.ts +0 -45
  305. package/tests/insurance/test.ts +0 -40
  306. package/tests/liquidation/test.ts +0 -125
  307. package/tests/oracles/mmOracleGate.test.ts +0 -379
  308. package/tests/oracles/pythPegSnap.test.ts +0 -76
  309. package/tests/sdkParity/enumParity.test.ts +0 -84
  310. package/tests/sdkParity/marginCategoryFill.test.ts +0 -143
  311. package/tests/sdkParity/memcmpOffsets.test.ts +0 -139
  312. package/tests/spot/test.ts +0 -281
  313. package/tests/tx/TransactionConfirmationManager.test.ts +0 -312
  314. package/tests/tx/cachedBlockhashFetcher.test.ts +0 -96
  315. package/tests/tx/priorityFeeCalculator.ts +0 -77
  316. package/tests/tx/priorityFeeStrategy.ts +0 -95
  317. package/tests/user/bankruptcy.ts +0 -165
  318. package/tests/user/feeAndWithdrawLimits.ts +0 -284
  319. package/tests/user/getMarginCalculation.ts +0 -586
  320. package/tests/user/helpers.ts +0 -184
  321. package/tests/user/liquidations.ts +0 -129
  322. package/tests/user/marginCalculations.test.ts +0 -321
  323. package/tests/user/test.ts +0 -833
  324. package/tsconfig.browser.json +0 -18
  325. package/tsconfig.json +0 -36
@@ -1,105 +0,0 @@
1
- import {
2
- BlockhashWithExpiryBlockHeight,
3
- Commitment,
4
- Connection,
5
- } from '@solana/web3.js';
6
- import { BlockhashFetcher } from './types';
7
-
8
- /**
9
- * Fetches the latest blockhash and caches it for a configurable amount of time.
10
- *
11
- * - Prevents RPC spam by reusing cached values
12
- * - Retries on failure with exponential backoff
13
- * - Prevents concurrent requests for the same blockhash
14
- */
15
- export class CachedBlockhashFetcher implements BlockhashFetcher {
16
- private recentBlockhashCache: {
17
- value: BlockhashWithExpiryBlockHeight | undefined;
18
- lastUpdated: number;
19
- } = { value: undefined, lastUpdated: 0 };
20
-
21
- private blockhashFetchingPromise: Promise<void> | null = null;
22
-
23
- /**
24
- * @param connection - RPC connection to fetch the blockhash from.
25
- * @param blockhashCommitment - Commitment level to request the blockhash at.
26
- * @param retryCount - Maximum fetch attempts before giving up and throwing.
27
- * @param retrySleepTimeMs - Base backoff delay (ms) between retries; doubles each attempt (`retrySleepTimeMs * 2^i`).
28
- * @param staleCacheTimeMs - How long (ms) a cached blockhash is served before a refresh is triggered.
29
- */
30
- constructor(
31
- private connection: Connection,
32
- private blockhashCommitment: Commitment,
33
- private retryCount: number,
34
- private retrySleepTimeMs: number,
35
- private staleCacheTimeMs: number
36
- ) {}
37
-
38
- private async fetchBlockhashWithRetry(): Promise<BlockhashWithExpiryBlockHeight> {
39
- for (let i = 0; i < this.retryCount; i++) {
40
- try {
41
- return await this.connection.getLatestBlockhash(
42
- this.blockhashCommitment
43
- );
44
- } catch (err) {
45
- if (i === this.retryCount - 1) {
46
- throw new Error('Failed to fetch blockhash after maximum retries');
47
- }
48
- await this.sleep(this.retrySleepTimeMs * 2 ** i);
49
- }
50
- }
51
- throw new Error('Failed to fetch blockhash after maximum retries');
52
- }
53
-
54
- private sleep(ms: number): Promise<void> {
55
- return new Promise((resolve) => setTimeout(resolve, ms));
56
- }
57
-
58
- private async updateBlockhashCache(): Promise<void> {
59
- const result = await this.fetchBlockhashWithRetry();
60
- this.recentBlockhashCache = {
61
- value: result,
62
- lastUpdated: Date.now(),
63
- };
64
- }
65
-
66
- /**
67
- * Returns the cached blockhash, refreshing it first if the cache is older than
68
- * `staleCacheTimeMs`. Concurrent calls during a refresh all await the same in-flight fetch
69
- * rather than issuing duplicate RPC requests.
70
- * @returns The latest (possibly cached) blockhash and its expiry block height.
71
- * @throws If no cached value exists yet and the initial fetch fails after exhausting
72
- * `retryCount` retries.
73
- */
74
- public async getLatestBlockhash(): Promise<
75
- BlockhashWithExpiryBlockHeight | undefined
76
- > {
77
- if (this.isCacheStale()) {
78
- await this.refreshBlockhash();
79
- }
80
- return this.recentBlockhashCache.value;
81
- }
82
-
83
- private isCacheStale(): boolean {
84
- const lastUpdateTime = this.recentBlockhashCache.lastUpdated;
85
- return (
86
- !lastUpdateTime || Date.now() > lastUpdateTime + this.staleCacheTimeMs
87
- );
88
- }
89
-
90
- /**
91
- * Refresh the blockhash cache, await a pending refresh if it exists
92
- */
93
- private async refreshBlockhash(): Promise<void> {
94
- if (!this.blockhashFetchingPromise) {
95
- this.blockhashFetchingPromise = this.updateBlockhashCache();
96
- try {
97
- await this.blockhashFetchingPromise;
98
- } finally {
99
- this.blockhashFetchingPromise = null;
100
- }
101
- } else {
102
- await this.blockhashFetchingPromise;
103
- }
104
- }
105
- }
@@ -1,9 +0,0 @@
1
- import { BlockhashWithExpiryBlockHeight } from '@solana/web3.js';
2
-
3
- /** Strategy interface for obtaining a recent blockhash, abstracting whether it's fetched fresh every call or cached (see `BaseBlockhashFetcher`/`CachedBlockhashFetcher`). */
4
- export interface BlockhashFetcher {
5
- /**
6
- * @returns The latest blockhash and its expiry block height, or `undefined` if unavailable.
7
- */
8
- getLatestBlockhash(): Promise<BlockhashWithExpiryBlockHeight | undefined>;
9
- }
@@ -1,200 +0,0 @@
1
- import { ConfirmationStrategy, TxSigAndSlot } from './types';
2
- import {
3
- ConfirmOptions,
4
- TransactionSignature,
5
- Connection,
6
- Commitment,
7
- BlockhashWithExpiryBlockHeight,
8
- } from '@solana/web3.js';
9
- import { BaseTxSender } from './baseTxSender';
10
- import { TxHandler } from './txHandler';
11
- import { IWallet } from '../types';
12
- import { DEFAULT_CONFIRMATION_OPTS } from '../config';
13
-
14
- const DEFAULT_TIMEOUT = 35000;
15
- const DEFAULT_BLOCKHASH_REFRESH = 10000;
16
-
17
- /**
18
- * `TxSender` optimized for low latency: sends a transaction exactly once (no resend/retry loop —
19
- * relies on the RPC node's own forwarding), and can skip confirmation entirely or confirm
20
- * asynchronously in the background so `sendRawTransaction` returns as soon as the send lands.
21
- * Maintains its own periodically-refreshed blockhash cache (independent of `TxHandler`'s) purely
22
- * for that background-refresh convenience; it is not actually consumed by `sendRawTransaction`
23
- * here. Suited to latency-sensitive keeper bots that would rather fire-and-forget than pay for
24
- * `RetryTxSender`'s resend loop.
25
- */
26
- export class FastSingleTxSender extends BaseTxSender {
27
- connection: Connection;
28
- wallet: IWallet;
29
- opts: ConfirmOptions;
30
- timeout: number;
31
- /** How often (ms) `startBlockhashRefreshLoop` refreshes `recentBlockhash`; `0` disables the refresh loop. */
32
- blockhashRefreshInterval: number;
33
- additionalConnections: Connection[];
34
- timoutCount = 0;
35
- /** Periodically refreshed blockhash cache (see `startBlockhashRefreshLoop`); informational only — `sendRawTransaction` does not currently read this field. */
36
- recentBlockhash?: BlockhashWithExpiryBlockHeight;
37
- /** If `true`, `sendRawTransaction` returns immediately after sending, without waiting for or checking confirmation. */
38
- skipConfirmation: boolean;
39
- /** If `true` (and `skipConfirmation` is `false`), confirmation runs without being awaited — `sendRawTransaction` returns before the transaction is confirmed. */
40
- confirmInBackground: boolean;
41
- /** Commitment level used when refreshing `recentBlockhash`. */
42
- blockhashCommitment: Commitment;
43
- /** Handle for the interval timer started by `startBlockhashRefreshLoop`. */
44
- blockhashIntervalId?: NodeJS.Timer;
45
-
46
- /**
47
- * @param props.connection - RPC connection used for sending, confirming, and blockhash refresh.
48
- * @param props.wallet - Wallet used to sign transactions that aren't already `preSigned`.
49
- * @param props.opts - Default `ConfirmOptions`; defaults to `DEFAULT_CONFIRMATION_OPTS` with `maxRetries: 0` (this sender does not retry sends itself).
50
- * @param props.timeout - Confirmation timeout in milliseconds; defaults to 35000 (35s).
51
- * @param props.blockhashRefreshInterval - Interval (ms) for the background blockhash refresh; defaults to 10000 (10s). `0` disables it.
52
- * @param props.additionalConnections - Extra connections to also broadcast raw transactions to.
53
- * @param props.skipConfirmation - Skip confirmation entirely after sending; defaults to `false`.
54
- * @param props.confirmInBackground - Confirm without awaiting, so `sendRawTransaction` resolves right after send; defaults to `false`.
55
- * @param props.blockhashCommitment - Commitment for the background blockhash refresh; defaults to `'finalized'`.
56
- * @param props.confirmationStrategy - How to wait for confirmation; defaults to `ConfirmationStrategy.Combo`.
57
- * @param props.trackTxLandRate - Enables land-rate tracking.
58
- * @param props.txHandler - Custom `TxHandler` for signing/building transactions.
59
- * @param props.txLandRateLookbackWindowMinutes - Rolling window, in minutes, for the land-rate calculation.
60
- * @param props.landRateToFeeFunc - Custom mapping from land rate to priority-fee multiplier.
61
- * @param props.throwOnTimeoutError - Whether confirmation timeouts throw `TxSendError`; defaults to `true`.
62
- */
63
- public constructor({
64
- connection,
65
- wallet,
66
- opts = { ...DEFAULT_CONFIRMATION_OPTS, maxRetries: 0 },
67
- timeout = DEFAULT_TIMEOUT,
68
- blockhashRefreshInterval = DEFAULT_BLOCKHASH_REFRESH,
69
- additionalConnections = new Array<Connection>(),
70
- skipConfirmation = false,
71
- confirmInBackground = false,
72
- blockhashCommitment = 'finalized',
73
- confirmationStrategy = ConfirmationStrategy.Combo,
74
- trackTxLandRate,
75
- txHandler,
76
- txLandRateLookbackWindowMinutes,
77
- landRateToFeeFunc,
78
- throwOnTimeoutError = true,
79
- }: {
80
- connection: Connection;
81
- wallet: IWallet;
82
- opts?: ConfirmOptions;
83
- timeout?: number;
84
- blockhashRefreshInterval?: number;
85
- additionalConnections?: Connection[];
86
- skipConfirmation?: boolean;
87
- confirmInBackground?: boolean;
88
- blockhashCommitment?: Commitment;
89
- confirmationStrategy?: ConfirmationStrategy;
90
- trackTxLandRate?: boolean;
91
- txHandler?: TxHandler;
92
- txLandRateLookbackWindowMinutes?: number;
93
- landRateToFeeFunc?: (landRate: number) => number;
94
- throwOnTimeoutError?: boolean;
95
- }) {
96
- super({
97
- connection,
98
- wallet,
99
- opts,
100
- timeout,
101
- additionalConnections,
102
- confirmationStrategy,
103
- txHandler,
104
- trackTxLandRate,
105
- txLandRateLookbackWindowMinutes,
106
- landRateToFeeFunc,
107
- throwOnTimeoutError,
108
- });
109
- this.connection = connection;
110
- this.wallet = wallet;
111
- this.opts = opts;
112
- this.timeout = timeout;
113
- this.blockhashRefreshInterval = blockhashRefreshInterval;
114
- this.additionalConnections = additionalConnections;
115
- this.skipConfirmation = skipConfirmation;
116
- this.confirmInBackground = confirmInBackground;
117
- this.blockhashCommitment = blockhashCommitment;
118
- this.startBlockhashRefreshLoop();
119
- }
120
-
121
- /**
122
- * Starts a `setInterval` loop (if `blockhashRefreshInterval > 0`) that refreshes
123
- * `this.recentBlockhash` every `blockhashRefreshInterval` ms. Fetch errors are logged and
124
- * otherwise ignored (the loop keeps running with the stale cached value).
125
- */
126
- startBlockhashRefreshLoop(): void {
127
- if (this.blockhashRefreshInterval > 0) {
128
- this.blockhashIntervalId = setInterval(async () => {
129
- try {
130
- this.recentBlockhash = await this.connection.getLatestBlockhash(
131
- this.blockhashCommitment
132
- );
133
- } catch (e) {
134
- console.error('Error in startBlockhashRefreshLoop: ', e);
135
- }
136
- }, this.blockhashRefreshInterval);
137
- }
138
- }
139
-
140
- /**
141
- * Sends a raw transaction exactly once via `connection.sendRawTransaction` (plus a best-effort
142
- * broadcast to `additionalConnections`), then confirms it unless `skipConfirmation` is set —
143
- * awaited normally, or fired without awaiting if `confirmInBackground` is set (in which case
144
- * the returned `slot` will be `undefined`, since it isn't known yet at return time).
145
- * @param rawTransaction - Serialized, signed transaction bytes.
146
- * @param opts - Options passed to `sendRawTransaction`/`confirmTransaction`; `opts.commitment` selects confirmation level.
147
- * @returns The signature, and the confirmation slot if confirmation completed synchronously (`undefined` if `skipConfirmation` or `confirmInBackground` is set).
148
- * @throws Whatever `connection.sendRawTransaction` or (if awaited) `confirmTransaction`/`checkConfirmationResultForError` throw.
149
- */
150
- async sendRawTransaction(
151
- rawTransaction: Buffer | Uint8Array,
152
- opts: ConfirmOptions
153
- ): Promise<TxSigAndSlot> {
154
- let txid: TransactionSignature;
155
- try {
156
- txid = await this.connection.sendRawTransaction(rawTransaction, opts);
157
- this.txSigCache?.set(txid, false);
158
- this.sendToAdditionalConnections(rawTransaction, opts);
159
- } catch (e) {
160
- console.error(e);
161
- throw e;
162
- }
163
-
164
- let slot: number | undefined;
165
- if (!this.skipConfirmation) {
166
- try {
167
- if (this.confirmInBackground) {
168
- this.confirmTransaction(txid, opts.commitment)
169
- .then(async (result) => {
170
- this.txSigCache?.set(txid, true);
171
- if (result) {
172
- await this.checkConfirmationResultForError(txid, result.value);
173
- slot = result.context.slot;
174
- }
175
- })
176
- .catch((err) => {
177
- // background confirmation is fire-and-forget; surface failures
178
- // in logs instead of as unhandled promise rejections
179
- console.error(
180
- `Error confirming transaction ${txid} in background:`,
181
- err
182
- );
183
- });
184
- } else {
185
- const result = await this.confirmTransaction(txid, opts.commitment);
186
- this.txSigCache?.set(txid, true);
187
- if (result) {
188
- await this.checkConfirmationResultForError(txid, result.value);
189
- slot = result.context.slot;
190
- }
191
- }
192
- } catch (e) {
193
- console.error(e);
194
- throw e;
195
- }
196
- }
197
-
198
- return { txSig: txid, slot };
199
- }
200
- }
@@ -1,193 +0,0 @@
1
- import {
2
- ConfirmOptions,
3
- Connection,
4
- VersionedTransaction,
5
- } from '@solana/web3.js';
6
- import bs58 from 'bs58';
7
- import { BaseTxSender } from './baseTxSender';
8
- import { ConfirmationStrategy, TxSigAndSlot } from './types';
9
- import { TxHandler } from './txHandler';
10
- import { IWallet } from '../types';
11
- import { DEFAULT_CONFIRMATION_OPTS } from '../config';
12
-
13
- const DEFAULT_TIMEOUT = 35000;
14
- const DEFAULT_RETRY = 5000;
15
-
16
- type ResolveReference = {
17
- resolve?: () => void;
18
- };
19
-
20
- /**
21
- * `TxSender` that never calls `connection.sendRawTransaction` itself — instead it hands the raw
22
- * transaction to `additionalTxSenderCallbacks` (e.g. a Jito/third-party bundle submitter) and
23
- * re-invokes those callbacks on a `retrySleep` interval until the transaction confirms or
24
- * `timeout` elapses. `connection` is used only to *confirm* the transaction (via
25
- * `BaseTxSender.confirmTransaction`), never to broadcast it. `additionalConnections` is always
26
- * empty for this sender (the constructor doesn't accept it) since forwarding goes exclusively
27
- * through the callbacks.
28
- *
29
- * Use this when transaction submission is delegated to an external forwarder/relay rather than
30
- * this RPC connection, but you still want this SDK's confirmation/retry/land-rate machinery.
31
- */
32
- export class ForwardOnlyTxSender extends BaseTxSender {
33
- connection: Connection;
34
- wallet: IWallet;
35
- opts: ConfirmOptions;
36
- timeout: number;
37
- retrySleep: number;
38
- additionalConnections: Connection[];
39
- timoutCount = 0;
40
-
41
- /**
42
- * @param props.connection - RPC connection used only for confirmation, never for sending.
43
- * @param props.wallet - Wallet used to sign transactions that aren't already `preSigned`.
44
- * @param props.opts - Default `ConfirmOptions`; defaults to `DEFAULT_CONFIRMATION_OPTS` with `maxRetries: 0` (retries are handled by this sender's own re-forward loop, not the RPC node).
45
- * @param props.timeout - Total time (ms) to keep re-forwarding and waiting for confirmation before giving up; defaults to 35000 (35s).
46
- * @param props.retrySleep - Interval (ms) between re-invocations of `additionalTxSenderCallbacks`; defaults to 5000 (5s).
47
- * @param props.confirmationStrategy - How to wait for confirmation; defaults to `ConfirmationStrategy.Combo`.
48
- * @param props.additionalTxSenderCallbacks - Callbacks that actually submit the transaction (e.g. to a relay/bundler); required for this sender to do anything, since it never calls `sendRawTransaction` on `connection` itself. Defaults to an empty array (transaction is never actually broadcast anywhere).
49
- * @param props.txHandler - Custom `TxHandler` for signing/building transactions.
50
- * @param props.trackTxLandRate - Enables land-rate tracking.
51
- * @param props.txLandRateLookbackWindowMinutes - Rolling window, in minutes, for the land-rate calculation.
52
- * @param props.landRateToFeeFunc - Custom mapping from land rate to priority-fee multiplier.
53
- * @param props.throwOnTimeoutError - Whether confirmation timeouts throw `TxSendError`; defaults to `true`.
54
- */
55
- public constructor({
56
- connection,
57
- wallet,
58
- opts = { ...DEFAULT_CONFIRMATION_OPTS, maxRetries: 0 },
59
- timeout = DEFAULT_TIMEOUT,
60
- retrySleep = DEFAULT_RETRY,
61
- confirmationStrategy = ConfirmationStrategy.Combo,
62
- additionalTxSenderCallbacks = [],
63
- txHandler,
64
- trackTxLandRate,
65
- txLandRateLookbackWindowMinutes,
66
- landRateToFeeFunc,
67
- throwOnTimeoutError = true,
68
- }: {
69
- connection: Connection;
70
- wallet: IWallet;
71
- opts?: ConfirmOptions;
72
- timeout?: number;
73
- retrySleep?: number;
74
- confirmationStrategy?: ConfirmationStrategy;
75
- additionalTxSenderCallbacks?: ((base58EncodedTx: string) => void)[];
76
- txHandler?: TxHandler;
77
- trackTxLandRate?: boolean;
78
- txLandRateLookbackWindowMinutes?: number;
79
- landRateToFeeFunc?: (landRate: number) => number;
80
- throwOnTimeoutError?: boolean;
81
- }) {
82
- super({
83
- connection,
84
- wallet,
85
- opts,
86
- timeout,
87
- additionalConnections: [],
88
- confirmationStrategy,
89
- additionalTxSenderCallbacks,
90
- txHandler,
91
- trackTxLandRate,
92
- txLandRateLookbackWindowMinutes,
93
- landRateToFeeFunc,
94
- throwOnTimeoutError,
95
- });
96
- this.connection = connection;
97
- this.wallet = wallet;
98
- this.opts = opts;
99
- this.timeout = timeout;
100
- this.retrySleep = retrySleep;
101
- this.additionalConnections = [];
102
- }
103
-
104
- /**
105
- * Waits `retrySleep` milliseconds, exposing an early-wake `resolve` via `reference` so
106
- * `sendRawTransaction`'s stop condition can cut the wait short once the transaction confirms.
107
- * @param reference - Mutable holder `sendRawTransaction` uses to resolve this sleep early.
108
- */
109
- async sleep(reference: ResolveReference): Promise<void> {
110
- return new Promise((resolve) => {
111
- reference.resolve = resolve;
112
- setTimeout(resolve, this.retrySleep);
113
- });
114
- }
115
-
116
- /**
117
- * Overrides `BaseTxSender.sendToAdditionalConnections` to skip `additionalConnections`
118
- * entirely (always empty for this sender) and only invoke `additionalTxSenderCallbacks` with
119
- * the base58-encoded transaction — this is this sender's *only* transaction submission path.
120
- * @param rawTx - Serialized, signed transaction bytes.
121
- * @param _opts - Unused (kept for `BaseTxSender` override compatibility).
122
- */
123
- sendToAdditionalConnections(
124
- rawTx: Buffer | Uint8Array,
125
- _opts: ConfirmOptions
126
- ): void {
127
- this.additionalTxSenderCallbacks?.map((callback) => {
128
- callback(bs58.encode(rawTx));
129
- });
130
- }
131
-
132
- /**
133
- * "Sends" a raw transaction by repeatedly invoking `additionalTxSenderCallbacks` with it every
134
- * `retrySleep` ms (never calling `connection.sendRawTransaction`) while concurrently waiting
135
- * for confirmation via `confirmTransaction`. Re-forwarding stops as soon as confirmation
136
- * resolves (successfully or by throwing) or `timeout` elapses.
137
- * @param rawTransaction - Serialized, signed transaction bytes (must deserialize as a `VersionedTransaction`).
138
- * @param opts - Confirmation options; `opts.commitment` is used for confirmation.
139
- * @returns The signature and confirmation slot once confirmed.
140
- * @throws Whatever `confirmTransaction` throws (e.g. `TxSendError` on timeout, or the resolved on-chain error).
141
- */
142
- async sendRawTransaction(
143
- rawTransaction: Buffer | Uint8Array,
144
- opts: ConfirmOptions
145
- ): Promise<TxSigAndSlot> {
146
- const deserializedTx = VersionedTransaction.deserialize(rawTransaction);
147
-
148
- const txSig = deserializedTx.signatures[0];
149
- const encodedTxSig = bs58.encode(txSig);
150
-
151
- const startTime = this.getTimestamp();
152
-
153
- this.sendToAdditionalConnections(rawTransaction, opts);
154
- this.txSigCache?.set(encodedTxSig, false);
155
-
156
- let done = false;
157
- const resolveReference: ResolveReference = {
158
- resolve: undefined,
159
- };
160
- const stopWaiting = () => {
161
- done = true;
162
- if (resolveReference.resolve) {
163
- resolveReference.resolve();
164
- }
165
- };
166
-
167
- (async () => {
168
- while (!done && this.getTimestamp() - startTime < this.timeout) {
169
- await this.sleep(resolveReference);
170
- if (!done) {
171
- this.sendToAdditionalConnections(rawTransaction, opts);
172
- }
173
- }
174
- })();
175
-
176
- let slot: number | undefined;
177
- try {
178
- const result = await this.confirmTransaction(
179
- encodedTxSig,
180
- opts.commitment
181
- );
182
- slot = result?.context?.slot;
183
- this.txSigCache?.set(encodedTxSig, true);
184
- // eslint-disable-next-line no-useless-catch
185
- } catch (e) {
186
- throw e;
187
- } finally {
188
- stopWaiting();
189
- }
190
-
191
- return { txSig: encodedTxSig, slot };
192
- }
193
- }
@@ -1,117 +0,0 @@
1
- import { ComputeBudgetProgram, TransactionInstruction } from '@solana/web3.js';
2
-
3
- /**
4
- * This class determines whether a priority fee needs to be included in a transaction based on
5
- * a recent history of timed out transactions.
6
- */
7
- export class PriorityFeeCalculator {
8
- lastTxTimeoutCount: number;
9
- priorityFeeTriggered: boolean;
10
- lastTxTimeoutCountTriggered: number;
11
- priorityFeeLatchDurationMs: number; // how long to stay in triggered state before resetting
12
-
13
- /**
14
- * Constructor for the PriorityFeeCalculator class.
15
- * @param currentTimeMs - The current time in milliseconds.
16
- * @param priorityFeeLatchDurationMs - The duration for how long to stay in triggered state before resetting. Default value is 10 seconds.
17
- */
18
- constructor(
19
- currentTimeMs: number,
20
- priorityFeeLatchDurationMs: number = 10 * 1000
21
- ) {
22
- this.lastTxTimeoutCount = 0;
23
- this.priorityFeeTriggered = false;
24
- this.lastTxTimeoutCountTriggered = currentTimeMs;
25
- this.priorityFeeLatchDurationMs = priorityFeeLatchDurationMs;
26
- }
27
-
28
- /**
29
- * Update the priority fee state based on the current time and the current timeout count.
30
- * @param currentTimeMs current time in milliseconds
31
- * @returns true if priority fee should be included in the next transaction
32
- */
33
- public updatePriorityFee(
34
- currentTimeMs: number,
35
- txTimeoutCount: number
36
- ): boolean {
37
- let triggerPriorityFee = false;
38
-
39
- if (txTimeoutCount > this.lastTxTimeoutCount) {
40
- this.lastTxTimeoutCount = txTimeoutCount;
41
- this.lastTxTimeoutCountTriggered = currentTimeMs;
42
- triggerPriorityFee = true;
43
- } else {
44
- if (!this.priorityFeeTriggered) {
45
- triggerPriorityFee = false;
46
- } else if (
47
- currentTimeMs - this.lastTxTimeoutCountTriggered <
48
- this.priorityFeeLatchDurationMs
49
- ) {
50
- triggerPriorityFee = true;
51
- }
52
- }
53
-
54
- this.priorityFeeTriggered = triggerPriorityFee;
55
-
56
- return triggerPriorityFee;
57
- }
58
-
59
- /**
60
- * This method returns a transaction instruction list that sets the compute limit on the ComputeBudget program.
61
- * @param computeUnitLimit - The maximum number of compute units that can be used by the transaction.
62
- * @returns An array of transaction instructions.
63
- */
64
- public generateComputeBudgetIxs(
65
- computeUnitLimit: number
66
- ): Array<TransactionInstruction> {
67
- const ixs = [
68
- ComputeBudgetProgram.setComputeUnitLimit({
69
- units: computeUnitLimit,
70
- }),
71
- ];
72
-
73
- return ixs;
74
- }
75
-
76
- /**
77
- * Calculates the compute unit price to use based on the desired additional fee to pay and the compute unit limit.
78
- * @param computeUnitLimit desired CU to use
79
- * @param additionalFeeMicroLamports desired additional fee to pay, in micro lamports
80
- * @returns the compute unit price to use, in micro lamports
81
- */
82
- public calculateComputeUnitPrice(
83
- computeUnitLimit: number,
84
- additionalFeeMicroLamports: number
85
- ): number {
86
- return additionalFeeMicroLamports / computeUnitLimit;
87
- }
88
-
89
- /**
90
- * This method generates a list of transaction instructions for the ComputeBudget program, and includes a priority fee if it's required
91
- * @param computeUnitLimit - The maximum number of compute units that can be used by the transaction.
92
- * @param usePriorityFee - A boolean indicating whether to include a priority fee in the transaction, this should be from `this.updatePriorityFee()` or `this.priorityFeeTriggered`.
93
- * @param additionalFeeMicroLamports - The additional fee to be paid, in micro lamports, the actual price will be calculated.
94
- * @returns An array of transaction instructions.
95
- */
96
- public generateComputeBudgetWithPriorityFeeIx(
97
- computeUnitLimit: number,
98
- usePriorityFee: boolean,
99
- additionalFeeMicroLamports: number
100
- ): Array<TransactionInstruction> {
101
- const ixs = this.generateComputeBudgetIxs(computeUnitLimit);
102
-
103
- if (usePriorityFee) {
104
- const computeUnitPrice = this.calculateComputeUnitPrice(
105
- computeUnitLimit,
106
- additionalFeeMicroLamports
107
- );
108
- ixs.push(
109
- ComputeBudgetProgram.setComputeUnitPrice({
110
- microLamports: computeUnitPrice,
111
- })
112
- );
113
- }
114
-
115
- return ixs;
116
- }
117
- }