solana-streamer-sdk 1.5.6

A low-latency Solana DEX event streaming facade over sol-parser-sdk with Yellowstone gRPC, ShredStream, and RPC parsing helpers.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
//! Orca Whirlpool and Meteora Pools / DLMM events with SDK-shaped payloads.
use crate::streaming::event_parser::common::EventMetadata;
use crate::streaming::event_parser::protocols::sol_parser_forward::events::{
    MeteoraDbcCurveCompleteEvent, MeteoraDbcInitializePoolEvent, MeteoraDbcSwapEvent,
    MeteoraDlmmAddLiquidityEvent, MeteoraDlmmClaimFeeEvent, MeteoraDlmmClosePositionEvent,
    MeteoraDlmmCreatePositionEvent, MeteoraDlmmInitializeBinArrayEvent,
    MeteoraDlmmInitializePoolEvent, MeteoraDlmmRemoveLiquidityEvent, MeteoraDlmmSwapEvent,
    MeteoraPoolsAddLiquidityEvent, MeteoraPoolsBootstrapLiquidityEvent,
    MeteoraPoolsPoolCreatedEvent, MeteoraPoolsRemoveLiquidityEvent, MeteoraPoolsSetPoolFeesEvent,
    MeteoraPoolsSwapEvent, OrcaFeeTierAccount, OrcaFeeTierAccountEvent, OrcaPositionAccount,
    OrcaPositionAccountEvent, OrcaPositionRewardInfo, OrcaTick, OrcaTickArrayAccount,
    OrcaTickArrayAccountEvent, OrcaWhirlpoolAccount, OrcaWhirlpoolAccountEvent,
    OrcaWhirlpoolLiquidityDecreasedEvent, OrcaWhirlpoolLiquidityIncreasedEvent,
    OrcaWhirlpoolPoolInitializedEvent, OrcaWhirlpoolRewardInfo, OrcaWhirlpoolSwapEvent,
    OrcaWhirlpoolsConfigAccount, OrcaWhirlpoolsConfigAccountEvent,
};

pub(crate) fn orca_swap_from_pb(
    e: sol_parser_sdk::core::events::OrcaWhirlpoolSwapEvent,
    meta: EventMetadata,
) -> OrcaWhirlpoolSwapEvent {
    OrcaWhirlpoolSwapEvent {
        metadata: meta,
        whirlpool: e.whirlpool,
        input_amount: e.input_amount,
        output_amount: e.output_amount,
        a_to_b: e.a_to_b,
        pre_sqrt_price: e.pre_sqrt_price,
        post_sqrt_price: e.post_sqrt_price,
        input_transfer_fee: e.input_transfer_fee,
        output_transfer_fee: e.output_transfer_fee,
        lp_fee: e.lp_fee,
        protocol_fee: e.protocol_fee,
    }
}

pub(crate) fn orca_liquidity_increased_from_pb(
    e: sol_parser_sdk::core::events::OrcaWhirlpoolLiquidityIncreasedEvent,
    meta: EventMetadata,
) -> OrcaWhirlpoolLiquidityIncreasedEvent {
    OrcaWhirlpoolLiquidityIncreasedEvent {
        metadata: meta,
        whirlpool: e.whirlpool,
        liquidity: e.liquidity,
        token_a_amount: e.token_a_amount,
        token_b_amount: e.token_b_amount,
        position: e.position,
        tick_lower_index: e.tick_lower_index,
        tick_upper_index: e.tick_upper_index,
        token_a_transfer_fee: e.token_a_transfer_fee,
        token_b_transfer_fee: e.token_b_transfer_fee,
    }
}

pub(crate) fn orca_liquidity_decreased_from_pb(
    e: sol_parser_sdk::core::events::OrcaWhirlpoolLiquidityDecreasedEvent,
    meta: EventMetadata,
) -> OrcaWhirlpoolLiquidityDecreasedEvent {
    OrcaWhirlpoolLiquidityDecreasedEvent {
        metadata: meta,
        whirlpool: e.whirlpool,
        liquidity: e.liquidity,
        token_a_amount: e.token_a_amount,
        token_b_amount: e.token_b_amount,
        position: e.position,
        tick_lower_index: e.tick_lower_index,
        tick_upper_index: e.tick_upper_index,
        token_a_transfer_fee: e.token_a_transfer_fee,
        token_b_transfer_fee: e.token_b_transfer_fee,
    }
}

