sol-parser-sdk-nodejs 0.4.0 → 0.5.5

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 (74) hide show
  1. package/README.md +22 -4
  2. package/README_CN.md +22 -4
  3. package/dist/accounts/mod.d.ts +1 -0
  4. package/dist/accounts/mod.js +53 -6
  5. package/dist/accounts/pumpfun.d.ts +16 -0
  6. package/dist/accounts/pumpfun.js +538 -0
  7. package/dist/accounts/rust_aliases.d.ts +1 -0
  8. package/dist/accounts/rust_aliases.js +3 -1
  9. package/dist/core/account_dispatcher_rpc.js +5 -26
  10. package/dist/core/account_fill_meteora.d.ts +1 -2
  11. package/dist/core/account_fill_meteora.js +0 -2
  12. package/dist/core/account_fill_pumpfun.js +92 -13
  13. package/dist/core/account_fill_pumpswap.js +50 -0
  14. package/dist/core/account_fill_raydium_launchlab.d.ts +4 -0
  15. package/dist/core/account_fill_raydium_launchlab.js +20 -0
  16. package/dist/core/dex_event.d.ts +283 -17
  17. package/dist/core/pumpfun_fee_enrich.d.ts +5 -0
  18. package/dist/core/pumpfun_fee_enrich.js +131 -0
  19. package/dist/core/unified_parser.js +2 -0
  20. package/dist/grpc/client.d.ts +26 -1
  21. package/dist/grpc/client.js +279 -0
  22. package/dist/grpc/log_instr_dedup.d.ts +2 -0
  23. package/dist/grpc/log_instr_dedup.js +378 -0
  24. package/dist/grpc/order_buffer.d.ts +27 -0
  25. package/dist/grpc/order_buffer.js +166 -0
  26. package/dist/grpc/program_ids.d.ts +5 -3
  27. package/dist/grpc/program_ids.js +12 -5
  28. package/dist/grpc/types.d.ts +17 -6
  29. package/dist/grpc/types.js +265 -153
  30. package/dist/grpc/yellowstone_parse.d.ts +3 -1
  31. package/dist/grpc/yellowstone_parse.js +13 -10
  32. package/dist/index.d.ts +9 -7
  33. package/dist/index.js +33 -7
  34. package/dist/instr/meteora_damm_ix.js +4 -1
  35. package/dist/instr/meteora_dlmm_ix.d.ts +2 -0
  36. package/dist/instr/meteora_dlmm_ix.js +134 -0
  37. package/dist/instr/meteora_pools_ix.d.ts +2 -0
  38. package/dist/instr/meteora_pools_ix.js +78 -0
  39. package/dist/instr/mod.d.ts +4 -1
  40. package/dist/instr/mod.js +45 -18
  41. package/dist/instr/program_ids.d.ts +1 -5
  42. package/dist/instr/program_ids.js +4 -6
  43. package/dist/instr/pump_fees_ix.d.ts +2 -0
  44. package/dist/instr/pump_fees_ix.js +166 -0
  45. package/dist/instr/pumpfun_ix.js +272 -1
  46. package/dist/instr/pumpswap_ix.js +36 -2
  47. package/dist/instr/raydium_clmm_ix.js +73 -52
  48. package/dist/instr/raydium_launchlab_ix.d.ts +8 -0
  49. package/dist/instr/raydium_launchlab_ix.js +125 -0
  50. package/dist/instr/rust_aliases.d.ts +3 -0
  51. package/dist/instr/rust_aliases.js +7 -1
  52. package/dist/logs/discriminator_lut.d.ts +1 -1
  53. package/dist/logs/discriminator_lut.js +2 -0
  54. package/dist/logs/optimized_matcher.js +130 -25
  55. package/dist/logs/program_log_discriminators.d.ts +10 -0
  56. package/dist/logs/program_log_discriminators.js +10 -0
  57. package/dist/logs/pump.d.ts +2 -0
  58. package/dist/logs/pump.js +122 -2
  59. package/dist/logs/pump_amm.js +1 -1
  60. package/dist/logs/pump_fees.d.ts +23 -0
  61. package/dist/logs/pump_fees.js +364 -0
  62. package/dist/logs/raydium_launchlab.d.ts +10 -0
  63. package/dist/logs/raydium_launchlab.js +84 -0
  64. package/dist/rpc_transaction.d.ts +2 -0
  65. package/dist/rpc_transaction.js +14 -6
  66. package/dist/shredstream/client.d.ts +4 -1
  67. package/dist/shredstream/client.js +18 -14
  68. package/dist/shredstream/index.d.ts +1 -1
  69. package/dist/shredstream/index.js +1 -1
  70. package/dist/shredstream/instruction_parse.d.ts +3 -3
  71. package/dist/shredstream/instruction_parse.js +38 -13
  72. package/dist/util/market.d.ts +18 -0
  73. package/dist/util/market.js +54 -0
  74. package/package.json +1 -1
@@ -1,8 +1,9 @@
1
1
  import type { SubscribeRequestFilterAccountsFilter } from "@triton-one/yellowstone-grpc";
2
+ import type { DexEvent } from "../core/dex_event.js";
2
3
  /** gRPC 订阅顺序模式 */
3
4
  export type OrderMode = "Unordered" | "Ordered" | "StreamingOrdered" | "MicroBatch";
4
5
  /** 与 Rust `grpc::types::Protocol` 一致 */
5
- export type Protocol = "PumpFun" | "PumpSwap" | "Bonk" | "RaydiumCpmm" | "RaydiumClmm" | "RaydiumAmmV4" | "MeteoraDammV2";
6
+ export type Protocol = "PumpFun" | "PumpSwap" | "PumpFees" | "RaydiumLaunchlab" | "RaydiumCpmm" | "RaydiumClmm" | "RaydiumAmmV4" | "OrcaWhirlpool" | "MeteoraPools" | "MeteoraDammV2" | "MeteoraDlmm" | "MeteoraDbc";
6
7
  export type SlotStatus = "Processed" | "Confirmed" | "Finalized" | "FirstShredReceived" | "Completed" | "CreatedBank" | "Dead";
