sol-parser-sdk-python 0.5.15__tar.gz → 0.5.16__tar.gz
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.
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/PKG-INFO +25 -18
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/README.md +24 -17
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/README_CN.md +24 -17
- sol_parser_sdk_python-0.5.16/docs/releases/v0.5.16.md +18 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/pump_shred_routes.py +4 -1
- sol_parser_sdk_python-0.5.16/examples/raw_instruction_filter.py +16 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/pyproject.toml +1 -1
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/__init__.py +2 -2
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/event_types.py +2 -2
- sol_parser_sdk_python-0.5.16/sol_parser/raw_instruction.py +77 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/shredstream_client.py +4 -3
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_raw_instruction.py +33 -0
- sol_parser_sdk_python-0.5.15/sol_parser/raw_instruction.py +0 -15
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/.env.example +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/.gitignore +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/docs/USAGE.md +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/docs/releases/v0.5.15.md +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/block_meta_stream.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/amm_v4_grpc_refresh_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/batch2_cpmm_simulations_20261003.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/block_meta_grpc_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/cached_damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/cached_tip_routes_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/cpmm_lp_simulations_20261006.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/pump_curve_instruction.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/pump_shred_routes.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/pumpfun_current_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/pumpfun_funded_sell_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/pumpfun_settlement_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/pumpfun_usdc_multihop_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/pumpswap_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/raw_instructions.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/simulation_ata_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/fixtures/simulation_routes_live_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/hot_path_benchmark.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/hot_path_benchmark.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/meteora_damm_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/multi_protocol_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/offline_bank/README.md +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/offline_bank/config.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/offline_bank/expected.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/offline_bank/programs.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/offline_bank/snapshot.json.gz +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/parse_tx_by_signature.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/pump_execution_replay.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/pump_offline_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/pumpfun_quick_test.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/pumpfun_trade_filter.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/pumpfun_with_metrics.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/pumpswap_low_latency.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/pumpswap_with_metrics.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/rust_example_utils.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/simulation_routes.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/stonkfun_routes.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/stonkfun_snapshot_refresh.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/scripts/bench_parser.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/scripts/gen_golden_rust.sh +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/account_dispatcher.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/account_fillers/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/account_fillers/meteora.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/account_fillers/orca.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/account_fillers/pumpfun.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/account_fillers/pumpswap.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/account_fillers/raydium.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/account_fillers/raydium_launchlab.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/accounts/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/accounts/raydium_orca.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/accounts/rpc_wallet.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/accounts/utils.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/block_meta.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/check_migration.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/clock.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/common/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/dex_parsers.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/entries_decode.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/env_config.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/event_type_parity.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/geyser_pb2.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/geyser_pb2_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/grpc/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/grpc/geyser_connect.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/grpc/subscribe_builder.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/grpc/transaction_meta.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/grpc_client.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/grpc_instruction_parser.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/grpc_types.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/inner_instruction_parser.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/instr/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/instr_account_utils.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/instructions.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/json_util.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/liquidity_snapshot.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/log_instr_dedup.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/logs/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/market.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/merger.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/order_buffer.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/parser.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/pump_routes.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/pump_upgrade.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/pumpfun_fee_enrich.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/rpc_parser.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/rust_api_inventory.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/rust_event_json.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/shredstream_pb2.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/shredstream_pb2_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/shredstream_pumpfun.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/simulation_route.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/solana_storage_pb2.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/solana_storage_pb2_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/stonkfun_registry.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/transaction_route.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/u128_parity.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/verify_discriminators.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/wire_transaction.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/account_lifecycle_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/cached_damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/cached_tip_routes_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/clmm_fee_rewards_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/clmm_liquidity_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/clmm_one_sided_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/cpmm_liquidity_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/cpmm_lp_simulations_20261006.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_borrow_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_cpi_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_dual_claims_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_reward_admin_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_reward_renewal_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_reward_withdraw_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_upstream_hook_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_v1_config2_instruction_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_v1_live_simulations_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_v2_authority_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_v2_fees_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_v2_liquidity_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_v2_rewards_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/damm_v2_vesting_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/dbc_boundary_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/dbc_live_simulations_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/dbc_migration_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/dbc_referral_live_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/dbc_swap2.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/dbc_v1_migration_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/dlmm_fees_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/dlmm_hook_rewards_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/dlmm_rewards_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/golden_parse_log.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/launchlab_migration_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/native_settlement_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_compact_simulations_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_depth2_20261014.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_execution_20261019.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_holder_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_routes_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_synthetic_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_upgrade/account_context.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_upgrade/boost_account_context.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_upgrade/events.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_upgrade/mainnet.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_upgrade/pump_trade_account_context.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pump_upgrade/simulation_events.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_concentrated_multihop_mainnet_simulations_20261005.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/2MfmZSU8mWEbskNHAxQGphAyB5x72SC2HYuAkLeSyH6MjttUHqUjm24wPMeH7zrCoQoYFwbLeiFE571mc8WvgZyL.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/2dabmQiykzC1tsNmgtRFbsRJjEKMfUySgScJc2J2uq8CQtoXWZ3YyT99p3nVuCXifEhLkyUe4Sf4nfe2UkFT8AJr.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/2eVpZNvQYPMBVNT5357Qt7HVAUSv9gdwqxKStvdwQ498rcJLLCHVcYPaGfFqVBz44ndYvkA1H4CwjBuDSviAj7jp.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/3GufGVVRrnrH1Yuto57jDeTKXeki6ooE9w6h4qYRvNm5FcCpxwDHNvzHXdpAMbxRmukWJpSPHUKHEjnFTCC979ka.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/3LQK2JHVbVSSfyCYwTwzoYTY9NEN4gZXzqw3TvAvMJHsvPsopCHtsa5ALhj4tFn8xWbmJ5DsYMMcnPukTBkSjtQf.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/3MRWKDUcD5CGn5Xz4qWyGA8Y9udw4SsSr4gcxCjTUqCFt6Zc6uiwHF1wLZXKoqBcGEM2kruBS85ymYxmYk8FLGBk.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/3NBSCgAXpNqg7JBUzp6RsfZYzf2QbbHi6r2wcoBF4Lpuzozae7ExUJUGoqpVCXXs8cbibr6aWySH1bsg86Enuhez.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/3QVpcUq64D4DUV9empFr3G98pCEa1Cp2fAcFJKyiJGsQ2ir2S4yBLhHYXPNmLfCE8KVDgLApfBYTFM7pf9JVPbsb.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/3REXMDkvZsWvgc8czYpfn24avz18APMuzbV2VgQBeymArdJvfQcfcpKr46f3j1H2bAiymFneaNocPH7KzPUPbR1S.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/3ejAydePsZTUfeZaU9eiAM37gV5AYPG9hhyMtUobJLQtSMgroDeiE8njXu2JiwMyX5YJLp3vrfNPy89S7EDdUCAy.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/3zC4bw1osyebZ77KagXYP3b5rEBHvJCgcwCriCLc5gAUp9Ev6Bx5ZMbqnYpkKE2VgZgMFcZN5FYKQfcKL45MWpyu.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/5PgkFgTLSEZPZhxgWNToPzTZct95SycuaH9H3g82YwcKXudtiynEZmiaoQrhGv2gdZLrvsVZ5Wn88KGirbFYpLrt.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_create/661yA5s6uxUsggTcT4cZ6yyMfNmF4mCZzxLnCb1zBrSY3YhAiouYXBitiPvkngBEKxaeGcpXiek6qXDajiRr9wuY.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_current_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_funded_sell_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_settlement_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpfun_usdc_multihop_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpswap_liquidity_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/pumpswap_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/review10_compiled_bounds.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/review10_prefunded_ata.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/review10_wire_bounds.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/signed_alt_load_rejections_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/signed_clmm_boundaries_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/signed_cpmm_bank_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/signed_dex_replay_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/signed_identical_alt_bank_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/signed_multileg_bank_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/signed_nested_cpi_bank_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/signed_replay_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/signed_wire_boundaries_20261009.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/simulation_alt_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/simulation_ata_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/simulation_routes_live_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/stonkfun_routes_0_7_7.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/whirlpool_fees_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/whirlpool_hook_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/whirlpool_liquidity_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/fixtures/whirlpool_one_sided_20261008.json +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_amm_v4_v2.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_block_meta.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_clmm_fee_rewards_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_clmm_liquidity_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_clmm_one_sided_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_cpmm_liquidity_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_borrow_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_cpi_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_dual_claims_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_reward_admin_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_reward_renewal_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_reward_withdraw_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_upstream_hook_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_v1_live_simulations.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_v2_authority_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_v2_fees_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_v2_liquidity_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_v2_rewards_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_damm_v2_vesting_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_dbc_boundary_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_dbc_migration_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_dbc_upgrade.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_dbc_v1_migration_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_dex_retry_delay.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_dlmm_fees_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_dlmm_hook_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_dlmm_rewards_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_exact_metadata_json.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_filter_and_account_parity.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_golden.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_grpc_unary_methods.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_hot_path_wire_decoder.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_imports_and_inner.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_launchlab_invocation_anchor.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_launchlab_migration_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_log_instr_dedup.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_market_helpers.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_native_grpc_server.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_native_plan_lifecycle.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_orca_whirlpool_instruction_parity.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_order_buffer.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_ordered_late_regression.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_prefix_prefilter.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_protocol_current_fields.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_compact_simulation_routes.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_depth2.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_execution.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_fees_instruction_parity.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_holder_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_offline_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_routes_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_shred_routes.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_synthetic_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_trade_account_context.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_trade_merge_identity.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_upgrade_events.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pump_upgrade_mainnet.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pumpfun_account_fill.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pumpfun_create_regression.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pumpfun_trade_tail.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pumpfun_v2_parity.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pumpswap_account_context.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pumpswap_instruction.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pumpswap_liquidity_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_pumpswap_upgrade.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_raydium_clmm_instruction_parity.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_raydium_current_logs.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_review10.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_review_batch2.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_shred_wire_sanitize.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_shredstream.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_signed_transaction_replay.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_simulation_route.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_snapshot_refresh_example.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_stonkfun_routes.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_whirlpool_fees_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_whirlpool_hook_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_whirlpool_liquidity_bank.py +0 -0
- {sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/tests/test_whirlpool_one_sided_bank.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sol-parser-sdk-python
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.16
|
|
4
4
|
Summary: Solana DEX program log parsing (pure Python, API aligned with sol-parser-sdk)
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Requires-Dist: base58>=2.0
|
|
@@ -22,7 +22,12 @@ Description-Content-Type: text/markdown
|
|
|
22
22
|
|
|
23
23
|
<div align="center">
|
|
24
24
|
|
|
25
|
-
## v0.5.
|
|
25
|
+
## v0.5.16 — DEX-scoped RawInstruction and typed DEX identifiers
|
|
26
|
+
|
|
27
|
+
Raw instructions now respect DEX subscriptions using programs referenced by each instruction. `RawInstructionDexType` provides typed identifiers with unchanged JSON strings. Unknown router layouts do not establish pool addresses, trade direction, or method versions.
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
## v0.5.16 — Pump execution replay
|
|
26
31
|
|
|
27
32
|
Current Anchor TradeEvent CPI decoding is supported alongside the historical encoding. RPC/gRPC instruction budgets and minimum outputs remain in instruction fields. Execution fields `sol_amount`, `quote_amount`, and `token_amount` come from execution events; without logs or event CPIs they remain zero (unavailable, not a proven zero fill).
|
|
28
33
|
|
|
@@ -30,13 +35,15 @@ Run `.venv/bin/python examples/pump_execution_replay.py` from this repository to
|
|
|
30
35
|
|
|
31
36
|
The current Delta sell signature is `4ARos3Yq1SMNE3izDpy9YdKrRgMmD7UCDxvnVrBRaGCJHiifPHSmQWc4DPfjUaEUcxS7puGmEN64K7EZdeXLJaj2` (slot 458542546). The dated fixture also includes Rapid create/buy, BuyV3, and PumpSwap buy with their full signatures and slots. Older five-combination multi-hop fixtures are retained as regression tests, not labeled as new mainnet captures.
|
|
32
37
|
|
|
33
|
-
## v0.5.
|
|
38
|
+
## v0.5.16 — raw Shred instructions
|
|
34
39
|
|
|
35
40
|
Default Shred parsing emits `RawInstruction` for unsupported third-party programs, including Rapid/Delta, without inferring direction, amounts, or internal buy methods. Infrastructure programs (System, Token, ATA, ComputeBudget, etc.) are omitted by default. Supported official DEX parsers are unchanged; official Pump/PumpSwap multi-hop instructions retain `PumpRouteIntent`.
|
|
36
41
|
|
|
37
42
|
The payload contains `program_id`, `instruction_index`, `accounts`, `account_indices`, `instruction_data`, and transaction metadata. Account order and duplicates are preserved. Unresolved ALT addresses are null/None, with original indices retained; supply cached loaded addresses or a resolver. No hot-path RPC is performed. Data is copied verbatim without requiring a known layout.
|
|
38
43
|
|
|
39
|
-
|
|
44
|
+
Run `uv run python examples/raw_instruction_filter.py` to compare PumpFun-only, Raydium CPMM-only, and all-raw subscriptions against signed offline transactions; the output includes `dexes`.
|
|
45
|
+
|
|
46
|
+
Without a filter, unknown third-party instructions are returned. Broad trade/swap filters (for example `PumpFunTrade` or `RaydiumCpmmSwap`) also return raw instructions associated with that DEX; direction-specific filters do not infer a buy or sell. Explicit `RawInstruction` selects all outer instructions only when no protocol restriction is set; streamer protocol restrictions always apply. Excluding `RawInstruction` wins. `dex_type` uses the public `RawInstructionDexType` enum (typed string constants in Go); JSON values remain unchanged, such as `"pumpfun"` and `"raydium_cpmm"`. `dexes` contains `{ dex_type, program_id, pool }` for each recognized DEX program targeted or referenced by this instruction, not other instructions in the transaction. Multi-DEX wrappers retain every association. Unknown or unresolved ALT references cannot satisfy a DEX subscription. `pool` is currently null: an unknown wrapper layout cannot establish the pool account. A program reference is not proof of an executed CPI. Raw callbacks are not fills.
|
|
40
47
|
|
|
41
48
|
Wrapper adapter functions remain explicit compatibility helpers only; default Shred parsing does not call them. The released-version history below describes previous behavior.
|
|
42
49
|
|
|
@@ -79,11 +86,11 @@ Parser SDK language versions and related Rust SDKs:
|
|
|
79
86
|
|
|
80
87
|
| Language | Repository | Description | Version |
|
|
81
88
|
|----------|------------|-------------|---------|
|
|
82
|
-
| Rust | [sol-parser-sdk](https://github.com/0xfnzero/sol-parser-sdk) | Solana DEX transaction and account event parsing | `v0.7.
|
|
83
|
-
| Node.js | [sol-parser-sdk-nodejs](https://github.com/0xfnzero/sol-parser-sdk-nodejs) | TypeScript/JavaScript for Node.js | `v0.5.
|
|
84
|
-
| Python | [sol-parser-sdk-python](https://github.com/0xfnzero/sol-parser-sdk-python) | Async/await native support | `v0.5.
|
|
85
|
-
| Go | [sol-parser-sdk-golang](https://github.com/0xfnzero/sol-parser-sdk-golang) | Go transaction and account event parsing | `v0.5.
|
|
86
|
-
| **Rust** | [sol-shred-sdk](https://github.com/0xfnzero/sol-shred-sdk) | Raw Solana shred decoding and ShredStream DEX event parsing | `v4.0.
|
|
89
|
+
| Rust | [sol-parser-sdk](https://github.com/0xfnzero/sol-parser-sdk) | Solana DEX transaction and account event parsing | `v0.7.17` |
|
|
90
|
+
| Node.js | [sol-parser-sdk-nodejs](https://github.com/0xfnzero/sol-parser-sdk-nodejs) | TypeScript/JavaScript for Node.js | `v0.5.23` |
|
|
91
|
+
| Python | [sol-parser-sdk-python](https://github.com/0xfnzero/sol-parser-sdk-python) | Async/await native support | `v0.5.16` |
|
|
92
|
+
| Go | [sol-parser-sdk-golang](https://github.com/0xfnzero/sol-parser-sdk-golang) | Go transaction and account event parsing | `v0.5.16` |
|
|
93
|
+
| **Rust** | [sol-shred-sdk](https://github.com/0xfnzero/sol-shred-sdk) | Raw Solana shred decoding and ShredStream DEX event parsing | `v4.0.8` |
|
|
87
94
|
| **Rust** | [sol-trade-sdk](https://github.com/0xfnzero/sol-trade-sdk) | Solana DEX trade construction and transaction execution | `v6.0.2` |
|
|
88
95
|
|
|
89
96
|
---
|
|
@@ -175,7 +182,7 @@ This is the Python implementation of the FnZero Solana DEX parser SDK for asynci
|
|
|
175
182
|
**From PyPI**
|
|
176
183
|
|
|
177
184
|
```bash
|
|
178
|
-
pip install sol-parser-sdk-python==0.5.
|
|
185
|
+
pip install sol-parser-sdk-python==0.5.16
|
|
179
186
|
```
|
|
180
187
|
|
|
181
188
|
**From source**
|
|
@@ -291,18 +298,18 @@ From the **package root** after `pip install -e .`. Run with `python examples/<f
|
|
|
291
298
|
| Description | Run command | Source |
|
|
292
299
|
|-------------|-------------|--------|
|
|
293
300
|
| **PumpFun** | | |
|
|
294
|
-
| PumpFun trade filtering | `python examples/pumpfun_trade_filter.py` | [pumpfun_trade_filter.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_trade_filter.py) | `v0.5.
|
|
295
|
-
| PumpFun events + metrics | `python examples/pumpfun_with_metrics.py` | [pumpfun_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_with_metrics.py) | `v0.5.
|
|
296
|
-
| Quick PumpFun connection test | `python examples/pumpfun_quick_test.py` | [pumpfun_quick_test.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_quick_test.py) | `v0.5.
|
|
301
|
+
| PumpFun trade filtering | `python examples/pumpfun_trade_filter.py` | [pumpfun_trade_filter.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_trade_filter.py) | `v0.5.16` |
|
|
302
|
+
| PumpFun events + metrics | `python examples/pumpfun_with_metrics.py` | [pumpfun_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_with_metrics.py) | `v0.5.16` |
|
|
303
|
+
| Quick PumpFun connection test | `python examples/pumpfun_quick_test.py` | [pumpfun_quick_test.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_quick_test.py) | `v0.5.16` |
|
|
297
304
|
| **PumpSwap** | | |
|
|
298
|
-
| PumpSwap ultra-low latency | `python examples/pumpswap_low_latency.py` | [pumpswap_low_latency.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_low_latency.py) | `v0.5.
|
|
299
|
-
| PumpSwap events + metrics | `python examples/pumpswap_with_metrics.py` | [pumpswap_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_with_metrics.py) | `v0.5.
|
|
305
|
+
| PumpSwap ultra-low latency | `python examples/pumpswap_low_latency.py` | [pumpswap_low_latency.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_low_latency.py) | `v0.5.16` |
|
|
306
|
+
| PumpSwap events + metrics | `python examples/pumpswap_with_metrics.py` | [pumpswap_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_with_metrics.py) | `v0.5.16` |
|
|
300
307
|
| **Meteora DAMM** | | |
|
|
301
|
-
| Meteora DAMM V2 events | `python examples/meteora_damm_grpc.py` | [meteora_damm_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/meteora_damm_grpc.py) | `v0.5.
|
|
308
|
+
| Meteora DAMM V2 events | `python examples/meteora_damm_grpc.py` | [meteora_damm_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/meteora_damm_grpc.py) | `v0.5.16` |
|
|
302
309
|
| **Multi-protocol** | | |
|
|
303
|
-
| Subscribe to every program in Rust `Protocol` / `program_ids` | `python examples/multi_protocol_grpc.py` | [multi_protocol_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/multi_protocol_grpc.py) | `v0.5.
|
|
310
|
+
| Subscribe to every program in Rust `Protocol` / `program_ids` | `python examples/multi_protocol_grpc.py` | [multi_protocol_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/multi_protocol_grpc.py) | `v0.5.16` |
|
|
304
311
|
| **Utility** | | |
|
|
305
|
-
| Parse tx by signature (HTTP RPC; not gRPC). `TX_SIGNATURE` / `RPC_URL` or `SOLANA_RPC_URL` in `.env` or `--sig` / `--rpc`. | `python examples/parse_tx_by_signature.py` | [parse_tx_by_signature.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/parse_tx_by_signature.py) | `v0.5.
|
|
312
|
+
| Parse tx by signature (HTTP RPC; not gRPC). `TX_SIGNATURE` / `RPC_URL` or `SOLANA_RPC_URL` in `.env` or `--sig` / `--rpc`. | `python examples/parse_tx_by_signature.py` | [parse_tx_by_signature.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/parse_tx_by_signature.py) | `v0.5.16` |
|
|
306
313
|
|
|
307
314
|
**Env:** gRPC examples need **`GRPC_URL`** or **`GRPC_ENDPOINT`**, plus **`GRPC_AUTH_TOKEN`** or **`GRPC_TOKEN`** (or legacy `GEYSER_*`). See **`.env.example`**.
|
|
308
315
|
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
## v0.5.
|
|
3
|
+
## v0.5.16 — DEX-scoped RawInstruction and typed DEX identifiers
|
|
4
|
+
|
|
5
|
+
Raw instructions now respect DEX subscriptions using programs referenced by each instruction. `RawInstructionDexType` provides typed identifiers with unchanged JSON strings. Unknown router layouts do not establish pool addresses, trade direction, or method versions.
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## v0.5.16 — Pump execution replay
|
|
4
9
|
|
|
5
10
|
Current Anchor TradeEvent CPI decoding is supported alongside the historical encoding. RPC/gRPC instruction budgets and minimum outputs remain in instruction fields. Execution fields `sol_amount`, `quote_amount`, and `token_amount` come from execution events; without logs or event CPIs they remain zero (unavailable, not a proven zero fill).
|
|
6
11
|
|
|
@@ -8,13 +13,15 @@ Run `.venv/bin/python examples/pump_execution_replay.py` from this repository to
|
|
|
8
13
|
|
|
9
14
|
The current Delta sell signature is `4ARos3Yq1SMNE3izDpy9YdKrRgMmD7UCDxvnVrBRaGCJHiifPHSmQWc4DPfjUaEUcxS7puGmEN64K7EZdeXLJaj2` (slot 458542546). The dated fixture also includes Rapid create/buy, BuyV3, and PumpSwap buy with their full signatures and slots. Older five-combination multi-hop fixtures are retained as regression tests, not labeled as new mainnet captures.
|
|
10
15
|
|
|
11
|
-
## v0.5.
|
|
16
|
+
## v0.5.16 — raw Shred instructions
|
|
12
17
|
|
|
13
18
|
Default Shred parsing emits `RawInstruction` for unsupported third-party programs, including Rapid/Delta, without inferring direction, amounts, or internal buy methods. Infrastructure programs (System, Token, ATA, ComputeBudget, etc.) are omitted by default. Supported official DEX parsers are unchanged; official Pump/PumpSwap multi-hop instructions retain `PumpRouteIntent`.
|
|
14
19
|
|
|
15
20
|
The payload contains `program_id`, `instruction_index`, `accounts`, `account_indices`, `instruction_data`, and transaction metadata. Account order and duplicates are preserved. Unresolved ALT addresses are null/None, with original indices retained; supply cached loaded addresses or a resolver. No hot-path RPC is performed. Data is copied verbatim without requiring a known layout.
|
|
16
21
|
|
|
17
|
-
|
|
22
|
+
Run `uv run python examples/raw_instruction_filter.py` to compare PumpFun-only, Raydium CPMM-only, and all-raw subscriptions against signed offline transactions; the output includes `dexes`.
|
|
23
|
+
|
|
24
|
+
Without a filter, unknown third-party instructions are returned. Broad trade/swap filters (for example `PumpFunTrade` or `RaydiumCpmmSwap`) also return raw instructions associated with that DEX; direction-specific filters do not infer a buy or sell. Explicit `RawInstruction` selects all outer instructions only when no protocol restriction is set; streamer protocol restrictions always apply. Excluding `RawInstruction` wins. `dex_type` uses the public `RawInstructionDexType` enum (typed string constants in Go); JSON values remain unchanged, such as `"pumpfun"` and `"raydium_cpmm"`. `dexes` contains `{ dex_type, program_id, pool }` for each recognized DEX program targeted or referenced by this instruction, not other instructions in the transaction. Multi-DEX wrappers retain every association. Unknown or unresolved ALT references cannot satisfy a DEX subscription. `pool` is currently null: an unknown wrapper layout cannot establish the pool account. A program reference is not proof of an executed CPI. Raw callbacks are not fills.
|
|
18
25
|
|
|
19
26
|
Wrapper adapter functions remain explicit compatibility helpers only; default Shred parsing does not call them. The released-version history below describes previous behavior.
|
|
20
27
|
|
|
@@ -57,11 +64,11 @@ Parser SDK language versions and related Rust SDKs:
|
|
|
57
64
|
|
|
58
65
|
| Language | Repository | Description | Version |
|
|
59
66
|
|----------|------------|-------------|---------|
|
|
60
|
-
| Rust | [sol-parser-sdk](https://github.com/0xfnzero/sol-parser-sdk) | Solana DEX transaction and account event parsing | `v0.7.
|
|
61
|
-
| Node.js | [sol-parser-sdk-nodejs](https://github.com/0xfnzero/sol-parser-sdk-nodejs) | TypeScript/JavaScript for Node.js | `v0.5.
|
|
62
|
-
| Python | [sol-parser-sdk-python](https://github.com/0xfnzero/sol-parser-sdk-python) | Async/await native support | `v0.5.
|
|
63
|
-
| Go | [sol-parser-sdk-golang](https://github.com/0xfnzero/sol-parser-sdk-golang) | Go transaction and account event parsing | `v0.5.
|
|
64
|
-
| **Rust** | [sol-shred-sdk](https://github.com/0xfnzero/sol-shred-sdk) | Raw Solana shred decoding and ShredStream DEX event parsing | `v4.0.
|
|
67
|
+
| Rust | [sol-parser-sdk](https://github.com/0xfnzero/sol-parser-sdk) | Solana DEX transaction and account event parsing | `v0.7.17` |
|
|
68
|
+
| Node.js | [sol-parser-sdk-nodejs](https://github.com/0xfnzero/sol-parser-sdk-nodejs) | TypeScript/JavaScript for Node.js | `v0.5.23` |
|
|
69
|
+
| Python | [sol-parser-sdk-python](https://github.com/0xfnzero/sol-parser-sdk-python) | Async/await native support | `v0.5.16` |
|
|
70
|
+
| Go | [sol-parser-sdk-golang](https://github.com/0xfnzero/sol-parser-sdk-golang) | Go transaction and account event parsing | `v0.5.16` |
|
|
71
|
+
| **Rust** | [sol-shred-sdk](https://github.com/0xfnzero/sol-shred-sdk) | Raw Solana shred decoding and ShredStream DEX event parsing | `v4.0.8` |
|
|
65
72
|
| **Rust** | [sol-trade-sdk](https://github.com/0xfnzero/sol-trade-sdk) | Solana DEX trade construction and transaction execution | `v6.0.2` |
|
|
66
73
|
|
|
67
74
|
---
|
|
@@ -153,7 +160,7 @@ This is the Python implementation of the FnZero Solana DEX parser SDK for asynci
|
|
|
153
160
|
**From PyPI**
|
|
154
161
|
|
|
155
162
|
```bash
|
|
156
|
-
pip install sol-parser-sdk-python==0.5.
|
|
163
|
+
pip install sol-parser-sdk-python==0.5.16
|
|
157
164
|
```
|
|
158
165
|
|
|
159
166
|
**From source**
|
|
@@ -269,18 +276,18 @@ From the **package root** after `pip install -e .`. Run with `python examples/<f
|
|
|
269
276
|
| Description | Run command | Source |
|
|
270
277
|
|-------------|-------------|--------|
|
|
271
278
|
| **PumpFun** | | |
|
|
272
|
-
| PumpFun trade filtering | `python examples/pumpfun_trade_filter.py` | [pumpfun_trade_filter.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_trade_filter.py) | `v0.5.
|
|
273
|
-
| PumpFun events + metrics | `python examples/pumpfun_with_metrics.py` | [pumpfun_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_with_metrics.py) | `v0.5.
|
|
274
|
-
| Quick PumpFun connection test | `python examples/pumpfun_quick_test.py` | [pumpfun_quick_test.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_quick_test.py) | `v0.5.
|
|
279
|
+
| PumpFun trade filtering | `python examples/pumpfun_trade_filter.py` | [pumpfun_trade_filter.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_trade_filter.py) | `v0.5.16` |
|
|
280
|
+
| PumpFun events + metrics | `python examples/pumpfun_with_metrics.py` | [pumpfun_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_with_metrics.py) | `v0.5.16` |
|
|
281
|
+
| Quick PumpFun connection test | `python examples/pumpfun_quick_test.py` | [pumpfun_quick_test.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_quick_test.py) | `v0.5.16` |
|
|
275
282
|
| **PumpSwap** | | |
|
|
276
|
-
| PumpSwap ultra-low latency | `python examples/pumpswap_low_latency.py` | [pumpswap_low_latency.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_low_latency.py) | `v0.5.
|
|
277
|
-
| PumpSwap events + metrics | `python examples/pumpswap_with_metrics.py` | [pumpswap_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_with_metrics.py) | `v0.5.
|
|
283
|
+
| PumpSwap ultra-low latency | `python examples/pumpswap_low_latency.py` | [pumpswap_low_latency.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_low_latency.py) | `v0.5.16` |
|
|
284
|
+
| PumpSwap events + metrics | `python examples/pumpswap_with_metrics.py` | [pumpswap_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_with_metrics.py) | `v0.5.16` |
|
|
278
285
|
| **Meteora DAMM** | | |
|
|
279
|
-
| Meteora DAMM V2 events | `python examples/meteora_damm_grpc.py` | [meteora_damm_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/meteora_damm_grpc.py) | `v0.5.
|
|
286
|
+
| Meteora DAMM V2 events | `python examples/meteora_damm_grpc.py` | [meteora_damm_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/meteora_damm_grpc.py) | `v0.5.16` |
|
|
280
287
|
| **Multi-protocol** | | |
|
|
281
|
-
| Subscribe to every program in Rust `Protocol` / `program_ids` | `python examples/multi_protocol_grpc.py` | [multi_protocol_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/multi_protocol_grpc.py) | `v0.5.
|
|
288
|
+
| Subscribe to every program in Rust `Protocol` / `program_ids` | `python examples/multi_protocol_grpc.py` | [multi_protocol_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/multi_protocol_grpc.py) | `v0.5.16` |
|
|
282
289
|
| **Utility** | | |
|
|
283
|
-
| Parse tx by signature (HTTP RPC; not gRPC). `TX_SIGNATURE` / `RPC_URL` or `SOLANA_RPC_URL` in `.env` or `--sig` / `--rpc`. | `python examples/parse_tx_by_signature.py` | [parse_tx_by_signature.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/parse_tx_by_signature.py) | `v0.5.
|
|
290
|
+
| Parse tx by signature (HTTP RPC; not gRPC). `TX_SIGNATURE` / `RPC_URL` or `SOLANA_RPC_URL` in `.env` or `--sig` / `--rpc`. | `python examples/parse_tx_by_signature.py` | [parse_tx_by_signature.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/parse_tx_by_signature.py) | `v0.5.16` |
|
|
284
291
|
|
|
285
292
|
**Env:** gRPC examples need **`GRPC_URL`** or **`GRPC_ENDPOINT`**, plus **`GRPC_AUTH_TOKEN`** or **`GRPC_TOKEN`** (or legacy `GEYSER_*`). See **`.env.example`**.
|
|
286
293
|
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
## v0.5.
|
|
3
|
+
## v0.5.16 — RawInstruction 协议过滤与 DEX 枚举
|
|
4
|
+
|
|
5
|
+
修复原始指令绕过 DEX 订阅范围的问题。按单条指令引用的官方程序识别 DEX,使用 `RawInstructionDexType` 枚举;JSON 字符串保持不变。未知 router 不推断池子地址、买卖方向或方法版本。
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
## v0.5.16 — Pump 执行事件与最新回放示例
|
|
4
9
|
|
|
5
10
|
修复官方 Anchor CPI TradeEvent 前缀识别,保留历史编码兼容。RPC/gRPC 的实际 `sol_amount`、`quote_amount`、`token_amount` 只从执行事件合并;预算和最小输出保留在指令参数字段。如果日志及事件 CPI 均缺失,实际金额字段为 0(表示无执行数据,不代表已确认零成交)。非 SOL 报价金额不能当作 SOL。
|
|
6
11
|
|
|
@@ -8,13 +13,15 @@
|
|
|
8
13
|
|
|
9
14
|
新 Delta 卖出样本:`4ARos3Yq1SMNE3izDpy9YdKrRgMmD7UCDxvnVrBRaGCJHiifPHSmQWc4DPfjUaEUcxS7puGmEN64K7EZdeXLJaj2`,slot 458542546。日期样本文件还包含 Rapid 创建后买入、BuyV3 和 PumpSwap 买入的完整签名及 slot。旧的五种双跳组合仅作为回归样本,未冒充本次新抓取交易。
|
|
10
15
|
|
|
11
|
-
## v0.5.
|
|
16
|
+
## v0.5.16 — Shred 原始指令透传
|
|
12
17
|
|
|
13
18
|
默认 Shred 入口将未适配的第三方程序(包括 Rapid/Delta)作为 `RawInstruction` 返回,不再推断买卖方向、金额或内部 buy 版本。System、Token、ATA、ComputeBudget 等基础程序默认不透传;已支持的官方 DEX 指令继续正常解析,官方 Pump/PumpSwap 多跳仍返回 `PumpRouteIntent`。
|
|
14
19
|
|
|
15
20
|
事件包含 `program_id`、`instruction_index`、`accounts`、`account_indices`、`instruction_data` 和交易 metadata。账户保留原顺序与重复项;未解析 ALT 地址为 null/None,原始索引仍保留。使用缓存 loaded-addresses/resolver 补齐,热路径不请求 RPC。data 是完整原始字节,不要求已知布局。
|
|
16
21
|
|
|
17
|
-
|
|
22
|
+
运行 `uv run python examples/raw_instruction_filter.py` 对比同一组已签名交易的 PumpFun、Raydium CPMM 与全量原始指令订阅;输出包含 `dexes`。
|
|
23
|
+
|
|
24
|
+
无过滤器时返回未知第三方指令。宽泛交易/Swap 订阅(如 `PumpFunTrade`、`RaydiumCpmmSwap`)也返回关联该 DEX 的原始指令;买/卖方向订阅不推测方向。显式 `RawInstruction` 仅在未限制协议时返回全部外层指令,streamer 的协议限制始终生效;显式排除 `RawInstruction` 优先。`dex_type` 使用公开枚举 `RawInstructionDexType`(Go 为命名字符串类型与常量);JSON 仍为 `"pumpfun"`、`"raydium_cpmm"` 等原有字符串。`dexes` 数组包含各关联 DEX 的 `{ dex_type, program_id, pool }`,只识别本条指令直接调用或账户中引用的 DEX 程序,不借用同笔其他指令的账户;多 DEX 包装保留所有关联。未知或未解析 ALT 中的程序不能匹配 DEX 订阅。`pool` 当前为 null:未知包装布局无法确定池子账户。program 引用不证明执行了 CPI,原始回调不是成交。
|
|
18
25
|
|
|
19
26
|
已有 wrapper 适配函数仅作为显式调用的兼容接口保留,不参与默认 Shred 解码。以下已发布版本的历史说明描述旧行为。
|
|
20
27
|
|
|
@@ -57,11 +64,11 @@
|
|
|
57
64
|
|
|
58
65
|
| 语言 | 仓库 | 描述 | 版本 |
|
|
59
66
|
|------|------|------|
|
|
60
|
-
| Rust | [sol-parser-sdk](https://github.com/0xfnzero/sol-parser-sdk) | Solana DEX 交易与账户事件解析 | `v0.7.
|
|
61
|
-
| Node.js | [sol-parser-sdk-nodejs](https://github.com/0xfnzero/sol-parser-sdk-nodejs) | TypeScript/JavaScript,Node.js 支持 | `v0.5.
|
|
62
|
-
| Python | [sol-parser-sdk-python](https://github.com/0xfnzero/sol-parser-sdk-python) | 原生 async/await 支持 | `v0.5.
|
|
63
|
-
| Go | [sol-parser-sdk-golang](https://github.com/0xfnzero/sol-parser-sdk-golang) | Go 交易与账户事件解析 | `v0.5.
|
|
64
|
-
| **Rust** | [sol-shred-sdk](https://github.com/0xfnzero/sol-shred-sdk) | Solana 原始 shred 解码与 ShredStream DEX 事件解析 | `v4.0.
|
|
67
|
+
| Rust | [sol-parser-sdk](https://github.com/0xfnzero/sol-parser-sdk) | Solana DEX 交易与账户事件解析 | `v0.7.17` |
|
|
68
|
+
| Node.js | [sol-parser-sdk-nodejs](https://github.com/0xfnzero/sol-parser-sdk-nodejs) | TypeScript/JavaScript,Node.js 支持 | `v0.5.23` |
|
|
69
|
+
| Python | [sol-parser-sdk-python](https://github.com/0xfnzero/sol-parser-sdk-python) | 原生 async/await 支持 | `v0.5.16` |
|
|
70
|
+
| Go | [sol-parser-sdk-golang](https://github.com/0xfnzero/sol-parser-sdk-golang) | Go 交易与账户事件解析 | `v0.5.16` |
|
|
71
|
+
| **Rust** | [sol-shred-sdk](https://github.com/0xfnzero/sol-shred-sdk) | Solana 原始 shred 解码与 ShredStream DEX 事件解析 | `v4.0.8` |
|
|
65
72
|
| **Rust** | [sol-trade-sdk](https://github.com/0xfnzero/sol-trade-sdk) | Solana DEX 交易构建与交易执行 | `v6.0.2` |
|
|
66
73
|
|
|
67
74
|
---
|
|
@@ -153,7 +160,7 @@ Validation includes local CPU benchmarks and offline signed-bank scenarios. Meas
|
|
|
153
160
|
**PyPI**
|
|
154
161
|
|
|
155
162
|
```bash
|
|
156
|
-
pip install sol-parser-sdk-python==0.5.
|
|
163
|
+
pip install sol-parser-sdk-python==0.5.16
|
|
157
164
|
```
|
|
158
165
|
|
|
159
166
|
**源码**
|
|
@@ -269,18 +276,18 @@ Python ShredStream 热路径默认严格解析静态账户;V0 ALT 指令需传
|
|
|
269
276
|
| 描述 | 运行命令 | 源码 |
|
|
270
277
|
|------|----------|------|
|
|
271
278
|
| **PumpFun** | | |
|
|
272
|
-
| PumpFun 交易过滤 | `python examples/pumpfun_trade_filter.py` | [pumpfun_trade_filter.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_trade_filter.py) | `v0.5.
|
|
273
|
-
| PumpFun 事件 + 性能指标 | `python examples/pumpfun_with_metrics.py` | [pumpfun_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_with_metrics.py) | `v0.5.
|
|
274
|
-
| PumpFun 快速连接测试 | `python examples/pumpfun_quick_test.py` | [pumpfun_quick_test.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_quick_test.py) | `v0.5.
|
|
279
|
+
| PumpFun 交易过滤 | `python examples/pumpfun_trade_filter.py` | [pumpfun_trade_filter.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_trade_filter.py) | `v0.5.16` |
|
|
280
|
+
| PumpFun 事件 + 性能指标 | `python examples/pumpfun_with_metrics.py` | [pumpfun_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_with_metrics.py) | `v0.5.16` |
|
|
281
|
+
| PumpFun 快速连接测试 | `python examples/pumpfun_quick_test.py` | [pumpfun_quick_test.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_quick_test.py) | `v0.5.16` |
|
|
275
282
|
| **PumpSwap** | | |
|
|
276
|
-
| PumpSwap 超低延迟 | `python examples/pumpswap_low_latency.py` | [pumpswap_low_latency.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_low_latency.py) | `v0.5.
|
|
277
|
-
| PumpSwap 事件 + 性能指标 | `python examples/pumpswap_with_metrics.py` | [pumpswap_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_with_metrics.py) | `v0.5.
|
|
283
|
+
| PumpSwap 超低延迟 | `python examples/pumpswap_low_latency.py` | [pumpswap_low_latency.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_low_latency.py) | `v0.5.16` |
|
|
284
|
+
| PumpSwap 事件 + 性能指标 | `python examples/pumpswap_with_metrics.py` | [pumpswap_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_with_metrics.py) | `v0.5.16` |
|
|
278
285
|
| **Meteora DAMM** | | |
|
|
279
|
-
| Meteora DAMM V2 事件 | `python examples/meteora_damm_grpc.py` | [meteora_damm_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/meteora_damm_grpc.py) | `v0.5.
|
|
286
|
+
| Meteora DAMM V2 事件 | `python examples/meteora_damm_grpc.py` | [meteora_damm_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/meteora_damm_grpc.py) | `v0.5.16` |
|
|
280
287
|
| **多协议** | | |
|
|
281
|
-
| 订阅 Rust `Protocol` / `program_ids` 中的全部程序 | `python examples/multi_protocol_grpc.py` | [multi_protocol_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/multi_protocol_grpc.py) | `v0.5.
|
|
288
|
+
| 订阅 Rust `Protocol` / `program_ids` 中的全部程序 | `python examples/multi_protocol_grpc.py` | [multi_protocol_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/multi_protocol_grpc.py) | `v0.5.16` |
|
|
282
289
|
| **工具** | | |
|
|
283
|
-
| 按签名解析交易(HTTP RPC,非 gRPC)。`.env` 或环境中 `TX_SIGNATURE` / `RPC_URL` 或 `SOLANA_RPC_URL`,或 `--sig` / `--rpc`。 | `python examples/parse_tx_by_signature.py` | [parse_tx_by_signature.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/parse_tx_by_signature.py) | `v0.5.
|
|
290
|
+
| 按签名解析交易(HTTP RPC,非 gRPC)。`.env` 或环境中 `TX_SIGNATURE` / `RPC_URL` 或 `SOLANA_RPC_URL`,或 `--sig` / `--rpc`。 | `python examples/parse_tx_by_signature.py` | [parse_tx_by_signature.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/parse_tx_by_signature.py) | `v0.5.16` |
|
|
284
291
|
|
|
285
292
|
**环境变量:** gRPC 示例需要 **`GRPC_URL`** 或 **`GRPC_ENDPOINT`**,以及 **`GRPC_AUTH_TOKEN`** 或 **`GRPC_TOKEN`**(或旧名 `GEYSER_*`)。详见 **`.env.example`**。
|
|
286
293
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# v0.5.16 — DEX-scoped raw instructions and typed DEX identifiers
|
|
2
|
+
|
|
3
|
+
Released 2026-10-19.
|
|
4
|
+
|
|
5
|
+
RawInstruction callbacks now match the subscribed DEX using only the outer instruction's program and referenced accounts. Unrelated instructions in the same transaction no longer inherit a DEX association. Streamer protocol restrictions apply even when RawInstruction is explicitly selected; legacy sol-shred-sdk PumpFun callbacks only forward PumpFun-associated wrappers.
|
|
6
|
+
|
|
7
|
+
The dexes array preserves all detected DEX associations for multi-DEX wrappers. Each entry contains dex_type, program_id and a nullable pool. RawInstructionDexType is a public enum in Rust, TypeScript and Python, and a named string type with constants in Go. JSON identifiers remain pumpfun, raydium_cpmm, etc. Unknown router layouts leave pool null and do not imply CPI execution, trade direction, amounts or buy-method versions. Unresolved ALT references cannot match a DEX subscription.
|
|
8
|
+
|
|
9
|
+
## Compatibility
|
|
10
|
+
|
|
11
|
+
- Broad trade/swap filters now include associated raw instructions. Excluding RawInstruction takes precedence; direction/method-specific subscriptions do not infer unknown router behavior.
|
|
12
|
+
- Without protocol restrictions, explicit RawInstruction still selects all outer instructions.
|
|
13
|
+
- Rust callers constructing RawInstructionEvent must populate dexes; RawInstructionDex.dex_type is now an enum. Historical JSON without dexes remains readable with an empty list.
|
|
14
|
+
- No third-party router payload decoding or guessed pool-account positions were added.
|
|
15
|
+
|
|
16
|
+
## Validation
|
|
17
|
+
|
|
18
|
+
Regression coverage includes instruction-local DEX scope, multi-DEX references, duplicate accounts, unresolved ALT addresses, raw exclusions, streamer protocol gates, enum exports and JSON round trips. Signed replay examples compare PumpFun, Raydium CPMM and all-raw subscriptions across language implementations.
|
|
@@ -8,6 +8,7 @@ import base58
|
|
|
8
8
|
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
|
|
9
9
|
from sol_parser.shredstream_client import parse_shred_transaction,parse_shred_transaction_with_loaded_addresses
|
|
10
10
|
from sol_parser.wire_transaction import decode_wire_transaction
|
|
11
|
+
from sol_parser import RawInstructionDexType
|
|
11
12
|
from sol_parser.grpc_types import EventType,IncludeOnlyFilter,ExcludeFilter,EventMetadata
|
|
12
13
|
from sol_parser.pump_routes import AMM,parse_route
|
|
13
14
|
|
|
@@ -40,7 +41,9 @@ def run_replay():
|
|
|
40
41
|
assert e.account_indices == ix['accounts']
|
|
41
42
|
assert e.instruction_data == list(base58.b58decode(ix['data']))
|
|
42
43
|
assert not hasattr(e, 'is_buy') and not hasattr(e, 'ix_name')
|
|
43
|
-
|
|
44
|
+
selected = parse(IncludeOnlyFilter([EventType.PUMP_FUN_TRADE]))
|
|
45
|
+
assert selected
|
|
46
|
+
assert all(e.type == EventType.RAW_INSTRUCTION and any(d.dex_type == RawInstructionDexType.PUMPFUN for d in e.data.dexes) for e in selected)
|
|
44
47
|
assert not parse(ExcludeFilter([EventType.RAW_INSTRUCTION]))
|
|
45
48
|
trace.append((f['signature'], [e.type for e in events]))
|
|
46
49
|
continue
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""python examples/raw_instruction_filter.py — offline signed transaction replay."""
|
|
2
|
+
import base64
|
|
3
|
+
import json
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from sol_parser.shredstream_client import parse_shred_transaction_with_loaded_addresses
|
|
6
|
+
from sol_parser.grpc_types import EventType, IncludeOnlyFilter
|
|
7
|
+
from sol_parser.json_util import dex_event_json_dumps
|
|
8
|
+
|
|
9
|
+
for case in json.loads((Path(__file__).parent / "fixtures/raw_instructions.json").read_text()):
|
|
10
|
+
for kind in ("PumpFunTrade", "RaydiumCpmmSwap", "RawInstruction"):
|
|
11
|
+
events = parse_shred_transaction_with_loaded_addresses(
|
|
12
|
+
base64.b64decode(case["wire"]), case["loaded_writable"], case["loaded_readonly"],
|
|
13
|
+
filter=IncludeOnlyFilter([EventType(kind)]))
|
|
14
|
+
print(json.dumps({"signature": case["signature"], "filter": kind,
|
|
15
|
+
"raw_instructions": [json.loads(dex_event_json_dumps(e)) for e in events
|
|
16
|
+
if e.type == EventType.RAW_INSTRUCTION]}))
|
|
@@ -513,8 +513,8 @@ from .pump_upgrade import PumpFunPostCompleteBuyEvent, PumpFunSweepBondingCurveF
|
|
|
513
513
|
__all__ += ['decode_pump_multi_hop_intent','PumpFunPostCompleteBuyEvent','PumpFunSweepBondingCurveFeeEvent','PumpFunCompleteEvent','PumpSwapSweepPoolFeeEvent']
|
|
514
514
|
|
|
515
515
|
from .pump_routes import PumpRouteHop, PumpRouteIntentEvent
|
|
516
|
-
from .raw_instruction import RawInstructionEvent
|
|
517
|
-
__all__ += ["RawInstructionEvent"]
|
|
516
|
+
from .raw_instruction import RawInstructionEvent, RawInstructionDex, RawInstructionDexType
|
|
517
|
+
__all__ += ["RawInstructionEvent", "RawInstructionDex", "RawInstructionDexType"]
|
|
518
518
|
from .shredstream_client import parse_shred_transaction, parse_shred_transaction_with_loaded_addresses, parse_shred_transaction_best_effort
|
|
519
519
|
|
|
520
520
|
__all__ += ["PumpRouteHop", "PumpRouteIntentEvent", "parse_shred_transaction", "parse_shred_transaction_with_loaded_addresses", "parse_shred_transaction_best_effort"]
|
|
@@ -1817,8 +1817,8 @@ def to_typed_event(event: dict) -> Optional[TypedDexEvent]:
|
|
|
1817
1817
|
return cls(metadata=meta,**values)
|
|
1818
1818
|
|
|
1819
1819
|
if event_type == EventType.RAW_INSTRUCTION:
|
|
1820
|
-
from .raw_instruction import RawInstructionEvent
|
|
1821
|
-
return RawInstructionEvent(metadata=meta, program_id=data['program_id'],
|
|
1820
|
+
from .raw_instruction import RawInstructionEvent, RawInstructionDex
|
|
1821
|
+
return RawInstructionEvent(metadata=meta, dexes=[RawInstructionDex(**d) for d in data.get('dexes', [])], program_id=data['program_id'],
|
|
1822
1822
|
instruction_index=int(data['instruction_index']), accounts=list(data['accounts']),
|
|
1823
1823
|
account_indices=list(data['account_indices']), instruction_data=list(data['instruction_data']))
|
|
1824
1824
|
if event_type == EventType.PUMP_ROUTE_INTENT:
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""Lossless outer instructions, without inferred CPI or trade semantics."""
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from typing import Optional
|
|
5
|
+
from .event_types import DexEventBase
|
|
6
|
+
|
|
7
|
+
INFRASTRUCTURE_PROGRAMS = frozenset(["11111111111111111111111111111111","TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb","ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","ComputeBudget111111111111111111111111111111","MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr","Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo","AddressLookupTab1e1111111111111111111111111","Vote111111111111111111111111111111111111111","Ed25519SigVerify111111111111111111111111111","KeccakSecp256k11111111111111111111111111111","Secp256r1SigVerify1111111111111111111111111"])
|
|
8
|
+
|
|
9
|
+
class RawInstructionDexType(str, Enum):
|
|
10
|
+
"""Stable DEX identifiers; serialized as the original strings."""
|
|
11
|
+
PUMPFUN = "pumpfun"
|
|
12
|
+
PUMPSWAP = "pumpswap"
|
|
13
|
+
RAYDIUM_LAUNCHLAB = "raydium_launchlab"
|
|
14
|
+
RAYDIUM_CPMM = "raydium_cpmm"
|
|
15
|
+
RAYDIUM_CLMM = "raydium_clmm"
|
|
16
|
+
RAYDIUM_AMM_V4 = "raydium_amm_v4"
|
|
17
|
+
ORCA_WHIRLPOOL = "orca_whirlpool"
|
|
18
|
+
METEORA_POOLS = "meteora_pools"
|
|
19
|
+
METEORA_DAMM_V2 = "meteora_damm_v2"
|
|
20
|
+
METEORA_DLMM = "meteora_dlmm"
|
|
21
|
+
METEORA_DBC = "meteora_dbc"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class RawInstructionDex:
|
|
26
|
+
"""DEX program reference, not proof of CPI execution or a pool layout."""
|
|
27
|
+
dex_type: RawInstructionDexType
|
|
28
|
+
program_id: str
|
|
29
|
+
pool: Optional[str] = None
|
|
30
|
+
|
|
31
|
+
def __post_init__(self):
|
|
32
|
+
# Normalize JSON strings and reject unsupported identifiers.
|
|
33
|
+
self.dex_type = RawInstructionDexType(self.dex_type)
|
|
34
|
+
|
|
35
|
+
@dataclass
|
|
36
|
+
class RawInstructionEvent(DexEventBase):
|
|
37
|
+
dexes: list[RawInstructionDex] = field(default_factory=list)
|
|
38
|
+
program_id: str = ''
|
|
39
|
+
instruction_index: int = 0
|
|
40
|
+
# Original order including duplicates. None denotes an unresolved ALT key.
|
|
41
|
+
accounts: list[Optional[str]] = field(default_factory=list)
|
|
42
|
+
account_indices: list[int] = field(default_factory=list)
|
|
43
|
+
instruction_data: list[int] = field(default_factory=list)
|
|
44
|
+
|
|
45
|
+
def raw_instruction_dexes(program, accounts):
|
|
46
|
+
from . import instructions as program_ids
|
|
47
|
+
return [RawInstructionDex(name, getattr(program_ids, pid)) for name, pid, _ in _DEX_PROGRAMS
|
|
48
|
+
if program == getattr(program_ids, pid) or getattr(program_ids, pid) in accounts]
|
|
49
|
+
|
|
50
|
+
_DEX_PROGRAMS = [
|
|
51
|
+
(RawInstructionDexType.PUMPFUN, "PUMPFUN_PROGRAM_ID", "PumpFunTrade"),
|
|
52
|
+
(RawInstructionDexType.PUMPSWAP, "PUMPSWAP_PROGRAM_ID", "PumpSwapTrade"),
|
|
53
|
+
(RawInstructionDexType.RAYDIUM_LAUNCHLAB, "RAYDIUM_LAUNCHLAB_PROGRAM_ID", "RaydiumLaunchlabTrade"),
|
|
54
|
+
(RawInstructionDexType.RAYDIUM_CPMM, "RAYDIUM_CPMM_PROGRAM_ID", "RaydiumCpmmSwap"),
|
|
55
|
+
(RawInstructionDexType.RAYDIUM_CLMM, "RAYDIUM_CLMM_PROGRAM_ID", "RaydiumClmmSwap"),
|
|
56
|
+
(RawInstructionDexType.RAYDIUM_AMM_V4, "RAYDIUM_AMM_V4_PROGRAM_ID", "RaydiumAmmV4Swap"),
|
|
57
|
+
(RawInstructionDexType.ORCA_WHIRLPOOL, "ORCA_WHIRLPOOL_PROGRAM_ID", "OrcaWhirlpoolSwap"),
|
|
58
|
+
(RawInstructionDexType.METEORA_POOLS, "METEORA_POOLS_PROGRAM_ID", "MeteoraPoolsSwap"),
|
|
59
|
+
(RawInstructionDexType.METEORA_DAMM_V2, "METEORA_DAMM_V2_PROGRAM_ID", "MeteoraDammV2Swap"),
|
|
60
|
+
(RawInstructionDexType.METEORA_DLMM, "METEORA_DLMM_PROGRAM_ID", "MeteoraDlmmSwap"),
|
|
61
|
+
(RawInstructionDexType.METEORA_DBC, "METEORA_DBC_PROGRAM_ID", "MeteoraDbcSwap"),
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
def raw_instruction_matches_filter(dexes, filter):
|
|
65
|
+
from .grpc_types import EventType
|
|
66
|
+
if filter is None:
|
|
67
|
+
return True
|
|
68
|
+
if EventType.RAW_INSTRUCTION in (getattr(filter, "exclude_types", None) or ()):
|
|
69
|
+
return False
|
|
70
|
+
included = getattr(filter, "include_only", None)
|
|
71
|
+
if included is not None and EventType.RAW_INSTRUCTION in included:
|
|
72
|
+
return True
|
|
73
|
+
if not dexes:
|
|
74
|
+
return included is None
|
|
75
|
+
return any(dex.dex_type == name and (included is None or EventType(event) in included)
|
|
76
|
+
and filter.should_include(EventType(event))
|
|
77
|
+
for dex in dexes for name, _, event in _DEX_PROGRAMS)
|
{sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/sol_parser/shredstream_client.py
RENAMED
|
@@ -133,7 +133,7 @@ def _should_parse_shred_instructions(filter: Optional[EventTypeFilter]) -> bool:
|
|
|
133
133
|
|
|
134
134
|
|
|
135
135
|
def _parse_decoded_shred(tx, keys, signature, slot, tx_index, recv_us, filter, best_effort=False):
|
|
136
|
-
from .raw_instruction import RawInstructionEvent, INFRASTRUCTURE_PROGRAMS
|
|
136
|
+
from .raw_instruction import RawInstructionEvent, INFRASTRUCTURE_PROGRAMS, raw_instruction_dexes, raw_instruction_matches_filter
|
|
137
137
|
from .grpc_types import EventType
|
|
138
138
|
from .pump_routes import may_parse_route, parse_route
|
|
139
139
|
from .grpc_types import EventMetadata
|
|
@@ -154,10 +154,11 @@ def _parse_decoded_shred(tx, keys, signature, slot, tx_index, recv_us, filter, b
|
|
|
154
154
|
for index, (pid, data, indices) in enumerate(instructions):
|
|
155
155
|
unknown = pid and pid not in _UNKNOWN_PROGRAM_CANDIDATES and pid not in INFRASTRUCTURE_PROGRAMS
|
|
156
156
|
explicit_raw = filter is not None and EventType.RAW_INSTRUCTION in (getattr(filter, 'include_only', None) or ())
|
|
157
|
-
|
|
157
|
+
dexes = raw_instruction_dexes(pid, [keys[i] if i < len(keys) else None for i in indices]) if unknown or explicit_raw else []
|
|
158
|
+
if pid and (unknown or explicit_raw) and raw_instruction_matches_filter(dexes, filter):
|
|
158
159
|
out.append(DexEvent(EventType.RAW_INSTRUCTION, RawInstructionEvent(
|
|
159
160
|
metadata=EventMetadata(signature=signature, slot=slot, tx_index=tx_index, grpc_recv_us=recv_us, recent_blockhash=msg['recentBlockhash']),
|
|
160
|
-
program_id=pid, instruction_index=index,
|
|
161
|
+
dexes=dexes, program_id=pid, instruction_index=index,
|
|
161
162
|
accounts=[keys[i] if i < len(keys) else None for i in indices],
|
|
162
163
|
account_indices=list(indices), instruction_data=list(data))))
|
|
163
164
|
if unknown:
|
|
@@ -45,3 +45,36 @@ def test_unknown_program_changed_data_and_missing_alt_stay_raw():
|
|
|
45
45
|
assert len(events)==1
|
|
46
46
|
assert events[0].data.accounts == [msg['accountKeys'][i] if i<250 else None for i in indices]
|
|
47
47
|
assert events[0].data.instruction_data==[255,0,1]
|
|
48
|
+
|
|
49
|
+
def test_raw_subscriptions_use_instruction_local_program_references():
|
|
50
|
+
tx, _ = decode_wire_transaction(base64.b64decode(FIXTURES[0]['wire']))
|
|
51
|
+
msg = tx['message']
|
|
52
|
+
msg['accountKeys'] = [msg['accountKeys'][0], '6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P', 'CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C']
|
|
53
|
+
msg['instructions'] = [dict(programIdIndex=0, accounts=accounts, data=b'\xff')
|
|
54
|
+
for accounts in ([1, 1], [2], [], [1, 2, 250], [250])]
|
|
55
|
+
for kind, expected in [('PumpFunTrade', [0, 3]), ('RaydiumCpmmSwap', [1, 3]), ('PumpFunBuy', []), ('RawInstruction', [0, 1, 2, 3, 4])]:
|
|
56
|
+
events = _parse_decoded_shred(tx, msg['accountKeys'], None, 0, 0, 0, IncludeOnlyFilter([EventType(kind)]))
|
|
57
|
+
assert [e.data.instruction_index for e in events] == expected
|
|
58
|
+
events = _parse_decoded_shred(tx, msg['accountKeys'], None, 0, 0, 0, None)
|
|
59
|
+
assert [d.dex_type for d in events[3].data.dexes] == ['pumpfun', 'raydium_cpmm']
|
|
60
|
+
assert all(d.pool is None for d in events[3].data.dexes)
|
|
61
|
+
assert events[3].data.accounts[-1] is None
|
|
62
|
+
filter = IncludeOnlyFilter([EventType.PUMP_FUN_TRADE])
|
|
63
|
+
filter.exclude_types = [EventType.RAW_INSTRUCTION]
|
|
64
|
+
assert _parse_decoded_shred(tx, msg['accountKeys'], None, 0, 0, 0, filter) == []
|
|
65
|
+
|
|
66
|
+
def test_dex_enum_exports_and_json_round_trip():
|
|
67
|
+
import pytest
|
|
68
|
+
from sol_parser import RawInstructionDexType, RawInstructionDex
|
|
69
|
+
expected = ["pumpfun","pumpswap","raydium_launchlab","raydium_cpmm","raydium_clmm","raydium_amm_v4","orca_whirlpool","meteora_pools","meteora_damm_v2","meteora_dlmm","meteora_dbc"]
|
|
70
|
+
assert [kind.value for kind in RawInstructionDexType] == expected
|
|
71
|
+
for kind in RawInstructionDexType:
|
|
72
|
+
assert json.dumps(kind) == json.dumps(kind.value)
|
|
73
|
+
restored = RawInstructionDex(**json.loads(json.dumps(dict(dex_type=kind, program_id="program"))))
|
|
74
|
+
assert restored.dex_type is kind
|
|
75
|
+
with pytest.raises(ValueError):
|
|
76
|
+
RawInstructionDex(dex_type="typo", program_id="program")
|
|
77
|
+
tx, _ = decode_wire_transaction(base64.b64decode(FIXTURES[0]['wire']))
|
|
78
|
+
events = _parse_decoded_shred(tx, tx['message']['accountKeys'], None, 0, 0, 0, None)
|
|
79
|
+
assert any(e.data.dexes for e in events)
|
|
80
|
+
assert all(isinstance(d.dex_type, RawInstructionDexType) for e in events for d in e.data.dexes)
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
"""Lossless outer instructions, without inferred CPI or trade semantics."""
|
|
2
|
-
from dataclasses import dataclass, field
|
|
3
|
-
from typing import Optional
|
|
4
|
-
from .event_types import DexEventBase
|
|
5
|
-
|
|
6
|
-
INFRASTRUCTURE_PROGRAMS = frozenset(["11111111111111111111111111111111","TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb","ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","ComputeBudget111111111111111111111111111111","MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr","Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo","AddressLookupTab1e1111111111111111111111111","Vote111111111111111111111111111111111111111","Ed25519SigVerify111111111111111111111111111","KeccakSecp256k11111111111111111111111111111","Secp256r1SigVerify1111111111111111111111111"])
|
|
7
|
-
|
|
8
|
-
@dataclass
|
|
9
|
-
class RawInstructionEvent(DexEventBase):
|
|
10
|
-
program_id: str = ''
|
|
11
|
-
instruction_index: int = 0
|
|
12
|
-
# Original order including duplicates. None denotes an unresolved ALT key.
|
|
13
|
-
accounts: list[Optional[str]] = field(default_factory=list)
|
|
14
|
-
account_indices: list[int] = field(default_factory=list)
|
|
15
|
-
instruction_data: list[int] = field(default_factory=list)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/hot_path_benchmark.json
RENAMED
|
File without changes
|
{sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/hot_path_benchmark.py
RENAMED
|
File without changes
|
|
File without changes
|
{sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/multi_protocol_grpc.py
RENAMED
|
File without changes
|
{sol_parser_sdk_python-0.5.15 → sol_parser_sdk_python-0.5.16}/examples/offline_bank/README.md
RENAMED
|
File without changes
|