pub(crate) fn orca_pool_initialized_from_pb(
    e: sol_parser_sdk::core::events::OrcaWhirlpoolPoolInitializedEvent,
    meta: EventMetadata,
) -> OrcaWhirlpoolPoolInitializedEvent {
    OrcaWhirlpoolPoolInitializedEvent {
        metadata: meta,
        whirlpool: e.whirlpool,
        whirlpools_config: e.whirlpools_config,
        token_mint_a: e.token_mint_a,
        token_mint_b: e.token_mint_b,
        tick_spacing: e.tick_spacing,
        token_program_a: e.token_program_a,
        token_program_b: e.token_program_b,
        decimals_a: e.decimals_a,
        decimals_b: e.decimals_b,
        initial_sqrt_price: e.initial_sqrt_price,
    }
}

fn orca_whirlpool_reward_from_pb(
    r: sol_parser_sdk::core::events::OrcaWhirlpoolRewardInfo,
) -> OrcaWhirlpoolRewardInfo {
    OrcaWhirlpoolRewardInfo {
        mint: r.mint,
        vault: r.vault,
        authority: r.authority,
        emissions_per_second_x64: r.emissions_per_second_x64,
        growth_global_x64: r.growth_global_x64,
    }
}

fn orca_position_reward_from_pb(
    r: sol_parser_sdk::core::events::OrcaPositionRewardInfo,
) -> OrcaPositionRewardInfo {
    OrcaPositionRewardInfo {
        growth_inside_checkpoint: r.growth_inside_checkpoint,
        amount_owed: r.amount_owed,
    }
}

fn orca_tick_from_pb(t: sol_parser_sdk::core::events::OrcaTick) -> OrcaTick {
    OrcaTick {
        initialized: t.initialized,
        liquidity_net: t.liquidity_net,
        liquidity_gross: t.liquidity_gross,
        fee_growth_outside_a: t.fee_growth_outside_a,
        fee_growth_outside_b: t.fee_growth_outside_b,
        reward_growths_outside: t.reward_growths_outside,
    }
}

pub(crate) fn orca_whirlpool_account_from_pb(
    e: sol_parser_sdk::core::events::OrcaWhirlpoolAccountEvent,
    meta: EventMetadata,
) -> OrcaWhirlpoolAccountEvent {
    OrcaWhirlpoolAccountEvent {
        metadata: meta,
        pubkey: e.pubkey,
        whirlpool: OrcaWhirlpoolAccount {
            whirlpools_config: e.whirlpool.whirlpools_config,
            whirlpool_bump: e.whirlpool.whirlpool_bump,
            tick_spacing: e.whirlpool.tick_spacing,
            tick_spacing_seed: e.whirlpool.tick_spacing_seed,
            fee_rate: e.whirlpool.fee_rate,
            protocol_fee_rate: e.whirlpool.protocol_fee_rate,
            liquidity: e.whirlpool.liquidity,
            sqrt_price: e.whirlpool.sqrt_price,
            tick_current_index: e.whirlpool.tick_current_index,
            protocol_fee_owed_a: e.whirlpool.protocol_fee_owed_a,
            protocol_fee_owed_b: e.whirlpool.protocol_fee_owed_b,
            token_mint_a: e.whirlpool.token_mint_a,
            token_vault_a: e.whirlpool.token_vault_a,
            fee_growth_global_a: e.whirlpool.fee_growth_global_a,
            token_mint_b: e.whirlpool.token_mint_b,
            token_vault_b: e.whirlpool.token_vault_b,
            fee_growth_global_b: e.whirlpool.fee_growth_global_b,
            reward_last_updated_timestamp: e.whirlpool.reward_last_updated_timestamp,
            reward_infos: e.whirlpool.reward_infos.map(orca_whirlpool_reward_from_pb),
        },
        ..Default::default()
    }
}