7
8
  export interface SubscribeUpdateAccountInfo {
8
9
  pubkey: Uint8Array;
@@ -73,6 +74,8 @@ export interface SubscribeUpdate {
73
74
  blockMeta?: SubscribeUpdateBlockMeta;
74
75
  ping?: SubscribeUpdatePing;
75
76
  pong?: SubscribeUpdatePong;
77
+ /** Yellowstone SubscribeUpdate.created_at, Unix timestamp in microseconds. */
78
+ createdAtUs?: number;
76
79
  }
77
80
  export interface SubscribeCallbacks {
78
81
  onUpdate?: (update: SubscribeUpdate) => void;
@@ -146,11 +149,13 @@ export declare function accountFilterFromProgramOwners(programIds: string[]): Ac
146
149
  */
147
150
  export declare function accountFilterMemcmp(offset: number, bytes: Uint8Array): SubscribeRequestFilterAccountsFilter;
148
151
  /** 事件类型过滤标签 */
149
- export type EventType = "BlockMeta" | "PumpFunTrade" | "PumpFunBuy" | "PumpFunSell" | "PumpFunBuyExactSolIn" | "PumpFunCreate" | "PumpFunCreateV2" | "PumpFunComplete" | "PumpFunMigrate" | "PumpSwapTrade" | "PumpSwapBuy" | "PumpSwapSell" | "PumpSwapCreatePool" | "PumpSwapLiquidityAdded" | "PumpSwapLiquidityRemoved" | "RaydiumClmmSwap" | "RaydiumClmmIncreaseLiquidity" | "RaydiumClmmDecreaseLiquidity" | "RaydiumClmmCreatePool" | "RaydiumClmmOpenPosition" | "RaydiumClmmOpenPositionWithTokenExtNft" | "RaydiumClmmClosePosition" | "RaydiumClmmCollectFee" | "RaydiumCpmmSwap" | "RaydiumCpmmDeposit" | "RaydiumCpmmWithdraw" | "RaydiumCpmmInitialize" | "RaydiumAmmV4Swap" | "RaydiumAmmV4Deposit" | "RaydiumAmmV4Withdraw" | "RaydiumAmmV4WithdrawPnl" | "RaydiumAmmV4Initialize2" | "OrcaWhirlpoolSwap" | "OrcaWhirlpoolLiquidityIncreased" | "OrcaWhirlpoolLiquidityDecreased" | "OrcaWhirlpoolPoolInitialized" | "MeteoraPoolsSwap" | "MeteoraPoolsAddLiquidity" | "MeteoraPoolsRemoveLiquidity" | "MeteoraPoolsBootstrapLiquidity" | "MeteoraPoolsPoolCreated" | "MeteoraPoolsSetPoolFees" | "MeteoraDammV2Swap" | "MeteoraDammV2AddLiquidity" | "MeteoraDammV2RemoveLiquidity" | "MeteoraDammV2RemoveAllLiquidity" | "MeteoraDammV2CreatePosition" | "MeteoraDammV2InitializePool" | "MeteoraDammV2ClosePosition" | "MeteoraDlmmSwap" | "MeteoraDlmmAddLiquidity" | "MeteoraDlmmRemoveLiquidity" | "MeteoraDlmmInitializePool" | "MeteoraDlmmInitializeBinArray" | "MeteoraDlmmCreatePosition" | "MeteoraDlmmClosePosition" | "MeteoraDlmmClaimFee" | "BonkTrade" | "BonkPoolCreate" | "BonkMigrateAmm" | "TokenAccount" | "TokenInfo" | "NonceAccount" | "AccountPumpSwapGlobalConfig" | "AccountPumpSwapPool";
152
+ export type EventType = "BlockMeta" | "PumpFunTrade" | "PumpFunBuy" | "PumpFunSell" | "PumpFunBuyExactSolIn" | "PumpFunCreate" | "PumpFunCreateV2" | "PumpFunComplete" | "PumpFunMigrate" | "PumpFeesCreateFeeSharingConfig" | "PumpFeesInitializeFeeConfig" | "PumpFeesResetFeeSharingConfig" | "PumpFeesRevokeFeeSharingAuthority" | "PumpFeesTransferFeeSharingAuthority" | "PumpFeesUpdateAdmin" | "PumpFeesUpdateFeeConfig" | "PumpFeesUpdateFeeShares" | "PumpFeesUpsertFeeTiers" | "PumpFunMigrateBondingCurveCreator" | "PumpSwapTrade" | "PumpSwapBuy" | "PumpSwapSell" | "PumpSwapCreatePool" | "PumpSwapLiquidityAdded" | "PumpSwapLiquidityRemoved" | "RaydiumClmmSwap" | "RaydiumClmmIncreaseLiquidity" | "RaydiumClmmDecreaseLiquidity" | "RaydiumClmmCreatePool" | "RaydiumClmmOpenPosition" | "RaydiumClmmOpenPositionWithTokenExtNft" | "RaydiumClmmClosePosition" | "RaydiumClmmCollectFee" | "RaydiumCpmmSwap" | "RaydiumCpmmDeposit" | "RaydiumCpmmWithdraw" | "RaydiumCpmmInitialize" | "RaydiumAmmV4Swap" | "RaydiumAmmV4Deposit" | "RaydiumAmmV4Withdraw" | "RaydiumAmmV4WithdrawPnl" | "RaydiumAmmV4Initialize2" | "OrcaWhirlpoolSwap" | "OrcaWhirlpoolLiquidityIncreased" | "OrcaWhirlpoolLiquidityDecreased" | "OrcaWhirlpoolPoolInitialized" | "MeteoraPoolsSwap" | "MeteoraPoolsAddLiquidity" | "MeteoraPoolsRemoveLiquidity" | "MeteoraPoolsBootstrapLiquidity" | "MeteoraPoolsPoolCreated" | "MeteoraPoolsSetPoolFees" | "MeteoraDammV2Swap" | "MeteoraDammV2AddLiquidity" | "MeteoraDammV2RemoveLiquidity" | "MeteoraDammV2CreatePosition" | "MeteoraDammV2InitializePool" | "MeteoraDammV2ClosePosition" | "MeteoraDbcSwap" | "MeteoraDbcInitializePool" | "MeteoraDbcCurveComplete" | "MeteoraDlmmSwap" | "MeteoraDlmmAddLiquidity" | "MeteoraDlmmRemoveLiquidity" | "MeteoraDlmmInitializePool" | "MeteoraDlmmInitializeBinArray" | "MeteoraDlmmCreatePosition" | "MeteoraDlmmClosePosition" | "MeteoraDlmmClaimFee" | "RaydiumLaunchlabTrade" | "RaydiumLaunchlabPoolCreate" | "RaydiumLaunchlabMigrateAmm" | "TokenAccount" | "TokenInfo" | "NonceAccount" | "AccountPumpFunGlobal" | "AccountPumpFunBondingCurve" | "AccountPumpFunFeeConfig" | "AccountPumpFunSharingConfig" | "AccountPumpFunGlobalVolumeAccumulator" | "AccountPumpFunUserVolumeAccumulator" | "AccountPumpSwapGlobalConfig" | "AccountPumpSwapPool" | "AccountRaydiumClmmAmmConfig" | "AccountRaydiumClmmPoolState" | "AccountRaydiumClmmTickArrayState" | "AccountRaydiumCpmmAmmConfig" | "AccountRaydiumCpmmPoolState" | "AccountOrcaWhirlpool" | "AccountOrcaPosition" | "AccountOrcaTickArray" | "AccountOrcaFeeTier" | "AccountOrcaWhirlpoolsConfig";
150
153
  /** 与 Rust `grpc::EventType`(由 `StreamingEventType` 导出)一致 */
151
154
  export type StreamingEventType = EventType;
152
155
  /** 所有事件类型列表 */
153
156
  export declare const ALL_EVENT_TYPES: EventType[];
157
+ export declare function eventTypeFromDexEvent(event: DexEvent): EventType | null;
158
+ export declare function eventTypeFilterShouldIncludeDexEvent(filter: EventTypeFilter, event: DexEvent): boolean;
154
159
  export interface EventTypeFilter {
155
160
  include_only?: EventType[];
156
161
  exclude_types?: EventType[];
@@ -160,10 +165,18 @@ export declare function eventTypeFilterIncludeOnly(types: EventType[]): EventTyp
160
165
  export declare function eventTypeFilterExclude(types: EventType[]): EventTypeFilter;
161
166
  /** 过滤器是否包含 PumpFun 相关类型 */
162
167
  export declare function eventTypeFilterIncludesPumpfun(filter: EventTypeFilter): boolean;
168
+ /** 过滤器是否包含 Pump Fees (`pfeeUx...`) 相关类型 */
169
+ export declare function eventTypeFilterIncludesPumpFees(filter: EventTypeFilter): boolean;
163
170
  /** 过滤器是否包含 PumpSwap 相关类型 */
164
171
  export declare function eventTypeFilterIncludesPumpswap(filter: EventTypeFilter): boolean;
165
172
  /** 过滤器是否包含 Meteora DAMM V2 相关类型 */
166
173
  export declare function eventTypeFilterIncludesMeteoraDammV2(filter: EventTypeFilter): boolean;
174
+ /** 过滤器是否包含 Meteora DBC 相关类型 */
175
+ export declare function eventTypeFilterIncludesMeteoraDbc(filter: EventTypeFilter): boolean;
176
+ /** 过滤器是否包含 Meteora Pools 相关类型 */
177
+ export declare function eventTypeFilterIncludesMeteoraPools(filter: EventTypeFilter): boolean;
178
+ /** 过滤器是否包含 Meteora DLMM 相关类型 */
179
+ export declare function eventTypeFilterIncludesMeteoraDlmm(filter: EventTypeFilter): boolean;
167
180
  /** 过滤器是否包含 Raydium CLMM 相关类型 */
168
181
  export declare function eventTypeFilterIncludesRaydiumClmm(filter: EventTypeFilter): boolean;
169
182
  /** 过滤器是否包含 Raydium CPMM 相关类型 */
@@ -172,10 +185,8 @@ export declare function eventTypeFilterIncludesRaydiumCpmm(filter: EventTypeFilt
172
185
  export declare function eventTypeFilterIncludesRaydiumAmmV4(filter: EventTypeFilter): boolean;
173
186
  /** 过滤器是否包含 Orca Whirlpool 相关类型 */
174
187
  export declare function eventTypeFilterIncludesOrcaWhirlpool(filter: EventTypeFilter): boolean;
175
- /** 过滤器是否包含 Bonk Launchpad 相关类型(与 Rust `includes_raydium_launchpad` / Bonk 集合一致) */
176
- export declare function eventTypeFilterIncludesBonk(filter: EventTypeFilter): boolean;
177
- /** 与 Rust `EventTypeFilter::includes_raydium_launchpad` 同名语义 */
178
- export declare function eventTypeFilterIncludesRaydiumLaunchpad(filter: EventTypeFilter): boolean;
188
+ /** 过滤器是否包含 Raydium LaunchLab 相关类型(与 Rust `includes_raydium_launchlab` 集合一致) */
189
+ export declare function eventTypeFilterIncludesRaydiumLaunchlab(filter: EventTypeFilter): boolean;
179
190
  /**
180
191
  * `parseInstructionUnified` 前置白名单:仅当 `include_only` 与下列指令相关类型有交集时才解析指令。
181
192
  * 若白名单中不含下列任一类型,则整条指令解析入口返回 null。
@@ -12,17 +12,22 @@ exports.slotFilterMinSlot = slotFilterMinSlot;
12
12
  exports.slotFilterMaxSlot = slotFilterMaxSlot;
13
13
  exports.accountFilterFromProgramOwners = accountFilterFromProgramOwners;
14
14
  exports.accountFilterMemcmp = accountFilterMemcmp;
15
+ exports.eventTypeFromDexEvent = eventTypeFromDexEvent;
16
+ exports.eventTypeFilterShouldIncludeDexEvent = eventTypeFilterShouldIncludeDexEvent;
15
17
  exports.eventTypeFilterIncludeOnly = eventTypeFilterIncludeOnly;
16
18
  exports.eventTypeFilterExclude = eventTypeFilterExclude;
17
19
  exports.eventTypeFilterIncludesPumpfun = eventTypeFilterIncludesPumpfun;
20
+ exports.eventTypeFilterIncludesPumpFees = eventTypeFilterIncludesPumpFees;
18
21
  exports.eventTypeFilterIncludesPumpswap = eventTypeFilterIncludesPumpswap;
19
22
  exports.eventTypeFilterIncludesMeteoraDammV2 = eventTypeFilterIncludesMeteoraDammV2;
23
+ exports.eventTypeFilterIncludesMeteoraDbc = eventTypeFilterIncludesMeteoraDbc;
24
+ exports.eventTypeFilterIncludesMeteoraPools = eventTypeFilterIncludesMeteoraPools;
25
+ exports.eventTypeFilterIncludesMeteoraDlmm = eventTypeFilterIncludesMeteoraDlmm;
20
26
  exports.eventTypeFilterIncludesRaydiumClmm = eventTypeFilterIncludesRaydiumClmm;
21
27
  exports.eventTypeFilterIncludesRaydiumCpmm = eventTypeFilterIncludesRaydiumCpmm;
22
28
  exports.eventTypeFilterIncludesRaydiumAmmV4 = eventTypeFilterIncludesRaydiumAmmV4;
23
29
  exports.eventTypeFilterIncludesOrcaWhirlpool = eventTypeFilterIncludesOrcaWhirlpool;
24
- exports.eventTypeFilterIncludesBonk = eventTypeFilterIncludesBonk;
25
- exports.eventTypeFilterIncludesRaydiumLaunchpad = eventTypeFilterIncludesRaydiumLaunchpad;
30
+ exports.eventTypeFilterIncludesRaydiumLaunchlab = eventTypeFilterIncludesRaydiumLaunchlab;
26
31
  exports.eventTypeFilterAllowsInstructionParsing = eventTypeFilterAllowsInstructionParsing;
27
32
  function defaultClientConfig() {
28
33
  return {
@@ -129,6 +134,16 @@ exports.ALL_EVENT_TYPES = [
129
134
  "PumpFunCreateV2",
130
135
  "PumpFunComplete",
131
136
  "PumpFunMigrate",
137
+ "PumpFeesCreateFeeSharingConfig",
138
+ "PumpFeesInitializeFeeConfig",
139
+ "PumpFeesResetFeeSharingConfig",
140
+ "PumpFeesRevokeFeeSharingAuthority",
141
+ "PumpFeesTransferFeeSharingAuthority",
142
+ "PumpFeesUpdateAdmin",
143
+ "PumpFeesUpdateFeeConfig",
144
+ "PumpFeesUpdateFeeShares",
145
+ "PumpFeesUpsertFeeTiers",
146
+ "PumpFunMigrateBondingCurveCreator",
132
147
  // PumpSwap
133
148
  "PumpSwapTrade",
134
149
  "PumpSwapBuy",
@@ -172,10 +187,13 @@ exports.ALL_EVENT_TYPES = [
172
187
  "MeteoraDammV2Swap",
173
188
  "MeteoraDammV2AddLiquidity",
174
189
  "MeteoraDammV2RemoveLiquidity",
175
- "MeteoraDammV2RemoveAllLiquidity",
176
190
  "MeteoraDammV2CreatePosition",
177
191
  "MeteoraDammV2InitializePool",
178
192
  "MeteoraDammV2ClosePosition",
193
+ // Meteora DBC
194
+ "MeteoraDbcSwap",
195
+ "MeteoraDbcInitializePool",
196
+ "MeteoraDbcCurveComplete",
179
197
  // Meteora DLMM
180
198
  "MeteoraDlmmSwap",
181
199
  "MeteoraDlmmAddLiquidity",
@@ -185,17 +203,174 @@ exports.ALL_EVENT_TYPES = [
185
203
  "MeteoraDlmmCreatePosition",
186
204
  "MeteoraDlmmClosePosition",
187
205
  "MeteoraDlmmClaimFee",
188
- // Bonk
189
- "BonkTrade",
190
- "BonkPoolCreate",
191
- "BonkMigrateAmm",
206
+ // RaydiumLaunchlab
207
+ "RaydiumLaunchlabTrade",
208
+ "RaydiumLaunchlabPoolCreate",
209
+ "RaydiumLaunchlabMigrateAmm",
192
210
  // Account types
193
211
  "TokenAccount",
194
212
  "TokenInfo",
195
213
  "NonceAccount",
214
+ "AccountPumpFunGlobal",
215
+ "AccountPumpFunBondingCurve",
216
+ "AccountPumpFunFeeConfig",
217
+ "AccountPumpFunSharingConfig",
218
+ "AccountPumpFunGlobalVolumeAccumulator",
219
+ "AccountPumpFunUserVolumeAccumulator",
196
220
  "AccountPumpSwapGlobalConfig",
197
221
  "AccountPumpSwapPool",
222
+ "AccountRaydiumClmmAmmConfig",
223
+ "AccountRaydiumClmmPoolState",
224
+ "AccountRaydiumClmmTickArrayState",
225
+ "AccountRaydiumCpmmAmmConfig",
226
+ "AccountRaydiumCpmmPoolState",
227
+ "AccountOrcaWhirlpool",
228
+ "AccountOrcaPosition",
229
+ "AccountOrcaTickArray",
230
+ "AccountOrcaFeeTier",
231
+ "AccountOrcaWhirlpoolsConfig",
198
232
  ];
233
+ const ALL_EVENT_TYPE_SET = new Set(exports.ALL_EVENT_TYPES);
234
+ const PUMPFUN_BUY_FAMILY = ["PumpFunBuy", "PumpFunBuyExactSolIn"];
235
+ const PUMPFUN_TRADE_FAMILY = [
236
+ "PumpFunBuy",
237
+ "PumpFunSell",
238
+ "PumpFunBuyExactSolIn",
239
+ ];
240
+ const PUMPFUN_CREATE_FAMILY = ["PumpFunCreate", "PumpFunCreateV2"];
241
+ const PUMPSWAP_TRADE_FAMILY = ["PumpSwapBuy", "PumpSwapSell"];
242
+ const PUMP_FEES_EVENT_TYPES = [
243
+ "PumpFeesCreateFeeSharingConfig",
244
+ "PumpFeesInitializeFeeConfig",
245
+ "PumpFeesResetFeeSharingConfig",
246
+ "PumpFeesRevokeFeeSharingAuthority",
247
+ "PumpFeesTransferFeeSharingAuthority",
248
+ "PumpFeesUpdateAdmin",
249
+ "PumpFeesUpdateFeeConfig",
250
+ "PumpFeesUpdateFeeShares",
251
+ "PumpFeesUpsertFeeTiers",
252
+ ];
253
+ const PUMPFUN_FILTER_TYPES = [
254
+ "PumpFunTrade",
255
+ "PumpFunBuy",
256
+ "PumpFunSell",
257
+ "PumpFunBuyExactSolIn",
258
+ "PumpFunCreate",
259
+ "PumpFunCreateV2",
260
+ "PumpFunComplete",
261
+ "PumpFunMigrate",
262
+ "PumpFunMigrateBondingCurveCreator",
263
+ ];
264
+ const PUMPSWAP_FILTER_TYPES = [
265
+ "PumpSwapTrade",
266
+ "PumpSwapBuy",
267
+ "PumpSwapSell",
268
+ "PumpSwapCreatePool",
269
+ "PumpSwapLiquidityAdded",
270
+ "PumpSwapLiquidityRemoved",
271
+ ];
272
+ const METEORA_DAMM_V2_FILTER_TYPES = [
273
+ "MeteoraDammV2Swap",
274
+ "MeteoraDammV2AddLiquidity",
275
+ "MeteoraDammV2RemoveLiquidity",
276
+ "MeteoraDammV2CreatePosition",
277
+ "MeteoraDammV2InitializePool",
278
+ "MeteoraDammV2ClosePosition",
279
+ ];
280
+ const METEORA_DBC_FILTER_TYPES = [
281
+ "MeteoraDbcSwap",
282
+ "MeteoraDbcInitializePool",
283
+ "MeteoraDbcCurveComplete",
284
+ ];
285
+ const METEORA_POOLS_FILTER_TYPES = [
286
+ "MeteoraPoolsSwap",
287
+ "MeteoraPoolsAddLiquidity",
288
+ "MeteoraPoolsRemoveLiquidity",
289
+ "MeteoraPoolsBootstrapLiquidity",
290
+ "MeteoraPoolsPoolCreated",
291
+ "MeteoraPoolsSetPoolFees",
292
+ ];
293
+ const METEORA_DLMM_FILTER_TYPES = [
294
+ "MeteoraDlmmSwap",
295
+ "MeteoraDlmmAddLiquidity",
296
+ "MeteoraDlmmRemoveLiquidity",
297
+ "MeteoraDlmmInitializePool",
298
+ "MeteoraDlmmInitializeBinArray",
299
+ "MeteoraDlmmCreatePosition",
300
+ "MeteoraDlmmClosePosition",
301
+ "MeteoraDlmmClaimFee",
302
+ ];
303
+ const RAYDIUM_CLMM_FILTER_TYPES = [
304
+ "RaydiumClmmSwap",
305
+ "RaydiumClmmIncreaseLiquidity",
306
+ "RaydiumClmmDecreaseLiquidity",
307
+ "RaydiumClmmCreatePool",
308
+ "RaydiumClmmOpenPosition",
309
+ "RaydiumClmmOpenPositionWithTokenExtNft",
310
+ "RaydiumClmmClosePosition",
311
+ "RaydiumClmmCollectFee",
312
+ ];
313
+ const RAYDIUM_CPMM_FILTER_TYPES = [
314
+ "RaydiumCpmmSwap",
315
+ "RaydiumCpmmDeposit",
316
+ "RaydiumCpmmWithdraw",
317
+ "RaydiumCpmmInitialize",
318
+ ];
319
+ const RAYDIUM_AMM_V4_FILTER_TYPES = [
320
+ "RaydiumAmmV4Swap",
321
+ "RaydiumAmmV4Deposit",
322
+ "RaydiumAmmV4Withdraw",
323
+ "RaydiumAmmV4WithdrawPnl",
324
+ "RaydiumAmmV4Initialize2",
325
+ ];
326
+ const ORCA_WHIRLPOOL_FILTER_TYPES = [
327
+ "OrcaWhirlpoolSwap",
328
+ "OrcaWhirlpoolLiquidityIncreased",
329
+ "OrcaWhirlpoolLiquidityDecreased",
330
+ "OrcaWhirlpoolPoolInitialized",
331
+ ];
332
+ const RAYDIUM_LAUNCHLAB_FILTER_TYPES = [
333
+ "RaydiumLaunchlabTrade",
334
+ "RaydiumLaunchlabPoolCreate",
335
+ "RaydiumLaunchlabMigrateAmm",
336
+ ];
337
+ const INSTRUCTION_EVENT_TYPES = [
338
+ ...PUMPFUN_FILTER_TYPES,
339
+ ...PUMP_FEES_EVENT_TYPES,
340
+ ...PUMPSWAP_FILTER_TYPES,
341
+ ...METEORA_DAMM_V2_FILTER_TYPES,
342
+ ...METEORA_POOLS_FILTER_TYPES,
343
+ ...METEORA_DLMM_FILTER_TYPES,
344
+ ...RAYDIUM_CLMM_FILTER_TYPES,
345
+ ...RAYDIUM_CPMM_FILTER_TYPES,
346
+ ...RAYDIUM_AMM_V4_FILTER_TYPES,
347
+ ...ORCA_WHIRLPOOL_FILTER_TYPES,
348
+ ...RAYDIUM_LAUNCHLAB_FILTER_TYPES,
349
+ ];
350
+ const INSTRUCTION_EVENT_TYPE_SET = new Set(INSTRUCTION_EVENT_TYPES);
351
+ const DEX_EVENT_TYPE_BY_VARIANT = {
352
+ PumpFunGlobalAccount: "AccountPumpFunGlobal",
353
+ PumpFunBondingCurveAccount: "AccountPumpFunBondingCurve",
354
+ PumpFunFeeConfigAccount: "AccountPumpFunFeeConfig",
355
+ PumpFunSharingConfigAccount: "AccountPumpFunSharingConfig",
356
+ PumpFunGlobalVolumeAccumulatorAccount: "AccountPumpFunGlobalVolumeAccumulator",
357
+ PumpFunUserVolumeAccumulatorAccount: "AccountPumpFunUserVolumeAccumulator",
358
+ PumpSwapGlobalConfigAccount: "AccountPumpSwapGlobalConfig",
359
+ PumpSwapPoolAccount: "AccountPumpSwapPool",
360
+ };
361
+ function eventTypeFromDexEvent(event) {
362
+ const variant = Object.keys(event)[0];
363
+ if (!variant || variant === "Error")
364
+ return null;
365
+ const mapped = DEX_EVENT_TYPE_BY_VARIANT[variant];
366
+ if (mapped)
367
+ return mapped;
368
+ return ALL_EVENT_TYPE_SET.has(variant) ? variant : null;
369
+ }
370
+ function eventTypeFilterShouldIncludeDexEvent(filter, event) {
371
+ const eventType = eventTypeFromDexEvent(event);
372
+ return eventType === null || filter.shouldInclude(eventType);
373
+ }
199
374
  function eventTypeFilterIncludeOnly(types) {
200
375
  const include_only = types;
201
376
  return {
@@ -204,7 +379,21 @@ function eventTypeFilterIncludeOnly(types) {
204
379
  if (include_only.includes(eventType))
205
380
  return true;
206
381
  if (eventType === "PumpFunTrade") {
207
- return include_only.some((t) => ["PumpFunBuy", "PumpFunSell", "PumpFunBuyExactSolIn"].includes(t));
382
+ return eventTypesIntersect(include_only, PUMPFUN_TRADE_FAMILY);
383
+ }
384
+ if (isPumpfunTradeConcrete(eventType)) {
385
+ if (include_only.includes("PumpFunTrade"))
386
+ return true;
387
+ if (isPumpfunBuyFamily(eventType)) {
388
+ return eventTypesIntersect(include_only, PUMPFUN_BUY_FAMILY);
389
+ }
390
+ return false;
391
+ }
392
+ if (isPumpfunCreateFamily(eventType)) {
393
+ return eventTypesIntersect(include_only, PUMPFUN_CREATE_FAMILY);
394
+ }
395
+ if (isPumpswapTradeConcrete(eventType)) {
396
+ return include_only.includes("PumpSwapTrade");
208
397
  }
209
398
  return false;
210
399
  },
@@ -215,181 +404,104 @@ function eventTypeFilterExclude(types) {
215
404
  return {
216
405
  exclude_types,
217
406
  shouldInclude(eventType) {
218
- return !exclude_types.includes(eventType);
407
+ if (exclude_types.includes(eventType))
408
+ return false;
409
+ if (isPumpfunTradeConcrete(eventType) && exclude_types.includes("PumpFunTrade")) {
410
+ return false;
411
+ }
412
+ if (isPumpfunBuyFamily(eventType) &&
413
+ eventTypesIntersect(exclude_types, PUMPFUN_BUY_FAMILY)) {
414
+ return false;
415
+ }
416
+ if (isPumpfunCreateFamily(eventType) &&
417
+ eventTypesIntersect(exclude_types, PUMPFUN_CREATE_FAMILY)) {
418
+ return false;
419
+ }
420
+ if (isPumpswapTradeConcrete(eventType) && exclude_types.includes("PumpSwapTrade")) {
421
+ return false;
422
+ }
423
+ return true;
219
424
  },
220
425
  };
221
426
  }
222
- /** 过滤器是否包含 PumpFun 相关类型 */
223
- function eventTypeFilterIncludesPumpfun(filter) {
427
+ function eventTypesIntersect(types, candidates) {
428
+ return types.some((t) => candidates.includes(t));
429
+ }
430
+ function isPumpfunTradeConcrete(eventType) {
431
+ return (eventType === "PumpFunBuy" ||
432
+ eventType === "PumpFunSell" ||
433
+ eventType === "PumpFunBuyExactSolIn");
434
+ }
435
+ function isPumpfunBuyFamily(eventType) {
436
+ return eventType === "PumpFunBuy" || eventType === "PumpFunBuyExactSolIn";
437
+ }
438
+ function isPumpfunCreateFamily(eventType) {
439
+ return eventType === "PumpFunCreate" || eventType === "PumpFunCreateV2";
440
+ }
441
+ function isPumpswapTradeConcrete(eventType) {
442
+ return eventType === "PumpSwapBuy" || eventType === "PumpSwapSell";
443
+ }
444
+ function eventTypeFilterIncludesAny(filter, types) {
224
445
  if (filter.include_only) {
225
- return filter.include_only.some((t) => [
226
- "PumpFunTrade",
227
- "PumpFunBuy",
228
- "PumpFunSell",
229
- "PumpFunBuyExactSolIn",
230
- "PumpFunCreate",
231
- "PumpFunCreateV2",
232
- "PumpFunComplete",
233
- "PumpFunMigrate",
234
- ].includes(t));
446
+ return eventTypesIntersect(filter.include_only, types);
235
447
  }
236
448
  if (filter.exclude_types) {
237
- return !filter.exclude_types.some((t) => [
238
- "PumpFunTrade",
239
- "PumpFunBuy",
240
- "PumpFunSell",
241
- "PumpFunBuyExactSolIn",
242
- "PumpFunCreate",
243
- "PumpFunCreateV2",
244
- "PumpFunComplete",
245
- "PumpFunMigrate",
246
- ].includes(t));
449
+ return types.some((t) => filter.shouldInclude(t));
247
450
  }
248
- return true;
451
+ return types.some((t) => filter.shouldInclude(t));
452
+ }
453
+ /** 过滤器是否包含 PumpFun 相关类型 */
454
+ function eventTypeFilterIncludesPumpfun(filter) {
455
+ return eventTypeFilterIncludesAny(filter, PUMPFUN_FILTER_TYPES);
456
+ }
457
+ /** 过滤器是否包含 Pump Fees (`pfeeUx...`) 相关类型 */
458
+ function eventTypeFilterIncludesPumpFees(filter) {
459
+ return eventTypeFilterIncludesAny(filter, PUMP_FEES_EVENT_TYPES);
249
460
  }
250
461
  /** 过滤器是否包含 PumpSwap 相关类型 */
251
462
  function eventTypeFilterIncludesPumpswap(filter) {
252
- if (filter.include_only) {
253
- return filter.include_only.some((t) => [
254
- "PumpSwapBuy",
255
- "PumpSwapSell",
256
- "PumpSwapCreatePool",
257
- "PumpSwapLiquidityAdded",
258
- "PumpSwapLiquidityRemoved",
259
- ].includes(t));
260
- }
261
- if (filter.exclude_types) {
262
- return !filter.exclude_types.some((t) => [
263
- "PumpSwapBuy",
264
- "PumpSwapSell",
265
- "PumpSwapCreatePool",
266
- "PumpSwapLiquidityAdded",
267
- "PumpSwapLiquidityRemoved",
268
- ].includes(t));
269
- }
270
- return true;
463
+ return eventTypeFilterIncludesAny(filter, PUMPSWAP_FILTER_TYPES);
271
464
  }
272
465
  /** 过滤器是否包含 Meteora DAMM V2 相关类型 */
273
466
  function eventTypeFilterIncludesMeteoraDammV2(filter) {
274
- if (filter.include_only) {
275
- return filter.include_only.some((t) => [
276
- "MeteoraDammV2Swap",
277
- "MeteoraDammV2AddLiquidity",
278
- "MeteoraDammV2CreatePosition",
279
- "MeteoraDammV2InitializePool",
280
- "MeteoraDammV2ClosePosition",
281
- "MeteoraDammV2RemoveLiquidity",
282
- "MeteoraDammV2RemoveAllLiquidity",
283
- ].includes(t));
284
- }
285
- if (filter.exclude_types) {
286
- return !filter.exclude_types.some((t) => [
287
- "MeteoraDammV2Swap",
288
- "MeteoraDammV2AddLiquidity",
289
- "MeteoraDammV2CreatePosition",
290
- "MeteoraDammV2InitializePool",
291
- "MeteoraDammV2ClosePosition",
292
- "MeteoraDammV2RemoveLiquidity",
293
- "MeteoraDammV2RemoveAllLiquidity",
294
- ].includes(t));
295
- }
296
- return true;
467
+ return eventTypeFilterIncludesAny(filter, METEORA_DAMM_V2_FILTER_TYPES);
468
+ }
469
+ /** 过滤器是否包含 Meteora DBC 相关类型 */
470
+ function eventTypeFilterIncludesMeteoraDbc(filter) {
471
+ return eventTypeFilterIncludesAny(filter, METEORA_DBC_FILTER_TYPES);
472
+ }
473
+ /** 过滤器是否包含 Meteora Pools 相关类型 */
474
+ function eventTypeFilterIncludesMeteoraPools(filter) {
475
+ return eventTypeFilterIncludesAny(filter, METEORA_POOLS_FILTER_TYPES);
476
+ }
477
+ /** 过滤器是否包含 Meteora DLMM 相关类型 */
478
+ function eventTypeFilterIncludesMeteoraDlmm(filter) {
479
+ return eventTypeFilterIncludesAny(filter, METEORA_DLMM_FILTER_TYPES);
297
480
  }
298
481
  /** 过滤器是否包含 Raydium CLMM 相关类型 */
299
482
  function eventTypeFilterIncludesRaydiumClmm(filter) {
300
- if (filter.include_only) {
301
- return filter.include_only.some((t) => [
302
- "RaydiumClmmSwap",
303
- "RaydiumClmmIncreaseLiquidity",
304
- "RaydiumClmmDecreaseLiquidity",
305
- "RaydiumClmmCreatePool",
306
- ].includes(t));
307
- }
308
- if (filter.exclude_types) {
309
- return !filter.exclude_types.some((t) => [
310
- "RaydiumClmmSwap",
311
- "RaydiumClmmIncreaseLiquidity",
312
- "RaydiumClmmDecreaseLiquidity",
313
- "RaydiumClmmCreatePool",
314
- ].includes(t));
315
- }
316
- return true;
483
+ return eventTypeFilterIncludesAny(filter, RAYDIUM_CLMM_FILTER_TYPES);
317
484
  }
318
485
  /** 过滤器是否包含 Raydium CPMM 相关类型 */
319
486
  function eventTypeFilterIncludesRaydiumCpmm(filter) {
320
- if (filter.include_only) {
321
- return filter.include_only.some((t) => [
322
- "RaydiumCpmmSwap",
323
- "RaydiumCpmmDeposit",
324
- "RaydiumCpmmWithdraw",
325
- ].includes(t));
326
- }
327
- if (filter.exclude_types) {
328
- return !filter.exclude_types.some((t) => [
329
- "RaydiumCpmmSwap",
330
- "RaydiumCpmmDeposit",
331
- "RaydiumCpmmWithdraw",
332
- ].includes(t));
333
- }
334
- return true;
487
+ return eventTypeFilterIncludesAny(filter, RAYDIUM_CPMM_FILTER_TYPES);
335
488
  }
336
489
  /** 过滤器是否包含 Raydium AMM V4 相关类型 */
337
490
  function eventTypeFilterIncludesRaydiumAmmV4(filter) {
338
- if (filter.include_only) {
339
- return filter.include_only.some((t) => ["RaydiumAmmV4Swap"].includes(t));
340
- }
341
- if (filter.exclude_types) {
342
- return !filter.exclude_types.some((t) => ["RaydiumAmmV4Swap"].includes(t));
343
- }
344
- return true;
491
+ return eventTypeFilterIncludesAny(filter, RAYDIUM_AMM_V4_FILTER_TYPES);
345
492
  }
346
493
  /** 过滤器是否包含 Orca Whirlpool 相关类型 */
347
494
  function eventTypeFilterIncludesOrcaWhirlpool(filter) {
348
- if (filter.include_only) {
349
- return filter.include_only.some((t) => [
350
- "OrcaWhirlpoolSwap",
351
- "OrcaWhirlpoolLiquidityIncreased",
352
- "OrcaWhirlpoolLiquidityDecreased",
353
- ].includes(t));
354
- }
355
- if (filter.exclude_types) {
356
- return !filter.exclude_types.some((t) => [
357
- "OrcaWhirlpoolSwap",
358
- "OrcaWhirlpoolLiquidityIncreased",
359
- "OrcaWhirlpoolLiquidityDecreased",
360
- ].includes(t));
361
- }
362
- return true;
363
- }
364
- /** 过滤器是否包含 Bonk Launchpad 相关类型(与 Rust `includes_raydium_launchpad` / Bonk 集合一致) */
365
- function eventTypeFilterIncludesBonk(filter) {
366
- const bonk = ["BonkTrade", "BonkPoolCreate", "BonkMigrateAmm"];
367
- if (filter.include_only) {
368
- return filter.include_only.some((t) => bonk.includes(t));
369
- }
370
- if (filter.exclude_types) {
371
- return !filter.exclude_types.some((t) => bonk.includes(t));
372
- }
373
- return true;
495
+ return eventTypeFilterIncludesAny(filter, ORCA_WHIRLPOOL_FILTER_TYPES);
374
496
  }
375
- /** Rust `EventTypeFilter::includes_raydium_launchpad` 同名语义 */
376
- function eventTypeFilterIncludesRaydiumLaunchpad(filter) {
377
- return eventTypeFilterIncludesBonk(filter);
497
+ /** 过滤器是否包含 Raydium LaunchLab 相关类型(与 Rust `includes_raydium_launchlab` 集合一致) */
498
+ function eventTypeFilterIncludesRaydiumLaunchlab(filter) {
499
+ return eventTypeFilterIncludesAny(filter, RAYDIUM_LAUNCHLAB_FILTER_TYPES);
378
500
  }
379
501
  /**
380
502
  * `parseInstructionUnified` 前置白名单:仅当 `include_only` 与下列指令相关类型有交集时才解析指令。
381
503
  * 若白名单中不含下列任一类型,则整条指令解析入口返回 null。
382
504
  */
383
505
  function eventTypeFilterAllowsInstructionParsing(includeOnly) {
384
- const ix = [
385
- "PumpFunMigrate",
386
- "MeteoraDammV2Swap",
387
- "MeteoraDammV2AddLiquidity",
388
- "MeteoraDammV2CreatePosition",
389
- "MeteoraDammV2InitializePool",
390
- "MeteoraDammV2ClosePosition",
391
- "MeteoraDammV2RemoveLiquidity",
392
- "MeteoraDammV2RemoveAllLiquidity",
393
- ];
394
- return includeOnly.some((t) => ix.includes(t));
506
+ return includeOnly.some((t) => INSTRUCTION_EVENT_TYPE_SET.has(t));
395
507
  }
@@ -1,5 +1,5 @@
1
1
  import type { DexEvent } from "../core/dex_event.js";
2
- import type { SubscribeUpdateTransactionInfo } from "./types.js";
2
+ import type { EventTypeFilter, SubscribeUpdateTransactionInfo } from "./types.js";
3
3
  /**
4
4
  * Yellowstone `SubscribeUpdateTransactionInfo.index` → `EventMetadata.tx_index`。
5
5
  * 与 Rust `sol-parser-sdk` gRPC 路径中 `let idx = info.index` 传入 `parse_logs(..., idx, ...)` 一致。
@@ -11,4 +11,6 @@ export declare function grpcTxIndexFromInfo(info: Pick<SubscribeUpdateTransactio
11
11
  */
12
12
  export declare function parseDexEventsFromGrpcTransactionInfo(info: SubscribeUpdateTransactionInfo, slot: string | bigint, options?: {
13
13
  blockTimeUs?: number;
14
+ grpcRecvUs?: number;
15
+ eventTypeFilter?: EventTypeFilter;
14
16
  }): DexEvent[];
@@ -6,14 +6,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.grpcTxIndexFromInfo = grpcTxIndexFromInfo;
7
7
  exports.parseDexEventsFromGrpcTransactionInfo = parseDexEventsFromGrpcTransactionInfo;
8
8
  /**
9
- * Yellowstone gRPC 单笔交易:日志解析 + 与 Rust `parse_logs` 相同的账户/数据填充。
9
+ * Yellowstone gRPC 单笔交易:统一交易解析(指令 + 日志 + 与 Rust 相同的账户/数据填充)。
10
10
  * 依赖 `@triton-one/yellowstone-grpc` 的 `txEncode`(Binary)得到与 web3 兼容的 meta + 反序列化交易。
11
11
  */
12
12
  const yellowstone_grpc_1 = require("@triton-one/yellowstone-grpc");
13
13
  const yellowstone_grpc_solana_encoding_wasm_js_1 = require("@triton-one/yellowstone-grpc/dist/encoding/yellowstone_grpc_solana_encoding_wasm.js");
14
14
  const bs58_1 = __importDefault(require("bs58"));
15
15
  const web3_js_1 = require("@solana/web3.js");
16
- const unified_parser_js_1 = require("../core/unified_parser.js");
17
16
  const rpc_transaction_js_1 = require("../rpc_transaction.js");
18
17
  /**
19
18
  * Yellowstone `SubscribeUpdateTransactionInfo.index` → `EventMetadata.tx_index`。
@@ -45,15 +44,19 @@ function parseDexEventsFromGrpcTransactionInfo(info, slot, options) {
45
44
  const enc = yellowstone_grpc_1.txEncode.encode(y, yellowstone_grpc_solana_encoding_wasm_js_1.WasmUiTransactionEncoding.Binary, 0, false);
46
45
  const vt = web3_js_1.VersionedTransaction.deserialize(bs58_1.default.decode(enc.transaction));
47
46
  const meta = enc.meta;
48
- const logs = meta?.logMessages;
49
- if (!Array.isArray(logs) || logs.length === 0)
50
- return [];
51
47
  const slotNum = typeof slot === "bigint" ? Number(slot) : Number(slot);
52
48
  const signatureBase58 = bs58_1.default.encode(Uint8Array.from(info.signature));
53
49
  const txIndex = grpcTxIndexFromInfo(info);
54
- const events = (0, unified_parser_js_1.parseLogsOnly)(logs, signatureBase58, slotNum, options?.blockTimeUs, txIndex);
55
- if (events.length === 0)
56
- return [];
57
- (0, rpc_transaction_js_1.applyAccountFillsToLogEvents)(events, vt.message, meta);
58
- return events;
50
+ const blockTime = options?.blockTimeUs == null ? null : Math.floor(options.blockTimeUs / 1_000_000);
51
+ const parsed = (0, rpc_transaction_js_1.parseRpcTransaction)({
52
+ slot: slotNum,
53
+ blockTime,
54
+ meta,
55
+ transaction: vt,
56
+ }, signatureBase58, options?.eventTypeFilter, {
57
+ blockTimeUs: options?.blockTimeUs,
58
+ grpcRecvUs: options?.grpcRecvUs,
59
+ txIndex,
60
+ });
61
+ return parsed.ok ? parsed.events : [];
59
62
  }