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.
Files changed (166) hide show
  1. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/PKG-INFO +9 -2
  2. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/README.md +8 -1
  3. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/README_CN.md +8 -1
  4. sol_parser_sdk_python-0.5.10/docs/FAILED_TRANSACTION_AUDIT_20261007.md +42 -0
  5. sol_parser_sdk_python-0.5.10/docs/PUMPFUN_CREATE_REGRESSION_20261007.md +41 -0
  6. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/pyproject.toml +1 -1
  7. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_dispatcher.py +27 -2
  8. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/pumpfun.py +6 -15
  9. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/dex_parsers.py +4 -0
  10. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/event_types.py +14 -0
  11. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc_client.py +4 -0
  12. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc_instruction_parser.py +11 -1
  13. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/instructions.py +3 -3
  14. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/rpc_parser.py +11 -0
  15. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/2MfmZSU8mWEbskNHAxQGphAyB5x72SC2HYuAkLeSyH6MjttUHqUjm24wPMeH7zrCoQoYFwbLeiFE571mc8WvgZyL.json +524 -0
  16. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/2dabmQiykzC1tsNmgtRFbsRJjEKMfUySgScJc2J2uq8CQtoXWZ3YyT99p3nVuCXifEhLkyUe4Sf4nfe2UkFT8AJr.json +252 -0
  17. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/2eVpZNvQYPMBVNT5357Qt7HVAUSv9gdwqxKStvdwQ498rcJLLCHVcYPaGfFqVBz44ndYvkA1H4CwjBuDSviAj7jp.json +713 -0
  18. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3GufGVVRrnrH1Yuto57jDeTKXeki6ooE9w6h4qYRvNm5FcCpxwDHNvzHXdpAMbxRmukWJpSPHUKHEjnFTCC979ka.json +676 -0
  19. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3LQK2JHVbVSSfyCYwTwzoYTY9NEN4gZXzqw3TvAvMJHsvPsopCHtsa5ALhj4tFn8xWbmJ5DsYMMcnPukTBkSjtQf.json +252 -0
  20. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3MRWKDUcD5CGn5Xz4qWyGA8Y9udw4SsSr4gcxCjTUqCFt6Zc6uiwHF1wLZXKoqBcGEM2kruBS85ymYxmYk8FLGBk.json +252 -0
  21. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3NBSCgAXpNqg7JBUzp6RsfZYzf2QbbHi6r2wcoBF4Lpuzozae7ExUJUGoqpVCXXs8cbibr6aWySH1bsg86Enuhez.json +252 -0
  22. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3QVpcUq64D4DUV9empFr3G98pCEa1Cp2fAcFJKyiJGsQ2ir2S4yBLhHYXPNmLfCE8KVDgLApfBYTFM7pf9JVPbsb.json +248 -0
  23. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3REXMDkvZsWvgc8czYpfn24avz18APMuzbV2VgQBeymArdJvfQcfcpKr46f3j1H2bAiymFneaNocPH7KzPUPbR1S.json +252 -0
  24. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3ejAydePsZTUfeZaU9eiAM37gV5AYPG9hhyMtUobJLQtSMgroDeiE8njXu2JiwMyX5YJLp3vrfNPy89S7EDdUCAy.json +611 -0
  25. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/3zC4bw1osyebZ77KagXYP3b5rEBHvJCgcwCriCLc5gAUp9Ev6Bx5ZMbqnYpkKE2VgZgMFcZN5FYKQfcKL45MWpyu.json +252 -0
  26. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/5PgkFgTLSEZPZhxgWNToPzTZct95SycuaH9H3g82YwcKXudtiynEZmiaoQrhGv2gdZLrvsVZ5Wn88KGirbFYpLrt.json +713 -0
  27. sol_parser_sdk_python-0.5.10/tests/fixtures/pumpfun_create/661yA5s6uxUsggTcT4cZ6yyMfNmF4mCZzxLnCb1zBrSY3YhAiouYXBitiPvkngBEKxaeGcpXiek6qXDajiRr9wuY.json +505 -0
  28. sol_parser_sdk_python-0.5.10/tests/test_pumpfun_create_regression.py +101 -0
  29. sol_parser_sdk_python-0.5.9/uv.lock +0 -408
  30. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/.env.example +0 -0
  31. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/.gitignore +0 -0
  32. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_ALIGNMENT.md +0 -0
  33. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_DAMM_FACTORY_ALIGNMENT_20261004.md +0 -0
  34. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_DAMM_FACTORY_EVIDENCE_20261004.json +0 -0
  35. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_MIGRATION.md +0 -0
  36. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_PUMPFUN_NATIVE_DEBIT_ALIGNMENT_20261004.md +0 -0
  37. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_PUMPFUN_NATIVE_DEBIT_EVIDENCE_20261004.json +0 -0
  38. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_PUMPFUN_SETTLEMENT_ALIGNMENT_20261004.md +0 -0
  39. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/NATIVE_PUMPFUN_SETTLEMENT_EVIDENCE_20261004.json +0 -0
  40. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/GRPC_CACHE.md +0 -0
  41. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/SIMULATION_ROUTES.md +0 -0
  42. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/block_meta_stream.py +0 -0
  43. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/amm_v4_grpc_refresh_20261002.json +0 -0
  44. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/batch2_cpmm_simulations_20261003.json +0 -0
  45. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/block_meta_grpc_20261002.json +0 -0
  46. {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
  47. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/cached_tip_routes_20261002.json +0 -0
  48. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/cpmm_lp_simulations_20261006.json +0 -0
  49. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/damm_v2_mainnet_simulations_20261004.json +0 -0
  50. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/pumpfun_current_mainnet_simulations_20261004.json +0 -0
  51. {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
  52. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/pumpfun_settlement_mainnet_simulations_20261004.json +0 -0
  53. {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
  54. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/pumpswap_mainnet_simulations_20261004.json +0 -0
  55. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/simulation_ata_20261002.json +0 -0
  56. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/fixtures/simulation_routes_live_20261002.json +0 -0
  57. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/meteora_damm_grpc.py +0 -0
  58. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/multi_protocol_grpc.py +0 -0
  59. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/parse_tx_by_signature.py +0 -0
  60. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/pumpfun_quick_test.py +0 -0
  61. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/pumpfun_trade_filter.py +0 -0
  62. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/pumpfun_with_metrics.py +0 -0
  63. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/pumpswap_low_latency.py +0 -0
  64. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/pumpswap_with_metrics.py +0 -0
  65. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/rust_example_utils.py +0 -0
  66. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/simulation_routes.py +0 -0
  67. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/stonkfun_routes.py +0 -0
  68. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/examples/stonkfun_snapshot_refresh.py +0 -0
  69. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/scripts/bench_parser.py +0 -0
  70. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/scripts/gen_golden_rust.sh +0 -0
  71. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/__init__.py +0 -0
  72. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/__init__.py +0 -0
  73. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/meteora.py +0 -0
  74. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/orca.py +0 -0
  75. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/pumpswap.py +0 -0
  76. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/raydium.py +0 -0
  77. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/account_fillers/raydium_launchlab.py +0 -0
  78. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/accounts/__init__.py +0 -0
  79. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/accounts/raydium_orca.py +0 -0
  80. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/accounts/rpc_wallet.py +0 -0
  81. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/accounts/utils.py +0 -0
  82. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/block_meta.py +0 -0
  83. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/check_migration.py +0 -0
  84. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/clock.py +0 -0
  85. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/common/__init__.py +0 -0
  86. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/entries_decode.py +0 -0
  87. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/env_config.py +0 -0
  88. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/event_type_parity.py +0 -0
  89. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/geyser_pb2.py +0 -0
  90. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/geyser_pb2_grpc.py +0 -0
  91. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc/__init__.py +0 -0
  92. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc/geyser_connect.py +0 -0
  93. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc/subscribe_builder.py +0 -0
  94. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc/transaction_meta.py +0 -0
  95. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/grpc_types.py +0 -0
  96. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/inner_instruction_parser.py +0 -0
  97. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/instr/__init__.py +0 -0
  98. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/instr_account_utils.py +0 -0
  99. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/json_util.py +0 -0
  100. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/liquidity_snapshot.py +0 -0
  101. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/log_instr_dedup.py +0 -0
  102. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/logs/__init__.py +0 -0
  103. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/market.py +0 -0
  104. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/merger.py +0 -0
  105. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/order_buffer.py +0 -0
  106. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/parser.py +0 -0
  107. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/pumpfun_fee_enrich.py +0 -0
  108. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/rust_api_inventory.py +0 -0
  109. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/rust_event_json.py +0 -0
  110. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/shredstream_client.py +0 -0
  111. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/shredstream_pb2.py +0 -0
  112. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/shredstream_pb2_grpc.py +0 -0
  113. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/shredstream_pumpfun.py +0 -0
  114. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/simulation_route.py +0 -0
  115. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/solana_storage_pb2.py +0 -0
  116. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/solana_storage_pb2_grpc.py +0 -0
  117. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/stonkfun_registry.py +0 -0
  118. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/transaction_route.py +0 -0
  119. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/u128_parity.py +0 -0
  120. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/verify_discriminators.py +0 -0
  121. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/sol_parser/wire_transaction.py +0 -0
  122. {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
  123. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/cached_tip_routes_20261002.json +0 -0
  124. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/cpmm_lp_simulations_20261006.json +0 -0
  125. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/damm_v2_mainnet_simulations_20261004.json +0 -0
  126. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/golden_parse_log.json +0 -0
  127. {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
  128. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/pumpfun_current_mainnet_simulations_20261004.json +0 -0
  129. {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
  130. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/pumpfun_settlement_mainnet_simulations_20261004.json +0 -0
  131. {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
  132. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/pumpswap_mainnet_simulations_20261004.json +0 -0
  133. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/review10_compiled_bounds.json +0 -0
  134. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/review10_prefunded_ata.json +0 -0
  135. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/review10_wire_bounds.json +0 -0
  136. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/simulation_ata_20261002.json +0 -0
  137. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/simulation_routes_live_20261002.json +0 -0
  138. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/fixtures/stonkfun_routes_0_7_7.json +0 -0
  139. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_amm_v4_v2.py +0 -0
  140. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_block_meta.py +0 -0
  141. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_exact_metadata_json.py +0 -0
  142. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_filter_and_account_parity.py +0 -0
  143. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_golden.py +0 -0
  144. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_grpc_unary_methods.py +0 -0
  145. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_imports_and_inner.py +0 -0
  146. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_launchlab_invocation_anchor.py +0 -0
  147. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_log_instr_dedup.py +0 -0
  148. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_market_helpers.py +0 -0
  149. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_native_grpc_server.py +0 -0
  150. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_native_plan_lifecycle.py +0 -0
  151. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_orca_whirlpool_instruction_parity.py +0 -0
  152. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_order_buffer.py +0 -0
  153. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pump_fees_instruction_parity.py +0 -0
  154. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pumpfun_account_fill.py +0 -0
  155. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pumpfun_trade_tail.py +0 -0
  156. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pumpfun_v2_parity.py +0 -0
  157. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pumpswap_instruction.py +0 -0
  158. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_pumpswap_upgrade.py +0 -0
  159. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_raydium_clmm_instruction_parity.py +0 -0
  160. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_raydium_current_logs.py +0 -0
  161. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_review10.py +0 -0
  162. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_review_batch2.py +0 -0
  163. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_shredstream.py +0 -0
  164. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_simulation_route.py +0 -0
  165. {sol_parser_sdk_python-0.5.9 → sol_parser_sdk_python-0.5.10}/tests/test_snapshot_refresh_example.py +0 -0
  166. {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.9
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.9
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.9
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.9
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`.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sol-parser-sdk-python"
3
- version = "0.5.9"
3
+ version = "0.5.10"
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"
@@ -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
- run(PUMPFUN_PROGRAM_ID, lambda g: pumpfun.fill_create_accounts(data, g))
149
+ fill_create()
125
150
  elif et == EventType.PUMP_FUN_CREATE_V2:
126
- run(PUMPFUN_PROGRAM_ID, lambda g: pumpfun.fill_create_v2_accounts(data, g))
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:
@@ -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
- if get(15) == "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P":
117
- fill_create_v2_accounts(e, get) # type: ignore[arg-type]
118
- return
119
- if _empty(e.mint):
120
- e.mint = get(0)
121
- if _empty(e.bonding_curve):
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,
@@ -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=_get_account_safe(accounts, 16) or Z,
855
- quote_vault=_get_account_safe(accounts, 17),
856
- quote_token_program=_get_account_safe(accounts, 18),
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))