pub(crate) fn orca_position_account_from_pb(
    e: sol_parser_sdk::core::events::OrcaPositionAccountEvent,
    meta: EventMetadata,
) -> OrcaPositionAccountEvent {
    OrcaPositionAccountEvent {
        metadata: meta,
        pubkey: e.pubkey,
        position: OrcaPositionAccount {
            whirlpool: e.position.whirlpool,
            position_mint: e.position.position_mint,
            liquidity: e.position.liquidity,
            tick_lower_index: e.position.tick_lower_index,
            tick_upper_index: e.position.tick_upper_index,
            fee_growth_checkpoint_a: e.position.fee_growth_checkpoint_a,
            fee_owed_a: e.position.fee_owed_a,
            fee_growth_checkpoint_b: e.position.fee_growth_checkpoint_b,
            fee_owed_b: e.position.fee_owed_b,
            reward_infos: e.position.reward_infos.map(orca_position_reward_from_pb),
        },
        ..Default::default()
    }
}

pub(crate) fn orca_tick_array_account_from_pb(
    e: sol_parser_sdk::core::events::OrcaTickArrayAccountEvent,
    meta: EventMetadata,
) -> OrcaTickArrayAccountEvent {
    OrcaTickArrayAccountEvent {
        metadata: meta,
        pubkey: e.pubkey,
        tick_array: OrcaTickArrayAccount {
            start_tick_index: e.tick_array.start_tick_index,
            ticks: e.tick_array.ticks.into_iter().map(orca_tick_from_pb).collect(),
            whirlpool: e.tick_array.whirlpool,
        },
        ..Default::default()
    }
}

pub(crate) fn orca_fee_tier_account_from_pb(
    e: sol_parser_sdk::core::events::OrcaFeeTierAccountEvent,
    meta: EventMetadata,
) -> OrcaFeeTierAccountEvent {
    OrcaFeeTierAccountEvent {
        metadata: meta,
        pubkey: e.pubkey,
        fee_tier: OrcaFeeTierAccount {
            whirlpools_config: e.fee_tier.whirlpools_config,
            tick_spacing: e.fee_tier.tick_spacing,
            default_fee_rate: e.fee_tier.default_fee_rate,
        },
        ..Default::default()
    }
}

pub(crate) fn orca_whirlpools_config_account_from_pb(
    e: sol_parser_sdk::core::events::OrcaWhirlpoolsConfigAccountEvent,
    meta: EventMetadata,
) -> OrcaWhirlpoolsConfigAccountEvent {
    OrcaWhirlpoolsConfigAccountEvent {
        metadata: meta,
        pubkey: e.pubkey,
        config: OrcaWhirlpoolsConfigAccount {
            fee_authority: e.config.fee_authority,
            collect_protocol_fees_authority: e.config.collect_protocol_fees_authority,
            reward_emissions_super_authority: e.config.reward_emissions_super_authority,
            default_protocol_fee_rate: e.config.default_protocol_fee_rate,
        },
        ..Default::default()
    }
}

pub(crate) fn meteora_dbc_swap_from_pb(
    e: sol_parser_sdk::core::events::MeteoraDbcSwapEvent,
    meta: EventMetadata,
) -> MeteoraDbcSwapEvent {
    MeteoraDbcSwapEvent {
        metadata: meta,
        pool: e.pool,
        config: e.config,
        trade_direction: e.trade_direction,
        has_referral: e.has_referral,
        amount_in: e.amount_in,
        minimum_amount_out: e.minimum_amount_out,
        actual_input_amount: e.actual_input_amount,
        output_amount: e.output_amount,
        next_sqrt_price: e.next_sqrt_price,
        trading_fee: e.trading_fee,
        protocol_fee: e.protocol_fee,
        referral_fee: e.referral_fee,
        current_timestamp: e.current_timestamp,
    }
}

