sol-parser-sdk-python 0.5.9__tar.gz → 0.5.11__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.11/.gitignore +19 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/PKG-INFO +31 -14
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/README.md +29 -13
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/README_CN.md +28 -12
- sol_parser_sdk_python-0.5.11/docs/USAGE.md +161 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/pyproject.toml +2 -1
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/__init__.py +21 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/account_dispatcher.py +120 -7
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/account_fillers/pumpfun.py +25 -15
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/account_fillers/pumpswap.py +45 -2
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/account_fillers/raydium.py +25 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/accounts/__init__.py +19 -1
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/dex_parsers.py +242 -5
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/event_type_parity.py +8 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/event_types.py +246 -2
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/grpc_client.py +8 -2
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/grpc_instruction_parser.py +81 -9
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/grpc_types.py +38 -1
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/inner_instruction_parser.py +14 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/instructions.py +200 -31
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/log_instr_dedup.py +65 -7
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/merger.py +18 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/order_buffer.py +37 -12
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/parser.py +22 -5
- sol_parser_sdk_python-0.5.11/sol_parser/pump_upgrade.py +194 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/rpc_parser.py +15 -2
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/shredstream_client.py +4 -1
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/simulation_route.py +18 -6
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/transaction_route.py +10 -1
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/wire_transaction.py +8 -14
- sol_parser_sdk_python-0.5.11/tests/fixtures/account_lifecycle_20261008.json +4825 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/clmm_fee_rewards_20261008.json +20734 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/clmm_liquidity_20261008.json +14005 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/clmm_one_sided_20261008.json +28917 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/cpmm_liquidity_20261008.json +7552 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_borrow_20261009.json +46480 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_cpi_20261009.json +18862 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_dual_claims_20261009.json +10987 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_reward_admin_20261009.json +12310 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_reward_renewal_20261009.json +6350 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_reward_withdraw_20261009.json +20815 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_upstream_hook_20261009.json +3793 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_v1_config2_instruction_20261008.json +39 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_v1_live_simulations_20261008.json +78 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_v2_authority_20261008.json +18092 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_v2_fees_20261008.json +6449 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_v2_liquidity_20261008.json +11262 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_v2_rewards_20261008.json +4608 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/damm_v2_vesting_20261008.json +17467 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/dbc_boundary_20261008.json +3612 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/dbc_live_simulations_20261008.json +857 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/dbc_migration_20261008.json +1776 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/dbc_referral_live_20261008.json +105 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/dbc_swap2.json +575 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/dbc_v1_migration_20261008.json +1462 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/dlmm_fees_20261008.json +1098 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/dlmm_hook_rewards_20261009.json +2576 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/dlmm_rewards_20261008.json +1779 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/launchlab_migration_20261009.json +4533 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/native_settlement_20261008.json +25831 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pump_compact_simulations_20261008.json +2113 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pump_holder_20261009.json +1762 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pump_routes_20261009.json +2695 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pump_synthetic_20261009.json +1275 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pump_upgrade/account_context.json +239 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pump_upgrade/boost_account_context.json +59 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pump_upgrade/events.json +57 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pump_upgrade/mainnet.json +6305 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pump_upgrade/pump_trade_account_context.json +1050 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pump_upgrade/simulation_events.json +3132 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/2MfmZSU8mWEbskNHAxQGphAyB5x72SC2HYuAkLeSyH6MjttUHqUjm24wPMeH7zrCoQoYFwbLeiFE571mc8WvgZyL.json +524 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/2dabmQiykzC1tsNmgtRFbsRJjEKMfUySgScJc2J2uq8CQtoXWZ3YyT99p3nVuCXifEhLkyUe4Sf4nfe2UkFT8AJr.json +252 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/2eVpZNvQYPMBVNT5357Qt7HVAUSv9gdwqxKStvdwQ498rcJLLCHVcYPaGfFqVBz44ndYvkA1H4CwjBuDSviAj7jp.json +713 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/3GufGVVRrnrH1Yuto57jDeTKXeki6ooE9w6h4qYRvNm5FcCpxwDHNvzHXdpAMbxRmukWJpSPHUKHEjnFTCC979ka.json +676 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/3LQK2JHVbVSSfyCYwTwzoYTY9NEN4gZXzqw3TvAvMJHsvPsopCHtsa5ALhj4tFn8xWbmJ5DsYMMcnPukTBkSjtQf.json +252 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/3MRWKDUcD5CGn5Xz4qWyGA8Y9udw4SsSr4gcxCjTUqCFt6Zc6uiwHF1wLZXKoqBcGEM2kruBS85ymYxmYk8FLGBk.json +252 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/3NBSCgAXpNqg7JBUzp6RsfZYzf2QbbHi6r2wcoBF4Lpuzozae7ExUJUGoqpVCXXs8cbibr6aWySH1bsg86Enuhez.json +252 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/3QVpcUq64D4DUV9empFr3G98pCEa1Cp2fAcFJKyiJGsQ2ir2S4yBLhHYXPNmLfCE8KVDgLApfBYTFM7pf9JVPbsb.json +248 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/3REXMDkvZsWvgc8czYpfn24avz18APMuzbV2VgQBeymArdJvfQcfcpKr46f3j1H2bAiymFneaNocPH7KzPUPbR1S.json +252 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/3ejAydePsZTUfeZaU9eiAM37gV5AYPG9hhyMtUobJLQtSMgroDeiE8njXu2JiwMyX5YJLp3vrfNPy89S7EDdUCAy.json +611 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/3zC4bw1osyebZ77KagXYP3b5rEBHvJCgcwCriCLc5gAUp9Ev6Bx5ZMbqnYpkKE2VgZgMFcZN5FYKQfcKL45MWpyu.json +252 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/5PgkFgTLSEZPZhxgWNToPzTZct95SycuaH9H3g82YwcKXudtiynEZmiaoQrhGv2gdZLrvsVZ5Wn88KGirbFYpLrt.json +713 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpfun_create/661yA5s6uxUsggTcT4cZ6yyMfNmF4mCZzxLnCb1zBrSY3YhAiouYXBitiPvkngBEKxaeGcpXiek6qXDajiRr9wuY.json +505 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/pumpswap_liquidity_20261008.json +11649 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/signed_alt_load_rejections_20261009.json +46 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/signed_clmm_boundaries_20261009.json +469 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/signed_cpmm_bank_20261009.json +628 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/signed_dex_replay_20261009.json +2172 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/signed_identical_alt_bank_20261009.json +881 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/signed_multileg_bank_20261009.json +1098 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/signed_nested_cpi_bank_20261009.json +667 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/signed_replay_20261009.json +1081 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/signed_wire_boundaries_20261009.json +236 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/simulation_alt_20261008.json +561 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/whirlpool_fees_20261008.json +15651 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/whirlpool_hook_20261008.json +1735 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/whirlpool_liquidity_20261008.json +19618 -0
- sol_parser_sdk_python-0.5.11/tests/fixtures/whirlpool_one_sided_20261008.json +25171 -0
- sol_parser_sdk_python-0.5.11/tests/test_clmm_fee_rewards_bank.py +20 -0
- sol_parser_sdk_python-0.5.11/tests/test_clmm_liquidity_bank.py +40 -0
- sol_parser_sdk_python-0.5.11/tests/test_clmm_one_sided_bank.py +20 -0
- sol_parser_sdk_python-0.5.11/tests/test_cpmm_liquidity_bank.py +24 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_borrow_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_cpi_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_dual_claims_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_reward_admin_bank.py +32 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_reward_renewal_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_reward_withdraw_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_upstream_hook_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_v1_live_simulations.py +22 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_v2_authority_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_v2_fees_bank.py +34 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_v2_liquidity_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_v2_rewards_bank.py +31 -0
- sol_parser_sdk_python-0.5.11/tests/test_damm_v2_vesting_bank.py +20 -0
- sol_parser_sdk_python-0.5.11/tests/test_dbc_boundary_bank.py +27 -0
- sol_parser_sdk_python-0.5.11/tests/test_dbc_migration_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_dbc_upgrade.py +58 -0
- sol_parser_sdk_python-0.5.11/tests/test_dbc_v1_migration_bank.py +35 -0
- sol_parser_sdk_python-0.5.11/tests/test_dex_retry_delay.py +34 -0
- sol_parser_sdk_python-0.5.11/tests/test_dlmm_fees_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_dlmm_hook_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_dlmm_rewards_bank.py +32 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_filter_and_account_parity.py +46 -3
- sol_parser_sdk_python-0.5.11/tests/test_launchlab_migration_bank.py +19 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_orca_whirlpool_instruction_parity.py +2 -2
- sol_parser_sdk_python-0.5.11/tests/test_order_buffer.py +79 -0
- sol_parser_sdk_python-0.5.11/tests/test_ordered_late_regression.py +40 -0
- sol_parser_sdk_python-0.5.11/tests/test_prefix_prefilter.py +27 -0
- sol_parser_sdk_python-0.5.11/tests/test_protocol_current_fields.py +24 -0
- sol_parser_sdk_python-0.5.11/tests/test_pump_compact_simulation_routes.py +18 -0
- sol_parser_sdk_python-0.5.11/tests/test_pump_holder_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_pump_routes_bank.py +19 -0
- sol_parser_sdk_python-0.5.11/tests/test_pump_synthetic_bank.py +21 -0
- sol_parser_sdk_python-0.5.11/tests/test_pump_trade_account_context.py +53 -0
- sol_parser_sdk_python-0.5.11/tests/test_pump_trade_merge_identity.py +92 -0
- sol_parser_sdk_python-0.5.11/tests/test_pump_upgrade_events.py +41 -0
- sol_parser_sdk_python-0.5.11/tests/test_pump_upgrade_mainnet.py +57 -0
- sol_parser_sdk_python-0.5.11/tests/test_pumpfun_create_regression.py +101 -0
- sol_parser_sdk_python-0.5.11/tests/test_pumpswap_account_context.py +70 -0
- sol_parser_sdk_python-0.5.11/tests/test_pumpswap_liquidity_bank.py +26 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_pumpswap_upgrade.py +1 -1
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_raydium_clmm_instruction_parity.py +28 -13
- sol_parser_sdk_python-0.5.11/tests/test_shred_wire_sanitize.py +40 -0
- sol_parser_sdk_python-0.5.11/tests/test_signed_transaction_replay.py +274 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_simulation_route.py +68 -12
- sol_parser_sdk_python-0.5.11/tests/test_whirlpool_fees_bank.py +20 -0
- sol_parser_sdk_python-0.5.11/tests/test_whirlpool_hook_bank.py +20 -0
- sol_parser_sdk_python-0.5.11/tests/test_whirlpool_liquidity_bank.py +37 -0
- sol_parser_sdk_python-0.5.11/tests/test_whirlpool_one_sided_bank.py +20 -0
- sol_parser_sdk_python-0.5.9/.gitignore +0 -10
- sol_parser_sdk_python-0.5.9/NATIVE_ALIGNMENT.md +0 -312
- sol_parser_sdk_python-0.5.9/NATIVE_DAMM_FACTORY_ALIGNMENT_20261004.md +0 -16
- sol_parser_sdk_python-0.5.9/NATIVE_DAMM_FACTORY_EVIDENCE_20261004.json +0 -55
- sol_parser_sdk_python-0.5.9/NATIVE_MIGRATION.md +0 -38
- sol_parser_sdk_python-0.5.9/NATIVE_PUMPFUN_NATIVE_DEBIT_ALIGNMENT_20261004.md +0 -18
- sol_parser_sdk_python-0.5.9/NATIVE_PUMPFUN_NATIVE_DEBIT_EVIDENCE_20261004.json +0 -57
- sol_parser_sdk_python-0.5.9/NATIVE_PUMPFUN_SETTLEMENT_ALIGNMENT_20261004.md +0 -11
- sol_parser_sdk_python-0.5.9/NATIVE_PUMPFUN_SETTLEMENT_EVIDENCE_20261004.json +0 -70
- sol_parser_sdk_python-0.5.9/examples/GRPC_CACHE.md +0 -38
- sol_parser_sdk_python-0.5.9/examples/SIMULATION_ROUTES.md +0 -62
- sol_parser_sdk_python-0.5.9/tests/test_order_buffer.py +0 -38
- sol_parser_sdk_python-0.5.9/uv.lock +0 -408
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/.env.example +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/block_meta_stream.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/amm_v4_grpc_refresh_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/batch2_cpmm_simulations_20261003.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/block_meta_grpc_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/cached_damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/cached_tip_routes_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/cpmm_lp_simulations_20261006.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/pumpfun_current_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/pumpfun_funded_sell_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/pumpfun_settlement_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/pumpfun_usdc_multihop_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/pumpswap_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/simulation_ata_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/fixtures/simulation_routes_live_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/meteora_damm_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/multi_protocol_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/parse_tx_by_signature.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/pumpfun_quick_test.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/pumpfun_trade_filter.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/pumpfun_with_metrics.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/pumpswap_low_latency.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/pumpswap_with_metrics.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/rust_example_utils.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/simulation_routes.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/stonkfun_routes.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/examples/stonkfun_snapshot_refresh.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/scripts/bench_parser.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/scripts/gen_golden_rust.sh +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/account_fillers/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/account_fillers/meteora.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/account_fillers/orca.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/account_fillers/raydium_launchlab.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/accounts/raydium_orca.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/accounts/rpc_wallet.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/accounts/utils.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/block_meta.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/check_migration.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/clock.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/common/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/entries_decode.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/env_config.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/geyser_pb2.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/geyser_pb2_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/grpc/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/grpc/geyser_connect.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/grpc/subscribe_builder.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/grpc/transaction_meta.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/instr/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/instr_account_utils.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/json_util.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/liquidity_snapshot.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/logs/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/market.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/pumpfun_fee_enrich.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/rust_api_inventory.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/rust_event_json.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/shredstream_pb2.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/shredstream_pb2_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/shredstream_pumpfun.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/solana_storage_pb2.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/solana_storage_pb2_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/stonkfun_registry.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/u128_parity.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/verify_discriminators.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/cached_damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/cached_tip_routes_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/cpmm_lp_simulations_20261006.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/golden_parse_log.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/pumpfun_concentrated_multihop_mainnet_simulations_20261005.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/pumpfun_current_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/pumpfun_funded_sell_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/pumpfun_settlement_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/pumpfun_usdc_multihop_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/pumpswap_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/review10_compiled_bounds.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/review10_prefunded_ata.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/review10_wire_bounds.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/simulation_ata_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/simulation_routes_live_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/fixtures/stonkfun_routes_0_7_7.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_amm_v4_v2.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_block_meta.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_exact_metadata_json.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_golden.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_grpc_unary_methods.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_imports_and_inner.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_launchlab_invocation_anchor.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_log_instr_dedup.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_market_helpers.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_native_grpc_server.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_native_plan_lifecycle.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_pump_fees_instruction_parity.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_pumpfun_account_fill.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_pumpfun_trade_tail.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_pumpfun_v2_parity.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_pumpswap_instruction.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_raydium_current_logs.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_review10.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_review_batch2.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_shredstream.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_snapshot_refresh_example.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/tests/test_stonkfun_routes.py +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.pyc
|
|
3
|
+
*.pyo
|
|
4
|
+
*.egg-info/
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
.venv/
|
|
8
|
+
venv/
|
|
9
|
+
.DS_Store
|
|
10
|
+
.env
|
|
11
|
+
|
|
12
|
+
# Generated reports and local tooling outputs
|
|
13
|
+
/NATIVE_*EVIDENCE*.json
|
|
14
|
+
.pytest_cache/
|
|
15
|
+
.mypy_cache/
|
|
16
|
+
.ruff_cache/
|
|
17
|
+
.benchmarks/
|
|
18
|
+
.coverage
|
|
19
|
+
htmlcov/
|
|
@@ -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.11
|
|
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
|
|
@@ -8,6 +8,7 @@ Requires-Dist: grpcio-tools>=1.64.0
|
|
|
8
8
|
Requires-Dist: grpcio>=1.64.0
|
|
9
9
|
Requires-Dist: python-dotenv>=1.0.0
|
|
10
10
|
Provides-Extra: dev
|
|
11
|
+
Requires-Dist: cryptography>=44.0; extra == 'dev'
|
|
11
12
|
Requires-Dist: pytest-asyncio>=0.21; extra == 'dev'
|
|
12
13
|
Requires-Dist: pytest-benchmark>=4.0; extra == 'dev'
|
|
13
14
|
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
@@ -50,17 +51,27 @@ Description-Content-Type: text/markdown
|
|
|
50
51
|
|
|
51
52
|
---
|
|
52
53
|
|
|
53
|
-
##
|
|
54
|
+
## 📦 SDK Versions and Related SDKs
|
|
54
55
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
|
58
|
-
|
|
59
|
-
|
|
|
60
|
-
|
|
|
56
|
+
Parser SDK language versions and related Rust SDKs:
|
|
57
|
+
|
|
58
|
+
| Language | Repository | Description | Version |
|
|
59
|
+
|----------|------------|-------------|---------|
|
|
60
|
+
| Rust | [sol-parser-sdk](https://github.com/0xfnzero/sol-parser-sdk) | Solana DEX transaction and account event parsing |
|
|
61
|
+
| Node.js | [sol-parser-sdk-nodejs](https://github.com/0xfnzero/sol-parser-sdk-nodejs) | TypeScript/JavaScript for Node.js |
|
|
62
|
+
| Python | [sol-parser-sdk-python](https://github.com/0xfnzero/sol-parser-sdk-python) | Async/await native support |
|
|
63
|
+
| Go | [sol-parser-sdk-golang](https://github.com/0xfnzero/sol-parser-sdk-golang) | Go transaction and account event parsing |
|
|
64
|
+
| **Rust** | [sol-shred-sdk](https://github.com/0xfnzero/sol-shred-sdk) | Raw Solana shred decoding and ShredStream DEX event parsing | `v4.0.3` |
|
|
65
|
+
| **Rust** | [sol-trade-sdk](https://github.com/0xfnzero/sol-trade-sdk) | Solana DEX trade construction and transaction execution | `v6.0.0` |
|
|
61
66
|
|
|
62
67
|
---
|
|
63
68
|
|
|
69
|
+
## v0.5.11 — Signed transaction and hot-path hardening
|
|
70
|
+
|
|
71
|
+
Hardens signed transaction sanitization, loaded-address boundaries, ordered stream filtering and parser lifecycle. Aligns CLMM and DEX instruction/event layouts, nested CPI route attribution and liquidity/reward accounting. Adds independently signed wire fixtures, ALT failure cases and offline bank regressions.
|
|
72
|
+
|
|
73
|
+
Validation includes local CPU benchmarks and offline signed-bank scenarios. Measured hot paths use cached inputs without RPC. Benchmarks do not establish production network or transaction-landing latency. No funded mainnet transactions were broadcast.
|
|
74
|
+
|
|
64
75
|
## What This SDK Is For
|
|
65
76
|
|
|
66
77
|
This is the Python implementation of the FnZero Solana DEX parser SDK for asyncio services, research scripts, indexers, copy-trading systems, sniper pipelines, and backend jobs that need normalized real-time DEX events.
|
|
@@ -76,6 +87,13 @@ This is the Python implementation of the FnZero Solana DEX parser SDK for asynci
|
|
|
76
87
|
|
|
77
88
|
## Release notes
|
|
78
89
|
|
|
90
|
+
### v0.5.10
|
|
91
|
+
|
|
92
|
+
- Matches PumpFun create/create_v2 accounts by the actual instruction discriminator and event mint, including CPI calls; ambiguous matches are left unspecified.
|
|
93
|
+
- Stops inferring quote mint/vault/token-program fields from arbitrary remaining create_v2 accounts and preserves authoritative decoded fields.
|
|
94
|
+
- Restores historical CreateEvent decoding and verifies successful and failed transactions using saved mainnet fixtures.
|
|
95
|
+
- Suppresses rolled-back DEX events from failed transactions and preserves failure status through RPC/gRPC adapters.
|
|
96
|
+
|
|
79
97
|
### v0.5.9
|
|
80
98
|
|
|
81
99
|
- Adds native gRPC lifecycle and block metadata support, instruction-level route analysis and StonkFun registry/snapshot examples.
|
|
@@ -117,7 +135,7 @@ This is the Python implementation of the FnZero Solana DEX parser SDK for asynci
|
|
|
117
135
|
**From PyPI**
|
|
118
136
|
|
|
119
137
|
```bash
|
|
120
|
-
pip install sol-parser-sdk-python==0.5.
|
|
138
|
+
pip install sol-parser-sdk-python==0.5.11
|
|
121
139
|
```
|
|
122
140
|
|
|
123
141
|
**From source**
|
|
@@ -339,12 +357,11 @@ MIT — https://github.com/0xfnzero/sol-parser-sdk-python
|
|
|
339
357
|
- **Telegram**: https://t.me/fnzero_group
|
|
340
358
|
- **Discord**: https://discord.gg/vuazbGkqQE
|
|
341
359
|
|
|
342
|
-
##
|
|
343
|
-
|
|
344
|
-
See [NATIVE_ALIGNMENT.md](NATIVE_ALIGNMENT.md) for implemented native APIs, Rust golden tests, mainnet simulation evidence, examples, and remaining parity gaps. Full cross-language parity is still in progress.
|
|
360
|
+
## API compatibility
|
|
345
361
|
|
|
362
|
+
Full cross-language API parity is still in progress. See the [API migration guide](docs/USAGE.md#api-compatibility) for public behavior and support boundaries, and the examples directory for usage.
|
|
346
363
|
|
|
347
|
-
实时 parser → trade 接入使用 Yellowstone **gRPC**;见 [gRPC 缓存接入与三语言示例](examples/GRPC_CACHE.md)。此路径不使用 WebSocket,报价和构建热路径不调用 RPC。
|
|
348
364
|
|
|
365
|
+
实时 parser → trade 接入使用 Yellowstone **gRPC**;见 [gRPC 缓存接入与三语言示例](docs/USAGE.md#grpc-cache)。此路径不使用 WebSocket,报价和构建热路径不调用 RPC。
|
|
349
366
|
|
|
350
|
-
[
|
|
367
|
+
Shared PumpFun create/create_v2 mainnet fixtures, replay instructions and verification limits are documented in the [validation guide](https://github.com/0xfnzero/sol-parser-sdk-golang/tree/main/validation/pumpfun_create_20261007).
|
|
@@ -32,17 +32,27 @@
|
|
|
32
32
|
|
|
33
33
|
---
|
|
34
34
|
|
|
35
|
-
##
|
|
35
|
+
## 📦 SDK Versions and Related SDKs
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
|
40
|
-
|
|
41
|
-
|
|
|
42
|
-
|
|
|
37
|
+
Parser SDK language versions and related Rust SDKs:
|
|
38
|
+
|
|
39
|
+
| Language | Repository | Description | Version |
|
|
40
|
+
|----------|------------|-------------|---------|
|
|
41
|
+
| Rust | [sol-parser-sdk](https://github.com/0xfnzero/sol-parser-sdk) | Solana DEX transaction and account event parsing |
|
|
42
|
+
| Node.js | [sol-parser-sdk-nodejs](https://github.com/0xfnzero/sol-parser-sdk-nodejs) | TypeScript/JavaScript for Node.js |
|
|
43
|
+
| Python | [sol-parser-sdk-python](https://github.com/0xfnzero/sol-parser-sdk-python) | Async/await native support |
|
|
44
|
+
| Go | [sol-parser-sdk-golang](https://github.com/0xfnzero/sol-parser-sdk-golang) | Go transaction and account event parsing |
|
|
45
|
+
| **Rust** | [sol-shred-sdk](https://github.com/0xfnzero/sol-shred-sdk) | Raw Solana shred decoding and ShredStream DEX event parsing | `v4.0.3` |
|
|
46
|
+
| **Rust** | [sol-trade-sdk](https://github.com/0xfnzero/sol-trade-sdk) | Solana DEX trade construction and transaction execution | `v6.0.0` |
|
|
43
47
|
|
|
44
48
|
---
|
|
45
49
|
|
|
50
|
+
## v0.5.11 — Signed transaction and hot-path hardening
|
|
51
|
+
|
|
52
|
+
Hardens signed transaction sanitization, loaded-address boundaries, ordered stream filtering and parser lifecycle. Aligns CLMM and DEX instruction/event layouts, nested CPI route attribution and liquidity/reward accounting. Adds independently signed wire fixtures, ALT failure cases and offline bank regressions.
|
|
53
|
+
|
|
54
|
+
Validation includes local CPU benchmarks and offline signed-bank scenarios. Measured hot paths use cached inputs without RPC. Benchmarks do not establish production network or transaction-landing latency. No funded mainnet transactions were broadcast.
|
|
55
|
+
|
|
46
56
|
## What This SDK Is For
|
|
47
57
|
|
|
48
58
|
This is the Python implementation of the FnZero Solana DEX parser SDK for asyncio services, research scripts, indexers, copy-trading systems, sniper pipelines, and backend jobs that need normalized real-time DEX events.
|
|
@@ -58,6 +68,13 @@ This is the Python implementation of the FnZero Solana DEX parser SDK for asynci
|
|
|
58
68
|
|
|
59
69
|
## Release notes
|
|
60
70
|
|
|
71
|
+
### v0.5.10
|
|
72
|
+
|
|
73
|
+
- Matches PumpFun create/create_v2 accounts by the actual instruction discriminator and event mint, including CPI calls; ambiguous matches are left unspecified.
|
|
74
|
+
- Stops inferring quote mint/vault/token-program fields from arbitrary remaining create_v2 accounts and preserves authoritative decoded fields.
|
|
75
|
+
- Restores historical CreateEvent decoding and verifies successful and failed transactions using saved mainnet fixtures.
|
|
76
|
+
- Suppresses rolled-back DEX events from failed transactions and preserves failure status through RPC/gRPC adapters.
|
|
77
|
+
|
|
61
78
|
### v0.5.9
|
|
62
79
|
|
|
63
80
|
- Adds native gRPC lifecycle and block metadata support, instruction-level route analysis and StonkFun registry/snapshot examples.
|
|
@@ -99,7 +116,7 @@ This is the Python implementation of the FnZero Solana DEX parser SDK for asynci
|
|
|
99
116
|
**From PyPI**
|
|
100
117
|
|
|
101
118
|
```bash
|
|
102
|
-
pip install sol-parser-sdk-python==0.5.
|
|
119
|
+
pip install sol-parser-sdk-python==0.5.11
|
|
103
120
|
```
|
|
104
121
|
|
|
105
122
|
**From source**
|
|
@@ -321,12 +338,11 @@ MIT — https://github.com/0xfnzero/sol-parser-sdk-python
|
|
|
321
338
|
- **Telegram**: https://t.me/fnzero_group
|
|
322
339
|
- **Discord**: https://discord.gg/vuazbGkqQE
|
|
323
340
|
|
|
324
|
-
##
|
|
325
|
-
|
|
326
|
-
See [NATIVE_ALIGNMENT.md](NATIVE_ALIGNMENT.md) for implemented native APIs, Rust golden tests, mainnet simulation evidence, examples, and remaining parity gaps. Full cross-language parity is still in progress.
|
|
341
|
+
## API compatibility
|
|
327
342
|
|
|
343
|
+
Full cross-language API parity is still in progress. See the [API migration guide](docs/USAGE.md#api-compatibility) for public behavior and support boundaries, and the examples directory for usage.
|
|
328
344
|
|
|
329
|
-
实时 parser → trade 接入使用 Yellowstone **gRPC**;见 [gRPC 缓存接入与三语言示例](examples/GRPC_CACHE.md)。此路径不使用 WebSocket,报价和构建热路径不调用 RPC。
|
|
330
345
|
|
|
346
|
+
实时 parser → trade 接入使用 Yellowstone **gRPC**;见 [gRPC 缓存接入与三语言示例](docs/USAGE.md#grpc-cache)。此路径不使用 WebSocket,报价和构建热路径不调用 RPC。
|
|
331
347
|
|
|
332
|
-
[
|
|
348
|
+
Shared PumpFun create/create_v2 mainnet fixtures, replay instructions and verification limits are documented in the [validation guide](https://github.com/0xfnzero/sol-parser-sdk-golang/tree/main/validation/pumpfun_create_20261007).
|
|
@@ -32,14 +32,18 @@
|
|
|
32
32
|
|
|
33
33
|
---
|
|
34
34
|
|
|
35
|
-
##
|
|
35
|
+
## 📦 SDK 版本与相关项目
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
|
40
|
-
|
|
41
|
-
|
|
|
42
|
-
|
|
|
37
|
+
解析 SDK 的各语言版本及相关 Rust SDK:
|
|
38
|
+
|
|
39
|
+
| 语言 | 仓库 | 描述 | 版本 |
|
|
40
|
+
|------|------|------|
|
|
41
|
+
| Rust | [sol-parser-sdk](https://github.com/0xfnzero/sol-parser-sdk) | Solana DEX 交易与账户事件解析 |
|
|
42
|
+
| Node.js | [sol-parser-sdk-nodejs](https://github.com/0xfnzero/sol-parser-sdk-nodejs) | TypeScript/JavaScript,Node.js 支持 |
|
|
43
|
+
| Python | [sol-parser-sdk-python](https://github.com/0xfnzero/sol-parser-sdk-python) | 原生 async/await 支持 |
|
|
44
|
+
| Go | [sol-parser-sdk-golang](https://github.com/0xfnzero/sol-parser-sdk-golang) | Go 交易与账户事件解析 |
|
|
45
|
+
| **Rust** | [sol-shred-sdk](https://github.com/0xfnzero/sol-shred-sdk) | Solana 原始 shred 解码与 ShredStream DEX 事件解析 | `v4.0.3` |
|
|
46
|
+
| **Rust** | [sol-trade-sdk](https://github.com/0xfnzero/sol-trade-sdk) | Solana DEX 交易构建与交易执行 | `v6.0.0` |
|
|
43
47
|
|
|
44
48
|
---
|
|
45
49
|
|
|
@@ -58,6 +62,19 @@
|
|
|
58
62
|
|
|
59
63
|
## 发布说明
|
|
60
64
|
|
|
65
|
+
## v0.5.11 — Signed transaction and hot-path hardening
|
|
66
|
+
|
|
67
|
+
Hardens signed transaction sanitization, loaded-address boundaries, ordered stream filtering and parser lifecycle. Aligns CLMM and DEX instruction/event layouts, nested CPI route attribution and liquidity/reward accounting. Adds independently signed wire fixtures, ALT failure cases and offline bank regressions.
|
|
68
|
+
|
|
69
|
+
Validation includes local CPU benchmarks and offline signed-bank scenarios. Measured hot paths use cached inputs without RPC. Benchmarks do not establish production network or transaction-landing latency. No funded mainnet transactions were broadcast.
|
|
70
|
+
|
|
71
|
+
### v0.5.10
|
|
72
|
+
|
|
73
|
+
- 按实际指令 discriminator 和事件 mint 匹配 PumpFun create/create_v2 账户,支持 CPI,并拒绝猜测有歧义的匹配。
|
|
74
|
+
- 停止从 create_v2 的任意尾部账户推断 quote mint、vault、token program,保留权威解码字段。
|
|
75
|
+
- 恢复历史 CreateEvent 布局,并通过保存的真实主网成功、失败交易验证。
|
|
76
|
+
- 过滤失败交易中已经回滚的 Create/Buy 等 DEX 事件,并在 RPC/gRPC 转换中保留失败状态。
|
|
77
|
+
|
|
61
78
|
### v0.5.9
|
|
62
79
|
|
|
63
80
|
- Adds native gRPC lifecycle and block metadata support, instruction-level route analysis and StonkFun registry/snapshot examples.
|
|
@@ -99,7 +116,7 @@
|
|
|
99
116
|
**PyPI**
|
|
100
117
|
|
|
101
118
|
```bash
|
|
102
|
-
pip install sol-parser-sdk-python==0.5.
|
|
119
|
+
pip install sol-parser-sdk-python==0.5.11
|
|
103
120
|
```
|
|
104
121
|
|
|
105
122
|
**源码**
|
|
@@ -293,9 +310,8 @@ MIT — https://github.com/0xfnzero/sol-parser-sdk-python
|
|
|
293
310
|
- **Telegram**: https://t.me/fnzero_group
|
|
294
311
|
- **Discord**: https://discord.gg/vuazbGkqQE
|
|
295
312
|
|
|
296
|
-
##
|
|
297
|
-
|
|
298
|
-
See [NATIVE_ALIGNMENT.md](NATIVE_ALIGNMENT.md) for implemented native APIs, Rust golden tests, mainnet simulation evidence, examples, and remaining parity gaps. Full cross-language parity is still in progress.
|
|
313
|
+
## API 兼容性
|
|
299
314
|
|
|
315
|
+
完整跨语言 API 对齐仍在进行;公开行为和支持边界见 [API 迁移说明](docs/USAGE.md#api-compatibility),使用方法见 examples 目录。
|
|
300
316
|
|
|
301
|
-
|
|
317
|
+
PumpFun create/create_v2 的共享主网样本、重放方法和验证边界见 [验证说明](https://github.com/0xfnzero/sol-parser-sdk-golang/tree/main/validation/pumpfun_create_20261007)。
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Sol Parser SDK python usage
|
|
2
|
+
|
|
3
|
+
[English](../README.md) · [中文](../README_CN.md)
|
|
4
|
+
|
|
5
|
+
- [API compatibility](#api-compatibility)
|
|
6
|
+
- [gRPC account cache](#grpc-cache)
|
|
7
|
+
- [Simulation routes](#simulation-routes)
|
|
8
|
+
|
|
9
|
+
## API compatibility
|
|
10
|
+
|
|
11
|
+
以下说明当前公开行为和仍需调用方处理的边界;完整跨语言功能对齐仍在审核。
|
|
12
|
+
|
|
13
|
+
### 元数据精度
|
|
14
|
+
|
|
15
|
+
Node 的 `EventMetadata.slot`、`tx_index`、`block_time_us`、`grpc_recv_us` 现在是 `bigint`。输入支持 bigint、十进制字符串及安全整数 Number;超出安全整数范围的 Number、浮点数、越界 u64/i64 拒绝。根入口导出 `exactU64`、`exactI64`、`exactInteger`。使用 `dexEventToJsonString` 或 `bigintToJsonReplacer` 输出 JSON;直接 JSON.stringify(bigint) 会失败。
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
const slot = exactU64("18446744073709551615");
|
|
19
|
+
const latency = Number(BigInt(nowUs()) - event.metadata.grpc_recv_us);
|
|
20
|
+
console.log(JSON.stringify(event, bigintToJsonReplacer));
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
只在计算显示用延迟时将差值转为 Number。slot、index、时间及金额参与解析和排序时保留精确整数。
|
|
24
|
+
|
|
25
|
+
Go `EventMetadata` 保持 uint64/int64,JSON 输出上述四个字段为十进制字符串;Unmarshal 接受整数文本或十进制字符串,并检查范围,不接受 null/float/bool。Python `EventMetadata` 将十进制字符串归一为 int,拒绝 bool/float/越界;公开 JSON 工具输出上述元数据字段为字符串。各语言省略元数据整数时仍默认 0。未知实际净到账继续使用明确未知值,不能用 0 代替。
|
|
26
|
+
|
|
27
|
+
其余全部事件整数/JSON 字段的行为审核尚未完成。
|
|
28
|
+
|
|
29
|
+
### 事件别名
|
|
30
|
+
|
|
31
|
+
三语言提供 `LaunchLabPoolCreateEvent`、`StonkFunPoolCreateEvent`、`LaunchLabTradeEvent`、`StonkFunTradeEvent`。它们复用已有 RaydiumLaunchlab 结构。平台归属仍需池配置或迁移记录,不能仅凭共享 program ID 断言 StonkFun。
|
|
32
|
+
|
|
33
|
+
### gRPC 生命周期
|
|
34
|
+
|
|
35
|
+
一个 client 同时管理一个 DEX 订阅。再次订阅会停止并等待原订阅;动态更新和停止串行进行。Node `sub.join()` / Go `sub.Join()` 等待全部 worker;Python `await client.stop()` 等待任务。Node 使用 grpc-js + proto-loader,安装 SDK 不再包含 Yellowstone Rust N-API 客户端依赖。
|
|
36
|
+
|
|
37
|
+
Node `sub.states` / `sub.status()`、Go `sub.States` / `sub.Status()`、Python `queue.states` / `queue.status()` 提供连接、重连、连续性中断、丢弃及停止状态;保留原事件和错误消费方式。状态通知有界,状态快照可读取当前累计信息。重连成功不会自动清除连续性中断。调用方需中止交易准备,在选定 fork 下重新验证缓存,再恢复 readiness。
|
|
38
|
+
|
|
39
|
+
节点停止可能使事件消费结束或队列停止产出;Python 队列消费者同时观察状态以终止 get 等待。完整实时缓存恢复、新 array 发现和 commitment/fork 自动关联仍在实现。
|
|
40
|
+
|
|
41
|
+
示例见 [gRPC 缓存接入](#grpc-cache);PublicNode 接入读取 GRPC_URL/GRPC_TOKEN,不打印凭据。
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
### DAMM route 解析
|
|
45
|
+
|
|
46
|
+
新增 legacy swap/swap2 route;mode 0/1 exact-in,mode 2 第一个金额为期望输出、第二个为最大输入,其它 mode unknown。失败保留意图、实际成交未知;Token-2022 缺净到账证据不填零。历史模拟 expected 新增 DAMM leg,调用方不可依赖旧的空 legs。
|
|
47
|
+
|
|
48
|
+
<a id="grpc-cache"></a>
|
|
49
|
+
|
|
50
|
+
## gRPC account cache
|
|
51
|
+
|
|
52
|
+
实时交易数据以 Rust sol-parser-sdk 的 Yellowstone gRPC 接口为准。三个原生 parser 使用相同来源:交易事件提供 pool/mint/方向线索,原始账户事件提供当前字节、owner、slot、write_version,Clock 提供 epoch/时间,BlockMeta 或显式 gRPC unary 提供 blockhash。
|
|
53
|
+
|
|
54
|
+
此流程不使用 WebSocket。parser 没有 WebSocket 订阅接口;parser 的 SubscriptionHandle/Subscription 管理 gRPC 流。trade-sdk 中另有通用 WebSocket 兼容模块,其实现与测试不是 parser gRPC 能力的证明。
|
|
55
|
+
|
|
56
|
+
| 语言 | parser 实时入口 | 原始账户写入 trade cache |
|
|
57
|
+
| --- | --- | --- |
|
|
58
|
+
| Node.js | YellowstoneGrpc.subscribeDexEvents | SubscriptionAccountCache.updateFromParser(raw) |
|
|
59
|
+
| Python | YellowstoneGrpc.subscribe_dex_events | SubscriptionAccountCache.update_from_parser(raw) |
|
|
60
|
+
| Go | YellowstoneGrpc.SubscribeDexEvents | SubscriptionAccountCache.UpdateRaw(pubkey, owner, data, lamports, slot, writeVersion) |
|
|
61
|
+
|
|
62
|
+
Node/Python 传原始账户事件的 payload,而非最外层 DexEvent wrapper。Go 将事件公钥解析为 solana.PublicKey;解析失败必须返回错误。账户关闭(lamports=0)保留为 tombstone,不复用旧字节。不要从 swap 事件伪造账户完整状态、当前手续费或 slot。
|
|
63
|
+
|
|
64
|
+
推荐接入顺序:
|
|
65
|
+
|
|
66
|
+
1. 在 parser 订阅交易与 AccountRawSnapshot;raw snapshot 需要显式开启事件过滤。按已知 pool/config/vault/mint/tick/bin/Clock 地址订阅。路由候选是线索,用户可选择 SOL、WSOL、USDC 或股票作为支付/收款资产。
|
|
67
|
+
2. 原始账户更新写入选定 fork 的本地 cache,保留真实版本。缺失配置/新 array 必须在交易前通过订阅或冷启动补齐;不会用 WebSocket 或热路径 RPC 自动兜底。
|
|
68
|
+
3. 冻结 cache.snapshot(),替换为用户的钱包、金额与资产,使用 cached prepare/route。本地校验 owner、pool/mint 连通性、状态、费率、Token-2022 费用及 freshness 后报价和构建。本次买入或卖出是独立交易。
|
|
69
|
+
4. 模拟可显式调用 simulateTransaction;这是验证步骤。读取模拟结果用 parser 的 simulation_routes 示例,不等于真实发送。
|
|
70
|
+
|
|
71
|
+
gRPC 流不保证首次提供所有静态账户。pool 已更新不等于 mint/config 已新鲜;不得把其它账户 slot 改成 Clock slot。重连后须确认缺失更新和 fork,缓存就绪前暂停构建。缺失数据或过期状态明确失败。
|
|
72
|
+
|
|
73
|
+
### 完整示例
|
|
74
|
+
|
|
75
|
+
两个 SDK 安装在各自环境中即可运行,也可分别在对应仓库运行。快照文件是两个示例间的明确接口,安装和运行不需要 Rust。
|
|
76
|
+
|
|
77
|
+
| 语言 | parser 仓库:gRPC 刷新 | trade 仓库:本地构建 |
|
|
78
|
+
| --- | --- | --- |
|
|
79
|
+
| Node.js | npx tsx examples/stonkfun_snapshot_refresh.ts /absolute/snapshot.json --require-pool-update | npx tsx examples/cached_trade.ts /absolute/snapshot.json |
|
|
80
|
+
| Python | python examples/stonkfun_snapshot_refresh.py /absolute/snapshot.json --require-pool-update | python examples/cached_trade.py /absolute/snapshot.json |
|
|
81
|
+
| Go | go run ./examples/stonkfun_snapshot_refresh /absolute/snapshot.json --require-pool-update | go run ./examples/cached_trade /absolute/snapshot.json |
|
|
82
|
+
|
|
83
|
+
使用与 cached_trade 匹配的 accounts[]、legs[] 完整快照,例如现有 cached_tip_route_* 样本;更换自己的钱包、金额和本次方向。CPMM 的 named snapshot 应交给 cached_cpmm 示例。不要直接用历史快照实时交易。
|
|
84
|
+
|
|
85
|
+
parser 刷新读取 GRPC_URL / GRPC_TOKEN,保留没更新账户的原 slot,可能因 provider 没有发送 pool 更新而超时;trade 默认不联网。需要模拟时为 trade 示例增加 --simulate,并配置 RPC_URL。冷启动与显式模拟允许 RPC,交易报价和构建热路径禁止 RPC。
|
|
86
|
+
|
|
87
|
+
本文件描述已实现的接入接口;完整自动重连恢复、fork 一致性策略、新 array 发现和全部协议缓存仍须逐项验证。之前十轮报告中的 WebSocket 修复仅属于 trade-sdk 通用模块,不计入这些 gRPC 对齐能力。
|
|
88
|
+
|
|
89
|
+
<a id="simulation-routes"></a>
|
|
90
|
+
|
|
91
|
+
## Simulation routes
|
|
92
|
+
|
|
93
|
+
运行trade侧cached_trade示例时,--simulate返回包含innerInstructions的模拟结果。内部SPL转账可能是jsonParsed,原来的compiled route入口仍会拒绝它。专用入口需要**原始交易wire和对应完整simulateTransaction响应**,仅离线处理证据,不查询RPC或重新构建签名交易。
|
|
94
|
+
|
|
95
|
+
```sh
|
|
96
|
+
# Go
|
|
97
|
+
go run ./examples/simulation_routes solparser/testdata/cached_tip_routes_20261002.json route-buy
|
|
98
|
+
# Node
|
|
99
|
+
npx tsx examples/simulation_routes.ts examples/fixtures/cached_tip_routes_20261002.json route-buy
|
|
100
|
+
# Python
|
|
101
|
+
PYTHONPATH=. python examples/simulation_routes.py examples/fixtures/cached_tip_routes_20261002.json route-buy
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
import { analyzeSimulationRoutes } from "sol-parser-sdk";
|
|
106
|
+
const route = analyzeSimulationRoutes(wire, simulationResponse);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
from sol_parser import analyze_simulation_routes
|
|
111
|
+
route = analyze_simulation_routes(wire, simulation_response)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
SPL普通/checked/明确fee转账,以及首次ATA的getAccountDataSize/createAccount/initializeImmutableOwner/initializeAccount3的parsed表示被还原为分析证据;raw/compiled CPI原样保留位置和stack height。其它parsed指令明确报错。金额使用最小单位amount字段,不用uiAmount浮点值。缺失Token-2022手续费的净到账保持未知;失败交易实际成交字段为空。tip不会被当成WSOL充值。含ALT的V0需要原有compiled route入口与显式loadedAddresses;此入口不查询lookup table。调用方必须提供与wire对应的可信模拟响应。
|
|
115
|
+
|
|
116
|
+
保存快照与模拟仅用于复现,不是实时状态。Go parser 已补齐 AnalyzeSimulationRoutes,接受 wire、完整模拟响应的 []byte 和可选 graduatedPools;安装和使用不依赖 Rust。
|
|
117
|
+
|
|
118
|
+
```go
|
|
119
|
+
route, err := solparser.AnalyzeSimulationRoutes(wire, simulationResponseJSON, nil)
|
|
120
|
+
if err != nil { return err }
|
|
121
|
+
// route.Legs 的 ActualOutputAmount == nil 表示净到账未知,不能当作零。
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
当前银行模拟复现:`examples/fixtures/simulation_routes_live_20261002.json`。包括因旧保护价格触发滑点错误的买入和成功卖出;失败时只保留意图,actual amount为空。Go可以用相同文件路径运行上述示例。保存wire用replaceRecentBlockhash重新模拟并不等于当前状态重新报价。
|
|
125
|
+
|
|
126
|
+
首次 ATA 模拟:`examples/fixtures/simulation_ata_20261002.json`,含 classic SPL、Token-2022 股票和带建账户的单池/三跳卖出。setup指令用于mint推断,不计入成交转账;getAccountDataSize仅支持空列表或immutableOwner扩展,其它扩展明确报错。compiled route入口现在也要求meta.err显式存在,缺失状态不再默认为成功。
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
2026-10-03: Prefunded ATA creation is also supported: System transfer, allocate and assign CPI are reconstructed and validated. getAccountDataSize accepts empty/immutableOwner extension lists only; unknown parsed instructions remain errors. Wire and compiled-route indexes, duplicate CPI groups and token-balance indexes are validated before event reconstruction. No RPC is used by the parser. Mainnet prefunded-ATA evidence is covered by the review10 fixture tests.
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
#### 第二批审查证据(2026-10-03)
|
|
133
|
+
|
|
134
|
+
`fixtures/batch2_cpmm_simulations_20261003.json` 含独立买入/卖出的真实主网模拟响应与原 wire,两个模拟均成功,三语言解析结果一致。买入实际输入 1000000、输出 13486034;卖出实际输入 1000000,但响应未明确 Token-2022 转账费,净到账保持未知。不要用快照报价填充实际成交字段。根目录第二批十轮审查证据同时保留触发滑点保护的延迟快照与历史三跳重放。
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
### CPMM LP 模拟中的铸造/销毁 CPI(2026-10-06)
|
|
138
|
+
|
|
139
|
+
三语言支持 parsed SPL/Token-2022 的 mintTo、burn、mintToChecked、burnChecked,校验精确 u64 金额、u8 decimals、多签账户与原始指令位置。它们保留为供分析的指令,不计入转账或 swap 成交;LP 顶层操作仍可能出现在 unknown_invocations,不意味着已新增 LP 事件 API。首次 ATA、资金准备 swap、LP 操作可在同笔模拟中解析。未知 Token-2022 净到账仍为 null。
|
|
140
|
+
|
|
141
|
+
真实主网模拟样例:examples/fixtures/cpmm_lp_simulations_20261006.json,包含 LP 存入与取出。在各语言仓库运行:
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
# Go
|
|
145
|
+
go run ./examples/simulation_routes examples/fixtures/cpmm_lp_simulations_20261006.json
|
|
146
|
+
# Node
|
|
147
|
+
npx tsx examples/simulation_routes.ts examples/fixtures/cpmm_lp_simulations_20261006.json
|
|
148
|
+
# Python
|
|
149
|
+
PYTHONPATH=. python examples/simulation_routes.py examples/fixtures/cpmm_lp_simulations_20261006.json
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
该样例包含 sigVerify=false 的资金准备前缀,仅作执行验证,不可广播。新交易的完整原始响应可由 Rust CPMM_SIMULATION_DIR 保存后,用相同示例解析。
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
## Pump upgrade (October 2026)
|
|
156
|
+
|
|
157
|
+
Compact Pump v3 and PumpSwap v2 trades use their new 17-account layouts. New typed events cover `PumpFunPostCompleteBuy`, `PumpFunComplete`, `PumpFunSweepBondingCurveFee` and `PumpSwapSweepPoolFee`, with program-scoped log and CPI parsing. Historical SOL CompleteEvent payloads remain supported. Curve/pool retained fees and synthetic counters are exposed; optional historical tails default to zero.
|
|
158
|
+
|
|
159
|
+
For a synthetic completing buy, retain TradeEvent **and** PostCompleteBuyEvent and aggregate execution amounts within the same invocation. CompleteEvent is the completion notification. For `multi_hop_swap`, retain each venue's trade events; different venues are not merged into one fill. The multi-hop intent decoder exposes the fixed user accounts, input/minimum limits and 5 roles per hop; these limits are not actual executed amounts. Streamer forwards the typed events and account fields through its parser bridge (its re-exported `parser_sdk` also provides the intent decoder).
|
|
160
|
+
|
|
161
|
+
Reference: [pump-public-docs](https://github.com/pump-fun/pump-public-docs/tree/8cda1fa30ea658b20909d8aedf002047119388d2). Validation uses offline official IDL fixtures; no live trade is sent by the tests.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sol-parser-sdk-python"
|
|
3
|
-
version = "0.5.
|
|
3
|
+
version = "0.5.11"
|
|
4
4
|
description = "Solana DEX program log parsing (pure Python, API aligned with sol-parser-sdk)"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -16,6 +16,7 @@ shredstream = [
|
|
|
16
16
|
"solders>=0.21.0",
|
|
17
17
|
]
|
|
18
18
|
dev = [
|
|
19
|
+
"cryptography>=44.0", # Independent Ed25519 verification in signed wire regressions.
|
|
19
20
|
"pytest>=8.0",
|
|
20
21
|
"pytest-asyncio>=0.21",
|
|
21
22
|
"requests>=2.31",
|
|
@@ -148,6 +148,9 @@ from .event_types import (
|
|
|
148
148
|
# Meteora DAMM v2 events
|
|
149
149
|
MeteoraDammV2SwapEvent,
|
|
150
150
|
MeteoraDammV2CreatePositionEvent,
|
|
151
|
+
MeteoraDammV2ClaimPositionFeeEvent,
|
|
152
|
+
MeteoraDammV2ClaimRewardEvent,
|
|
153
|
+
MeteoraDlmmClaimRewardEvent,
|
|
151
154
|
MeteoraDammV2ClosePositionEvent,
|
|
152
155
|
MeteoraDammV2AddLiquidityEvent,
|
|
153
156
|
MeteoraDammV2RemoveLiquidityEvent,
|
|
@@ -155,6 +158,11 @@ from .event_types import (
|
|
|
155
158
|
MeteoraDammV2DynamicFeeParameters,
|
|
156
159
|
MeteoraDammV2UpdateDelegatePermissionEvent,
|
|
157
160
|
MeteoraDammV2WithdrawDeadLiquidityRewardEvent,
|
|
161
|
+
MeteoraDammV2WithdrawIneligibleRewardEvent,
|
|
162
|
+
MeteoraDammV2UpdateRewardFunderEvent,
|
|
163
|
+
MeteoraDammV2UpdateRewardDurationEvent,
|
|
164
|
+
MeteoraDammV2InitializeRewardEvent,
|
|
165
|
+
MeteoraDammV2FundRewardEvent,
|
|
158
166
|
MeteoraDammV2CreateConfigEvent,
|
|
159
167
|
MeteoraDammV2CreateDynamicConfigEvent,
|
|
160
168
|
MeteoraDbcCurveCompleteEvent,
|
|
@@ -433,6 +441,9 @@ __all__ = [
|
|
|
433
441
|
"MeteoraPoolsPoolCreatedEvent",
|
|
434
442
|
"MeteoraDammV2SwapEvent",
|
|
435
443
|
"MeteoraDammV2CreatePositionEvent",
|
|
444
|
+
"MeteoraDammV2ClaimPositionFeeEvent",
|
|
445
|
+
"MeteoraDammV2ClaimRewardEvent",
|
|
446
|
+
"MeteoraDlmmClaimRewardEvent",
|
|
436
447
|
"MeteoraDammV2ClosePositionEvent",
|
|
437
448
|
"MeteoraDammV2AddLiquidityEvent",
|
|
438
449
|
"MeteoraDammV2RemoveLiquidityEvent",
|
|
@@ -440,6 +451,11 @@ __all__ = [
|
|
|
440
451
|
"MeteoraDammV2DynamicFeeParameters",
|
|
441
452
|
"MeteoraDammV2UpdateDelegatePermissionEvent",
|
|
442
453
|
"MeteoraDammV2WithdrawDeadLiquidityRewardEvent",
|
|
454
|
+
"MeteoraDammV2WithdrawIneligibleRewardEvent",
|
|
455
|
+
"MeteoraDammV2UpdateRewardFunderEvent",
|
|
456
|
+
"MeteoraDammV2UpdateRewardDurationEvent",
|
|
457
|
+
"MeteoraDammV2InitializeRewardEvent",
|
|
458
|
+
"MeteoraDammV2FundRewardEvent",
|
|
443
459
|
"MeteoraDammV2CreateConfigEvent",
|
|
444
460
|
"MeteoraDammV2CreateDynamicConfigEvent",
|
|
445
461
|
"MeteoraDbcCurveCompleteEvent",
|
|
@@ -490,3 +506,8 @@ __all__ += ["LaunchLabPoolCreateEvent", "StonkFunPoolCreateEvent", "LaunchLabTra
|
|
|
490
506
|
|
|
491
507
|
from .grpc_client import DexEventQueue, GrpcStreamStatus
|
|
492
508
|
__all__ += ["DexEventQueue", "GrpcStreamStatus"]
|
|
509
|
+
|
|
510
|
+
from .pump_upgrade import decode_pump_multi_hop_intent
|
|
511
|
+
|
|
512
|
+
from .pump_upgrade import PumpFunPostCompleteBuyEvent, PumpFunSweepBondingCurveFeeEvent, PumpFunCompleteEvent, PumpSwapSweepPoolFeeEvent
|
|
513
|
+
__all__ += ['decode_pump_multi_hop_intent','PumpFunPostCompleteBuyEvent','PumpFunSweepBondingCurveFeeEvent','PumpFunCompleteEvent','PumpSwapSweepPoolFeeEvent']
|
{sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.11}/sol_parser/account_dispatcher.py
RENAMED
|
@@ -110,6 +110,119 @@ def fill_accounts_with_owned_keys(
|
|
|
110
110
|
return
|
|
111
111
|
filler(get)
|
|
112
112
|
|
|
113
|
+
def fill_clmm_liquidity(remove=False):
|
|
114
|
+
position_index = 2 if remove else 4
|
|
115
|
+
allowed = (bytes([58,127,188,62,79,82,196,96]), bytes([160,38,208,111,104,91,44,1])) if remove else (bytes([133,29,89,223,69,238,176,10]), bytes([46,156,243,118,13,205,251,178]))
|
|
116
|
+
selected = None
|
|
117
|
+
for invocation in invokes.get(base58.b58decode(RAYDIUM_CLMM_PROGRAM_ID), []):
|
|
118
|
+
raw = get_instruction_data(meta_pb, transaction_pb, invocation)
|
|
119
|
+
if not raw or raw[:8] not in allowed:
|
|
120
|
+
continue
|
|
121
|
+
get = get_instruction_account_getter(meta_pb, transaction_pb, static_keys, w, r, invocation)
|
|
122
|
+
if get is None or not raydium.clmm_position_matches(data.position_nft_mint, get(position_index)):
|
|
123
|
+
continue
|
|
124
|
+
data.personal_position = get(position_index)
|
|
125
|
+
if selected is not None and any(selected(i) != get(i) for i in range(18)):
|
|
126
|
+
return
|
|
127
|
+
selected = get
|
|
128
|
+
if selected is not None:
|
|
129
|
+
(raydium.fill_clmm_decrease_liquidity_accounts if remove else raydium.fill_clmm_increase_liquidity_accounts)(data, selected)
|
|
130
|
+
|
|
131
|
+
def fill_pump_trade():
|
|
132
|
+
if not data.mint or data.mint == "11111111111111111111111111111111":
|
|
133
|
+
return
|
|
134
|
+
layouts = {
|
|
135
|
+
bytes([102,6,61,18,1,218,235,234]): (2,6,True,16),
|
|
136
|
+
bytes([56,252,116,8,158,223,205,95]): (2,6,True,16),
|
|
137
|
+
bytes([51,230,133,164,1,127,131,173]): (2,6,False,14),
|
|
138
|
+
bytes([184,23,238,97,103,197,211,61]): (1,13,True,27),
|
|
139
|
+
bytes([194,171,28,70,104,77,91,47]): (1,13,True,27),
|
|
140
|
+
bytes([93,246,130,60,231,233,64,178]): (1,13,False,26),
|
|
141
|
+
bytes([7,5,29,196,245,23,101,80]): (1,8,True,17),
|
|
142
|
+
bytes([225,247,80,30,213,179,132,136]): (1,8,True,17),
|
|
143
|
+
bytes([28,146,222,119,38,196,105,213]): (1,8,False,17),
|
|
144
|
+
}
|
|
145
|
+
selected = None
|
|
146
|
+
for invocation in invokes.get(base58.b58decode(PUMPFUN_PROGRAM_ID), []):
|
|
147
|
+
raw = get_instruction_data(meta_pb, transaction_pb, invocation)
|
|
148
|
+
layout = layouts.get(raw[:8]) if raw else None
|
|
149
|
+
if layout is None:
|
|
150
|
+
continue
|
|
151
|
+
mint_index, user_index, buy, minimum = layout
|
|
152
|
+
oi, ii = invocation
|
|
153
|
+
instruction = (transaction_pb.message.instructions[oi] if ii < 0 else
|
|
154
|
+
next(g for g in meta_pb.inner_instructions if g.index == oi).instructions[ii])
|
|
155
|
+
if buy != data.is_buy or len(instruction.accounts) < minimum:
|
|
156
|
+
continue
|
|
157
|
+
get = get_instruction_account_getter(meta_pb, transaction_pb, static_keys, w, r, invocation)
|
|
158
|
+
if get is None or get(mint_index) != data.mint:
|
|
159
|
+
continue
|
|
160
|
+
if data.user and data.user != "11111111111111111111111111111111" and get(user_index) != data.user:
|
|
161
|
+
continue
|
|
162
|
+
if selected is not None:
|
|
163
|
+
return
|
|
164
|
+
selected = get
|
|
165
|
+
if selected is not None:
|
|
166
|
+
pumpfun.fill_trade_accounts(data, selected)
|
|
167
|
+
|
|
168
|
+
def fill_swap(buy):
|
|
169
|
+
# Match the event's own pool, user and direction, not the largest invoke.
|
|
170
|
+
if not data.pool or data.pool == "11111111111111111111111111111111":
|
|
171
|
+
return
|
|
172
|
+
selected = None
|
|
173
|
+
legacy = (bytes([102, 6, 61, 18, 1, 218, 235, 234]),
|
|
174
|
+
bytes([198, 46, 21, 82, 180, 217, 232, 112])) if buy else (bytes([51, 230, 133, 164, 1, 127, 131, 173]),)
|
|
175
|
+
compact = (bytes([184, 23, 238, 97, 103, 197, 211, 61]),
|
|
176
|
+
bytes([194, 171, 28, 70, 104, 77, 91, 47])) if buy else (bytes([93, 246, 130, 60, 231, 233, 64, 178]),)
|
|
177
|
+
for invocation in invokes.get(base58.b58decode(PUMPSWAP_PROGRAM_ID), []):
|
|
178
|
+
raw = get_instruction_data(meta_pb, transaction_pb, invocation)
|
|
179
|
+
boost = buy and raw is not None and raw[:8] == bytes([105, 68, 6, 175, 0, 7, 35, 162])
|
|
180
|
+
if raw is None or (not boost and raw[:8] not in legacy + compact):
|
|
181
|
+
continue
|
|
182
|
+
oi, ii = invocation
|
|
183
|
+
instruction = (transaction_pb.message.instructions[oi] if ii < 0 else
|
|
184
|
+
next(g for g in meta_pb.inner_instructions if g.index == oi).instructions[ii])
|
|
185
|
+
minimum = 13 if boost else (17 if raw[:8] in compact else (23 if buy else 21))
|
|
186
|
+
if len(instruction.accounts) < minimum:
|
|
187
|
+
continue
|
|
188
|
+
get = get_instruction_account_getter(meta_pb, transaction_pb, static_keys, w, r, invocation)
|
|
189
|
+
if get is None or get(0) != data.pool:
|
|
190
|
+
continue
|
|
191
|
+
if data.user and data.user != "11111111111111111111111111111111" and get(7 if boost else 1) != data.user:
|
|
192
|
+
continue
|
|
193
|
+
if selected is not None:
|
|
194
|
+
return # Invocation positions are unavailable; ambiguous context stays blank.
|
|
195
|
+
selected = (get, boost)
|
|
196
|
+
if selected is not None:
|
|
197
|
+
get, boost = selected
|
|
198
|
+
filler = pumpswap.fill_boost_buy_accounts if boost else (pumpswap.fill_buy_accounts if buy else pumpswap.fill_sell_accounts)
|
|
199
|
+
filler(data, get)
|
|
200
|
+
|
|
201
|
+
def fill_create(v2_only=False):
|
|
202
|
+
selected = None
|
|
203
|
+
for ix in invokes.get(base58.b58decode(PUMPFUN_PROGRAM_ID), []):
|
|
204
|
+
raw = get_instruction_data(meta_pb, transaction_pb, ix)
|
|
205
|
+
if raw is None:
|
|
206
|
+
continue
|
|
207
|
+
v2 = raw[:8] == bytes([214,144,76,236,95,139,49,180])
|
|
208
|
+
legacy = raw[:8] == bytes([24,30,200,40,5,28,7,119])
|
|
209
|
+
if not v2 and (v2_only or not legacy):
|
|
210
|
+
continue
|
|
211
|
+
get = get_instruction_account_getter(meta_pb, transaction_pb, static_keys, w, r, ix)
|
|
212
|
+
oi, ii = ix
|
|
213
|
+
instruction = (transaction_pb.message.instructions[oi] if ii < 0 else
|
|
214
|
+
next(g for g in meta_pb.inner_instructions if g.index == oi).instructions[ii])
|
|
215
|
+
if len(instruction.accounts) < (16 if v2 else 14) or get is None:
|
|
216
|
+
continue
|
|
217
|
+
if data.mint and data.mint != "11111111111111111111111111111111" and get(0) != data.mint:
|
|
218
|
+
continue
|
|
219
|
+
if selected is not None:
|
|
220
|
+
return # Multiple matching creates: do not guess.
|
|
221
|
+
selected = (get, v2)
|
|
222
|
+
if selected:
|
|
223
|
+
get, v2 = selected
|
|
224
|
+
(pumpfun.fill_create_v2_accounts if v2 else pumpfun.fill_create_accounts)(data, get)
|
|
225
|
+
|
|
113
226
|
et = event.type
|
|
114
227
|
data = event.data
|
|
115
228
|
|
|
@@ -119,17 +232,17 @@ def fill_accounts_with_owned_keys(
|
|
|
119
232
|
EventType.PUMP_FUN_SELL,
|
|
120
233
|
EventType.PUMP_FUN_BUY_EXACT_SOL_IN,
|
|
121
234
|
):
|
|
122
|
-
|
|
235
|
+
fill_pump_trade()
|
|
123
236
|
elif et == EventType.PUMP_FUN_CREATE:
|
|
124
|
-
|
|
237
|
+
fill_create()
|
|
125
238
|
elif et == EventType.PUMP_FUN_CREATE_V2:
|
|
126
|
-
|
|
239
|
+
fill_create(True)
|
|
127
240
|
elif et == EventType.PUMP_FUN_MIGRATE:
|
|
128
241
|
run(PUMPFUN_PROGRAM_ID, lambda g: pumpfun.fill_migrate_accounts(data, g))
|
|
129
242
|
elif et == EventType.PUMP_SWAP_BUY:
|
|
130
|
-
|
|
243
|
+
fill_swap(True)
|
|
131
244
|
elif et == EventType.PUMP_SWAP_SELL:
|
|
132
|
-
|
|
245
|
+
fill_swap(False)
|
|
133
246
|
elif et == EventType.PUMP_SWAP_TRADE:
|
|
134
247
|
run(PUMPSWAP_PROGRAM_ID, lambda g: pumpswap.fill_trade_accounts(data, g))
|
|
135
248
|
elif et == EventType.PUMP_SWAP_CREATE_POOL:
|
|
@@ -149,9 +262,9 @@ def fill_accounts_with_owned_keys(
|
|
|
149
262
|
elif et == EventType.RAYDIUM_CLMM_CLOSE_POSITION:
|
|
150
263
|
run(RAYDIUM_CLMM_PROGRAM_ID, lambda g: raydium.fill_clmm_close_position_accounts(data, g))
|
|
151
264
|
elif et == EventType.RAYDIUM_CLMM_INCREASE_LIQUIDITY:
|
|
152
|
-
|
|
265
|
+
fill_clmm_liquidity()
|
|
153
266
|
elif et == EventType.RAYDIUM_CLMM_DECREASE_LIQUIDITY:
|
|
154
|
-
|
|
267
|
+
fill_clmm_liquidity(True)
|
|
155
268
|
elif et == EventType.RAYDIUM_CPMM_SWAP:
|
|
156
269
|
run(RAYDIUM_CPMM_PROGRAM_ID, lambda g: raydium.fill_cpmm_swap_accounts(data, g))
|
|
157
270
|
elif et == EventType.RAYDIUM_CPMM_DEPOSIT:
|