sol-parser-sdk-python 0.5.9__tar.gz → 0.5.10__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.9 → sol_parser_sdk_python-0.5.10}/PKG-INFO +9 -2
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/README.md +8 -1
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/README_CN.md +8 -1
- sol_parser_sdk_python-0.5.10/docs/FAILED_TRANSACTION_AUDIT_20261007.md +42 -0
- sol_parser_sdk_python-0.5.10/docs/PUMPFUN_CREATE_REGRESSION_20261007.md +41 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/pyproject.toml +1 -1
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_dispatcher.py +27 -2
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/pumpfun.py +6 -15
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/dex_parsers.py +4 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/event_types.py +14 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc_client.py +4 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc_instruction_parser.py +11 -1
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/instructions.py +3 -3
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/rpc_parser.py +11 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/2MfmZSU8mWEbskNHAxQGphAyB5x72SC2HYuAkLeSyH6MjttUHqUjm24wPMeH7zrCoQoYFwbLeiFE571mc8WvgZyL.json +524 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/2dabmQiykzC1tsNmgtRFbsRJjEKMfUySgScJc2J2uq8CQtoXWZ3YyT99p3nVuCXifEhLkyUe4Sf4nfe2UkFT8AJr.json +252 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/2eVpZNvQYPMBVNT5357Qt7HVAUSv9gdwqxKStvdwQ498rcJLLCHVcYPaGfFqVBz44ndYvkA1H4CwjBuDSviAj7jp.json +713 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3GufGVVRrnrH1Yuto57jDeTKXeki6ooE9w6h4qYRvNm5FcCpxwDHNvzHXdpAMbxRmukWJpSPHUKHEjnFTCC979ka.json +676 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3LQK2JHVbVSSfyCYwTwzoYTY9NEN4gZXzqw3TvAvMJHsvPsopCHtsa5ALhj4tFn8xWbmJ5DsYMMcnPukTBkSjtQf.json +252 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3MRWKDUcD5CGn5Xz4qWyGA8Y9udw4SsSr4gcxCjTUqCFt6Zc6uiwHF1wLZXKoqBcGEM2kruBS85ymYxmYk8FLGBk.json +252 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3NBSCgAXpNqg7JBUzp6RsfZYzf2QbbHi6r2wcoBF4Lpuzozae7ExUJUGoqpVCXXs8cbibr6aWySH1bsg86Enuhez.json +252 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3QVpcUq64D4DUV9empFr3G98pCEa1Cp2fAcFJKyiJGsQ2ir2S4yBLhHYXPNmLfCE8KVDgLApfBYTFM7pf9JVPbsb.json +248 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3REXMDkvZsWvgc8czYpfn24avz18APMuzbV2VgQBeymArdJvfQcfcpKr46f3j1H2bAiymFneaNocPH7KzPUPbR1S.json +252 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3ejAydePsZTUfeZaU9eiAM37gV5AYPG9hhyMtUobJLQtSMgroDeiE8njXu2JiwMyX5YJLp3vrfNPy89S7EDdUCAy.json +611 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3zC4bw1osyebZ77KagXYP3b5rEBHvJCgcwCriCLc5gAUp9Ev6Bx5ZMbqnYpkKE2VgZgMFcZN5FYKQfcKL45MWpyu.json +252 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/5PgkFgTLSEZPZhxgWNToPzTZct95SycuaH9H3g82YwcKXudtiynEZmiaoQrhGv2gdZLrvsVZ5Wn88KGirbFYpLrt.json +713 -0
- sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/661yA5s6uxUsggTcT4cZ6yyMfNmF4mCZzxLnCb1zBrSY3YhAiouYXBitiPvkngBEKxaeGcpXiek6qXDajiRr9wuY.json +505 -0
- sol_parser_sdk_python-0.5.10/tests/test_pumpfun_create_regression.py +101 -0
- sol_parser_sdk_python-0.5.9/uv.lock +0 -408
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/.env.example +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/.gitignore +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_ALIGNMENT.md +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_DAMM_FACTORY_ALIGNMENT_20261004.md +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_DAMM_FACTORY_EVIDENCE_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_MIGRATION.md +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_PUMPFUN_NATIVE_DEBIT_ALIGNMENT_20261004.md +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_PUMPFUN_NATIVE_DEBIT_EVIDENCE_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_PUMPFUN_SETTLEMENT_ALIGNMENT_20261004.md +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_PUMPFUN_SETTLEMENT_EVIDENCE_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/GRPC_CACHE.md +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/SIMULATION_ROUTES.md +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/block_meta_stream.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/amm_v4_grpc_refresh_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/batch2_cpmm_simulations_20261003.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/block_meta_grpc_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/cached_damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/cached_tip_routes_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/cpmm_lp_simulations_20261006.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/pumpfun_current_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/pumpfun_funded_sell_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/pumpfun_settlement_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/pumpfun_usdc_multihop_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/pumpswap_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/simulation_ata_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/simulation_routes_live_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/meteora_damm_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/multi_protocol_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/parse_tx_by_signature.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/pumpfun_quick_test.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/pumpfun_trade_filter.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/pumpfun_with_metrics.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/pumpswap_low_latency.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/pumpswap_with_metrics.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/rust_example_utils.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/simulation_routes.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/stonkfun_routes.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/stonkfun_snapshot_refresh.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/scripts/bench_parser.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/scripts/gen_golden_rust.sh +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/meteora.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/orca.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/pumpswap.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/raydium.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/raydium_launchlab.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/accounts/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/accounts/raydium_orca.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/accounts/rpc_wallet.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/accounts/utils.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/block_meta.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/check_migration.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/clock.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/common/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/entries_decode.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/env_config.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/event_type_parity.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/geyser_pb2.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/geyser_pb2_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc/geyser_connect.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc/subscribe_builder.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc/transaction_meta.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc_types.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/inner_instruction_parser.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/instr/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/instr_account_utils.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/json_util.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/liquidity_snapshot.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/log_instr_dedup.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/logs/__init__.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/market.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/merger.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/order_buffer.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/parser.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/pumpfun_fee_enrich.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/rust_api_inventory.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/rust_event_json.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/shredstream_client.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/shredstream_pb2.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/shredstream_pb2_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/shredstream_pumpfun.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/simulation_route.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/solana_storage_pb2.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/solana_storage_pb2_grpc.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/stonkfun_registry.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/transaction_route.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/u128_parity.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/verify_discriminators.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/wire_transaction.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/cached_damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/cached_tip_routes_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/cpmm_lp_simulations_20261006.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/damm_v2_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/golden_parse_log.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/pumpfun_concentrated_multihop_mainnet_simulations_20261005.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/pumpfun_current_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/pumpfun_funded_sell_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/pumpfun_settlement_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/pumpfun_usdc_multihop_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/pumpswap_mainnet_simulations_20261004.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/review10_compiled_bounds.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/review10_prefunded_ata.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/review10_wire_bounds.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/simulation_ata_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/simulation_routes_live_20261002.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/stonkfun_routes_0_7_7.json +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_amm_v4_v2.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_block_meta.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_exact_metadata_json.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_filter_and_account_parity.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_golden.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_grpc_unary_methods.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_imports_and_inner.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_launchlab_invocation_anchor.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_log_instr_dedup.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_market_helpers.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_native_grpc_server.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_native_plan_lifecycle.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_orca_whirlpool_instruction_parity.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_order_buffer.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pump_fees_instruction_parity.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pumpfun_account_fill.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pumpfun_trade_tail.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pumpfun_v2_parity.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pumpswap_instruction.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pumpswap_upgrade.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_raydium_clmm_instruction_parity.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_raydium_current_logs.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_review10.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_review_batch2.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_shredstream.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_simulation_route.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_snapshot_refresh_example.py +0 -0
- {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_stonkfun_routes.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.10
|
|
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
|
|
@@ -76,6 +76,13 @@ This is the Python implementation of the FnZero Solana DEX parser SDK for asynci
|
|
|
76
76
|
|
|
77
77
|
## Release notes
|
|
78
78
|
|
|
79
|
+
### v0.5.10
|
|
80
|
+
|
|
81
|
+
- Matches PumpFun create/create_v2 accounts by the actual instruction discriminator and event mint, including CPI calls; ambiguous matches are left unspecified.
|
|
82
|
+
- Stops inferring quote mint/vault/token-program fields from arbitrary remaining create_v2 accounts and preserves authoritative decoded fields.
|
|
83
|
+
- Restores historical CreateEvent decoding and verifies successful and failed transactions using saved mainnet fixtures.
|
|
84
|
+
- Suppresses rolled-back DEX events from failed transactions and preserves failure status through RPC/gRPC adapters.
|
|
85
|
+
|
|
79
86
|
### v0.5.9
|
|
80
87
|
|
|
81
88
|
- Adds native gRPC lifecycle and block metadata support, instruction-level route analysis and StonkFun registry/snapshot examples.
|
|
@@ -117,7 +124,7 @@ This is the Python implementation of the FnZero Solana DEX parser SDK for asynci
|
|
|
117
124
|
**From PyPI**
|
|
118
125
|
|
|
119
126
|
```bash
|
|
120
|
-
pip install sol-parser-sdk-python==0.5.
|
|
127
|
+
pip install sol-parser-sdk-python==0.5.10
|
|
121
128
|
```
|
|
122
129
|
|
|
123
130
|
**From source**
|
|
@@ -58,6 +58,13 @@ This is the Python implementation of the FnZero Solana DEX parser SDK for asynci
|
|
|
58
58
|
|
|
59
59
|
## Release notes
|
|
60
60
|
|
|
61
|
+
### v0.5.10
|
|
62
|
+
|
|
63
|
+
- Matches PumpFun create/create_v2 accounts by the actual instruction discriminator and event mint, including CPI calls; ambiguous matches are left unspecified.
|
|
64
|
+
- Stops inferring quote mint/vault/token-program fields from arbitrary remaining create_v2 accounts and preserves authoritative decoded fields.
|
|
65
|
+
- Restores historical CreateEvent decoding and verifies successful and failed transactions using saved mainnet fixtures.
|
|
66
|
+
- Suppresses rolled-back DEX events from failed transactions and preserves failure status through RPC/gRPC adapters.
|
|
67
|
+
|
|
61
68
|
### v0.5.9
|
|
62
69
|
|
|
63
70
|
- Adds native gRPC lifecycle and block metadata support, instruction-level route analysis and StonkFun registry/snapshot examples.
|
|
@@ -99,7 +106,7 @@ This is the Python implementation of the FnZero Solana DEX parser SDK for asynci
|
|
|
99
106
|
**From PyPI**
|
|
100
107
|
|
|
101
108
|
```bash
|
|
102
|
-
pip install sol-parser-sdk-python==0.5.
|
|
109
|
+
pip install sol-parser-sdk-python==0.5.10
|
|
103
110
|
```
|
|
104
111
|
|
|
105
112
|
**From source**
|
|
@@ -58,6 +58,13 @@
|
|
|
58
58
|
|
|
59
59
|
## 发布说明
|
|
60
60
|
|
|
61
|
+
### v0.5.10
|
|
62
|
+
|
|
63
|
+
- 按实际指令 discriminator 和事件 mint 匹配 PumpFun create/create_v2 账户,支持 CPI,并拒绝猜测有歧义的匹配。
|
|
64
|
+
- 停止从 create_v2 的任意尾部账户推断 quote mint、vault、token program,保留权威解码字段。
|
|
65
|
+
- 恢复历史 CreateEvent 布局,并通过保存的真实主网成功、失败交易验证。
|
|
66
|
+
- 过滤失败交易中已经回滚的 Create/Buy 等 DEX 事件,并在 RPC/gRPC 转换中保留失败状态。
|
|
67
|
+
|
|
61
68
|
### v0.5.9
|
|
62
69
|
|
|
63
70
|
- Adds native gRPC lifecycle and block metadata support, instruction-level route analysis and StonkFun registry/snapshot examples.
|
|
@@ -99,7 +106,7 @@
|
|
|
99
106
|
**PyPI**
|
|
100
107
|
|
|
101
108
|
```bash
|
|
102
|
-
pip install sol-parser-sdk-python==0.5.
|
|
109
|
+
pip install sol-parser-sdk-python==0.5.10
|
|
103
110
|
```
|
|
104
111
|
|
|
105
112
|
**源码**
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Failed-transaction and skipped-test audit — 2026-10-07
|
|
2
|
+
|
|
3
|
+
## Findings and fix
|
|
4
|
+
|
|
5
|
+
The eight failed mainnet transactions failed on-chain: six attempted to allocate an already-used mint account; two had insufficient SOL. No parser fix can change their historical chain outcome. A new launch must use an unused mint account and sufficient SOL for the transfer/rent/fees.
|
|
6
|
+
|
|
7
|
+
Reviewing these previously excluded samples exposed an SDK defect: Go, Node.js and Python could emit instruction/log Create or Buy events for failed transactions, even though all of the transaction's program effects were rolled back. Python RPC metadata omitted `err`; Go and Node.js Yellowstone adapters also lost the failure flag.
|
|
8
|
+
|
|
9
|
+
The corrected high-level RPC/gRPC event paths suppress all DEX events when the transaction has a failure status. RPC metadata retains the original error; RPC-to-Yellowstone conversion preserves error **presence**, without pretending the JSON error is a Yellowstone binary error enum. Native protobuf errors remain usable as failure indicators even when their encoded payload is empty. Python's full subscription callback suppresses both instruction and log events.
|
|
10
|
+
|
|
11
|
+
The Rust RPC parser already suppressed failed transactions; the mainnet regression now explicitly asserts this behavior for the eight failed fixtures instead of skipping them. Raw ShredStream instruction decoding in sol-shred-sdk has no execution status and reports instruction intent; callers must use confirmed RPC/gRPC status to decide whether a launch committed.
|
|
12
|
+
|
|
13
|
+
## Actual failed transactions
|
|
14
|
+
|
|
15
|
+
| Signature | Slot | Confirmed chain failure |
|
|
16
|
+
| --- | ---: | --- |
|
|
17
|
+
| [2dabmQiykzC1tsNmgtRFbsRJjEKMfUySgScJc2J2uq8CQtoXWZ3YyT99p3nVuCXifEhLkyUe4Sf4nfe2UkFT8AJr](https://solscan.io/tx/2dabmQiykzC1tsNmgtRFbsRJjEKMfUySgScJc2J2uq8CQtoXWZ3YyT99p3nVuCXifEhLkyUe4Sf4nfe2UkFT8AJr) | 299999997 | Mint account already in use |
|
|
18
|
+
| [3GufGVVRrnrH1Yuto57jDeTKXeki6ooE9w6h4qYRvNm5FcCpxwDHNvzHXdpAMbxRmukWJpSPHUKHEjnFTCC979ka](https://solscan.io/tx/3GufGVVRrnrH1Yuto57jDeTKXeki6ooE9w6h4qYRvNm5FcCpxwDHNvzHXdpAMbxRmukWJpSPHUKHEjnFTCC979ka) | 454059364 | Insufficient SOL / lamports |
|
|
19
|
+
| [3LQK2JHVbVSSfyCYwTwzoYTY9NEN4gZXzqw3TvAvMJHsvPsopCHtsa5ALhj4tFn8xWbmJ5DsYMMcnPukTBkSjtQf](https://solscan.io/tx/3LQK2JHVbVSSfyCYwTwzoYTY9NEN4gZXzqw3TvAvMJHsvPsopCHtsa5ALhj4tFn8xWbmJ5DsYMMcnPukTBkSjtQf) | 299999997 | Mint account already in use |
|
|
20
|
+
| [3MRWKDUcD5CGn5Xz4qWyGA8Y9udw4SsSr4gcxCjTUqCFt6Zc6uiwHF1wLZXKoqBcGEM2kruBS85ymYxmYk8FLGBk](https://solscan.io/tx/3MRWKDUcD5CGn5Xz4qWyGA8Y9udw4SsSr4gcxCjTUqCFt6Zc6uiwHF1wLZXKoqBcGEM2kruBS85ymYxmYk8FLGBk) | 299999997 | Mint account already in use |
|
|
21
|
+
| [3NBSCgAXpNqg7JBUzp6RsfZYzf2QbbHi6r2wcoBF4Lpuzozae7ExUJUGoqpVCXXs8cbibr6aWySH1bsg86Enuhez](https://solscan.io/tx/3NBSCgAXpNqg7JBUzp6RsfZYzf2QbbHi6r2wcoBF4Lpuzozae7ExUJUGoqpVCXXs8cbibr6aWySH1bsg86Enuhez) | 299999991 | Mint account already in use |
|
|
22
|
+
| [3QVpcUq64D4DUV9empFr3G98pCEa1Cp2fAcFJKyiJGsQ2ir2S4yBLhHYXPNmLfCE8KVDgLApfBYTFM7pf9JVPbsb](https://solscan.io/tx/3QVpcUq64D4DUV9empFr3G98pCEa1Cp2fAcFJKyiJGsQ2ir2S4yBLhHYXPNmLfCE8KVDgLApfBYTFM7pf9JVPbsb) | 389243699 | Insufficient SOL / lamports |
|
|
23
|
+
| [3REXMDkvZsWvgc8czYpfn24avz18APMuzbV2VgQBeymArdJvfQcfcpKr46f3j1H2bAiymFneaNocPH7KzPUPbR1S](https://solscan.io/tx/3REXMDkvZsWvgc8czYpfn24avz18APMuzbV2VgQBeymArdJvfQcfcpKr46f3j1H2bAiymFneaNocPH7KzPUPbR1S) | 299999991 | Mint account already in use |
|
|
24
|
+
| [3zC4bw1osyebZ77KagXYP3b5rEBHvJCgcwCriCLc5gAUp9Ev6Bx5ZMbqnYpkKE2VgZgMFcZN5FYKQfcKL45MWpyu](https://solscan.io/tx/3zC4bw1osyebZ77KagXYP3b5rEBHvJCgcwCriCLc5gAUp9Ev6Bx5ZMbqnYpkKE2VgZgMFcZN5FYKQfcKL45MWpyu) | 299999991 | Mint account already in use |
|
|
25
|
+
|
|
26
|
+
The detailed JSON audit retains `meta.err` and the actual failure log message for each signature. The eight actual failures are now checked by Go/Node.js/Python/Rust RPC regressions; they produce no committed DEX events.
|
|
27
|
+
|
|
28
|
+
## Previously skipped or ignored tests
|
|
29
|
+
|
|
30
|
+
- The eight Node.js tests in `current_mainnet_transactions.test.ts` were opt-in network tests. Enabled them with `RUN_MAINNET_TESTS=1`: all eight passed against the public mainnet RPC, including PumpFun/PumpSwap, Meteora, Orca and Raydium fixtures.
|
|
31
|
+
- The Rust parser's ignored route timing test passed when run with `cargo test --lib -- --ignored`.
|
|
32
|
+
- sol-shred-sdk's ignored route timing and decoder microbenchmark tests both passed with the same command. These are manual timing tests, not previously failed tests.
|
|
33
|
+
|
|
34
|
+
## Final validation
|
|
35
|
+
|
|
36
|
+
- Go: `go test ./...` and `go vet ./...` passed, including the eight real failed transactions and native gRPC failure status tests.
|
|
37
|
+
- Node.js: build passed; full suite with `RUN_MAINNET_TESTS=1` and the shared 36-transaction corpus: **311 passed, zero skipped**.
|
|
38
|
+
- Python: full suite with the shared 36-transaction corpus: **277 passed**. Tests include RPC conversion, instruction-only gRPC parsing and the full subscription callback on failed transactions.
|
|
39
|
+
- Rust: shared-corpus RPC regression: **2 passed** (covering every successful sample plus all eight actual failed transactions); the ignored timing test passed.
|
|
40
|
+
- sol-shred-sdk: both ignored manual tests passed; its existing default/zero-copy correctness suites passed in the earlier synchronized-fix verification.
|
|
41
|
+
|
|
42
|
+
At verification time, changes were local and uncommitted. No transactions were submitted to Solana. Publication is tracked by the repository release.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# PumpFun create / create_v2 cross-language regression verification
|
|
2
|
+
|
|
3
|
+
Date: 2026-10-07. At verification time, changes were local and uncommitted. Publication is tracked by the repository release.
|
|
4
|
+
|
|
5
|
+
## Corrected behavior
|
|
6
|
+
|
|
7
|
+
- Select creation account context by the actual create/create_v2 discriminator and event mint, including CPI invocations. Require the corresponding minimum IDL account count (14/16). Decline ambiguous matches; never select a larger buy invocation as creation context.
|
|
8
|
+
- The current official public Pump IDL defines 16 fixed create_v2 accounts and **no quote mint/vault/token-program accounts**. Positions 16/17/18 are not interpreted as quote accounts. Preserve quote fields from decoded events and existing authoritative enrichment.
|
|
9
|
+
- Recognize the historical CreateEvent layout: three Borsh strings followed by exactly 96 bytes (mint, curve, user). Reject partial historical/modern layouts. Rust handles both direct logs and pre-decoded log/CPI event paths under both parser features.
|
|
10
|
+
- Rust and sol-shred-sdk also recognize historical create instruction arguments ending after the three strings, leaving unavailable creator metadata unspecified.
|
|
11
|
+
- Node.js and Python fill the complete legacy creation account context. Python declares the canonical create account fields so dataclass serialization retains them.
|
|
12
|
+
- sol-shred-sdk and the Rust parser SDK apply the quote fix to their ShredStream instruction paths as well.
|
|
13
|
+
|
|
14
|
+
## Mainnet evidence
|
|
15
|
+
|
|
16
|
+
Source: `sol-parser-sdk-golang/validation/pumpfun_create_20261007/transactions` and its `sources.json`, `pump_public_idl.json`, and `REPORT.md`.
|
|
17
|
+
Official IDL source: https://raw.githubusercontent.com/pump-fun/pump-public-docs/main/idl/pump.json
|
|
18
|
+
|
|
19
|
+
The shared corpus contains 36 signed getTransaction responses: 3 successful legacy creates, 25 successful create_v2 transactions, and 8 failed transactions. All four SDKs replayed the corpus. For each successful transaction, regression assertions compare creation mint/user/token program against the actual creating instruction and reject unrelated quote account values. Failed transactions are excluded from successful-launch assertions.
|
|
20
|
+
|
|
21
|
+
Rust RPC verification reconstructs the original signed binary transaction from the unparsed JSON response because its RPC parser expects binary encoding. sol-shred-sdk replays that same reconstructed signed transaction with the actual loaded addresses. These are offline RPC-derived replays, not independent live gRPC or raw-shred captures. This corpus does not establish USDC-launch coverage.
|
|
22
|
+
|
|
23
|
+
Each repository also includes five self-contained RPC fixtures: two historical legacy creates, a newer legacy create, and two recent create_v2 transactions. Regression tests additionally cover CPI creates, multiple mints, ambiguous duplicate creates, a longer unrelated buy, arbitrary remaining accounts, preservation of decoded quote fields, and historical payload bounds.
|
|
24
|
+
|
|
25
|
+
## Validation
|
|
26
|
+
|
|
27
|
+
| SDK | Full test results |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| sol-parser-sdk (Rust) | Default: 476 passed / 1 ignored; zero-copy: 474 passed / 1 ignored |
|
|
30
|
+
| sol-shred-sdk | Default: 398 passed / 2 ignored; zero-copy: 396 passed / 2 ignored |
|
|
31
|
+
| sol-parser-sdk-nodejs | TypeScript build passed; full suite with shared corpus: 302 passed / 8 skipped |
|
|
32
|
+
| sol-parser-sdk-python | Full suite with shared corpus: 275 passed |
|
|
33
|
+
|
|
34
|
+
All repositories passed `git diff --check`. Existing unrelated sol-shred-sdk working changes were preserved.
|
|
35
|
+
|
|
36
|
+
Run the new regression tests from each repository with `PUMPFUN_CREATE_CORPUS` pointing to the shared transactions directory to repeat all 36 samples; without that variable they use the repository's five saved fixtures.
|
|
37
|
+
|
|
38
|
+
- Rust: `cargo test --test pumpfun_create_regression`; also `cargo test --no-default-features --features parse-zero-copy --test pumpfun_create_regression`.
|
|
39
|
+
- sol-shred-sdk: the same Cargo test commands. On this macOS host, Cargo required `DYLD_LIBRARY_PATH` and `LIBCLANG_PATH` to point to the Xcode toolchain `usr/lib` directory for its existing RocksDB build dependency.
|
|
40
|
+
- Node.js: `npm test -- --run src/pumpfun_create_regression.test.ts`.
|
|
41
|
+
- Python: `.venv/bin/python -m pytest -q tests/test_pumpfun_create_regression.py`.
|
{sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_dispatcher.py
RENAMED
|
@@ -110,6 +110,31 @@ def fill_accounts_with_owned_keys(
|
|
|
110
110
|
return
|
|
111
111
|
filler(get)
|
|
112
112
|
|
|
113
|
+
def fill_create(v2_only=False):
|
|
114
|
+
selected = None
|
|
115
|
+
for ix in invokes.get(base58.b58decode(PUMPFUN_PROGRAM_ID), []):
|
|
116
|
+
raw = get_instruction_data(meta_pb, transaction_pb, ix)
|
|
117
|
+
if raw is None:
|
|
118
|
+
continue
|
|
119
|
+
v2 = raw[:8] == bytes([214,144,76,236,95,139,49,180])
|
|
120
|
+
legacy = raw[:8] == bytes([24,30,200,40,5,28,7,119])
|
|
121
|
+
if not v2 and (v2_only or not legacy):
|
|
122
|
+
continue
|
|
123
|
+
get = get_instruction_account_getter(meta_pb, transaction_pb, static_keys, w, r, ix)
|
|
124
|
+
oi, ii = ix
|
|
125
|
+
instruction = (transaction_pb.message.instructions[oi] if ii < 0 else
|
|
126
|
+
next(g for g in meta_pb.inner_instructions if g.index == oi).instructions[ii])
|
|
127
|
+
if len(instruction.accounts) < (16 if v2 else 14) or get is None:
|
|
128
|
+
continue
|
|
129
|
+
if data.mint and data.mint != "11111111111111111111111111111111" and get(0) != data.mint:
|
|
130
|
+
continue
|
|
131
|
+
if selected is not None:
|
|
132
|
+
return # Multiple matching creates: do not guess.
|
|
133
|
+
selected = (get, v2)
|
|
134
|
+
if selected:
|
|
135
|
+
get, v2 = selected
|
|
136
|
+
(pumpfun.fill_create_v2_accounts if v2 else pumpfun.fill_create_accounts)(data, get)
|
|
137
|
+
|
|
113
138
|
et = event.type
|
|
114
139
|
data = event.data
|
|
115
140
|
|
|
@@ -121,9 +146,9 @@ def fill_accounts_with_owned_keys(
|
|
|
121
146
|
):
|
|
122
147
|
run(PUMPFUN_PROGRAM_ID, lambda g: pumpfun.fill_trade_accounts(data, g))
|
|
123
148
|
elif et == EventType.PUMP_FUN_CREATE:
|
|
124
|
-
|
|
149
|
+
fill_create()
|
|
125
150
|
elif et == EventType.PUMP_FUN_CREATE_V2:
|
|
126
|
-
|
|
151
|
+
fill_create(True)
|
|
127
152
|
elif et == EventType.PUMP_FUN_MIGRATE:
|
|
128
153
|
run(PUMPFUN_PROGRAM_ID, lambda g: pumpfun.fill_migrate_accounts(data, g))
|
|
129
154
|
elif et == EventType.PUMP_SWAP_BUY:
|
{sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/pumpfun.py
RENAMED
|
@@ -113,15 +113,12 @@ def fill_trade_accounts(e: PumpFunTradeEvent, get: AccountGetter) -> None:
|
|
|
113
113
|
|
|
114
114
|
|
|
115
115
|
def fill_create_accounts(e: PumpFunCreateEvent, get: AccountGetter) -> None:
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
e
|
|
121
|
-
|
|
122
|
-
e.bonding_curve = get(2)
|
|
123
|
-
if _empty(e.user):
|
|
124
|
-
e.user = get(7)
|
|
116
|
+
for field, index in (("mint",0),("mint_authority",1),("bonding_curve",2),
|
|
117
|
+
("associated_bonding_curve",3),("global_account",4),("user",7),
|
|
118
|
+
("system_program",8),("token_program",9),("associated_token_program",10),
|
|
119
|
+
("event_authority",12),("program",13)):
|
|
120
|
+
if _empty(getattr(e, field, "")):
|
|
121
|
+
setattr(e, field, get(index))
|
|
125
122
|
|
|
126
123
|
|
|
127
124
|
def fill_create_v2_accounts(e: PumpFunCreateV2TokenEvent, get: AccountGetter) -> None:
|
|
@@ -157,12 +154,6 @@ def fill_create_v2_accounts(e: PumpFunCreateV2TokenEvent, get: AccountGetter) ->
|
|
|
157
154
|
e.event_authority = get(14)
|
|
158
155
|
if _empty(e.program):
|
|
159
156
|
e.program = get(15)
|
|
160
|
-
if _empty(e.quote_mint) or e.quote_mint == "So11111111111111111111111111111111111111111":
|
|
161
|
-
e.quote_mint = get(16)
|
|
162
|
-
if _empty(e.quote_vault):
|
|
163
|
-
e.quote_vault = get(17)
|
|
164
|
-
if _empty(e.quote_token_program):
|
|
165
|
-
e.quote_token_program = get(18)
|
|
166
157
|
if getattr(e, "ix_name", "") in ("", "create"):
|
|
167
158
|
e.ix_name = "create_v2"
|
|
168
159
|
|
|
@@ -324,6 +324,10 @@ def parse_create_from_data(data: bytes, meta: dict) -> DexEvent:
|
|
|
324
324
|
uri, o = _borsh_str(data, o)
|
|
325
325
|
except Exception:
|
|
326
326
|
return DexEvent()
|
|
327
|
+
if len(data) - o == 96:
|
|
328
|
+
return DexEvent(type=EventType.PUMP_FUN_CREATE, data=PumpFunCreateEvent(
|
|
329
|
+
metadata=_make_meta(meta), name=name, symbol=sym, uri=uri,
|
|
330
|
+
mint=_pub(data, o), bonding_curve=_pub(data, o + 32), user=_pub(data, o + 64)))
|
|
327
331
|
if len(data) < o + 32 * 4 + 8 * 5 + 32 + 1:
|
|
328
332
|
return DexEvent()
|
|
329
333
|
mint = _pub(data, o)
|
|
@@ -219,6 +219,20 @@ class PumpFunCreateEvent(DexEventBase):
|
|
|
219
219
|
virtual_quote_reserves: int = 0
|
|
220
220
|
creator_fee_bps: int = 0
|
|
221
221
|
is_holder_reward: bool = False
|
|
222
|
+
mint_authority: str = ""
|
|
223
|
+
associated_bonding_curve: str = ""
|
|
224
|
+
global_account: str = "" # Rust `global` PumpFun global config
|
|
225
|
+
system_program: str = ""
|
|
226
|
+
associated_token_program: str = ""
|
|
227
|
+
mayhem_program_id: str = ""
|
|
228
|
+
global_params: str = ""
|
|
229
|
+
sol_vault: str = ""
|
|
230
|
+
mayhem_state: str = ""
|
|
231
|
+
mayhem_token_vault: str = ""
|
|
232
|
+
event_authority: str = ""
|
|
233
|
+
program: str = ""
|
|
234
|
+
observed_fee_recipient: str = ""
|
|
235
|
+
ix_name: str = "create"
|
|
222
236
|
|
|
223
237
|
|
|
224
238
|
@dataclass
|
|
@@ -517,6 +517,7 @@ class YellowstoneGrpc:
|
|
|
517
517
|
signature = base58.b58encode(bytes(info.signature)).decode("ascii") if info.signature else ""
|
|
518
518
|
|
|
519
519
|
from .grpc_instruction_parser import (
|
|
520
|
+
subscribe_transaction_failed,
|
|
520
521
|
detect_pumpfun_create_from_logs,
|
|
521
522
|
enrich_dex_events_with_subscribe_tx_info,
|
|
522
523
|
parse_instructions_enhanced_from_subscribe_tx_info,
|
|
@@ -526,6 +527,9 @@ class YellowstoneGrpc:
|
|
|
526
527
|
from .pumpfun_fee_enrich import enrich_pumpfun_same_tx_post_merge
|
|
527
528
|
from .grpc_types import EventType
|
|
528
529
|
|
|
530
|
+
if subscribe_transaction_failed(info):
|
|
531
|
+
return # Suppress both instruction events and rolled-back log events.
|
|
532
|
+
|
|
529
533
|
instruction_events = parse_instructions_enhanced_from_subscribe_tx_info(
|
|
530
534
|
info,
|
|
531
535
|
slot,
|
{sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc_instruction_parser.py
RENAMED
|
@@ -229,6 +229,16 @@ def _meta_dict(
|
|
|
229
229
|
return m
|
|
230
230
|
|
|
231
231
|
|
|
232
|
+
def subscribe_transaction_failed(info: SubscribeUpdateTransactionInfo) -> bool:
|
|
233
|
+
"""Read protobuf error presence, including errors with an empty encoded payload."""
|
|
234
|
+
if not info.meta_raw:
|
|
235
|
+
return False
|
|
236
|
+
from . import solana_storage_pb2 as sol_pb
|
|
237
|
+
meta = sol_pb.TransactionStatusMeta()
|
|
238
|
+
meta.ParseFromString(info.meta_raw)
|
|
239
|
+
return meta.HasField("err")
|
|
240
|
+
|
|
241
|
+
|
|
232
242
|
def parse_instructions_enhanced_from_subscribe_tx_info(
|
|
233
243
|
info: SubscribeUpdateTransactionInfo,
|
|
234
244
|
slot: int,
|
|
@@ -268,7 +278,7 @@ def parse_instructions_enhanced_from_parsed(
|
|
|
268
278
|
transaction_pb: Any = None,
|
|
269
279
|
) -> List[DexEvent]:
|
|
270
280
|
"""接受已 Parse 的 ``Message`` 与 ``TransactionStatusMeta``(来自 ``solana_storage_pb2``)。"""
|
|
271
|
-
if not should_parse_instructions(filter):
|
|
281
|
+
if meta.HasField("err") or not should_parse_instructions(filter):
|
|
272
282
|
return []
|
|
273
283
|
|
|
274
284
|
grpc_us = int(time.time() * 1_000_000) if grpc_recv_us is None else grpc_recv_us
|
|
@@ -851,9 +851,9 @@ def _parse_pumpfun_create_v2(data: bytes, accounts: List[str], meta: EventMetada
|
|
|
851
851
|
is_cashback_enabled=is_cashback_enabled,
|
|
852
852
|
creator_fee_bps=creator_fee_bps,
|
|
853
853
|
is_holder_reward=is_holder_reward,
|
|
854
|
-
quote_mint=
|
|
855
|
-
quote_vault=
|
|
856
|
-
quote_token_program=
|
|
854
|
+
quote_mint=Z,
|
|
855
|
+
quote_vault=Z,
|
|
856
|
+
quote_token_program=Z,
|
|
857
857
|
virtual_quote_reserves=0,
|
|
858
858
|
observed_fee_recipient="",
|
|
859
859
|
),
|
|
@@ -71,6 +71,7 @@ class RpcTransactionMeta:
|
|
|
71
71
|
post_token_balances: List[RpcTokenBalance]
|
|
72
72
|
loaded_addresses: Optional[RpcLoadedAddresses]
|
|
73
73
|
compute_units_consumed: Optional[int]
|
|
74
|
+
err: Optional[Any] = None
|
|
74
75
|
|
|
75
76
|
|
|
76
77
|
@dataclass
|
|
@@ -200,6 +201,9 @@ def parse_rpc_transaction(
|
|
|
200
201
|
if tx.transaction is None or tx.transaction.message is None:
|
|
201
202
|
return [], ParseError("ConversionError", "Transaction message is nil")
|
|
202
203
|
|
|
204
|
+
if tx.meta is not None and tx.meta.err is not None:
|
|
205
|
+
return [], None # All events from a failed transaction describe rolled-back work.
|
|
206
|
+
|
|
203
207
|
msg = tx.transaction.message
|
|
204
208
|
meta = tx.meta
|
|
205
209
|
if meta is None:
|
|
@@ -429,6 +433,10 @@ def convert_rpc_to_grpc(
|
|
|
429
433
|
log_messages=meta.log_messages,
|
|
430
434
|
)
|
|
431
435
|
|
|
436
|
+
if meta.err is not None:
|
|
437
|
+
# Preserve failure presence without fabricating a Yellowstone binary error enum.
|
|
438
|
+
grpc_meta.err.SetInParent()
|
|
439
|
+
|
|
432
440
|
# 转换内部指令
|
|
433
441
|
for group in meta.inner_instructions:
|
|
434
442
|
grpc_group = grpc_meta.inner_instructions.add()
|
|
@@ -676,6 +684,7 @@ def rpc_get_transaction_result_dict_to_response(
|
|
|
676
684
|
post_token_balances=[],
|
|
677
685
|
loaded_addresses=loaded,
|
|
678
686
|
compute_units_consumed=meta_dict.get("computeUnitsConsumed"),
|
|
687
|
+
err=meta_dict.get("err"),
|
|
679
688
|
)
|
|
680
689
|
|
|
681
690
|
return RpcTransactionResponse(
|
|
@@ -743,6 +752,8 @@ def rpc_response_to_solana_storage(
|
|
|
743
752
|
ii.data = ix.data
|
|
744
753
|
if ix.stack_height is not None:
|
|
745
754
|
ii.stack_height = ix.stack_height
|
|
755
|
+
if m.err is not None:
|
|
756
|
+
meta.err.SetInParent()
|
|
746
757
|
if m.loaded_addresses:
|
|
747
758
|
for w in m.loaded_addresses.writable:
|
|
748
759
|
meta.loaded_writable_addresses.append(base58.b58decode(w))
|