pub(crate) fn meteora_dbc_initialize_pool_from_pb(
    e: sol_parser_sdk::core::events::MeteoraDbcInitializePoolEvent,
    meta: EventMetadata,
) -> MeteoraDbcInitializePoolEvent {
    MeteoraDbcInitializePoolEvent {
        metadata: meta,
        pool: e.pool,
        config: e.config,
        creator: e.creator,
        base_mint: e.base_mint,
        pool_type: e.pool_type,
        activation_point: e.activation_point,
    }
}

pub(crate) fn meteora_dbc_curve_complete_from_pb(
    e: sol_parser_sdk::core::events::MeteoraDbcCurveCompleteEvent,
    meta: EventMetadata,
) -> MeteoraDbcCurveCompleteEvent {
    MeteoraDbcCurveCompleteEvent {
        metadata: meta,
        pool: e.pool,
        config: e.config,
        base_reserve: e.base_reserve,
        quote_reserve: e.quote_reserve,
    }
}

pub(crate) fn meteora_pools_swap_from_pb(
    e: sol_parser_sdk::core::events::MeteoraPoolsSwapEvent,
    meta: EventMetadata,
) -> MeteoraPoolsSwapEvent {
    MeteoraPoolsSwapEvent {
        metadata: meta,
        in_amount: e.in_amount,
        out_amount: e.out_amount,
        trade_fee: e.trade_fee,
        admin_fee: e.admin_fee,
        host_fee: e.host_fee,
    }
}

pub(crate) fn meteora_pools_add_liquidity_from_pb(
    e: sol_parser_sdk::core::events::MeteoraPoolsAddLiquidityEvent,
    meta: EventMetadata,
) -> MeteoraPoolsAddLiquidityEvent {
    MeteoraPoolsAddLiquidityEvent {
        metadata: meta,
        lp_mint_amount: e.lp_mint_amount,
        token_a_amount: e.token_a_amount,
        token_b_amount: e.token_b_amount,
    }
}

pub(crate) fn meteora_pools_remove_liquidity_from_pb(
    e: sol_parser_sdk::core::events::MeteoraPoolsRemoveLiquidityEvent,
    meta: EventMetadata,
) -> MeteoraPoolsRemoveLiquidityEvent {
    MeteoraPoolsRemoveLiquidityEvent {
        metadata: meta,
        lp_unmint_amount: e.lp_unmint_amount,
        token_a_out_amount: e.token_a_out_amount,
        token_b_out_amount: e.token_b_out_amount,
    }
}

pub(crate) fn meteora_pools_bootstrap_from_pb(
    e: sol_parser_sdk::core::events::MeteoraPoolsBootstrapLiquidityEvent,
    meta: EventMetadata,
) -> MeteoraPoolsBootstrapLiquidityEvent {
    MeteoraPoolsBootstrapLiquidityEvent {
        metadata: meta,
        lp_mint_amount: e.lp_mint_amount,
        token_a_amount: e.token_a_amount,
        token_b_amount: e.token_b_amount,
        pool: e.pool,
    }
}

pub(crate) fn meteora_pools_pool_created_from_pb(
    e: sol_parser_sdk::core::events::MeteoraPoolsPoolCreatedEvent,
    meta: EventMetadata,
) -> MeteoraPoolsPoolCreatedEvent {
    MeteoraPoolsPoolCreatedEvent {
        metadata: meta,
        lp_mint: e.lp_mint,
        token_a_mint: e.token_a_mint,
        token_b_mint: e.token_b_mint,
        pool_type: e.pool_type,
        pool: e.pool,
    }
}

pub(crate) fn meteora_pools_set_fees_from_pb(
    e: sol_parser_sdk::core::events::MeteoraPoolsSetPoolFeesEvent,
    meta: EventMetadata,
) -> MeteoraPoolsSetPoolFeesEvent {
    MeteoraPoolsSetPoolFeesEvent {
        metadata: meta,
        trade_fee_numerator: e.trade_fee_numerator,
        trade_fee_denominator: e.trade_fee_denominator,
        owner_trade_fee_numerator: e.owner_trade_fee_numerator,
        owner_trade_fee_denominator: e.owner_trade_fee_denominator,
        pool: e.pool,
    }
}

