@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,65 +0,0 @@
1
- import type {
2
- AccountMeta,
3
- PublicKey,
4
- TransactionInstruction,
5
- } from '@solana/web3.js';
6
- import type { BN } from '../../isomorphic/anchor';
7
- import type { VelocityProgram } from '../../config';
8
-
9
- /**
10
- * Builds a `withdraw` instruction, transferring tokens from the protocol's
11
- * `spotMarketVault` to `userTokenAccount` and debiting (or borrowing against) `user`'s
12
- * spot position. Unlike deposit, `authority` must equal `user`'s own `authority` field
13
- * (and `userStats`'s) — delegates cannot withdraw.
14
- * @param args.program - Anchor `Program<Velocity>` used to build the instruction.
15
- * @param args.marketIndex - source spot market index.
16
- * @param args.amount - withdrawal amount, in the spot market's mint's native token precision.
17
- * @param args.reduceOnly - if true (or the market is reduce-only), caps the withdrawal to the user's current deposit balance so it can only reduce a deposit, never open/increase a borrow.
18
- * @param args.state - the global `State` PDA.
19
- * @param args.spotMarket - the source `SpotMarket` PDA.
20
- * @param args.spotMarketVault - the spot market's token vault PDA (transfer source).
21
- * @param args.velocitySigner - the program's PDA signer authority; must equal `state.signer` or the instruction throws (used as the CPI signer for the vault-to-user transfer).
22
- * @param args.user - the `User` account being debited; its `authority` must equal `args.authority`.
23
- * @param args.userStats - the withdrawing user's `UserStats` PDA; its `authority` must also equal `args.authority`.
24
- * @param args.userTokenAccount - destination token account; must share a mint with `spotMarketVault`.
25
- * @param args.authority - signer that must equal `user.authority` (and `userStats.authority`).
26
- * @param args.tokenProgram - the SPL Token or Token-2022 program owning the mint.
27
- * @param args.remainingAccounts - oracle/market `AccountMeta[]` for `marketIndex`, plus the withdrawn mint account, plus any Token-2022 transfer-hook accounts.
28
- * @returns the unsigned `withdraw` `TransactionInstruction`.
29
- */
30
- export async function buildWithdrawInstruction(args: {
31
- program: VelocityProgram;
32
- marketIndex: number;
33
- amount: BN;
34
- reduceOnly: boolean;
35
- state: PublicKey;
36
- spotMarket: PublicKey;
37
- spotMarketVault: PublicKey;
38
- velocitySigner: PublicKey;
39
- user: PublicKey;
40
- userStats: PublicKey;
41
- userTokenAccount: PublicKey;
42
- authority: PublicKey;
43
- tokenProgram: PublicKey;
44
- remainingAccounts: AccountMeta[];
45
- }): Promise<TransactionInstruction> {
46
- return await (args.program.instruction as any).withdraw(
47
- args.marketIndex,
48
- args.amount,
49
- args.reduceOnly,
50
- {
51
- accounts: {
52
- state: args.state,
53
- spotMarket: args.spotMarket,
54
- spotMarketVault: args.spotMarketVault,
55
- velocitySigner: args.velocitySigner,
56
- user: args.user,
57
- userStats: args.userStats,
58
- userTokenAccount: args.userTokenAccount,
59
- authority: args.authority,
60
- tokenProgram: args.tokenProgram,
61
- },
62
- remainingAccounts: args.remainingAccounts,
63
- }
64
- );
65
- }
@@ -1,320 +0,0 @@
1
- import { PublicKey, type AccountMeta } from '@solana/web3.js';
2
- import { isVariant } from '../types';
3
- import { QUOTE_SPOT_MARKET_INDEX, ZERO } from '../constants/numericConstants';
4
- import { isSpotPositionAvailable } from '../math/spotPosition';
5
- import { positionIsAvailable } from '../math/position';
6
- import type {
7
- UserAccount,
8
- SpotMarketAccount,
9
- PerpMarketAccount,
10
- } from '../types';
11
-
12
- /**
13
- * Per-call inputs to `getRemainingAccounts`, describing which markets and users' open
14
- * positions must be represented in the built `remainingAccounts` list.
15
- */
16
- export type RemainingAccountParams = {
17
- /** Every open (non-available) spot/perp position across these accounts is included — this is how a `User`'s own margined positions get their market + oracle accounts passed to an instruction. */
18
- userAccounts: UserAccount[];
19
- /** Perp market indexes to include as writable (plus their oracle and quote spot market), in addition to whatever `userAccounts`' positions already require. */
20
- writablePerpMarketIndexes?: number[];
21
- /** Spot market indexes to include as writable (plus their oracle), in addition to whatever `userAccounts`' positions already require. */
22
- writableSpotMarketIndexes?: number[];
23
- /** Perp market index(es) to include as read-only (plus their oracle and quote spot market) — typically the market(s) an instruction is acting on. */
24
- readablePerpMarketIndex?: number | number[];
25
- /** Spot market indexes to include as read-only (plus their oracle). */
26
- readableSpotMarketIndexes?: number[];
27
- /** If true, also re-includes any market still tracked in `ctx.perpMarketLastSlotCache` / `ctx.spotMarketLastSlotCache` whose cached slot is newer than the resolved user's last-active slot — a cache-invalidation guard so a market touched by a very recent instruction doesn't get dropped from the very next one before its state can be considered "seen" by the user account. Stale cache entries (slot ≤ the user's last-active slot) are evicted as a side effect. */
28
- useMarketLastSlotCache?: boolean;
29
- };
30
-
31
- /**
32
- * Caller-supplied hooks and mutable state `getRemainingAccounts` needs to resolve market
33
- * accounts and apply cache-invalidation logic without depending on a subscribed
34
- * `VelocityClient`. All fields are read (and the `Map`/`Set` fields also mutated in
35
- * place — entries may be added or evicted) by `getRemainingAccounts`; the caller owns
36
- * their lifetime and should typically persist them across calls for the caches to be
37
- * useful.
38
- */
39
- export type RemainingAccountsContext = {
40
- /** Resolves a perp market index to its loaded `PerpMarketAccount` (including `pubkey`, `oracle`, `oracleSource`, `quoteSpotMarketIndex`). Should throw or the caller should ensure the market is loaded before calling. */
41
- getPerpMarketAccount: (marketIndex: number) => PerpMarketAccount;
42
- /** Resolves a spot market index to its loaded `SpotMarketAccount` (including `pubkey` and `oracle`). */
43
- getSpotMarketAccount: (marketIndex: number) => SpotMarketAccount;
44
-
45
- /** Resolves a user's most recent on-chain-active slot, used to decide whether cached markets from `perpMarketLastSlotCache`/`spotMarketLastSlotCache` are still relevant. Returns `undefined` if the user account isn't known/loaded, in which case cache entries are treated as stale and dropped. */
46
- getUserAccountAndSlot: (
47
- subAccountId: number | undefined,
48
- authority: PublicKey
49
- ) => { slot: number } | undefined;
50
-
51
- /** Sub-account id used (together with `authority`) to look up the acting user when `params.userAccounts` is empty and `useMarketLastSlotCache` is set. */
52
- activeSubAccountId: number | undefined;
53
- /** Wallet authority used (together with `activeSubAccountId`) for the same lookup. */
54
- authority: PublicKey;
55
-
56
- /** Mutable cache of perp market index → last slot it was touched at; consulted (and pruned) only when `params.useMarketLastSlotCache` is true. Owned by the caller. */
57
- perpMarketLastSlotCache: Map<number, number>;
58
- /** Mutable cache of spot market index → last slot it was touched at; consulted (and pruned) only when `params.useMarketLastSlotCache` is true. Owned by the caller. */
59
- spotMarketLastSlotCache: Map<number, number>;
60
- /** Perp market indexes that must always be included as read-only, regardless of `params` (e.g. markets forced in by other in-flight instructions in the same transaction). Owned by the caller. */
61
- mustIncludePerpMarketIndexes: Set<number>;
62
- /** Spot market indexes that must always be included as read-only, regardless of `params`. Owned by the caller. */
63
- mustIncludeSpotMarketIndexes: Set<number>;
64
- };
65
-
66
- /**
67
- * Builds the ordered `remainingAccounts: AccountMeta[]` that Velocity trading/keeper
68
- * instructions require — one `AccountMeta` per oracle, then per spot market, then per
69
- * perp market, deduplicated by pubkey/index. This is the pure, subscription-free
70
- * equivalent of `VelocityClient`'s internal remaining-accounts builder: pass it whatever
71
- * markets/positions are relevant and it derives the same account set an instruction
72
- * builder (`buildDepositInstruction`, `buildPlacePerpOrderInstruction`, etc.) expects in
73
- * its `remainingAccounts` argument.
74
- *
75
- * Every open position on `params.userAccounts` contributes its market (+ oracle); open
76
- * spot positions with resting orders (`openAsks`/`openBids` non-zero) also pull in the
77
- * quote spot market so margin can be computed against it. `params.writable*`/`readable*`
78
- * indexes are added on top, and an oracle is marked writable only for a perp market on a
79
- * `prelaunch` oracle source being written to (needed so the prelaunch oracle CPI can
80
- * update its own account).
81
- *
82
- * @param ctx - resolver hooks and caller-owned mutable caches (see `RemainingAccountsContext`).
83
- * @param params - which markets/positions to include for this call (see `RemainingAccountParams`).
84
- * @returns the deduplicated `AccountMeta[]`, ordered oracles → spot markets → perp markets.
85
- */
86
- export function getRemainingAccounts(
87
- ctx: RemainingAccountsContext,
88
- params: RemainingAccountParams
89
- ): AccountMeta[] {
90
- const { oracleAccountMap, spotMarketAccountMap, perpMarketAccountMap } =
91
- getRemainingAccountMapsForUsers(ctx, params.userAccounts);
92
-
93
- if (params.useMarketLastSlotCache) {
94
- const lastUserSlot = ctx.getUserAccountAndSlot(
95
- params.userAccounts.length > 0
96
- ? params.userAccounts[0].subAccountId
97
- : ctx.activeSubAccountId,
98
- params.userAccounts.length > 0
99
- ? params.userAccounts[0].authority
100
- : ctx.authority
101
- )?.slot;
102
-
103
- for (const [marketIndex, slot] of ctx.perpMarketLastSlotCache.entries()) {
104
- if (lastUserSlot !== undefined && slot > lastUserSlot) {
105
- addPerpMarketToRemainingAccountMaps(
106
- ctx,
107
- marketIndex,
108
- false,
109
- oracleAccountMap,
110
- spotMarketAccountMap,
111
- perpMarketAccountMap
112
- );
113
- } else {
114
- ctx.perpMarketLastSlotCache.delete(marketIndex);
115
- }
116
- }
117
-
118
- for (const [marketIndex, slot] of ctx.spotMarketLastSlotCache.entries()) {
119
- if (lastUserSlot !== undefined && slot > lastUserSlot) {
120
- addSpotMarketToRemainingAccountMaps(
121
- ctx,
122
- marketIndex,
123
- false,
124
- oracleAccountMap,
125
- spotMarketAccountMap
126
- );
127
- } else {
128
- ctx.spotMarketLastSlotCache.delete(marketIndex);
129
- }
130
- }
131
- }
132
-
133
- if (params.readablePerpMarketIndex !== undefined) {
134
- const readablePerpMarketIndexes = Array.isArray(
135
- params.readablePerpMarketIndex
136
- )
137
- ? params.readablePerpMarketIndex
138
- : [params.readablePerpMarketIndex];
139
- for (const marketIndex of readablePerpMarketIndexes) {
140
- addPerpMarketToRemainingAccountMaps(
141
- ctx,
142
- marketIndex,
143
- false,
144
- oracleAccountMap,
145
- spotMarketAccountMap,
146
- perpMarketAccountMap
147
- );
148
- }
149
- }
150
-
151
- for (const perpMarketIndex of ctx.mustIncludePerpMarketIndexes.values()) {
152
- addPerpMarketToRemainingAccountMaps(
153
- ctx,
154
- perpMarketIndex,
155
- false,
156
- oracleAccountMap,
157
- spotMarketAccountMap,
158
- perpMarketAccountMap
159
- );
160
- }
161
-
162
- if (params.readableSpotMarketIndexes !== undefined) {
163
- for (const readableSpotMarketIndex of params.readableSpotMarketIndexes) {
164
- addSpotMarketToRemainingAccountMaps(
165
- ctx,
166
- readableSpotMarketIndex,
167
- false,
168
- oracleAccountMap,
169
- spotMarketAccountMap
170
- );
171
- }
172
- }
173
-
174
- for (const spotMarketIndex of ctx.mustIncludeSpotMarketIndexes.values()) {
175
- addSpotMarketToRemainingAccountMaps(
176
- ctx,
177
- spotMarketIndex,
178
- false,
179
- oracleAccountMap,
180
- spotMarketAccountMap
181
- );
182
- }
183
-
184
- if (params.writablePerpMarketIndexes !== undefined) {
185
- for (const writablePerpMarketIndex of params.writablePerpMarketIndexes) {
186
- addPerpMarketToRemainingAccountMaps(
187
- ctx,
188
- writablePerpMarketIndex,
189
- true,
190
- oracleAccountMap,
191
- spotMarketAccountMap,
192
- perpMarketAccountMap
193
- );
194
- }
195
- }
196
-
197
- if (params.writableSpotMarketIndexes !== undefined) {
198
- for (const writableSpotMarketIndex of params.writableSpotMarketIndexes) {
199
- addSpotMarketToRemainingAccountMaps(
200
- ctx,
201
- writableSpotMarketIndex,
202
- true,
203
- oracleAccountMap,
204
- spotMarketAccountMap
205
- );
206
- }
207
- }
208
-
209
- return [
210
- ...oracleAccountMap.values(),
211
- ...spotMarketAccountMap.values(),
212
- ...perpMarketAccountMap.values(),
213
- ];
214
- }
215
-
216
- function addPerpMarketToRemainingAccountMaps(
217
- ctx: RemainingAccountsContext,
218
- marketIndex: number,
219
- writable: boolean,
220
- oracleAccountMap: Map<string, AccountMeta>,
221
- spotMarketAccountMap: Map<number, AccountMeta>,
222
- perpMarketAccountMap: Map<number, AccountMeta>
223
- ): void {
224
- const perpMarketAccount = ctx.getPerpMarketAccount(marketIndex);
225
- perpMarketAccountMap.set(marketIndex, {
226
- pubkey: perpMarketAccount.pubkey,
227
- isSigner: false,
228
- isWritable: writable,
229
- });
230
- const oracleWritable =
231
- writable && isVariant(perpMarketAccount.oracleSource, 'prelaunch');
232
- oracleAccountMap.set(perpMarketAccount.oracle.toString(), {
233
- pubkey: perpMarketAccount.oracle,
234
- isSigner: false,
235
- isWritable: oracleWritable,
236
- });
237
- addSpotMarketToRemainingAccountMaps(
238
- ctx,
239
- perpMarketAccount.quoteSpotMarketIndex,
240
- false,
241
- oracleAccountMap,
242
- spotMarketAccountMap
243
- );
244
- }
245
-
246
- function addSpotMarketToRemainingAccountMaps(
247
- ctx: RemainingAccountsContext,
248
- marketIndex: number,
249
- writable: boolean,
250
- oracleAccountMap: Map<string, AccountMeta>,
251
- spotMarketAccountMap: Map<number, AccountMeta>
252
- ): void {
253
- const spotMarketAccount = ctx.getSpotMarketAccount(marketIndex);
254
- spotMarketAccountMap.set(spotMarketAccount.marketIndex, {
255
- pubkey: spotMarketAccount.pubkey,
256
- isSigner: false,
257
- isWritable: writable,
258
- });
259
- if (!spotMarketAccount.oracle.equals(PublicKey.default)) {
260
- oracleAccountMap.set(spotMarketAccount.oracle.toString(), {
261
- pubkey: spotMarketAccount.oracle,
262
- isSigner: false,
263
- isWritable: false,
264
- });
265
- }
266
- }
267
-
268
- function getRemainingAccountMapsForUsers(
269
- ctx: RemainingAccountsContext,
270
- userAccounts: UserAccount[]
271
- ): {
272
- oracleAccountMap: Map<string, AccountMeta>;
273
- spotMarketAccountMap: Map<number, AccountMeta>;
274
- perpMarketAccountMap: Map<number, AccountMeta>;
275
- } {
276
- const oracleAccountMap = new Map<string, AccountMeta>();
277
- const spotMarketAccountMap = new Map<number, AccountMeta>();
278
- const perpMarketAccountMap = new Map<number, AccountMeta>();
279
-
280
- for (const userAccount of userAccounts) {
281
- for (const spotPosition of userAccount.spotPositions) {
282
- if (!isSpotPositionAvailable(spotPosition)) {
283
- addSpotMarketToRemainingAccountMaps(
284
- ctx,
285
- spotPosition.marketIndex,
286
- false,
287
- oracleAccountMap,
288
- spotMarketAccountMap
289
- );
290
-
291
- if (
292
- !spotPosition.openAsks.eq(ZERO) ||
293
- !spotPosition.openBids.eq(ZERO)
294
- ) {
295
- addSpotMarketToRemainingAccountMaps(
296
- ctx,
297
- QUOTE_SPOT_MARKET_INDEX,
298
- false,
299
- oracleAccountMap,
300
- spotMarketAccountMap
301
- );
302
- }
303
- }
304
- }
305
- for (const position of userAccount.perpPositions) {
306
- if (!positionIsAvailable(position)) {
307
- addPerpMarketToRemainingAccountMaps(
308
- ctx,
309
- position.marketIndex,
310
- false,
311
- oracleAccountMap,
312
- spotMarketAccountMap,
313
- perpMarketAccountMap
314
- );
315
- }
316
- }
317
- }
318
-
319
- return { oracleAccountMap, spotMarketAccountMap, perpMarketAccountMap };
320
- }
@@ -1,109 +0,0 @@
1
- import { sha256 } from '@noble/hashes/sha256';
2
- import type {
3
- SignedMsgOrderParamsDelegateMessage,
4
- SignedMsgOrderParamsMessage,
5
- } from '../types';
6
-
7
- /**
8
- * Minimal shape of an Anchor `program.coder.types` needed to (de)serialize the
9
- * `signedMsgOrderParamsMessage` / `signedMsgOrderParamsDelegateMessage` IDL types —
10
- * lets these helpers accept a plain coder without depending on a full `Program`.
11
- */
12
- export type AnchorTypesCoder = {
13
- encode: (typeName: string, value: any) => Buffer;
14
- decode: (typeName: string, buffer: Buffer) => any;
15
- };
16
-
17
- /**
18
- * Borsh-encodes a Swift signed-order message envelope: an 8-byte Anchor type
19
- * discriminator (`sha256("global:SignedMsgOrderParamsMessage" | "...Delegate...")[0..8]`)
20
- * followed by the Borsh-serialized message body. This is the exact byte layout the
21
- * taker/delegate signs off-chain and the Swift server / `placeAndMakeSignedMsgPerpOrder`
22
- * verifies and decodes on submission.
23
- *
24
- * `maxMarginRatio`/`isolatedPositionDeposit` default to `null` when omitted, and
25
- * `builderIdx`/`builderFeeTenthBps` default to `null` when omitted — both for
26
- * Borsh-Option compatibility with the IDL type, which requires the fields be present.
27
- *
28
- * @param args.coderTypes - an Anchor types coder (or `AnchorTypesCoder`) that knows the `signedMsgOrderParamsMessage`/`signedMsgOrderParamsDelegateMessage` IDL types.
29
- * @param args.orderParamsMessage - the order params message to encode; a plain `SignedMsgOrderParamsMessage` or, if `delegateSigner` is true, a `SignedMsgOrderParamsDelegateMessage`.
30
- * @param args.delegateSigner - whether this message is signed by a delegate rather than the account owner; selects both the discriminator and the IDL type used to encode the body. Defaults to `false`.
31
- * @returns the discriminator-prefixed Borsh buffer, ready to be signed and submitted.
32
- */
33
- export function encodeSignedMsgOrderParamsMessage(args: {
34
- coderTypes: AnchorTypesCoder;
35
- orderParamsMessage:
36
- | SignedMsgOrderParamsMessage
37
- | SignedMsgOrderParamsDelegateMessage;
38
- delegateSigner?: boolean;
39
- }): Buffer {
40
- const { coderTypes, delegateSigner } = args;
41
- const orderParamsMessage: any = { ...args.orderParamsMessage };
42
-
43
- if (orderParamsMessage.maxMarginRatio === undefined) {
44
- orderParamsMessage.maxMarginRatio = null;
45
- }
46
- if (orderParamsMessage.isolatedPositionDeposit === undefined) {
47
- orderParamsMessage.isolatedPositionDeposit = null;
48
- }
49
-
50
- const anchorIxName = delegateSigner
51
- ? 'global' + ':' + 'SignedMsgOrderParamsDelegateMessage'
52
- : 'global' + ':' + 'SignedMsgOrderParamsMessage';
53
- const prefix = Buffer.from(sha256(anchorIxName).slice(0, 8));
54
-
55
- const withBuilderDefaults = {
56
- ...orderParamsMessage,
57
- builderIdx:
58
- orderParamsMessage.builderIdx !== undefined
59
- ? orderParamsMessage.builderIdx
60
- : null,
61
- builderFeeTenthBps:
62
- orderParamsMessage.builderFeeTenthBps !== undefined
63
- ? orderParamsMessage.builderFeeTenthBps
64
- : null,
65
- };
66
-
67
- const body = delegateSigner
68
- ? coderTypes.encode(
69
- 'signedMsgOrderParamsDelegateMessage',
70
- withBuilderDefaults as SignedMsgOrderParamsDelegateMessage
71
- )
72
- : coderTypes.encode(
73
- 'signedMsgOrderParamsMessage',
74
- withBuilderDefaults as SignedMsgOrderParamsMessage
75
- );
76
-
77
- return Buffer.concat([prefix, body]);
78
- }
79
-
80
- /**
81
- * Decodes a Swift signed-order message envelope produced by
82
- * `encodeSignedMsgOrderParamsMessage`: strips the leading 8-byte discriminator and
83
- * Borsh-deserializes the remainder as either `signedMsgOrderParamsMessage` or
84
- * `signedMsgOrderParamsDelegateMessage`.
85
- *
86
- * Zero-pads the buffer with 128 extra bytes before decoding, so a message encoded by an
87
- * older/smaller IDL (missing newer optional fields) still deserializes instead of
88
- * throwing on a short read. This only works because new fields are `Option`s — if the
89
- * current IDL's type were ever more than 128 bytes larger than the incoming message,
90
- * decoding would still fail.
91
- *
92
- * @param args.coderTypes - an Anchor types coder (or `AnchorTypesCoder`) that knows the `signedMsgOrderParamsMessage`/`signedMsgOrderParamsDelegateMessage` IDL types.
93
- * @param args.encodedMessage - the discriminator-prefixed buffer to decode (as produced by `encodeSignedMsgOrderParamsMessage`).
94
- * @param args.delegateSigner - whether to decode as a `SignedMsgOrderParamsDelegateMessage` rather than `SignedMsgOrderParamsMessage`. Must match how the message was encoded. Defaults to `false`.
95
- * @returns the decoded `SignedMsgOrderParamsMessage` or `SignedMsgOrderParamsDelegateMessage`.
96
- */
97
- export function decodeSignedMsgOrderParamsMessage(args: {
98
- coderTypes: AnchorTypesCoder;
99
- encodedMessage: Buffer;
100
- delegateSigner?: boolean;
101
- }): SignedMsgOrderParamsMessage | SignedMsgOrderParamsDelegateMessage {
102
- const decodeStr = args.delegateSigner
103
- ? 'signedMsgOrderParamsDelegateMessage'
104
- : 'signedMsgOrderParamsMessage';
105
- return args.coderTypes.decode(
106
- decodeStr,
107
- Buffer.concat([args.encodedMessage.slice(8), Buffer.alloc(128)])
108
- );
109
- }
@@ -1,148 +0,0 @@
1
- import { Buffer } from 'buffer';
2
- import {
3
- Idl,
4
- BorshAccountsCoder,
5
- BorshEventCoder,
6
- BorshInstructionCoder,
7
- BorshCoder,
8
- } from '../isomorphic/anchor';
9
-
10
- /**
11
- * Drop-in replacement for Anchor's `BorshCoder` that swaps in `CustomBorshAccountsCoder` for
12
- * account (de)serialization while delegating instruction/event/type coding to the stock Anchor
13
- * coder. Use this as the `coder` passed to `new Program(idl, provider, coder)` wherever an
14
- * account may be re-encoded (e.g. test fixtures), since the stock coder's `encode()` can
15
- * under-allocate its buffer for large accounts (see `CustomBorshAccountsCoder.encode`).
16
- */
17
- export class CustomBorshCoder<
18
- A extends string = string,
19
- _T extends string = string,
20
- > {
21
- readonly idl: Idl;
22
-
23
- /**
24
- * Instruction coder.
25
- */
26
- readonly instruction: BorshInstructionCoder;
27
-
28
- /**
29
- * Account coder.
30
- */
31
- readonly accounts: CustomBorshAccountsCoder<A>;
32
-
33
- /**
34
- * Coder for events.
35
- */
36
- readonly events: BorshEventCoder;
37
-
38
- /**
39
- * Coder for user-defined types.
40
- */
41
- readonly types: any;
42
-
43
- constructor(idl: Idl) {
44
- const baseCoder = new BorshCoder(idl);
45
- this.instruction = baseCoder.instruction as BorshInstructionCoder;
46
- this.accounts = new CustomBorshAccountsCoder(idl);
47
- this.events = baseCoder.events as BorshEventCoder;
48
- this.types = baseCoder.types;
49
- this.idl = idl;
50
- }
51
- }
52
-
53
- /**
54
- * Custom accounts coder that wraps BorshAccountsCoder to fix encode buffer sizing.
55
- */
56
- export class CustomBorshAccountsCoder<A extends string = string> {
57
- private baseCoder: BorshAccountsCoder<A>;
58
- private idl: Idl;
59
-
60
- public constructor(idl: Idl) {
61
- this.baseCoder = new BorshAccountsCoder<A>(idl);
62
- this.idl = idl;
63
- }
64
-
65
- /**
66
- * Encodes an account struct to its on-chain byte representation (8-byte discriminator +
67
- * Borsh-serialized fields). Unlike Anchor's stock `BorshAccountsCoder.encode` — which
68
- * allocates a hardcoded 1000-byte scratch buffer and silently truncates/corrupts any account
69
- * larger than that (e.g. `User` at ~4.5KB, `PerpMarket`) — this computes the buffer size from
70
- * the IDL layout via `this.baseCoder.size(accountName)` (floored at 1000 bytes for small
71
- * accounts) so large accounts encode correctly.
72
- * @param accountName - IDL account type name (e.g. `"User"`, `"PerpMarket"`).
73
- * @param account - The decoded account value to serialize.
74
- * @returns The encoded account bytes, discriminator included.
75
- * @throws Error if `accountName` is not present in the IDL's account layouts.
76
- */
77
- public async encode<T = any>(accountName: A, account: T): Promise<Buffer> {
78
- const layout = (this.baseCoder as any)['accountLayouts'].get(accountName);
79
- if (!layout) {
80
- throw new Error(`Unknown account: ${accountName}`);
81
- }
82
-
83
- // Fix: compute proper buffer size instead of the hardcoded 1000 bytes
84
- const size = this.baseCoder.size(accountName);
85
- const buffer = Buffer.alloc(Math.max(size, 1000));
86
- const len = layout.layout.encode(account, buffer);
87
- const accountData = buffer.slice(0, len);
88
- const discriminator = Buffer.from(layout.discriminator);
89
- return Buffer.concat([discriminator, accountData]);
90
- }
91
-
92
- // Delegate all other methods to the base coder
93
- /** Decodes and validates an account's discriminator, delegating to Anchor's `BorshAccountsCoder.decode`. */
94
- public decode<T = any>(accountName: A, data: Buffer): T {
95
- return this.baseCoder.decode(accountName, data);
96
- }
97
-
98
- /** Decodes an account by inspecting its discriminator to determine its type, delegating to Anchor's `BorshAccountsCoder.decodeAny`. */
99
- public decodeAny<T = any>(data: Buffer): T {
100
- return this.baseCoder.decodeAny(data);
101
- }
102
-
103
- /** Decodes an account without discriminator validation, delegating to Anchor's `BorshAccountsCoder.decodeUnchecked`. */
104
- public decodeUnchecked<T = any>(accountName: A, ix: Buffer): T {
105
- return this.baseCoder.decodeUnchecked(accountName, ix);
106
- }
107
-
108
- /** Builds a memcmp filter for `accountName`'s discriminator (optionally with `appendData`), delegating to Anchor's `BorshAccountsCoder.memcmp`. */
109
- public memcmp(accountName: A, appendData?: Buffer): any {
110
- return this.baseCoder.memcmp(accountName, appendData);
111
- }
112
-
113
- /** Returns the fixed on-chain byte size (including discriminator) of `accountName`, delegating to Anchor's `BorshAccountsCoder.size`. */
114
- public size(accountName: A | string): number {
115
- return this.baseCoder.size(accountName as A);
116
- }
117
-
118
- /**
119
- * Returns the 8-byte account discriminator for `accountName`, read from the IDL-derived
120
- * account layout (Anchor 0.32+ derives discriminators from the IDL rather than a static
121
- * `sha256("account:Name")` hash). This is the instance-scoped counterpart to the throwing
122
- * static `accountDiscriminator` stub.
123
- * @param accountName - IDL account type name (e.g. `"User"`, `"PerpMarket"`).
124
- * @throws Error if `accountName` is not present in the IDL's account layouts.
125
- */
126
- public accountDiscriminator(accountName: A): Buffer {
127
- const layout = (this.baseCoder as any)['accountLayouts'].get(accountName);
128
- if (!layout) {
129
- throw new Error(`Unknown account: ${accountName}`);
130
- }
131
- return Buffer.from(layout.discriminator);
132
- }
133
-
134
- /**
135
- * Always throws. Anchor 0.32+ derives account discriminators from the IDL rather than a
136
- * static `sha256("account:Name")` hash, so no *static* method can compute one without an
137
- * IDL instance — this stub exists only to satisfy code written against Anchor's older static
138
- * `BorshAccountsCoder.accountDiscriminator(name)` API.
139
- * @param _name - Unused.
140
- * @throws Error always; use the instance-scoped `accountDiscriminator` on a coder built from an IDL instead.
141
- */
142
- public static accountDiscriminator(_name: string): Buffer {
143
- // Delegate to an instance method since anchor 0.32 uses IDL discriminators
144
- throw new Error(
145
- 'accountDiscriminator requires an instance; use coder.accountDiscriminator(name)'
146
- );
147
- }
148
- }