@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
@@ -3042,7 +3042,8 @@ class VelocityClient {
3042
3042
  * @param subAccountId - Sub-account id to withdraw from; defaults to `this.activeSubAccountId`.
3043
3043
  * @returns The `withdraw` instruction.
3044
3044
  */
3045
- async getWithdrawIx(amount, marketIndex, userTokenAccount, reduceOnly = false, subAccountId) {
3045
+ async getWithdrawIx(amount, marketIndex, userTokenAccount, reduceOnly = false, subAccountId, overrides) {
3046
+ var _a;
3046
3047
  const user = await this.getUserAccountPublicKey(subAccountId);
3047
3048
  const remainingAccounts = this.getRemainingAccounts({
3048
3049
  userAccounts: [this.getUserAccountOrThrow(subAccountId)],
@@ -3068,7 +3069,7 @@ class VelocityClient {
3068
3069
  user,
3069
3070
  userStats: this.getUserStatsAccountPublicKey(),
3070
3071
  userTokenAccount,
3071
- authority: this.wallet.publicKey,
3072
+ authority: (_a = overrides === null || overrides === void 0 ? void 0 : overrides.authority) !== null && _a !== void 0 ? _a : this.wallet.publicKey,
3072
3073
  tokenProgram,
3073
3074
  remainingAccounts,
3074
3075
  });
@@ -3154,14 +3155,23 @@ class VelocityClient {
3154
3155
  * @param marketIndex - Spot market index of the balance to transfer.
3155
3156
  * @param fromSubAccountId - Sub-account id to debit.
3156
3157
  * @param toSubAccountId - Sub-account id to credit.
3158
+ * @param equityFloorDelta - Equity floor (QUOTE_PRECISION) to move from the debited to the credited
3159
+ * sub-account along with the funds, keeping the sum of floors constant. The debited side must stay
3160
+ * at/above its reduced floor and the credited side's collateral (after the transfer lands) must back
3161
+ * its increased floor, else the transfer reverts with `InvalidEquityFloorTransfer`. Pass `'auto'`
3162
+ * (quote market only) to move the minimal floor needed for the debited side to stay at/above its
3163
+ * floor: `max(0, amount - (collateral - floor))`, capped at the debited side's floor. The auto delta
3164
+ * never exceeds `amount`, so the credited side stays backed whenever it was before. Client-side
3165
+ * pricing can differ slightly from the on-chain strict check at the exact boundary; retry with an
3166
+ * explicit padded delta if an `'auto'` transfer reverts. Defaults to zero.
3157
3167
  * @param txParams - Optional compute-unit/priority-fee overrides for the transaction.
3158
3168
  * @returns The transaction signature.
3159
3169
  * @throws (on-chain) if `allowDelegateTransfer` is not enabled, if the signer is not the delegate on
3160
3170
  * both sub-accounts, if the sub-accounts have different owners, if either is bankrupt, or if
3161
3171
  * `fromSubAccountId === toSubAccountId`.
3162
3172
  */
3163
- async transferDepositByDelegate(amount, marketIndex, fromSubAccountId, toSubAccountId, txParams) {
3164
- const { txSig, slot } = await this.sendTransaction(await this.buildTransaction(await this.getTransferDepositByDelegateIx(amount, marketIndex, fromSubAccountId, toSubAccountId), txParams), [], this.opts);
3173
+ async transferDepositByDelegate(amount, marketIndex, fromSubAccountId, toSubAccountId, equityFloorDelta = numericConstants_1.ZERO, txParams) {
3174
+ const { txSig, slot } = await this.sendTransaction(await this.buildTransaction(await this.getTransferDepositByDelegateIx(amount, marketIndex, fromSubAccountId, toSubAccountId, equityFloorDelta), txParams), [], this.opts);
3165
3175
  if (fromSubAccountId === this.activeSubAccountId ||
3166
3176
  toSubAccountId === this.activeSubAccountId) {
3167
3177
  this.cacheSpotMarketSlot(slot, marketIndex);
@@ -3179,28 +3189,49 @@ class VelocityClient {
3179
3189
  * @param toSubAccountId - Sub-account id to credit.
3180
3190
  * @returns The instruction.
3181
3191
  */
3182
- async getTransferDepositByDelegateIx(amount, marketIndex, fromSubAccountId, toSubAccountId) {
3192
+ async getTransferDepositByDelegateIx(amount, marketIndex, fromSubAccountId, toSubAccountId, equityFloorDelta = numericConstants_1.ZERO) {
3183
3193
  const fromUser = await (0, pda_1.getUserAccountPublicKey)(this.program.programId, this.authority, fromSubAccountId);
3184
3194
  const toUser = await (0, pda_1.getUserAccountPublicKey)(this.program.programId, this.authority, toSubAccountId);
3185
- let remainingAccounts;
3186
- const userMapKey = this.getUserMapKey(fromSubAccountId, this.authority);
3187
- const mapUser = this.users.get(userMapKey);
3188
- if (mapUser) {
3189
- remainingAccounts = this.getRemainingAccounts({
3190
- userAccounts: [mapUser.getUserAccountOrThrow()],
3191
- useMarketLastSlotCache: true,
3192
- writableSpotMarketIndexes: [marketIndex],
3193
- });
3195
+ let resolvedFloorDelta;
3196
+ if (equityFloorDelta === 'auto') {
3197
+ // auto assumes amount and equity share QUOTE_PRECISION; for
3198
+ // non-quote markets the caller must value the tokens themselves
3199
+ if (marketIndex !== numericConstants_1.QUOTE_SPOT_MARKET_INDEX) {
3200
+ throw new Error("equityFloorDelta 'auto' is only supported for the quote spot market; pass an explicit delta");
3201
+ }
3202
+ const fromUserClass = this.getUser(fromSubAccountId, this.authority);
3203
+ const floor = fromUserClass.getUserAccountOrThrow().equityFloor;
3204
+ if (floor.lte(numericConstants_1.ZERO)) {
3205
+ resolvedFloorDelta = numericConstants_1.ZERO;
3206
+ }
3207
+ else {
3208
+ const excess = anchor_1.BN.max(fromUserClass.getTotalCollateral('Initial', true).sub(floor), numericConstants_1.ZERO);
3209
+ resolvedFloorDelta = anchor_1.BN.min(anchor_1.BN.max(amount.sub(excess), numericConstants_1.ZERO), floor);
3210
+ }
3194
3211
  }
3195
3212
  else {
3196
- const fromUserAccount = (await this.program.account.user.fetch(fromUser));
3197
- remainingAccounts = this.getRemainingAccounts({
3198
- userAccounts: [fromUserAccount],
3199
- useMarketLastSlotCache: true,
3200
- writableSpotMarketIndexes: [marketIndex],
3201
- });
3213
+ resolvedFloorDelta = equityFloorDelta;
3202
3214
  }
3203
- return await this.program.instruction.transferDepositByDelegate(marketIndex, amount, {
3215
+ const loadUserAccount = async (subAccountId, userPublicKey) => {
3216
+ const userMapKey = this.getUserMapKey(subAccountId, this.authority);
3217
+ const mapUser = this.users.get(userMapKey);
3218
+ if (mapUser) {
3219
+ return mapUser.getUserAccountOrThrow();
3220
+ }
3221
+ return (await this.program.account.user.fetch(userPublicKey));
3222
+ };
3223
+ // moving equity floor triggers an on-chain margin check of the credited
3224
+ // side, so its markets/oracles must be in the remaining accounts too
3225
+ const userAccounts = [await loadUserAccount(fromSubAccountId, fromUser)];
3226
+ if (resolvedFloorDelta.gt(numericConstants_1.ZERO)) {
3227
+ userAccounts.push(await loadUserAccount(toSubAccountId, toUser));
3228
+ }
3229
+ const remainingAccounts = this.getRemainingAccounts({
3230
+ userAccounts,
3231
+ useMarketLastSlotCache: true,
3232
+ writableSpotMarketIndexes: [marketIndex],
3233
+ });
3234
+ return await this.program.instruction.transferDepositByDelegate(marketIndex, amount, resolvedFloorDelta, {
3204
3235
  accounts: {
3205
3236
  delegate: this.wallet.publicKey,
3206
3237
  fromUser,
@@ -5241,6 +5272,42 @@ class VelocityClient {
5241
5272
  remainingAccounts,
5242
5273
  });
5243
5274
  }
5275
+ /**
5276
+ * Keeper instruction: trips the authority-wide equity floor breaker. Proves on-chain that the
5277
+ * given subaccount's cross-margin total collateral is below its `equityFloor` (reverts with
5278
+ * `SufficientCollateral` otherwise, or if no floor is set) and sets `equityBreakerTripped` on the
5279
+ * authority's `UserStats` — every subaccount of the authority then rejects risk-increasing fills,
5280
+ * withdrawals and transfers out until the warm admin calls `resetEquityFloorBreaker`.
5281
+ * Permissionless — any signer may trip it; the margin calculation is the proof.
5282
+ * @param userAccountPublicKey - Public key of the breached subaccount's user account.
5283
+ * @param user - Decoded user account of the breached subaccount.
5284
+ * @param txParams - Optional compute-unit/priority-fee overrides.
5285
+ * @returns The transaction signature.
5286
+ */
5287
+ async tripEquityFloorBreaker(userAccountPublicKey, user, txParams) {
5288
+ const { txSig } = await this.sendTransaction(await this.buildTransaction(await this.getTripEquityFloorBreakerIx(userAccountPublicKey, user), txParams), [], this.opts);
5289
+ return txSig;
5290
+ }
5291
+ /**
5292
+ * Builds the `tripEquityFloorBreaker` instruction. See `tripEquityFloorBreaker` for semantics.
5293
+ * @param userAccountPublicKey - Public key of the breached subaccount's user account.
5294
+ * @param userAccount - Decoded user account of the breached subaccount.
5295
+ * @returns The instruction.
5296
+ */
5297
+ async getTripEquityFloorBreakerIx(userAccountPublicKey, userAccount) {
5298
+ const remainingAccounts = this.getRemainingAccounts({
5299
+ userAccounts: [userAccount],
5300
+ });
5301
+ return await this.program.instruction.tripEquityFloorBreaker({
5302
+ accounts: {
5303
+ state: await this.getStatePublicKey(),
5304
+ keeper: this.wallet.publicKey,
5305
+ user: userAccountPublicKey,
5306
+ userStats: (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, userAccount.authority),
5307
+ },
5308
+ remainingAccounts,
5309
+ });
5310
+ }
5244
5311
  /**
5245
5312
  * Keeper instruction: marks a user account idle after confirming (via `validate_user_is_idle`)
5246
5313
  * it has been inactive long enough — the inactivity window is shorter (accelerated) when the
@@ -7183,11 +7250,12 @@ class VelocityClient {
7183
7250
  }
7184
7251
  /**
7185
7252
  * Keeper instruction: estimates the market's bid/ask price from the given makers' resting DLOB
7186
- * orders (filtered to those within `BID_ASK_TWAP_MAX_ORACLE_DIVERGENCE_PERCENT` of the oracle
7187
- * price) and folds the estimate into `lastBidPriceTwap`/`lastAskPriceTwap`. Restricted: the
7188
- * calling wallet's `UserStats` must have `canUpdateBidAskTwap` set and at least 1000 USDC
7189
- * (`QUOTE_PRECISION`, 1e6) staked in the insurance fund (`ifStakedQuoteAssetAmount`), or the
7190
- * instruction reverts.
7253
+ * orders (kept only within BID_ASK_TWAP_MAX_ORACLE_DIVERGENCE_PERCENT` of the oracle price on
7254
+ * both sides) and folds the estimate into `lastBidPriceTwap`/`lastAskPriceTwap`. This does NOT
7255
+ * update the funding rate, crank funding separately via `getUpdateFundingRateIx`. Restricted:
7256
+ * the calling wallet's `UserStats` (which must be the signer's own) must have
7257
+ * `canUpdateBidAskTwap` set and at least 1000 USDC (`QUOTE_PRECISION`, 1e6) staked in the
7258
+ * insurance fund (`ifStakedQuoteAssetAmount`), or the instruction reverts.
7191
7259
  * @param perpMarketIndex - Perp market index to update.
7192
7260
  * @param makers - `(maker, makerStats)` pairs whose resting orders are sampled for the estimate.
7193
7261
  * @param txParams - Optional compute-unit/priority-fee overrides.
@@ -7433,15 +7501,17 @@ class VelocityClient {
7433
7501
  * @param marketIndex - Spot market index whose insurance fund to stake into.
7434
7502
  * @returns The instruction.
7435
7503
  */
7436
- async getInitializeInsuranceFundStakeIx(marketIndex) {
7437
- const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, marketIndex);
7504
+ async getInitializeInsuranceFundStakeIx(marketIndex, overrides) {
7505
+ var _a;
7506
+ const authority = (_a = overrides === null || overrides === void 0 ? void 0 : overrides.authority) !== null && _a !== void 0 ? _a : this.wallet.publicKey;
7507
+ const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, authority, marketIndex);
7438
7508
  const accounts = {
7439
7509
  insuranceFundStake: ifStakeAccountPublicKey,
7440
7510
  spotMarket: this.getSpotMarketAccountOrThrow(marketIndex).pubkey,
7441
- userStats: (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, this.wallet.publicKey // only allow payer to initialize own insurance fund stake account
7511
+ userStats: (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, authority // only allow payer to initialize own insurance fund stake account
7442
7512
  ),
7443
- authority: this.wallet.publicKey,
7444
- payer: this.wallet.publicKey,
7513
+ authority,
7514
+ payer: authority,
7445
7515
  rent: web3_js_1.SYSVAR_RENT_PUBKEY,
7446
7516
  systemProgram: web3_js_1.SystemProgram.programId,
7447
7517
  state: await this.getStatePublicKey(),
@@ -7462,9 +7532,11 @@ class VelocityClient {
7462
7532
  * @param collateralAccountPublicKey - Token account to debit for the stake.
7463
7533
  * @returns The instruction.
7464
7534
  */
7465
- async getAddInsuranceFundStakeIx(marketIndex, amount, collateralAccountPublicKey) {
7535
+ async getAddInsuranceFundStakeIx(marketIndex, amount, collateralAccountPublicKey, overrides) {
7536
+ var _a;
7537
+ const authority = (_a = overrides === null || overrides === void 0 ? void 0 : overrides.authority) !== null && _a !== void 0 ? _a : this.wallet.publicKey;
7466
7538
  const spotMarket = this.getSpotMarketAccountOrThrow(marketIndex);
7467
- const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, marketIndex);
7539
+ const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, authority, marketIndex);
7468
7540
  const remainingAccounts = [];
7469
7541
  this.addTokenMintToRemainingAccounts(spotMarket, remainingAccounts);
7470
7542
  if (this.isTransferHook(spotMarket)) {
@@ -7476,9 +7548,9 @@ class VelocityClient {
7476
7548
  state: await this.getStatePublicKey(),
7477
7549
  spotMarket: spotMarket.pubkey,
7478
7550
  insuranceFundStake: ifStakeAccountPublicKey,
7479
- userStats: (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, this.wallet.publicKey // only allow payer to add to own insurance fund stake account
7551
+ userStats: (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, authority // only allow payer to add to own insurance fund stake account
7480
7552
  ),
7481
- authority: this.wallet.publicKey,
7553
+ authority,
7482
7554
  spotMarketVault: spotMarket.vault,
7483
7555
  insuranceFundVault: spotMarket.insuranceFund.vault,
7484
7556
  velocitySigner: this.getSignerPublicKey(),
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "@velocity-exchange/sdk",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "main": "lib/node/index.js",
5
5
  "types": "lib/node/index.d.ts",
6
6
  "module": "./lib/browser/index.js",
7
+ "files": [
8
+ "lib"
9
+ ],
7
10
  "repository": {
8
11
  "type": "git",
9
- "url": "git@github.com:velocity-exchange/velocity-v1.git"
12
+ "url": "git+https://github.com/velocity-exchange/velocity-v1.git",
13
+ "directory": "packages/sdk"
10
14
  },
11
15
  "scripts": {
12
16
  "lint": "eslint './**/*.{ts,tsx}' --quiet --format unix",
@@ -111,7 +115,7 @@
111
115
  },
112
116
  "description": "SDK for Velocity Protocol",
113
117
  "engines": {
114
- "node": "^24.0.0"
118
+ "node": ">=20"
115
119
  },
116
120
  "resolutions": {
117
121
  "@solana/web3.js": "1.98.0",
package/.prettierignore DELETED
@@ -1 +0,0 @@
1
- src/idl/velocity.ts
package/CHANGELOG.md DELETED
@@ -1,132 +0,0 @@
1
- # @velocity-exchange/sdk
2
-
3
- ## 0.4.0
4
-
5
- ### Minor Changes
6
-
7
- - [#197](https://github.com/velocity-exchange/velocity-v1/pull/197) [`900c07d`](https://github.com/velocity-exchange/velocity-v1/commit/900c07d9da7e106c82fbe65b3d92226d090bdee9) Thanks [@jordy25519](https://github.com/jordy25519)! - Attach the taker's `RevenueShareEscrow` on perp fills for referred takers. `getFillPerpOrderIx` gains an optional `takerIsReferred` flag; when set (or when the order carries a builder code) the deterministic escrow PDA is added to the fill. This mirrors the on-chain fill gate, which reads `UserStats.referrerStatus` (the `BuilderReferral` bit), so referred takers' fills no longer revert with `UnableToLoadRevenueShareAccount`. `ReferrerMap` gains `isBuilderReferral(authority)` and `mustGetIsBuilderReferral(authority)`, sourcing the bit from the UserStats fetch it already performs.
8
-
9
- - [#189](https://github.com/velocity-exchange/velocity-v1/pull/189) [`8df28ac`](https://github.com/velocity-exchange/velocity-v1/commit/8df28ac6d113760ae4a8cdff4ad438cb25efce2c) Thanks [@ChesterSim](https://github.com/ChesterSim)! - Program↔SDK parity fixes from the 2026-07-02 audit: renamed deprecated Switchboard
10
- OracleSource keys to match the IDL (fixes a decode crash on affected markets), applied
11
- the $100 initial-margin unrealized-PnL cap, standardized auction/limit prices to order
12
- tick size across the DLOB, isolated-position handling in bankruptcy/liquidation math,
13
- corrected MM-oracle validity gating, referrer_status memcmp offset, PerpOperation and
14
- OrderBitFlag bit values, wired five missing event records into EventSubscriber, fixed
15
- withdraw-limit divisors, multi-pool margin segregation, referee/builder fee estimation,
16
- and added AdminClient.updatePauseAdmin plus admin CLI commands for pause-admin rotation
17
- and fee-pool transfers. Also fixed withdrawFromIsolatedPerpPosition's withdraw-all path:
18
- it substituted the MIN_I64 sentinel into the instruction's unsigned u64 amount (serializing
19
- as 2^63, so full withdrawals always failed on-chain with InsufficientCollateral); it now
20
- clamps the request to the position's deposit plus claimable PnL.
21
-
22
- Follow-up completeness fixes: DLOBSubscriber.getL2/getL3 (and the dlob-server publisher) now
23
- thread orderTickSize so the public book view is tick-standardized like on-chain; added
24
- hasIsolatedMarginBankrupt and wired isolated-only bankruptcy detection into keeper resolution
25
- (isIsolatedPositionBankrupt now guards against non-isolated indices); getMarketFees applies the
26
- referee discount and calculateFeeForQuoteAmount accepts builder params so both public fee-prediction
27
- entry points match on-chain; and isFallbackAvailableLiquiditySource now fully mirrors
28
- amm_fill_gates_ok, adding the market-drawdown and MM-vs-exchange oracle volatility gates.
29
-
30
- Low-risk parity follow-ups: MarginCategory now includes 'Fill' as a single shared type, handled
31
- across perp margin ratio / unrealized-asset-weight and spot asset/liability weights (the
32
- integer-averaged midpoint of initial and maintenance, mirroring get_margin_ratio /
33
- get_asset_weight / get_liability_weight) instead of throwing or returning undefined; the
34
- worst-tier taker-fee estimate in calculateEntriesEffectOnFreeCollateral now ceil-divides to match
35
- calculate_taker_fee; MM-oracle validity is computed with the raw exchange confidence (matching
36
- get_mm_oracle_price_data) while the returned MM price keeps its diff-adjusted confidence; and
37
- corrected the OracleSourceNum doc (it is an SDK-internal oracle-id encoding, not the on-chain
38
- Borsh discriminant).
39
-
40
- Visible/breaking API changes in this release: `OracleSource.SWITCHBOARD` /
41
- `OracleSource.SWITCHBOARD_ON_DEMAND` (and the corresponding `OracleSourceNum` entries) are renamed
42
- to `DEPRECATED_SWITCHBOARD` / `DEPRECATED_SWITCHBOARD_ON_DEMAND` with no aliases kept for the old
43
- names; `ContractType.FUTURE` is renamed to `DEPRECATED_FUTURE`; and `FeatureBitFlags.BUILDER_REFERRAL`
44
- is removed outright, since no such on-chain flag exists. Separately, `getLimitPrice` gained a new
45
- optional trailing `tickSize` parameter — the existing `fallbackPrice` parameter stays in its original
46
- 4th position, so old 4-argument call sites keep working unchanged.
47
-
48
- ### Patch Changes
49
-
50
- - [#199](https://github.com/velocity-exchange/velocity-v1/pull/199) [`dff8a47`](https://github.com/velocity-exchange/velocity-v1/commit/dff8a4754f6b736fed330b2ab4fa5685db4f8159) Thanks [@jordy25519](https://github.com/jordy25519)! - Add BTC-PERP (index 1) and ETH-PERP (index 2) to `DevnetPerpMarkets`, reflecting the two Pyth-Lazer perp markets re-created on devnet. ETH-PERP uses lazer feed 2 (real ETH price feed).
51
-
52
- - [#193](https://github.com/velocity-exchange/velocity-v1/pull/193) [`bafd699`](https://github.com/velocity-exchange/velocity-v1/commit/bafd6990f8322f232d2f0d17042beb0e9c567164) Thanks [@jordy25519](https://github.com/jordy25519)! - Remove the stale `FettyRIP` (marketIndex 2) entry from `DevnetPerpMarkets`. That perp market was deleted on-chain, but the hand-maintained devnet config still listed it, so consumers that enumerate all perp markets (keeper-bots-v2, dlob-server) crashed with `Perp market config for 2 not found` when resolving the nonexistent market. The devnet config now mirrors on-chain state (SOL-PERP at index 0 only).
53
-
54
- ## 0.3.0
55
-
56
- ### Minor Changes
57
-
58
- - [#172](https://github.com/velocity-exchange/velocity-v1/pull/172) [`b7d15b9`](https://github.com/velocity-exchange/velocity-v1/commit/b7d15b970a74d267aeaf20bb644d5344b9aadc61) Thanks [@0xahzam](https://github.com/0xahzam)! - Decouple solvency-repair from the withdraw pause. The `resolve_perp_pnl_deficit`,
59
- `resolve_perp_bankruptcy`, and `resolve_spot_bankruptcy` instructions are now gated by a
60
- new `State.solvencyStatus` bitfield instead of `WithdrawPaused`, so user withdrawals can
61
- be halted while solvency repair keeps running (or repair can be frozen on its own). Adds
62
- the `SolvencyStatus` enum, `StateAccount.solvencyStatus`, a `solvencyRepairPaused()`
63
- helper, `AdminClient.updateSolvencyStatus`, and the `exchange set-solvency-status` admin
64
- CLI command.
65
-
66
- - [#141](https://github.com/velocity-exchange/velocity-v1/pull/141) [`3f148f8`](https://github.com/velocity-exchange/velocity-v1/commit/3f148f8b477e4176e11e0660adb0e67dd5163d3b) Thanks [@ChewingGlass](https://github.com/ChewingGlass)! - Harden the native fast-path admin handlers. The
67
- `update_amm_spread_adjustment_native` instruction now requires the program
68
- `State` account: `getUpdateAmmSpreadAdjustmentNativeIx` is now **async** and
69
- returns a `Promise<TransactionInstruction>` (it derives and appends the state
70
- account), and its compute-unit budget was raised to cover the on-chain account
71
- validation. Direct callers must `await` the builder. Two new program error
72
- codes are surfaced in the IDL: `InvalidNativeStateAccount` (6355) and
73
- `InvalidNativePerpMarketAccount` (6356).
74
-
75
- ### Patch Changes
76
-
77
- - [#173](https://github.com/velocity-exchange/velocity-v1/pull/173) [`2f6c64d`](https://github.com/velocity-exchange/velocity-v1/commit/2f6c64d54f1146d8e7f9ee4ab556929c6bf8b920) Thanks [@ChesterSim](https://github.com/ChesterSim)! - Fix stale `User` account byte offsets in `memcmp` filters and `OrderSubscriber`.
78
-
79
- The Velocity `User` account is 4496 bytes, but the memcmp filters and the
80
- `OrderSubscriber` staleness check still used offsets from the older 4376-byte
81
- layout. As a result `getUserWithOrderFilter()` matched zero accounts, so any
82
- consumer that bulk-loads users-with-orders (e.g. the DLOB server's
83
- `OrderSubscriber.fetch()`) loaded no orders and produced an empty order book
84
- (vAMM-only L2, empty L3). Offsets for `idle`, `hasOpenOrder`, `hasOpenAuction`,
85
- `poolId`, and `lastActiveSlot` are corrected to match the on-chain layout.
86
-
87
- ## 0.2.6
88
-
89
- ### Patch Changes
90
-
91
- - [#156](https://github.com/velocity-exchange/velocity-v1/pull/156) [`d3b58ab`](https://github.com/velocity-exchange/velocity-v1/commit/d3b58ab7e3ad33f0e6634ff87e9b150915b3aa13) Thanks [@ChesterSim](https://github.com/ChesterSim)! - Fix account decoder to pass account names as-is instead of capitalizing them. The
92
- Anchor v1 IDL program constructor already camelCases account names, so the extra
93
- `capitalize()` call was incorrect and caused decoding failures in the gRPC and
94
- WebSocket subscribers.
95
-
96
- ## 0.2.5
97
-
98
- ### Patch Changes
99
-
100
- - [#155](https://github.com/velocity-exchange/velocity-v1/pull/155) [`15073bc`](https://github.com/velocity-exchange/velocity-v1/commit/15073bc0b740b2d1cad471126a00368e72655bd5) Thanks [@ChesterSim](https://github.com/ChesterSim)! - Make the `UserAccountSubscriber` "not subscribed" contract consistent and fix a
101
- misleading error message. `getUserAccountAndSlot()` now throws `NotSubscribedError`
102
- when called before `subscribe()` on the gRPC-multi and WebSocket-program subscribers
103
- too (the WebSocket and polling subscribers already did) — so `User.getUserAccount()`
104
- uniformly throws when not subscribed and returns `undefined` only when subscribed but
105
- the account was not found on chain. `getUserAccountOrThrow()` /
106
- `getUserAccountAndSlotOrThrow()` now throw `User account not found: <pubkey>` (was
107
- `User account not loaded`), since after `subscribe()` resolves a missing account means
108
- "not found", not "still loading".
109
-
110
- ## 0.2.4
111
-
112
- ### Patch Changes
113
-
114
- - [#127](https://github.com/velocity-exchange/velocity-v1/pull/127) [`4f8e7aa`](https://github.com/velocity-exchange/velocity-v1/commit/4f8e7aaef0e35b190fc0b91cd29314d902d1ccab) Thanks [@ChesterSim](https://github.com/ChesterSim)! - reflect Typescript types on IDL changes
115
-
116
- ## 0.2.3
117
-
118
- ### Patch Changes
119
-
120
- - [#100](https://github.com/velocity-exchange/velocity-v1/pull/100) [`ae78769`](https://github.com/velocity-exchange/velocity-v1/commit/ae78769ef58355202c030435c2796ef045fe30a0) Thanks [@ChesterSim](https://github.com/ChesterSim)! - add back ForwardOnlyTxSender and calculateMaxRemainingDeposit
121
-
122
- ## 0.2.2
123
-
124
- ### Patch Changes
125
-
126
- - [#97](https://github.com/velocity-exchange/velocity-v1/pull/97) [`022a949`](https://github.com/velocity-exchange/velocity-v1/commit/022a949cb1802171ca57a61260f86c8908f94f34) Thanks [@ChewingGlass](https://github.com/ChewingGlass)! - Re-export `PriceUpdateAccount` from the package root and declare `@types/node` as a devDependency (fixes the SDK build under isolated installs). Enables downstream apps (dlob-server, keeper-bots-v2) to consume the velocity SDK without reaching into subpaths.
127
-
128
- ## 0.2.1
129
-
130
- ### Patch Changes
131
-
132
- - [`4fd7462`](https://github.com/velocity-exchange/velocity-v1/commit/4fd7462bfa3c55e31e3457b1b65f519cf052a6fa) Thanks [@ChewingGlass](https://github.com/ChewingGlass)! - Testing new changelog based package publishing flow
package/build-browser.js DELETED
@@ -1,58 +0,0 @@
1
- const esbuild = require('esbuild');
2
- const path = require('path');
3
-
4
- async function build() {
5
- try {
6
- await esbuild.build({
7
- entryPoints: ['./lib/browser/index.js'],
8
- bundle: true,
9
- minify: true,
10
- format: 'cjs',
11
- platform: 'browser',
12
- target: ['es2020'],
13
- outfile: './dist/browser.min.js',
14
- external: [
15
- '@solana/web3.js',
16
- '@coral-xyz/anchor',
17
- '@coral-xyz/anchor-30',
18
- ],
19
- define: {
20
- 'process.env.NODE_ENV': '"production"',
21
- 'global': 'globalThis',
22
- },
23
- inject: [path.resolve(__dirname, 'esbuild-shims.js')],
24
- alias: {
25
- // Node polyfills for browser
26
- 'crypto': 'crypto-browserify',
27
- 'stream': 'stream-browserify',
28
- 'path': 'path-browserify',
29
- 'os': 'os-browserify/browser',
30
- 'process': 'process/browser',
31
- 'vm': 'vm-browserify',
32
- },
33
- // Ignore node-only modules
34
- plugins: [{
35
- name: 'ignore-node-modules',
36
- setup(build) {
37
- build.onResolve({ filter: /^(fs|net|dns|tls|http2)$/ }, args => {
38
- return { path: args.path, namespace: 'ignore-ns' };
39
- });
40
- build.onLoad({ filter: /.*/, namespace: 'ignore-ns' }, () => {
41
- return { contents: 'export default {}' };
42
- });
43
- },
44
- }],
45
- loader: {
46
- '.json': 'json',
47
- },
48
- treeShaking: true,
49
- sourcemap: false,
50
- });
51
- console.log('✅ Browser build complete');
52
- } catch (error) {
53
- console.error('❌ Build failed:', error);
54
- process.exit(1);
55
- }
56
- }
57
-
58
- build();
package/bunfig.toml DELETED
@@ -1,3 +0,0 @@
1
- [install]
2
- exact = true
3
- minimumReleaseAge = 604800 # 7 days
package/esbuild-shims.js DELETED
@@ -1,12 +0,0 @@
1
- import { Buffer } from 'buffer';
2
- import process from 'process';
3
-
4
- if (typeof globalThis.Buffer === 'undefined') {
5
- globalThis.Buffer = Buffer;
6
- }
7
-
8
- if (typeof globalThis.process === 'undefined') {
9
- globalThis.process = process;
10
- }
11
-
12
- export { Buffer, process };
@@ -1,110 +0,0 @@
1
- import { Connection, Keypair, PublicKey } from '@solana/web3.js';
2
- import dotenv from 'dotenv';
3
- import { AnchorProvider, Idl, Program, ProgramAccount, BN } from '@coral-xyz/anchor';
4
- import velocityIDL from '../src/idl/velocity.json';
5
- import {
6
- VELOCITY_PROGRAM_ID,
7
- PerpMarketAccount,
8
- SpotMarketAccount,
9
- OracleInfo,
10
- Wallet,
11
- numberToSafeBN,
12
- } from '../src';
13
- import { VelocityClient } from '../src/velocityClient';
14
- import { VelocityClientConfig } from '../src/velocityClientConfig';
15
-
16
- async function main() {
17
- dotenv.config({ path: '../' });
18
-
19
- const RPC_ENDPOINT = process.env.RPC_ENDPOINT;
20
- if (!RPC_ENDPOINT) throw new Error('RPC_ENDPOINT env var required');
21
-
22
- let keypair: Keypair;
23
- const pk = process.env.PRIVATE_KEY;
24
- if (pk) {
25
- const secret = Uint8Array.from(JSON.parse(pk));
26
- keypair = Keypair.fromSecretKey(secret);
27
- } else {
28
- keypair = new Keypair();
29
- console.warn('Using ephemeral keypair. Provide PRIVATE_KEY to use a real wallet.');
30
- }
31
- const wallet = new Wallet(keypair);
32
-
33
- const connection = new Connection(RPC_ENDPOINT);
34
- const provider = new AnchorProvider(connection, wallet as any, {
35
- commitment: 'processed',
36
- });
37
- const programId = new PublicKey(VELOCITY_PROGRAM_ID);
38
- const program = new Program(velocityIDL as Idl, programId, provider);
39
-
40
- const allPerpMarketProgramAccounts =
41
- (await program.account.perpMarket.all()) as ProgramAccount<PerpMarketAccount>[];
42
- const perpMarketIndexes = allPerpMarketProgramAccounts.map((val) => val.account.marketIndex);
43
- const allSpotMarketProgramAccounts =
44
- (await program.account.spotMarket.all()) as ProgramAccount<SpotMarketAccount>[];
45
- const spotMarketIndexes = allSpotMarketProgramAccounts.map((val) => val.account.marketIndex);
46
-
47
- const seen = new Set<string>();
48
- const oracleInfos: OracleInfo[] = [];
49
- for (const acct of allPerpMarketProgramAccounts) {
50
- const key = `${acct.account.amm.oracle.toBase58()}-${Object.keys(acct.account.amm.oracleSource)[0]}`;
51
- if (!seen.has(key)) {
52
- seen.add(key);
53
- oracleInfos.push({ publicKey: acct.account.amm.oracle, source: acct.account.amm.oracleSource });
54
- }
55
- }
56
- for (const acct of allSpotMarketProgramAccounts) {
57
- const key = `${acct.account.oracle.toBase58()}-${Object.keys(acct.account.oracleSource)[0]}`;
58
- if (!seen.has(key)) {
59
- seen.add(key);
60
- oracleInfos.push({ publicKey: acct.account.oracle, source: acct.account.oracleSource });
61
- }
62
- }
63
-
64
- const clientConfig: VelocityClientConfig = {
65
- connection,
66
- wallet,
67
- programID: programId,
68
- accountSubscription: { type: 'websocket', commitment: 'processed' },
69
- perpMarketIndexes,
70
- spotMarketIndexes,
71
- oracleInfos,
72
- env: 'devnet',
73
- };
74
- const client = new VelocityClient(clientConfig);
75
- await client.subscribe();
76
-
77
- const candidates = perpMarketIndexes.filter((i) => i >= 0 && i <= 5);
78
- const targetMarketIndex = candidates.length
79
- ? candidates[Math.floor(Math.random() * candidates.length)]
80
- : perpMarketIndexes[0];
81
-
82
- const perpMarketAccount = client.getPerpMarketAccount(targetMarketIndex);
83
- const quoteSpotMarketIndex = perpMarketAccount.quoteSpotMarketIndex;
84
- const spotMarketAccount = client.getSpotMarketAccount(quoteSpotMarketIndex);
85
-
86
- const precision = new BN(10).pow(new BN(spotMarketAccount.decimals));
87
- const amount = numberToSafeBN(0.01, precision);
88
-
89
- const userTokenAccount = await client.getAssociatedTokenAccount(quoteSpotMarketIndex);
90
- const ix = await client.getDepositIntoIsolatedPerpPositionIx(
91
- amount,
92
- targetMarketIndex,
93
- userTokenAccount,
94
- 0
95
- );
96
-
97
- const tx = await client.buildTransaction([ix]);
98
- const { txSig } = await client.sendTransaction(tx);
99
- console.log(`Deposited into isolated perp market ${targetMarketIndex}: ${txSig}`);
100
-
101
- await client.getUser().unsubscribe();
102
- await client.unsubscribe();
103
- }
104
-
105
- main().catch((e) => {
106
- console.error(e);
107
- process.exit(1);
108
- });
109
-
110
-