pub(crate) fn meteora_dlmm_swap_from_pb(
    e: sol_parser_sdk::core::events::MeteoraDlmmSwapEvent,
    meta: EventMetadata,
) -> MeteoraDlmmSwapEvent {
    MeteoraDlmmSwapEvent {
        metadata: meta,
        pool: e.pool,
        from: e.from,
        start_bin_id: e.start_bin_id,
        end_bin_id: e.end_bin_id,
        amount_in: e.amount_in,
        amount_out: e.amount_out,
        swap_for_y: e.swap_for_y,
        fee: e.fee,
        protocol_fee: e.protocol_fee,
        fee_bps: e.fee_bps,
        host_fee: e.host_fee,
    }
}

pub(crate) fn meteora_dlmm_add_liquidity_from_pb(
    e: sol_parser_sdk::core::events::MeteoraDlmmAddLiquidityEvent,
    meta: EventMetadata,
) -> MeteoraDlmmAddLiquidityEvent {
    MeteoraDlmmAddLiquidityEvent {
        metadata: meta,
        pool: e.pool,
        from: e.from,
        position: e.position,
        amounts: e.amounts,
        active_bin_id: e.active_bin_id,
    }
}

pub(crate) fn meteora_dlmm_remove_liquidity_from_pb(
    e: sol_parser_sdk::core::events::MeteoraDlmmRemoveLiquidityEvent,
    meta: EventMetadata,
) -> MeteoraDlmmRemoveLiquidityEvent {
    MeteoraDlmmRemoveLiquidityEvent {
        metadata: meta,
        pool: e.pool,
        from: e.from,
        position: e.position,
        amounts: e.amounts,
        active_bin_id: e.active_bin_id,
    }
}

pub(crate) fn meteora_dlmm_init_pool_from_pb(
    e: sol_parser_sdk::core::events::MeteoraDlmmInitializePoolEvent,
    meta: EventMetadata,
) -> MeteoraDlmmInitializePoolEvent {
    MeteoraDlmmInitializePoolEvent {
        metadata: meta,
        pool: e.pool,
        creator: e.creator,
        active_bin_id: e.active_bin_id,
        bin_step: e.bin_step,
    }
}

pub(crate) fn meteora_dlmm_init_bin_array_from_pb(
    e: sol_parser_sdk::core::events::MeteoraDlmmInitializeBinArrayEvent,
    meta: EventMetadata,
) -> MeteoraDlmmInitializeBinArrayEvent {
    MeteoraDlmmInitializeBinArrayEvent {
        metadata: meta,
        pool: e.pool,
        bin_array: e.bin_array,
        index: e.index,
    }
}

pub(crate) fn meteora_dlmm_create_position_from_pb(
    e: sol_parser_sdk::core::events::MeteoraDlmmCreatePositionEvent,
    meta: EventMetadata,
) -> MeteoraDlmmCreatePositionEvent {
    MeteoraDlmmCreatePositionEvent {
        metadata: meta,
        pool: e.pool,
        position: e.position,
        owner: e.owner,
        lower_bin_id: e.lower_bin_id,
        width: e.width,
    }
}

pub(crate) fn meteora_dlmm_close_position_from_pb(
    e: sol_parser_sdk::core::events::MeteoraDlmmClosePositionEvent,
    meta: EventMetadata,
) -> MeteoraDlmmClosePositionEvent {
    MeteoraDlmmClosePositionEvent {
        metadata: meta,
        pool: e.pool,
        position: e.position,
        owner: e.owner,
    }
}

pub(crate) fn meteora_dlmm_claim_fee_from_pb(
    e: sol_parser_sdk::core::events::MeteoraDlmmClaimFeeEvent,
    meta: EventMetadata,
) -> MeteoraDlmmClaimFeeEvent {
    MeteoraDlmmClaimFeeEvent {
        metadata: meta,
        pool: e.pool,
        position: e.position,
        owner: e.owner,
        fee_x: e.fee_x,
        fee_y: e.fee_y,
    }
}