From 5e1ad759d8fcf9cb6b6bb6313822663ee2e4b80c Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Fri, 31 Jul 2026 19:34:00 +0200 Subject: [PATCH] v0.1.0-pre.073 --- docs/README.md | 13 +- docs/guides/CONFIGURATION.md | 79 + docs/guides/DEVNET_VALIDATION.md | 65 + docs/guides/LOGGING.md | 74 + docs/guides/POSTGRES_STORAGE.md | 66 + ...LAY_CORE_EXTRACTION_AND_MATERIALIZATION.md | 77 + docs/guides/RPC_BACKFILL_AND_WEBSOCKET.md | 101 + kb-config/CHANGELOG.md | 6 +- kb-logging/CHANGELOG.md | 7 +- kb-onchain-transport/CHANGELOG.md | 6 +- kb-onchain-transport/TODO.md | 4 +- kb-pipeline-demo-scenarios/CHANGELOG.md | 6 +- kb-pipeline/CHANGELOG.md | 6 +- kb-pipeline/TODO.md | 3 +- kb-program-ids/CHANGELOG.md | 6 +- kb-store/CHANGELOG.md | 6 +- kb-store/TODO.md | 4 +- olddocs/archivekbobobot/001.README.md | 31 + olddocs/archivekbobobot/CHANGELOG.md | 92 + olddocs/archivekbobobot/README.md | 1027 +++++++++ olddocs/archivekbobobot/ROADMAP.md | 1900 +++++++++++++++++ .../docs/ARCHIVE_ORGANIZATION.md | 22 + .../docs/DB_EVENT_MODEL_REVIEW.md | 401 ++++ .../docs/DEX_DECODER_MATRIX.md | 365 ++++ .../docs/DEX_EVENT_COVERAGE_MATRIX.md | 353 +++ ...RAYDIUM_LAUNCHPAD_EVENT_COVERAGE_REPORT.md | 213 ++ .../docs/SOLSCAN_ACCOUNT_SOURCE_MATRIX.md | 159 ++ .../docs/VALIDATION_STATUS_0_7_51.md | 42 + .../docs/VALIDATION_STATUS_0_7_51_FINAL.md | 47 + .../VALIDATION_STATUS_0_7_51_MAX_DECODER.md | 56 + .../docs/VALIDATION_STATUS_0_7_52_FINAL.md | 69 + .../docs/VALIDATION_STATUS_0_7_56_FINAL.md | 51 + .../docs/VALIDATION_STATUS_0_7_57_FINAL.md | 73 + ...SION_PROMPT_0.7.47_1FE5_CONTINUATION_V2.md | 193 ++ ...SESSION_PROMPT_0.7.47_EVENT_COVERAGE_V3.md | 157 ++ ...SESSION_PROMPT_0.7.47_UPSTREAM_REGISTRY.md | 251 +++ ...NEXT_SESSION_PROMPT_0.7.49_RAYDIUM_CLMM.md | 329 +++ .../docs/prompts/PROMPT_0_7_53_PUMP_SWAP.md | 150 ++ .../docs/prompts/PROMPT_0_7_54_PUMP_FUN.md | 272 +++ .../docs/prompts/PROMPT_0_7_55_PUMP_FEES.md | 347 +++ .../docs/prompts/PROMPT_0_7_56_METEORA_DBC.md | 218 ++ ...ETEORA_DLMM_FULL_DECODE_MATERIALIZATION.md | 457 ++++ ..._0_7_58_DEMO4_PROGRAM_SURFACE_DISCOVERY.md | 18 + ..._58_SQLITE_DB_TRANSACTION_MERGER_BINARY.md | 447 ++++ ..._0_7_58_demo4_program_surface_discovery.md | 18 + ..._58_sqlite_db_transaction_merger_binary.md | 447 ++++ ..._0_7_59_DEMO4_PROGRAM_SURFACE_DISCOVERY.md | 330 +++ ..._59_SQLITE_DB_TRANSACTION_MERGER_BINARY.md | 18 + ..._0_7_59_demo4_program_surface_discovery.md | 330 +++ ..._59_sqlite_db_transaction_merger_binary.md | 18 + .../PROMPT_0_7_60_METEORA_DAMM_NEXT_DEX.md | 232 ++ .../PROMPT_0_7_60_meteora_damm_next_dex.md | 232 ++ ..._khadhroony-bobobot_0.7.48-raydium-cpmm.md | 247 +++ ...hroony-bobobot_0.7.50-raydium-launchpad.md | 338 +++ ...hadhroony-bobobot_0.7.51-raydium-amm-v4.md | 386 ++++ ...hadhroony-bobobot_0.7.52-raydium-stable.md | 626 ++++++ .../DEX_COVERAGE_GLOBAL_WATCHLIST_0_7_53.md | 130 ++ .../FEE_EVENT_AMOUNTS_MODEL_NOTE_0_7_56.md | 151 ++ .../METEORA_DBC_EVENT_COVERAGE_REPORT.md | 161 ++ .../METEORA_DLMM_EVENT_COVERAGE_REPORT.md | 182 ++ .../PUMP_FEES_EVENT_COVERAGE_REPORT.md | 134 ++ .../reports/PUMP_FUN_EVENT_COVERAGE_REPORT.md | 127 ++ .../PUMP_SWAP_EVENT_COVERAGE_REPORT.md | 168 ++ .../RAYDIUM_AMM_V4_EVENT_COVERAGE_REPORT.md | 141 ++ .../RAYDIUM_CLMM_EVENT_COVERAGE_REPORT.md | 140 ++ ...IUM_CLMM_UPSTREAM_COVERAGE_REVIEW_PRE19.md | 130 ++ ..._CPMM_CLMM_RECHECK_REPORT_0_7_50_PRE_R2.md | 84 + .../RAYDIUM_CPMM_EVENT_COVERAGE_REPORT.md | 214 ++ ...IUM_CPMM_UPSTREAM_COVERAGE_REVIEW_PRE22.md | 74 + ...RAYDIUM_LAUNCHPAD_EVENT_COVERAGE_REPORT.md | 233 ++ .../reports/RAYDIUM_POOL_V4_DECISION_NOTE.md | 56 + ...YDIUM_STABLE_SWAP_EVENT_COVERAGE_REPORT.md | 164 ++ .../SQLITE_DB_TRANSACTION_MERGER_0_7_58.md | 219 ++ ...BihVLdqJRKGgzjcGLHkcTuzmSo1TQkHepzH8p.json | 1 + ...VGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4.json | 1 + ...Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY.json | 1 + ...NEomY6cQGZJUGwywTBD2UmDT32rZcNnfxQ5N2.json | 1 + ...ivhMpDnm27EHmRLeQ683Z1PufuqEmBZvD282s.json | 1 + ...Pc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3.json | 1 + ...PZJS2u2BBsUoscuikbYjnpFmbFsvVuJdgUMQe.json | 1 + ...kPetmHmwe74YC1ESx3LnFEpVau6g2pg4fHycr.json | 1 + ...spfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH.json | 1 + ...HA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH.json | 1 + ...9YKKSa3CUC2YUc4tPkHJ5Y6XW1yz8y6F7qWz9.json | 1 + ...eSFWaBXF25oSUgmGRwaW6sCMFLmBNiMSdbHVT.json | 1 + ...sSaDfNFQUYsHekbWBW1TsFdjDYzACh62tEHxn.json | 1 + ...ERWKpUTXvRPfXdzHhiCyJvLadVvXGfdpBqcE1.json | 1 + ...wWBBty3fHdyBpo35Mz84M8k3heKXmjmi9vFt5.json | 1 + ...HkBagdStcJCp3xbbb9B7sdMdWXFNj6mdsG4hn.json | 1 + ...UfmQBFcmzu1ctRd1Y1fxd66RBpboy1bmtDSQQ.json | 1 + ...pU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7..json | 1 + ...KmxNyREQM14SQLDykeBvEUG63TeohrvmofEiw.json | 1 + ...j8a9CEuX1eb1LWRnDT7uK6q1xMipnNyatn23M.json | 1 + ...AxXgZ4rjzxzPMP4oxduvQsQtZzyknqvzYNrNu.json | 1 + ...pjcyUwEvwtcfhEQefh773ZgjxcVRry7LDqg5X.json | 1 + ...ucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn.json | 1 + ...GBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu.json | 1 + ...ecMzAVgztLe6eGhwUBj1Pn3j9WAXwmtHmfbRr.json | 1 + ...2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB.json | 1 + ...bZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4.json | 1 + ...FNByNXLyCoK9wA2MykKAmQNZKBdY8s47dehDc.json | 1 + ...pWu9i7Kky8tPN37rs2TpmMrAZrC7S7vJa91Hr.json | 1 + ...g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD.json | 1 + ...R8qm1dhniz6pYuBZkuene3Hfrs1VQhVRgCNrr.json | 1 + ...spG5k6rtzrqqn7WNn3oZdyKqLKwK2XWQ8FLjd.json | 1 + ...siCMvXMjuoZ5VRrhG5qYBrUMYTE5WgHqgjEn6.json | 1 + ...48px58JSSwG4qejQ46kFMW4AMj7vzJnWZHNZn.json | 1 + ...9kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c.json | 1 + ...f31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA.json | 1 + ...SgKXdrN1egZf5sqe1TMai9K1rChYNDJgjq7aD.json | 1 + ...CCa8mdugg6JPF7gFirmmxisTfDJoSNSUi5zDJ.json | 1 + ...BfJfQ8RDGhg1wdhddq1odMAJUePHFuBYfUxKq.json | 1 + ...zsdepotRGe5xsfip7vLPTJnVuafqdUWexVnPM.json | 1 + ...cBuUyL46QYxwYJjidaFYhdvxUFrgvBxPshERx.json | 1 + ...ZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG.json | 1 + ...LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN.json | 1 + ...RxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo.json | 1 + ...67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB.json | 1 + ...CLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi.json | 1 + ...VNZFSYkqNXP6bxHLPL6QQJiMagDL3qcqUQTrG.json | 1 + ...NsFCP3kuNmWZuXtm1AaQCPj9uw6Guv2Ekoi5P.json | 1 + ...pMXVaYqmy4NjniPh4pqKNfMmsihgd4wdkCX3u.json | 1 + ...RgxpH4WjvdzxAYbGxwdGUz5MziiL5jek2kBma.json | 1 + ...B8m7sLD2xi6snefSasaswsKCxx5Tifjondogm.json | 1 + ...AfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb.json | 1 + ...2yP3H1pVU8djGvEHmYg8uamQ84AuyGtpsrXTF.json | 1 + ...MiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc.json | 1 + ...Saw7RKkQd8nEL4khUcuPhQ7WwY1B2qjx8jxFq.json | 1 + ...v7sMk3kTnyaRqZrbRPuntYzdh12evXBkprint.json | 1 + ...B6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json | 1 + ...ecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P.json | 1 + ...y6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA.json | 1 + ...EMaX8q7CCJb7NvUCxerBCcsFUa4LjBEynTtEd.json | 1 + ...5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK.json | 1 + ...L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C.json | 1 + ...sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj.json | 1 + ...mn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE.json | 1 + ...MU5Gj7kppfUCEmd4LbXXuyZH1yHaP2NTqdiZB.json | 1 + ...p65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf.json | 1 + ...3ga2dikrYS9ovDXgHGh5RUsb2RTUj6hrQXhk6.json | 1 + ...d8XiQwJ6ianp9snpu4brUqFxadzvHebnAXjJZ.json | 1 + ...HZwjELNnjvThjajtiVmkz3yPQEHjLtka2fwHW.json | 1 + ...UCoQUgGUan5YhzUZa6KqdzwX5L6FpUxfmKg5m.json | 1 + ...dwDryooaGtiocG1u3xcYbRpiJzb283XfCZsDp.json | 1 + ...uy5rYSxAfV3jaRJWHH6nN9WK4NRExGxsk1bCJ.json | 1 + ...bXtK84QcRjWVmYt9RaDyA8gKxdUrPFXmZyaki.json | 1 + ...76YGRNjk1pA8wCsN67aQsD9f9iLsz4NcJ1AVb.json | 1 + ...qBRek56DhiGXrn75yj2NHU3aYUnxvHXpkf3aD.json | 1 + 148 files changed, 14056 insertions(+), 18 deletions(-) create mode 100644 docs/guides/CONFIGURATION.md create mode 100644 docs/guides/DEVNET_VALIDATION.md create mode 100644 docs/guides/LOGGING.md create mode 100644 docs/guides/POSTGRES_STORAGE.md create mode 100644 docs/guides/REPLAY_CORE_EXTRACTION_AND_MATERIALIZATION.md create mode 100644 docs/guides/RPC_BACKFILL_AND_WEBSOCKET.md create mode 100644 olddocs/archivekbobobot/001.README.md create mode 100644 olddocs/archivekbobobot/CHANGELOG.md create mode 100644 olddocs/archivekbobobot/README.md create mode 100644 olddocs/archivekbobobot/ROADMAP.md create mode 100644 olddocs/archivekbobobot/docs/ARCHIVE_ORGANIZATION.md create mode 100644 olddocs/archivekbobobot/docs/DB_EVENT_MODEL_REVIEW.md create mode 100644 olddocs/archivekbobobot/docs/DEX_DECODER_MATRIX.md create mode 100644 olddocs/archivekbobobot/docs/DEX_EVENT_COVERAGE_MATRIX.md create mode 100644 olddocs/archivekbobobot/docs/RAYDIUM_LAUNCHPAD_EVENT_COVERAGE_REPORT.md create mode 100644 olddocs/archivekbobobot/docs/SOLSCAN_ACCOUNT_SOURCE_MATRIX.md create mode 100644 olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51.md create mode 100644 olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51_FINAL.md create mode 100644 olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51_MAX_DECODER.md create mode 100644 olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_52_FINAL.md create mode 100644 olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_56_FINAL.md create mode 100644 olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_57_FINAL.md create mode 100644 olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_1FE5_CONTINUATION_V2.md create mode 100644 olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_EVENT_COVERAGE_V3.md create mode 100644 olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_UPSTREAM_REGISTRY.md create mode 100644 olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.49_RAYDIUM_CLMM.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_53_PUMP_SWAP.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_54_PUMP_FUN.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_55_PUMP_FEES.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_56_METEORA_DBC.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_57_METEORA_DLMM_FULL_DECODE_MATERIALIZATION.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_58_DEMO4_PROGRAM_SURFACE_DISCOVERY.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_58_SQLITE_DB_TRANSACTION_MERGER_BINARY.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_58_demo4_program_surface_discovery.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_58_sqlite_db_transaction_merger_binary.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_59_DEMO4_PROGRAM_SURFACE_DISCOVERY.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_59_SQLITE_DB_TRANSACTION_MERGER_BINARY.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_59_demo4_program_surface_discovery.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_59_sqlite_db_transaction_merger_binary.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_60_METEORA_DAMM_NEXT_DEX.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_60_meteora_damm_next_dex.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_REPRISE_khadhroony-bobobot_0.7.48-raydium-cpmm.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_REPRISE_khadhroony-bobobot_0.7.50-raydium-launchpad.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_REPRISE_khadhroony-bobobot_0.7.51-raydium-amm-v4.md create mode 100644 olddocs/archivekbobobot/docs/prompts/PROMPT_REPRISE_khadhroony-bobobot_0.7.52-raydium-stable.md create mode 100644 olddocs/archivekbobobot/docs/reports/DEX_COVERAGE_GLOBAL_WATCHLIST_0_7_53.md create mode 100644 olddocs/archivekbobobot/docs/reports/FEE_EVENT_AMOUNTS_MODEL_NOTE_0_7_56.md create mode 100644 olddocs/archivekbobobot/docs/reports/METEORA_DBC_EVENT_COVERAGE_REPORT.md create mode 100644 olddocs/archivekbobobot/docs/reports/METEORA_DLMM_EVENT_COVERAGE_REPORT.md create mode 100644 olddocs/archivekbobobot/docs/reports/PUMP_FEES_EVENT_COVERAGE_REPORT.md create mode 100644 olddocs/archivekbobobot/docs/reports/PUMP_FUN_EVENT_COVERAGE_REPORT.md create mode 100644 olddocs/archivekbobobot/docs/reports/PUMP_SWAP_EVENT_COVERAGE_REPORT.md create mode 100644 olddocs/archivekbobobot/docs/reports/RAYDIUM_AMM_V4_EVENT_COVERAGE_REPORT.md create mode 100644 olddocs/archivekbobobot/docs/reports/RAYDIUM_CLMM_EVENT_COVERAGE_REPORT.md create mode 100644 olddocs/archivekbobobot/docs/reports/RAYDIUM_CLMM_UPSTREAM_COVERAGE_REVIEW_PRE19.md create mode 100644 olddocs/archivekbobobot/docs/reports/RAYDIUM_CPMM_CLMM_RECHECK_REPORT_0_7_50_PRE_R2.md create mode 100644 olddocs/archivekbobobot/docs/reports/RAYDIUM_CPMM_EVENT_COVERAGE_REPORT.md create mode 100644 olddocs/archivekbobobot/docs/reports/RAYDIUM_CPMM_UPSTREAM_COVERAGE_REVIEW_PRE22.md create mode 100644 olddocs/archivekbobobot/docs/reports/RAYDIUM_LAUNCHPAD_EVENT_COVERAGE_REPORT.md create mode 100644 olddocs/archivekbobobot/docs/reports/RAYDIUM_POOL_V4_DECISION_NOTE.md create mode 100644 olddocs/archivekbobobot/docs/reports/RAYDIUM_STABLE_SWAP_EVENT_COVERAGE_REPORT.md create mode 100644 olddocs/archivekbobobot/docs/reports/SQLITE_DB_TRANSACTION_MERGER_0_7_58.md create mode 100644 olddocs/archivekbobobot/idls/bonkswap.BSwp6bEBihVLdqJRKGgzjcGLHkcTuzmSo1TQkHepzH8p.json create mode 100644 olddocs/archivekbobobot/idls/boop_fun.boop8hVGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4.json create mode 100644 olddocs/archivekbobobot/idls/bubblegum.BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY.json create mode 100644 olddocs/archivekbobobot/idls/byreal_clmm.REALQqNEomY6cQGZJUGwywTBD2UmDT32rZcNnfxQ5N2.json create mode 100644 olddocs/archivekbobobot/idls/carrot.CarrotwivhMpDnm27EHmRLeQ683Z1PufuqEmBZvD282s.json create mode 100644 olddocs/archivekbobobot/idls/cctp_v1.CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3.json create mode 100644 olddocs/archivekbobobot/idls/cctp_v2.CCTPV2vPZJS2u2BBsUoscuikbYjnpFmbFsvVuJdgUMQe.json create mode 100644 olddocs/archivekbobobot/idls/clone.C1onEW2kPetmHmwe74YC1ESx3LnFEpVau6g2pg4fHycr.json create mode 100644 olddocs/archivekbobobot/idls/dflow_v4.DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH.json create mode 100644 olddocs/archivekbobobot/idls/drift_v2.dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH.json create mode 100644 olddocs/archivekbobobot/idls/fusion_amm.fUSioN9YKKSa3CUC2YUc4tPkHJ5Y6XW1yz8y6F7qWz9.json create mode 100644 olddocs/archivekbobobot/idls/goosefx_gamma.GAMMA7meSFWaBXF25oSUgmGRwaW6sCMFLmBNiMSdbHVT.json create mode 100644 olddocs/archivekbobobot/idls/goosefx_v2.GFXsSL5sSaDfNFQUYsHekbWBW1TsFdjDYzACh62tEHxn.json create mode 100644 olddocs/archivekbobobot/idls/guacswap.Gswppe6ERWKpUTXvRPfXdzHhiCyJvLadVvXGfdpBqcE1.json create mode 100644 olddocs/archivekbobobot/idls/helium_treasury_management.treaf4wWBBty3fHdyBpo35Mz84M8k3heKXmjmi9vFt5.json create mode 100644 olddocs/archivekbobobot/idls/hylo_exchange.HYEXCHtHkBagdStcJCp3xbbb9B7sdMdWXFNj6mdsG4hn.json create mode 100644 olddocs/archivekbobobot/idls/hylo_stability_pool.HysTabVUfmQBFcmzu1ctRd1Y1fxd66RBpboy1bmtDSQQ.json create mode 100644 olddocs/archivekbobobot/idls/jito_tip_distribution.4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7..json create mode 100644 olddocs/archivekbobobot/idls/jupiter_aprepro_smart_wallet.JSW99DKmxNyREQM14SQLDykeBvEUG63TeohrvmofEiw.json create mode 100644 olddocs/archivekbobobot/idls/jupiter_dca.DCA265Vj8a9CEuX1eb1LWRnDT7uK6q1xMipnNyatn23M.json create mode 100644 olddocs/archivekbobobot/idls/jupiter_limit_order.jupoNjAxXgZ4rjzxzPMP4oxduvQsQtZzyknqvzYNrNu.json create mode 100644 olddocs/archivekbobobot/idls/jupiter_limit_order_v2.j1o2qRpjcyUwEvwtcfhEQefh773ZgjxcVRry7LDqg5X.json create mode 100644 olddocs/archivekbobobot/idls/jupiter_locker.LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn.json create mode 100644 olddocs/archivekbobobot/idls/jupiter_perpetuals.PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu.json create mode 100644 olddocs/archivekbobobot/idls/jupiter_stable.JUPUSDecMzAVgztLe6eGhwUBj1Pn3j9WAXwmtHmfbRr.json create mode 100644 olddocs/archivekbobobot/idls/jupiter_v4.JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB.json create mode 100644 olddocs/archivekbobobot/idls/jupiter_v6.JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4.json create mode 100644 olddocs/archivekbobobot/idls/kamino.6LtLpnUFNByNXLyCoK9wA2MykKAmQNZKBdY8s47dehDc.json create mode 100644 olddocs/archivekbobobot/idls/kamino_farms.FarmsPZpWu9i7Kky8tPN37rs2TpmMrAZrC7S7vJa91Hr.json create mode 100644 olddocs/archivekbobobot/idls/kamino_lending.KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD.json create mode 100644 olddocs/archivekbobobot/idls/kamino_vault.kvauTFR8qm1dhniz6pYuBZkuene3Hfrs1VQhVRgCNrr.json create mode 100644 olddocs/archivekbobobot/idls/kamino_vault_v2.KvauGMspG5k6rtzrqqn7WNn3oZdyKqLKwK2XWQ8FLjd.json create mode 100644 olddocs/archivekbobobot/idls/layerzero_endpoint.76y77prsiCMvXMjuoZ5VRrhG5qYBrUMYTE5WgHqgjEn6.json create mode 100644 olddocs/archivekbobobot/idls/layerzero_executor.6doghB248px58JSSwG4qejQ46kFMW4AMj7vzJnWZHNZn.json create mode 100644 olddocs/archivekbobobot/idls/lifinity_amm_v2.2wT8Yq49kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c.json create mode 100644 olddocs/archivekbobobot/idls/marginfi_v2.MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA.json create mode 100644 olddocs/archivekbobobot/idls/marinade_finance.MarBmsSgKXdrN1egZf5sqe1TMai9K1rChYNDJgjq7aD.json create mode 100644 olddocs/archivekbobobot/idls/metadao_amm_v0.5.AMMJdEiCCa8mdugg6JPF7gFirmmxisTfDJoSNSUi5zDJ.json create mode 100644 olddocs/archivekbobobot/idls/metadao_futarchy.FUTARELBfJfQ8RDGhg1wdhddq1odMAJUePHFuBYfUxKq.json create mode 100644 olddocs/archivekbobobot/idls/metadao_launchpad.moontUzsdepotRGe5xsfip7vLPTJnVuafqdUWexVnPM.json create mode 100644 olddocs/archivekbobobot/idls/metdao_bid_wall.WALL8ucBuUyL46QYxwYJjidaFYhdvxUFrgvBxPshERx.json create mode 100644 olddocs/archivekbobobot/idls/meteora_damm_v2.cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG.json create mode 100644 olddocs/archivekbobobot/idls/meteora_dbc.dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN.json create mode 100644 olddocs/archivekbobobot/idls/meteora_dlmm.LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo.json create mode 100644 olddocs/archivekbobobot/idls/meteora_pools_amm.Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB.json create mode 100644 olddocs/archivekbobobot/idls/meteora_vault.24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi.json create mode 100644 olddocs/archivekbobobot/idls/moonit.MoonCVVNZFSYkqNXP6bxHLPL6QQJiMagDL3qcqUQTrG.json create mode 100644 olddocs/archivekbobobot/idls/numeraire.NUMERUNsFCP3kuNmWZuXtm1AaQCPj9uw6Guv2Ekoi5P.json create mode 100644 olddocs/archivekbobobot/idls/okx_dex_router.proVF4pMXVaYqmy4NjniPh4pqKNfMmsihgd4wdkCX3u.json create mode 100644 olddocs/archivekbobobot/idls/okx_lab_v1.6m2CDdhRgxpH4WjvdzxAYbGxwdGUz5MziiL5jek2kBma.json create mode 100644 olddocs/archivekbobobot/idls/ondo_gm.XzTT4XB8m7sLD2xi6snefSasaswsKCxx5Tifjondogm.json create mode 100644 olddocs/archivekbobobot/idls/openbook_v2.opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb.json create mode 100644 olddocs/archivekbobobot/idls/orca_wavebreak.waveQX2yP3H1pVU8djGvEHmYg8uamQ84AuyGtpsrXTF.json create mode 100644 olddocs/archivekbobobot/idls/orca_whirlpool.whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc.json create mode 100644 olddocs/archivekbobobot/idls/pancakeswap.HpNfyc2Saw7RKkQd8nEL4khUcuPhQ7WwY1B2qjx8jxFq.json create mode 100644 olddocs/archivekbobobot/idls/printr.T8HsGYv7sMk3kTnyaRqZrbRPuntYzdh12evXBkprint.json create mode 100644 olddocs/archivekbobobot/idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json create mode 100644 olddocs/archivekbobobot/idls/pump_fun.6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P.json create mode 100644 olddocs/archivekbobobot/idls/pump_swap.pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA.json create mode 100644 olddocs/archivekbobobot/idls/pumpup.PdMDrKEMaX8q7CCJb7NvUCxerBCcsFUa4LjBEynTtEd.json create mode 100644 olddocs/archivekbobobot/idls/raydium_clmm.CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK.json create mode 100644 olddocs/archivekbobobot/idls/raydium_cpmm.CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C.json create mode 100644 olddocs/archivekbobobot/idls/raydium_launchlab.LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj.json create mode 100644 olddocs/archivekbobobot/idls/raydium_lock.LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE.json create mode 100644 olddocs/archivekbobobot/idls/saber_decimal.DecZY86MU5Gj7kppfUCEmd4LbXXuyZH1yHaP2NTqdiZB.json create mode 100644 olddocs/archivekbobobot/idls/squads.SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf.json create mode 100644 olddocs/archivekbobobot/idls/stabble_clmm.6dMXqGZ3ga2dikrYS9ovDXgHGh5RUsb2RTUj6hrQXhk6.json create mode 100644 olddocs/archivekbobobot/idls/stabble_stable_swap.swapNyd8XiQwJ6ianp9snpu4brUqFxadzvHebnAXjJZ.json create mode 100644 olddocs/archivekbobobot/idls/stabble_weighted_swap.swapFpHZwjELNnjvThjajtiVmkz3yPQEHjLtka2fwHW.json create mode 100644 olddocs/archivekbobobot/idls/streamflow.strmRqUCoQUgGUan5YhzUZa6KqdzwX5L6FpUxfmKg5m.json create mode 100644 olddocs/archivekbobobot/idls/tensor-cnft.TCMPhJdwDryooaGtiocG1u3xcYbRpiJzb283XfCZsDp.json create mode 100644 olddocs/archivekbobobot/idls/vertigo.vrTGoBuy5rYSxAfV3jaRJWHH6nN9WK4NRExGxsk1bCJ.json create mode 100644 olddocs/archivekbobobot/idls/virtuals.5U3EU2ubXtK84QcRjWVmYt9RaDyA8gKxdUrPFXmZyaki.json create mode 100644 olddocs/archivekbobobot/idls/woofi.WooFif76YGRNjk1pA8wCsN67aQsD9f9iLsz4NcJ1AVb.json create mode 100644 olddocs/archivekbobobot/idls/zeta.ZETAxsqBRek56DhiGXrn75yj2NHU3aYUnxvHXpkf3aD.json diff --git a/docs/README.md b/docs/README.md index b8a54d5..9ae08e6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,5 @@ - + # Documentation active de Khadhroony Bot3 @@ -7,7 +7,7 @@ Ce répertoire contient la documentation active, normative ou opérationnelle de `khadhroony-bot3`. -La documentation historique de `khadhroony-bot2` est conservée sous `olddocs/archivekbot2/`. Elle ne doit être ni déplacée vers `docs/`, ni considérée comme normative. Tout nouveau document bot3 est réécrit après lecture du code, des tests, des matrices et des sources historiques pertinentes. +La documentation historique de `khadhroony-bot2` est conservée sous `olddocs/archivekbot2/`. La documentation historique de `khadhroony-bobobot` est conservée sous `olddocs/archivekbobobot/`. Elle ne doit être ni déplacée vers `docs/`, ni considérée comme normative. Tout nouveau document bot3 est réécrit après lecture du code, des tests, des matrices et des sources historiques pertinentes. ## 2. Architecture @@ -94,3 +94,12 @@ Le premier lot documenté comprend : ## Audits - [Audit d’alignement des TODO par crate](audits/CRATE_TODO_VERSION_ALIGNMENT_AUDIT.md) + +## Guides + +- [Configuration](guides/CONFIGURATION.md) +- [Logging et tracing](guides/LOGGING.md) +- [RPC, backfill et WebSocket](guides/RPC_BACKFILL_AND_WEBSOCKET.md) +- [Extraction Core, replay et matérialisation](guides/REPLAY_CORE_EXTRACTION_AND_MATERIALIZATION.md) +- [PostgreSQL et stockage](guides/POSTGRES_STORAGE.md) +- [Validation Devnet](guides/DEVNET_VALIDATION.md) diff --git a/docs/guides/CONFIGURATION.md b/docs/guides/CONFIGURATION.md new file mode 100644 index 0000000..2ad48fe --- /dev/null +++ b/docs/guides/CONFIGURATION.md @@ -0,0 +1,79 @@ + + + +# Guide de configuration + +## Objectif + +Ce guide décrit le chargement et l’utilisation de la configuration bot3. La référence d’API détaillée reste `kb-config/USAGE.md`. + +## Fichiers actifs + +- `config/example.config.json` : exemple utilisateur complet ; +- `config/schema.config.json` : contrat JSON formel ; +- `.env` et variantes locales : valeurs d’environnement non versionnées ; +- `.env.example` : noms de variables attendues sans secrets. + +Le format actif est JSON. Le futur split de configuration prévu en `0.5.x` ne modifie pas le contrat actuel. + +## Séquence de chargement + +1. charger les fichiers d’environnement autorisés avec `load_workspace_environment` ; +2. lire le fichier JSON ; +3. résoudre les placeholders `${NAME}` ou `${NAME:-fallback}` ; +4. parser avec `load_config_from_str` ou `load_config_from_path` ; +5. valider le schéma et les invariants typés ; +6. sélectionner le profil actif avec `active_profile`. + +## Exemple opérateur + +```rust +let environment = match kb_config::load_workspace_environment( + std::path::Path::new("."), +) { + std::result::Result::Ok(value) => value, + std::result::Result::Err(error) => return std::result::Result::Err(error), +}; + +let config = match kb_config::load_config_from_path( + std::path::Path::new("config/example.config.json"), +) { + std::result::Result::Ok(value) => value, + std::result::Result::Err(error) => return std::result::Result::Err(error), +}; + +let profile = match kb_config::active_profile(&config) { + std::result::Result::Ok(value) => value, + std::result::Result::Err(error) => return std::result::Result::Err(error), +}; + +println!("loaded environment files={}", environment.loaded_files.len()); +println!("active profile={}", profile.name); +``` + +## Invariants + +- aucun secret ne doit être ajouté à l’exemple versionné ; +- les placeholders non résolus doivent provoquer un diagnostic explicite ; +- le schéma embarqué et `config/schema.config.json` doivent rester identiques ; +- une sérialisation publique doit être précédée d’une validation ; +- les noms de profils et rôles d’endpoints doivent rester cohérents avec leurs consommateurs. + +## Diagnostic + +Pour isoler une erreur : + +1. afficher la liste des fichiers d’environnement chargés ; +2. résoudre le JSON sans l’écrire dans les logs s’il contient des secrets ; +3. valider le schéma ; +4. valider le modèle typé ; +5. vérifier le profil actif ; +6. vérifier les rôles HTTP, WebSocket, stockage et logging. + +## Références + +- `kb-config/README.md` ; +- `kb-config/USAGE.md` ; +- `kb-config/TODO.md` ; +- `config/README.md` ; +- `docs/decisions/WINCODE_COMPATIBILITY_POLICY.md`. diff --git a/docs/guides/DEVNET_VALIDATION.md b/docs/guides/DEVNET_VALIDATION.md new file mode 100644 index 0000000..286d7e5 --- /dev/null +++ b/docs/guides/DEVNET_VALIDATION.md @@ -0,0 +1,65 @@ + + + +# Guide de validation Devnet + +## Objectif + +Une validation Devnet démontre un parcours réel. Elle ne doit pas être confondue avec un test unitaire, une simulation ou une validation synthétique. + +## Niveaux de preuve + +1. test unitaire ou contractuel ; +2. validation synthétique sur fixtures ; +3. simulation RPC exacte ; +4. confirmation opérateur ; +5. soumission ; +6. confirmation finalisée ; +7. insertion canonique ; +8. extraction Core ; +9. replay et matérialisation ; +10. idempotence et vérification CLI finale. + +Le rapport doit indiquer précisément les niveaux réellement exécutés. + +## Prérequis + +- profil Devnet explicite ; +- endpoint compatible ; +- wallet de test et fonds suffisants ; +- paramètres bornés ; +- scénario réutilisable hors desktop lorsque possible ; +- confirmation opérateur avant tout envoi. + +## Commandes + +Les scénarios peuvent être déclenchés depuis `kb-pipeline-demo-scenarios` ou le desktop. La validation frontend se fait uniquement avec : + +```bash +cargo tauri dev -c kb-app-demo-desktop/tauri.conf.json +``` + +## Rapport + +Conserver : + +- scénario et version ; +- cluster ; +- signatures publiques ; +- opérations exécutées ; +- résultats de simulation et confirmation ; +- vérifications de stockage, replay et matérialisation ; +- limites et étapes non exécutées. + +Ne pas conserver de keypair, secret ou preuve privée dans les deltas. + +## ElGamal + +Le registre ElGamal ne doit pas être déclaré validé sur Devnet ou Mainnet sans confirmation de déploiement, preuve `PubkeyValidity`, compte `Proof Context State` valide et scénario complet. + +## Références + +- `docs/PRE_062_DEVNET_VALIDATION_REPORT.md` ; +- `docs/DEVNET_EXECUTION_GUIDE.md` ; +- `kb-pipeline-demo-scenarios/USAGE.md` ; +- `kb-app-demo-desktop/USAGE.md`. diff --git a/docs/guides/LOGGING.md b/docs/guides/LOGGING.md new file mode 100644 index 0000000..bf93ec1 --- /dev/null +++ b/docs/guides/LOGGING.md @@ -0,0 +1,74 @@ + + + +# Guide de logging et tracing + +## Objectif + +`kb-logging` initialise les routes de tracing définies par la configuration et conserve les guards nécessaires à leur durée de vie. + +## Flux de démarrage + +1. charger et valider la configuration avec `kb-config` ; +2. construire `LoggingConfig` ; +3. appeler `kb_logging::init_logging` une seule fois ; +4. conserver `LoggingGuard` jusqu’à la fermeture du processus ; +5. émettre les événements avec des targets canoniques. + +```rust +let guard = match kb_logging::init_logging(&config.logging) { + std::result::Result::Ok(value) => value, + std::result::Result::Err(error) => return std::result::Result::Err(error), +}; + +tracing::info!( + target: kb_logging::tracing_target(), + routes = guard.route_count(), + "logging initialized" +); +``` + +## Routes + +Une route définit notamment : + +- sink console ou fichier ; +- niveau minimal ; +- format humain, compact, pretty ou JSON ; +- rotation ; +- targets exactes ou préfixes ; +- activation ANSI. + +Les routes fichier ne doivent jamais écrire de secrets ou de keypairs. + +## Nomenclature des targets + +Les targets suivent les conventions du workspace, par exemple : + +```text +kb-pipeline.backfill +kb-pipeline.decode-replay +kb-onchain-transport.http +kb-lib.executor.spl.token-2022 +``` + +Une nouvelle target doit être ajoutée selon `docs/OPERATION_NAMING_CONVENTION.md` et les règles Khadhroony. + +## Frontend desktop + +Les fenêtres Tauri utilisent la permission tracing prévue par leurs capabilities. Les logs frontend sont adaptés vers le backend sans permettre au frontend de choisir arbitrairement une target sensible. + +## Diagnostic + +- vérifier les routes actives via `route_names()` ; +- confirmer le niveau global et les filtres spécifiques ; +- vérifier le chemin et les permissions d’une route fichier ; +- vérifier que le guard n’est pas détruit prématurément ; +- ne pas réinitialiser le subscriber global pendant l’exécution. + +## Références + +- `kb-logging/README.md` ; +- `kb-logging/USAGE.md` ; +- `kb-config/USAGE.md` ; +- `docs/architecture/ARCHITECTURE.md`. diff --git a/docs/guides/POSTGRES_STORAGE.md b/docs/guides/POSTGRES_STORAGE.md new file mode 100644 index 0000000..54b7dfb --- /dev/null +++ b/docs/guides/POSTGRES_STORAGE.md @@ -0,0 +1,66 @@ + + + +# Guide PostgreSQL et contrats de stockage + +## Objectif + +`kb-store` consolide les contrats de stockage Core, raw, decode et PostgreSQL de bot2 dans une crate unique. + +## Connexion + +```rust +let options = match kb_store::PostgresStoreOptions::new( + database_url, + 10, + 10_000, + true, +) { + std::result::Result::Ok(value) => value, + std::result::Result::Err(error) => return std::result::Result::Err(error), +}; + +let store = match kb_store::PostgresStore::connect(options).await { + std::result::Result::Ok(value) => value, + std::result::Result::Err(error) => return std::result::Result::Err(error), +}; +``` + +Toujours utiliser `masked_dsn()` dans les diagnostics. + +## Domaines + +- raw : acquisitions et observations ; +- Core : transactions, instructions, comptes et contexte normalisés ; +- decode : ledger, observations décodées et matérialisations ; +- replay : candidats et résumés bornés. + +## Migrations + +Les migrations sont idempotentes et ordonnées. Une nouvelle migration ne doit pas modifier rétroactivement une migration déjà publiée. + +## Repositories + +Les traits publics séparent le contrat de l’implémentation PostgreSQL. Les opérations de lecture utilisent des filtres et paginations bornés. + +## Diagnostics + +- health snapshot ; +- migration snapshot ; +- backend diagnostics ; +- diagnostics des tables raw, Core et decode ; +- validation des noms de tables. + +## Invariants + +- aucune donnée canonique ne doit être dupliquée sans justification ; +- les écritures rejouables doivent être idempotentes ; +- la progression de campagne doit rester cohérente avec les lignes effectivement traitées ; +- les requêtes dynamiques n’acceptent que des identifiants validés ; +- les erreurs PostgreSQL restent distinctes des erreurs de contrat. + +## Références + +- `docs/architecture/STORAGE_ARCHITECTURE.md` ; +- `kb-store/USAGE.md` ; +- `kb-store/README.md`. diff --git a/docs/guides/REPLAY_CORE_EXTRACTION_AND_MATERIALIZATION.md b/docs/guides/REPLAY_CORE_EXTRACTION_AND_MATERIALIZATION.md new file mode 100644 index 0000000..e6a6799 --- /dev/null +++ b/docs/guides/REPLAY_CORE_EXTRACTION_AND_MATERIALIZATION.md @@ -0,0 +1,77 @@ + + + +# Guide extraction Core, replay et matérialisation + +## Chaîne de traitement + +```text +acquisition canonique + ↓ +extraction Core + ↓ +entrées de replay instruction-level + ↓ +reconnaissance et décodage + ↓ +observations et diagnostics + ↓ +matérialisation optionnelle +``` + +## Extraction Core + +L’extraction transforme une transaction canonique persistée en entités Core normalisées. Elle doit conserver les index, comptes, Program IDs, succès ou échec de transaction et contexte nécessaire aux instructions internes. + +```rust +let summary = match kb_pipeline::execute_core_extraction( + request, + observer, +).await { + std::result::Result::Ok(value) => value, + std::result::Result::Err(error) => return std::result::Result::Err(error), +}; +``` + +## Decode replay + +Le replay sélectionne des instructions Core, applique une politique de dispatch et invoque les décodeurs compatibles. + +- une reconnaissance incompatible ne produit pas d’observation ; +- une transaction échouée peut produire une intention non committée ; +- les diagnostics doivent rester distincts des observations ; +- la même entrée et la même version de pipeline doivent produire un résultat déterministe. + +## Matérialisation + +La matérialisation est optionnelle et idempotente. Elle transforme les événements décodés en projections métier sans inventer un état confirmé. + +Une tâche de matérialisation doit préciser : + +- la provenance de l’événement ; +- le statut committé ou non committé ; +- les clés d’idempotence ; +- les invariants de mise à jour ; +- le traitement des événements obsolètes ou contradictoires. + +## Reprise + +La progression persistée ne doit avancer qu’après clôture cohérente du candidat. Les erreurs partielles restent rejouables. + +## Tests de référence + +- extraction Core legacy et v0 ; +- instructions outer et inner ; +- transactions échouées ; +- dispatch vers le décodeur exact ; +- matérialisation optionnelle ; +- replay forcé et idempotence ; +- corrélations stateful Token-2022. + +## Références + +- `docs/architecture/PIPELINE_ARCHITECTURE.md` ; +- `docs/architecture/STORAGE_ARCHITECTURE.md` ; +- `kb-pipeline/USAGE.md` ; +- `kb-lib/USAGE.md` ; +- `kb-store/USAGE.md`. diff --git a/docs/guides/RPC_BACKFILL_AND_WEBSOCKET.md b/docs/guides/RPC_BACKFILL_AND_WEBSOCKET.md new file mode 100644 index 0000000..e2dcf5e --- /dev/null +++ b/docs/guides/RPC_BACKFILL_AND_WEBSOCKET.md @@ -0,0 +1,101 @@ + + + +# Guide RPC, backfill et WebSocket + +## Séparation des responsabilités + +- `kb-onchain-transport` communique avec les endpoints ; +- `kb-pipeline` orchestre les campagnes ; +- `kb-store` persiste les acquisitions canoniques et la progression ; +- `kb-app-demo-desktop` fournit une interface opérateur ; +- `kb-pipeline-demo-scenarios` construit et exécute les scénarios réutilisables de démonstration et de validation, notamment sur Devnet. + +## Passage d’un scénario validé vers le pipeline + +`kb-pipeline-demo-scenarios` n’est pas la destination finale d’une logique réutilisable en production. Son rôle est de composer des APIs publiques existantes, préparer les fixtures, imposer les garde-fous opérateur et démontrer un parcours complet sur un réseau de validation. + +Lorsqu’un composant d’un scénario est validé et qu’il est générique, déterministe et utilisable indépendamment de la démonstration, il doit résider dans la couche appropriée : + +- `kb-lib` pour le décodage, la matérialisation, la construction d’instructions, les préflights et les politiques de sécurité ; +- `kb-onchain-transport` pour les opérations réseau génériques ; +- `kb-store` pour les contrats de persistance ; +- `kb-pipeline` pour l’orchestration réutilisable, y compris sur Mainnet lorsque le profil, la politique et l’appelant l’autorisent. + +La crate de scénarios conserve : + +- les fixtures et valeurs de démonstration ; +- la préparation Devnet ; +- les confirmations opérateur propres aux campagnes de validation ; +- les enchaînements de bout en bout destinés à prouver le comportement ; +- les rapports de validation et contrôles postérieurs au scénario. + +Une validation Devnet ne provoque pas automatiquement une promotion vers Mainnet. Le composant promu doit également être indépendant du cluster, couvert par des tests, borné, compatible avec les politiques de sécurité et ne pas contenir d’hypothèse propre aux fixtures Devnet. + +## Rôles d’endpoints + +Un endpoint n’est pas supposé supporter toutes les opérations. La configuration attribue des rôles HTTP ou WebSocket, puis les pools sélectionnent une cible compatible. + +Avant une campagne : + +1. résoudre le profil ; +2. vérifier la présence du rôle requis ; +3. vérifier les limites du fournisseur ; +4. fixer des bornes de pagination, concurrence et retry ; +5. préparer l’observateur et l’annulation coopérative. + +## Backfill HTTP + +Le backfill parcourt les signatures, charge les transactions et les adapte vers le contrat canonique avant stockage. + +```rust +let summary = match kb_pipeline::execute_http_backfill( + request, + observer, +).await { + std::result::Result::Ok(value) => value, + std::result::Result::Err(error) => return std::result::Result::Err(error), +}; + +println!("completed={}", summary.completed); +``` + +La frontière de reprise ne progresse qu’au travers des résultats contigus terminés. Une annulation ne doit pas sauter les candidats inachevés. + +## WebSocket + +La session WebSocket appartient au processus applicatif et non à la fenêtre qui l’affiche. Pour `demo_ws` : + +- fermer la fenêtre ne ferme pas une session active ; +- rouvrir la fenêtre relit l’état courant ; +- la déconnexion résulte d’une commande explicite, de la fermeture de l’application ou d’un timeout prévu ; +- les abonnements et notifications restent bornés. + +## Adaptation canonique + +Les réponses fournisseur sont converties avant le pipeline. Les différences legacy/v0, ALT, CPI, erreurs de transaction et encodages doivent rester explicites. + +## Erreurs + +Distinguer : + +- transport indisponible ; +- erreur JSON-RPC distante ; +- réponse invalide ; +- adaptation canonique impossible ; +- erreur de stockage ; +- annulation opérateur. + +## Tests de référence + +- pools et rôles d’endpoints ; +- fixtures `getTransaction` legacy et v0 ; +- pagination et reprise contiguë du backfill ; +- cycles de connexion, abonnement et déconnexion WebSocket ; +- maintien et restauration de l’état desktop. + +## Références + +- `kb-onchain-transport/USAGE.md` ; +- `kb-pipeline/USAGE.md` ; +- `kb-app-demo-desktop/USAGE.md`. diff --git a/kb-config/CHANGELOG.md b/kb-config/CHANGELOG.md index 1601c10..ee03174 100644 --- a/kb-config/CHANGELOG.md +++ b/kb-config/CHANGELOG.md @@ -1,8 +1,12 @@ - + # CHANGELOG — kb-config +## 0.1.0-pre.073 + +- ajout du guide transversal [`docs/guides/CONFIGURATION.md`](../docs/guides/CONFIGURATION.md) ; + ## 0.1.0-pre.072 - reclassement du TODO selon les blocants avant `0.4.6`, les travaux `0.4.7`, les versions ultérieures et les dépendances conditionnelles. diff --git a/kb-logging/CHANGELOG.md b/kb-logging/CHANGELOG.md index 16c81b6..5b4fe14 100644 --- a/kb-logging/CHANGELOG.md +++ b/kb-logging/CHANGELOG.md @@ -1,8 +1,12 @@ - + # CHANGELOG — kb-logging +## 0.1.0-pre.073 + +- ajout du guide transversal [`docs/guides/LOGGING.md`](../docs/guides/LOGGING.md) ; + ## 0.1.0-pre.072 - reclassement du TODO selon les blocants avant `0.4.6`, les travaux `0.4.7`, les versions ultérieures et les dépendances conditionnelles. @@ -13,7 +17,6 @@ ## 0.1.0-pre.069 - ### Documentation - création de `TODO.md`, `USAGE.md` et du changelog détaillé ; diff --git a/kb-onchain-transport/CHANGELOG.md b/kb-onchain-transport/CHANGELOG.md index 63d5e05..98c9186 100644 --- a/kb-onchain-transport/CHANGELOG.md +++ b/kb-onchain-transport/CHANGELOG.md @@ -1,8 +1,12 @@ - + # CHANGELOG — kb-onchain-transport +## 0.1.0-pre.073 + +- ajout du guide transversal [`docs/guides/RPC_BACKFILL_AND_WEBSOCKET.md`](../docs/guides/RPC_BACKFILL_AND_WEBSOCKET.md) ; + ## 0.1.0-pre.072 - reclassement du TODO selon les blocants avant `0.4.6`, les travaux `0.4.7`, les versions ultérieures et les dépendances conditionnelles. diff --git a/kb-onchain-transport/TODO.md b/kb-onchain-transport/TODO.md index 2a18ecb..9083977 100644 --- a/kb-onchain-transport/TODO.md +++ b/kb-onchain-transport/TODO.md @@ -1,12 +1,10 @@ - + # TODO — kb-onchain-transport ## Avant alignement `0.4.6` -- [ ] Documentation - produire dans `pre.073` le guide transversal RPC, backfill et WebSocket à partir des APIs bot3 actuelles. - ## Série `0.13.x` - [ ] WebSocket - étendre le support Helius selon les contrats retenus. diff --git a/kb-pipeline-demo-scenarios/CHANGELOG.md b/kb-pipeline-demo-scenarios/CHANGELOG.md index 016da82..8d7f4c1 100644 --- a/kb-pipeline-demo-scenarios/CHANGELOG.md +++ b/kb-pipeline-demo-scenarios/CHANGELOG.md @@ -1,8 +1,12 @@ - + # CHANGELOG — kb-pipeline-demo-scenarios +## 0.1.0-pre.073 + +- ajout du guide transversal [`docs/guides/DEVNET_VALIDATION.md`](../docs/guides/DEVNET_VALIDATION.md) ; + ## 0.1.0-pre.072 - reclassement du TODO selon les blocants avant `0.4.6`, les travaux `0.4.7`, les versions ultérieures et les dépendances conditionnelles. diff --git a/kb-pipeline/CHANGELOG.md b/kb-pipeline/CHANGELOG.md index 15ddaa7..62a4716 100644 --- a/kb-pipeline/CHANGELOG.md +++ b/kb-pipeline/CHANGELOG.md @@ -1,8 +1,12 @@ - + # CHANGELOG — kb-pipeline +## 0.1.0-pre.073 + +- ajout du guide transversal [`docs/guides/REPLAY_CORE_EXTRACTION_AND_MATERIALIZATION.md`](../docs/guides/REPLAY_CORE_EXTRACTION_AND_MATERIALIZATION.md) ; + ## 0.1.0-pre.072 - reclassement du TODO selon les blocants avant `0.4.6`, les travaux `0.4.7`, les versions ultérieures et les dépendances conditionnelles. diff --git a/kb-pipeline/TODO.md b/kb-pipeline/TODO.md index 39f354f..355b614 100644 --- a/kb-pipeline/TODO.md +++ b/kb-pipeline/TODO.md @@ -1,12 +1,11 @@ - + # TODO — kb-pipeline ## Bloquants avant alignement `0.4.6` - [ ] Audit - traiter les écarts pipeline réellement démontrés par `V0_4_6_ALIGNMENT_AUDIT.md`. -- [ ] Documentation - produire dans `pre.073` le guide de replay, extraction Core et matérialisation. ## Entre `0.4.6` et `0.4.7` diff --git a/kb-program-ids/CHANGELOG.md b/kb-program-ids/CHANGELOG.md index c4662ba..0f8509a 100644 --- a/kb-program-ids/CHANGELOG.md +++ b/kb-program-ids/CHANGELOG.md @@ -1,8 +1,12 @@ - + # CHANGELOG — kb-program-ids +## 0.1.0-pre.073 + +- ajout de l’archive documentaire bobobot, indexée par [`olddocs/archivekbobobot/001.README.md`](../olddocs/archivekbobobot/001.README.md), comme source historique future pour les Program IDs et IDL ; + ## 0.1.0-pre.072 - reclassement du TODO selon les blocants avant `0.4.6`, les travaux `0.4.7`, les versions ultérieures et les dépendances conditionnelles. diff --git a/kb-store/CHANGELOG.md b/kb-store/CHANGELOG.md index 4282ae6..da901ec 100644 --- a/kb-store/CHANGELOG.md +++ b/kb-store/CHANGELOG.md @@ -1,8 +1,12 @@ - + # CHANGELOG — kb-store +## 0.1.0-pre.073 + +- ajout du guide transversal [`docs/guides/POSTGRES_STORAGE.md`](../docs/guides/POSTGRES_STORAGE.md) ; + ## 0.1.0-pre.072 - reclassement du TODO selon les blocants avant `0.4.6`, les travaux `0.4.7`, les versions ultérieures et les dépendances conditionnelles. diff --git a/kb-store/TODO.md b/kb-store/TODO.md index 2db44d7..af59f30 100644 --- a/kb-store/TODO.md +++ b/kb-store/TODO.md @@ -1,12 +1,10 @@ - + # TODO — kb-store ## Avant alignement `0.4.6` -- [ ] Documentation - produire dans `pre.073` le guide transversal d’exploitation PostgreSQL et des contrats de stockage. - ## Versions ultérieures - [ ] Administration - définir les outils supplémentaires prévus par le ROADMAP avant leur implémentation. diff --git a/olddocs/archivekbobobot/001.README.md b/olddocs/archivekbobobot/001.README.md new file mode 100644 index 0000000..4fec32b --- /dev/null +++ b/olddocs/archivekbobobot/001.README.md @@ -0,0 +1,31 @@ + + + +# Archive documentaire khadhroony-bobobot + +Cette arborescence conserve les documents historiques utiles de `khadhroony-bobobot v0.7.58-pre.003` en maintenant leurs chemins relatifs. + +## Contenu conservé + +- documents racine `README.md`, `CHANGELOG.md` et `ROADMAP.md` ; +- documents, rapports et prompts sous `docs/` ; +- IDL JSON historiques sous `idls/`. + +## Contenu exclu + +- code source Rust ; +- manifests de compilation ; +- configuration d’exécution ; +- bases de données, fixtures et artefacts générés. + +## Statut + +Cette archive n’est pas normative pour bot3. Elle sert de source historique pour reconstruire et vérifier notamment : + +- les Program IDs ; +- les noms et familles de protocoles ; +- la présence et la provenance des IDL ; +- les références Solscan, Solana Explorer et dépôts Git ; +- les anciennes matrices de couverture. + +Aucune donnée de cette archive ne doit être reprise automatiquement dans la documentation active. Chaque information doit être relue, vérifiée et adaptée. diff --git a/olddocs/archivekbobobot/CHANGELOG.md b/olddocs/archivekbobobot/CHANGELOG.md new file mode 100644 index 0000000..2d472a9 --- /dev/null +++ b/olddocs/archivekbobobot/CHANGELOG.md @@ -0,0 +1,92 @@ + + +0.0.1 - initial skel +0.0.2 - Socle conforme +0.1.0 - Transport WebSocket générique +0.1.1 - Intégration Tauri minimale du WsClient +0.2.0 - Couche JSON-RPC WS Solana +0.3.0 - Registre subscriptions / notifications +0.3.1 - Ajout des helpers subscribe/unsubscribe à WsClient +0.3.2 - Ajout des helpers typed et du parsing typed basé sur solana-rpc-client-api +0.3.3 - Ajout du suffixe _raw aux helpers raw pour distinguer typed et raw +0.3.4 - Ajout de la fenêtre Demo Ws dans kb_demo_app pour tester les souscriptions live +0.3.5 - Stabilisation de Demo Ws, lecture correcte des endpoints activés depuis la config, limitation/throttling de l’affichage UI sous fort débit +0.4.0 - Socle HttpClient générique async clonable, JSON-RPC HTTP 2.0, résolution d’URL avec api_key_env_var, limiteur local req/sec + burst, helpers initiaux getHealth/getVersion/getSlot +0.4.1 - Ajout des premiers helpers HTTP Solana haut niveau, dans la continuité de l’API du client WebSocket +0.4.2 - Préparation de la politique HTTP avancée : états de pause avant envoi, quotas par famille de méthodes et futur pool d’endpoints +0.4.3 - Pool d’endpoints HTTP +0.4.4 - Ajout de la fenêtre Demo Http dans kb_demo_app, exécution manuelle des méthodes HTTP via le pool, snapshot des endpoints et amélioration des presets UI +0.5.0 - Début du socle SQLite : configuration database, ouverture/validation de la base et premières briques de persistance +0.5.1 - Ajout des premières tables métier SQLite pour les endpoints connus HTTP/WS et les événements runtime, avec séparation entities/dtos/queries/types +0.5.2 - Ajout de la table des tokens observés, de leur statut local et des premières requêtes de persistance associées +0.5.3 - Préparation du stockage local des événements techniques et des signaux utiles à l’analyse, avec distinction runtime / on-chain / métier +0.5.4 - Ajout du modèle métier normalisé initial pour les DEX, tokens, pools, paires, composition des pools et listings +0.5.5 - Ajout des événements métier normalisés pour les swaps, liquidités, mints et burns de tokens +0.5.6 - Consolidation de la couche stockage : activation des foreign keys SQLite, lectures ciblées sur le modèle métier normalisé, index supplémentaires et tests unitaires dédiés +0.6.0 - Ajout du pipeline de détection technique : façade de persistance pour observations on-chain, signaux d’analyse et candidats tokens depuis les connecteurs RPC +0.6.1 - Ajout du bridge de détection Solana WS : notifications JSON-RPC persistées en observations, avec détection initiale des mints SPL / Token-2022 depuis programNotification +0.6.2 - Branchement de WsClient vers le pipeline de détection via un relais asynchrone de notifications JSON-RPC WebSocket +0.6.3 - Enrichissement des notifications WebSocket utiles : extraction améliorée de pubkey, signature, owner, parsed account type et slot pour account/logs/signature notifications +0.6.4 - Premières règles de détection technique pour candidats pools/listings depuis programNotification en s’appuyant sur les DEX connus en base +0.6.5 - Ajout de ws_manager.rs pour l’orchestration multi-clients WebSocket, le bus d’événements unifié et le branchement centralisé du relais de détection +0.6.6 - Ajout de la fenêtre Demo Ws Manager dans kb_demo_app pour piloter plusieurs WsClient, visualiser le snapshot consolidé, tester le démarrage/arrêt par rôle et valider le flux unifié de WsEvent +0.7.0 - Ajout du socle de résolution transactionnelle orientée DEX : relais WS vers file de résolution, récupération getTransaction via HttpEndpointPool et persistance des résolutions dans les observations/signaux +0.7.1 - Ajout du modèle transactionnel enrichi : tables slots/transactions/instructions, requêtes d’accès et projection structurée des transactions résolues +0.7.2 - Ajout du premier décodeur DEX spécifique Raydium AmmV4 / initialize2, persistance des événements DEX décodés et branchement automatique du décodage après résolution/projection transactionnelle +0.7.3 - Ajout de la détection métier depuis les événements DEX décodés, avec alimentation de kb_pools, kb_pairs, kb_pool_tokens et kb_pool_listings, et signaux de première apparition +0.7.4 - Ajout du premier lot multi-DEX v1 avec décodeurs Pump.fun (create_v2) et PumpSwap (buy/sell), plus détection métier Pump.fun vers token/pool/pair/listing +0.7.5 - Enrichissement de PumpSwap avec extraction des mints et du pool_v2, persistance des événements décodés enrichis et détection métier automatique pool/pair/listing +0.7.6 - Ajout du premier support Meteora DBC avec décodage create_pool/swap, persistance des événements décodés et détection métier automatique pool/pair/listing +0.7.7 - Ajout du premier support Meteora DAMM v2 avec décodage create_pool/swap, persistance des événements décodés et détection métier automatique pool/pair/listing +0.7.8 - Ajout du premier support Meteora DAMM v1 avec décodage create_pool/swap, persistance des événements décodés et détection métier automatique pool/pair/listing +0.7.9 - Ajout d’un registre des surfaces de lancement, d’une attribution automatique des pools détectés à une origine de lancement, et d’un premier support Meteora Fun Launch au-dessus de Meteora DBC / DAMM +0.7.10 - Ajout du premier support Orca Whirlpools avec décodage create_pool/swap, persistance des événements décodés et détection métier automatique pool/pair/listing +0.7.11 - Ajout du premier support FluxBeam avec décodage create_pool/swap, persistance des événements décodés et détection métier automatique pool/pair/listing +0.7.12 - Ajout du premier support DexLab Swap/Pool avec décodage create_pool/swap, persistance des événements décodés et détection métier automatique pool/pair/listing +0.7.13 - Extension de la couche launch origins avec Bags et Moonit, ajout d’un enregistrement programmatique des mappings Bags, et détection automatique Moonit via suffixe de token mint +0.7.14 - Ajout d’une couche consolidée de traçabilité fondatrice multi-DEX avec enregistrement des pool origins, rattachement au decoded event, au pool/pair/listing et à l’éventuelle launch attribution +0.7.15 - Ajout d’une couche wallets observés et participations observées, avec extraction des rôles depuis les payloads décodés et rattachement transaction / decoded event / pool / pair +0.7.16 - Ajout d’une première couche trade events et pair metrics avec normalisation des swaps, agrégation par paire et branchement automatique dans le pipeline de résolution transactionnelle +0.7.17 - Ajout d’une première couche WS hybride avec collecte de cibles `programSubscribe` / `accountSubscribe` et persistance technique dédupliquée des notifications `logs / program / account` +0.7.18 - Ajout d’un premier backfill historique ciblé par token mint, basé sur `getSignaturesForAddress` + `getTransaction`, avec réutilisation du pipeline interne pour reconstruire transactions, pools, swaps, origins, wallets et métriques +0.7.19 - Ajout d’une première couche holdings observés avec agrégation par couple wallet/token et branchement automatique dans le pipeline de résolution transactionnelle +0.7.20 - Ajout d’une première couche candles / OHLCV avec matérialisation en base des timeframes usuels et régénération à la demande pour un timeframe arbitraire depuis les trade events +0.7.21 - Ajout d’une première couche de signaux analytiques enrichis par paire avec persistance dédiée et détection de first trade, trade burst, buy/sell imbalance, price jump et volume spike +0.7.22 - Ajout d’une première fenêtre `Demo Pipeline` dans `kb_demo_app` pour l’inspection en lecture seule du pipeline `0.7.x`, avec recherche par signature, token mint, pair id ou pool address, affichage structuré des transactions résolues, événements DEX décodés, pools, paires, listings, launch origins, pool origins, wallets et holdings observés, trade events, pair metrics, candles et signaux analytiques déjà persistés, ainsi que conservation d’une instance partagée de la base SQLite pour éviter la réouverture et la réinitialisation du schéma à chaque commande UI +0.7.23 - Ajout du pilotage UI du backfill historique ciblé par `token mint` dans `kb_demo_app`, avec saisie du rôle HTTP et des limites de signatures, affichage du résumé de backfill, réinspection automatique du token dans `Demo Pipeline` lorsque des objets persistés sont effectivement reconstruits, et gestion explicite du cas où le backfill réussit sans matérialiser de token exploitable dans la base locale +0.7.24 - Ajout de l’affichage graphique des candles / OHLCV dans `kb_demo_app` via `echarts`, avec sélection de paire et de timeframe, rendu chandelier + volume, et prise en charge des candles matérialisées ou régénérées à la demande depuis `Demo Pipeline` +0.7.25 - Enrichissement metadata des tokens, avec résolution locale limitée à SOL / WSOL, résolution des autres mints via comptes on-chain, Token-2022, Metaplex ou payloads DEX, et conservation explicite des cas non résolus +0.7.26 - Diagnostics locaux du pipeline persisté, correction de l’agrégation instruction-scoped des swaps Raydium, clarification des compteurs de replay/upsert, et validation qu’aucun trade candidate issu d’une transaction OK n’est perdu +0.7.27 - Validation multi-DEX et non-régression du pipeline sur Pump.fun, PumpSwap, Raydium CPMM et Raydium CLMM, avec corpus de tests, diagnostics de référence et garanties sur les événements non pricés +0.7.28 - Refactor DEX commun et verrouillage des invariants de normalisation : séparation des événements décodés, actionnables, trade candidates et candle candidates ; conservation des transactions failed comme traçables mais non actionnables ; ajout de la règle bloquante empêchant tout trade/candle candidate sans payload de montants exploitable, notamment pour le cas partiel `meteora_damm_v1.swap` sans base/quote amount. +0.7.29 - Ajout d’une matrice DEX commune (`dex_support_matrix`) utilisée par le catalogue DEX, la classification transactionnelle et l’enregistrement des protocol candidates ; ajout du profil de validation `0.7.29_multi_dex_matrix_baseline` exposant la matrice dans le rapport de validation ; préparation explicite des surfaces planifiées sans inventer de program ids non vérifiés. +0.7.30 - Ajout d’une taxonomie DEX plus fine pour les événements décodés : `eventLifecycleKind`, `eventActionability`, `nonTradeUseful`, compteurs diagnostics des événements non-trade utiles, trades non actionnables et classifications inconnues ; ajout du profil `0.7.30_non_trade_event_classification` sans modification volontaire de la matérialisation trade/candle. +0.7.31 - Application de la politique Option B : les transactions failed restent traçables dans les événements décodés mais ne peuvent plus alimenter `trade_events`, metrics ou candles ; le replay local réinitialise les tables de matérialisation marché avant reconstruction pour supprimer les anciennes lignes dérivées non actionnables. +0.7.32 - Clarification de la sémantique des diagnostics locaux : séparation des gaps littéraux de paires et des gaps bloquants/actionnables, ajout des compteurs de matérialisation par paire, résumé `pairActionabilitySummaries`, profil `0.7.32_validation_report_semantics` et garde-fous sur la matrice DEX sans modification de la matérialisation trade/candle. +0.7.33 - Ajout de la classification diagnostique `pairTradingReadiness` pour les paires, avec `quoteAssetClass`, `tradingRouteRequired`, résumé `pairTradingReadinessSummaries`, profil de validation `0.7.33_pair_trading_readiness` et mise à jour de la sélection UI Demo Pipeline 2 sans modifier la matérialisation trade/candle. +0.7.34 - Ajout du profil `0.7.34_non_trade_liquidity_lifecycle`, matérialisation des tables non-trade liquidité/lifecycle, warning non bloquant pour DEX attendus absents du corpus local, première tranche DLMM : `add_liquidity`, `remove_liquidity`, `initialize_position`, `initialize_bin_array`, intégration de la matérialisation non-trade dans les backfills token/pool ciblés, et distinction `PositionOpen`/`PositionClose` dans `LiquidityEventKind`. +0.7.35 - Ajout du profil `0.7.35_non_trade_fee_reward_admin`, matérialisation des événements non-trade fees/rewards/admin, raccordement aux diagnostics locaux et maintien strict de l’invariant : aucun fee/reward/admin ne peut produire de trade, metric ou candle. +0.7.36 - Consolidation de la famille Meteora : corpus mixte `meteora_damm_v1`, `meteora_damm_v2`, `meteora_dbc` et `meteora_dlmm`, correction des discriminants DAMM v2 / DBC, validation du profil `0.7.36_meteora_family_consolidation`, et reclassement explicite des swaps DAMM v2 / DBC sans payload montant/prix en `non_actionable_trade` afin d’éviter tout trade/candle artificiel. +0.7.37 - Première tranche metadata/catalog : ajout du profil `0.7.37_token_metadata_catalog_enrichment`, exposition des compteurs metadata dans diagnostics/validation et raccordement UI Demo Pipeline 2 sans rendre les metadata manquantes bloquantes. +0.7.38 - Priorisation des metadata manquantes : ajout du profil `0.7.38_token_metadata_gap_prioritization`, samples `tokenMetadataGapSamples`, priorités tradable/quote/catalog, raccordement UI Demo Pipeline 2 et maintien du caractère non bloquant des metadata incomplètes. +0.7.39 - Réorientation DEX-first : distinction explicite des rôles `dex_effective`, `aggregator_router`, `launch_surface` et `to_verify` dans la matrice DEX, suppression de l’alias ambigu `raydium`, ajout de `metaDAO` et `Printr` comme surfaces à vérifier sans `program_id`, profil `0.7.39_dex_first_effective_swap_surfaces`, validation locale avec invariants DEX-first maintenus et report des launch surfaces après les DEX effectifs. +0.7.40 - Ajout de Demo3 pour la constitution de corpus on-chain par `dex_code` / `program_id` via `getSignaturesForAddress` + `getTransaction`, extraction des mints, deltas SPL Token, comptes pool/state/vault/program candidats, ajout du backfill par signature dans Demo Pipeline 2, et validation pratique sur Raydium AMM v4 sans promotion automatique des comptes candidats. +0.7.41 - Raydium AMM v4 swap decoder v1 : décodage des inner instructions `675kPX...`, extraction pool/state, authority, vaults, mints, routeSource et montants exploitables, matérialisation trades/candles sur transactions OK, matrice AMM v4 passée en `supported`, et validation locale avec invariants trade/candle propres. +0.7.42 - Consolidation famille Raydium : audit conservatoire des instructions Raydium non décodées, décodage CLMM legacy `swap`, cleanup des audits remplacés, classification HTTP `getTransaction` comme requête lourde avec retry/backoff de backfill, mapping des événements non-swap prouvés `raydium_clmm` (`increase_liquidity_v2`, `decrease_liquidity_v2`, `open_position_with_token22_nft`, `close_position`) et `raydium_cpmm` (`initialize`, `withdraw`, `collect_creator_fee`), matérialisation de 25 liquidity events, 1 lifecycle event et 2 fee events sur corpus élargi, conservation des non-swaps AMM v4 legacy en audit. +0.7.43 - Reprise documentaire et normalisation DEX-first : `0.7.43` est conservé comme point de reprise non clos pour le lot Meteora, la suite est redécoupée par DEX/version séparés, le besoin d’un ledger de décodage/replay est acté, les statuts `known` / `observed` / `decoded` / `materialized` / `verified_by_corpus` deviennent obligatoires, et aucun `program_id` ne doit être marqué vérifié sans preuve/corpus reproductible. +0.7.44 - Ledger de décodage/replay DEX : ajout de `k_sol_dex_decode_replay_ledger`, des DTO/entities/queries associés, des re-exports DB/lib, et intégration dans le replay local pour skipper uniquement l’étape de décodage DEX lorsqu’un passage certifié existe pour la même version logique de decoder. Les transactions multi-event ou multi-token restent marquées `unsafe` et sont redécodées sauf option future plus explicite ; le replay continue de reconstruire détection, matérialisation, trades, candles et classifications à partir des events persistés. +0.7.45 - Meteora DLMM normalisation finale : consolidation séparée de `meteora_dlmm` sur corpus dédié, maintien du wrapper Anchor `anchor_self_cpi_log` `e445a52e51cb9a1d`, enrichissement des swaps via `Swap` / `Swap2Evt`, cleanup des audits Anchor CPI swap déjà couverts, ajout des events upstream Git/IDL observés et vérifiés par corpus (`lb_pair_create_event`, `add_liquidity_event`, `remove_liquidity_event`, `claim_fee_event`, `position_create_event`, `position_close_event`, `close_position_if_empty`, `remove_liquidity_by_range2`, `add_liquidity_by_strategy2`, `add_liquidity_by_weight`), conservation des deux audits résiduels `e8abf2613a4d232d` en `instruction_audit` faute de mapping upstream Git/IDL confirmé, matérialisation locale validée avec `15` liquidity events et `6` lifecycle events sur le corpus DLMM élargi, et version logique replay `dex_decode.v0.7.45.dlmm_add_liquidity_strategies1`. Aucun nouveau `program_id` n’est déclaré vérifié sans preuve/corpus reproductible. +0.7.46 - Meteora DAMM v1 events finalisés : extension conservatoire du decoder `meteora_damm_v1` depuis upstream Git/corpus local, events create_pool/add/remove liquidity/claim_fee/create_lock_escrow/lock_liquidity, corrections Demo3 ciblées et pagination multi-source, renommage documentaire/payload vers `upstream_git_*`, sans promotion de programme vault ou trade/candle sans preuve locale. +0.7.47 - Upstream Git Registry / DEX discovery preparation : registre générique `upstream_git`, extension Demo3 aux targets multi-surfaces, premiers decoders audit-only OpenBook v2 et Phoenix v1, matrices DEX/event coverage, revue DB et invariant maintenu : aucune entrée upstream ne produit trade/candle sans decoder spécialisé et corpus local. +0.7.48 - Raydium CPMM event coverage clôturé : couverture instructions/events CPMM Carbon/Raydium/fnzero, table coverage synchronisée, `k_sol_instruction_observations`, recherche Demo3 par instruction/discriminant, matérialisation validée des swaps, lifecycle, fees, admin/config, deposit/withdraw et `lp_change_event`, `swap_event` audit-only, fallback upstream remplacé quand le decoder local couvre l’entrée. +0.7.49 - Raydium CLMM event coverage clôturé : 45 entrées listées, 33 instructions locales observées/décodées, 25 entrées matérialisées, ajout `k_sol_orderbook_events`, matérialisation des limit orders, liquidity, fees, rewards, admin/config et lifecycle prouvés par corpus, préparation audit-only des 11 Anchor Program-data events non observés, nettoyage des `raydium_clmm.instruction_audit` et `upstream_git.instruction_match` redondants, validation des invariants failed transaction / non-swap / trade-candle. +0.7.50-pre3 - Raydium Launchpad self-CPI/pool catalog correction : ajout du preset Demo3 `raydium_launchpad`, décodage direct des self-CPI Launchpad `trade_event` et `pool_create_event`, correction des indices `initialize*` (`pool_state=5`, `base_mint=6`, `quote_mint=7`) et routage des `initialize*` vers la matérialisation catalogue pool/pair Launchpad sans promotion trade/candle. +0.7.50 - Raydium Launchpad event coverage bootstrap : normalisation locale canonique vers `raydium_launchpad`, ajout de `RAYDIUM_LAUNCHPAD_PROGRAM_ID`, synchronisation des entrées Carbon Launchpad dans le registre upstream, fallback audit/mapped decoder pour discriminants Launchpad, enrichissement audit Anchor self-CPI, maintien conservatoire en `decoded_events_only`, rapport Launchpad et SQL de validation dédiés. +0.7.50-pre-r2 - Clôture CPMM/CLMM post-Launchpad : ajout des entrées Carbon `cpi_event` pour `raydium_cpmm` et `raydium_clmm`, ajout de `raydium_clmm.update_dynamic_fee_config`, normalisation des Program-data events CLMM, ajout de la table `k_sol_token_account_events` et de la matérialisation `create_support_mint_associated`, reclassement des familles ambiguës (`cpi_transport`, `liquidity_calculation`, `liquidity_change`, `position_open`, `pool_create`, `admin_config`, `account_create`, `idl_management`), codage du discriminant CPMM `40f4bc78a7e9690a` comme `raydium_cpmm.anchor_idl_instruction` decoded-only après inspection Solscan, et contexte de secours pour matérialisation liquidity CLMM via événements frères quand possible. +0.7.51 - Raydium AMM v4 event coverage clôturé : decoder maximal local pour tous les discriminants officiels AMM v4 `00..11`, spécialisation des swaps `swap_base_in/out` et `swap_base_in/out_v2`, suppression durable du `raydium_amm_v4.swap` legacy, index AMM v4 en discriminant 1 octet, matérialisation validée des swaps, liquidity, lifecycle, fees, admin/config et side effects orderbook, `pre_initialize` conservé comme lifecycle audit deprecated/partial, `simulate_info` decoded-only, reset replay renforcé par `protocol_name`, validation des invariants failed/non-swap/single-target/unexplained gaps et maintien de `raydium_pool_v4` en audit conditionnel sans decoder autonome. +0.7.52 - Raydium Stable Swap event coverage clôturé : decoder legacy 1 octet pour la surface locale `00..0d`, matérialisation lifecycle/liquidity/admin/fee/orderbook selon contexte, swaps `swap_base_in/out` matérialisés uniquement depuis deltas de vaults exacts (`stable_swap_vault_balance_delta`), conservation des bornes d’instruction comme audit-only, failed transactions decoded-only avec skip reasons, validation locale 407 tests et clippy `-D warnings` OK. +0.7.53 - Clôture PumpSwap : décodage transaction/log complet, matérialisation `buy/sell/buy_exact_quote_in` depuis sources exactes, events Anchor audit-only, tests synthétiques IDL, validation globale coverage SQL et non-régression Raydium. +0.7.54 - Clôture Pump.fun : decoder maximal local depuis IDL Solscan/upstream, décodage des 40 instructions et 23 events Anchor connus, matérialisation validée des trades `buy/sell/buy_exact_sol_in` et `trade_event` v2/exact sans double-count, non-trades launch/fee/reward/admin selon contexte, validation SQL Pump.fun propre et ouverture de `0.7.55 pump_fees`. +0.7.55 - Clôture Pump Fees : decoder local maximal `pump_fees` depuis l'IDL locale, `29` instructions et `20` events Anchor couverts, tests synthétiques des Anchor IDL non observés, matérialisation prudente fee/reward/admin/lifecycle, `get_fees` decoded-only, transactions failed audit-only, aucun trade/candle direct et SQL de validation Pump Fees propre. +0.7.56 - Clôture Meteora DBC : decoder local maximal depuis l'IDL `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN`, couverture des 28 instructions et 23 events Anchor, matérialisation validée des swaps `swap/swap2`, lifecycle, admin/config, lockers/migrations et fees/surplus/leftover, ajout du modèle `k_sol_fee_event_amounts` pour les legs de montants fee, helper générique parent fee -> legs scalaires, recovery fee `allowlisted_inner_spl_transfer` strictement allowlistée pour anciens DEX, validation croisée Pump/Raydium, 446 tests passés, clippy OK et SQL de fermeture DBC propre. +0.7.57 - Clôture Meteora DLMM : decoder local maximal `meteora_dlmm` sur `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo`, couverture des `76` instructions IDL, `30` events Anchor et `12` accounts, correction du discriminant non-IDL local `75c73e67068e1fcb` en `initialize_preset_parameter_v2`, matérialisation validée des swaps, exact-out, liquidity, bins, positions, lifecycle, fees, rewards, admin/config et limit orders, `swap_event/swap2_evt` routés en lifecycle `swap_log` sans double-count trade/candle, recovery fee/reward strictement allowlistée depuis inner SPL transfers, cleanup coverage duplicates, validation finale `460` tests passés, clippy OK et SQL de fermeture DLMM propre. diff --git a/olddocs/archivekbobobot/README.md b/olddocs/archivekbobobot/README.md new file mode 100644 index 0000000..838d5e6 --- /dev/null +++ b/olddocs/archivekbobobot/README.md @@ -0,0 +1,1027 @@ + + +# khadhroony-bobobot + + +## État final validé `0.7.57` — `meteora_dlmm` full decode / full materialization + +La tranche `0.7.57 meteora_dlmm` est clôturée côté decoder local maximal, coverage, tests synthétiques, matérialisation prudente et validation SQL sur base dédiée. Le programme traité est : + +```text +LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo +``` + +Source IDL locale prioritaire : + +```text +idls/meteora_dlmm.LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo.json +``` + +Surface couverte : `76` instructions IDL, `30` events Anchor et `12` accounts, avec correction locale du discriminant `75c73e67068e1fcb`, identifié comme `initialize_preset_parameter_v2` par les logs Anchor (`Instruction: InitializePresetParameterV2`) et par hash Anchor. Les entrées observées utiles ne restent pas en decoded-only : elles alimentent `trade`, `liquidity`, `lifecycle`, `fee`, `reward`, `admin` ou `orderbook` selon leur famille. + +Validation locale finale rapportée : + +```text +cargo test -p kb_lib -> 460 passed / 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> OK +769 replayed +0 decode skipped +769 ledger upserts +646 unsafe ledger rows +106 trades +664 liquidity +1107 lifecycle +0 tokenAccount +424 candle upserts +instructionObservations = 8062 +resetDeleted = 9898 +catalog = 169 tokens / 218 pools / 218 pairs +``` + +Règles métier verrouillées : + +- les trades/candles DLMM proviennent uniquement des instructions swap fiables : `swap`, `swap2`, `swap_exact_out`, `swap_exact_out2`, `swap_with_price_impact`, `swap_with_price_impact2` ; +- `swap_event` et `swap2_evt` sont matérialisés comme `swap_log` lifecycle afin d'éviter tout double comptage trade/candle ; +- les positions, bins, pool create, preset parameters, pair status, token badge et operator/config alimentent lifecycle/admin selon contexte ; +- les limit orders alimentent `k_sol_orderbook_events` et ne produisent jamais trade/candle ; +- les fees DLMM utilisent `k_sol_fee_events` + `k_sol_fee_event_amounts`, avec recovery strictement allowlistée depuis inner SPL transfers ; +- les rewards DLMM utilisent une recovery strictement allowlistée, sans inventer de montant pour les initialisations/configurations ; +- les transactions failed restent décodées/auditables mais ne matérialisent aucune table métier. + +Synthèse fee/reward finale observée : + +```text +claim_fee 64 parents / 64 legs +claim_fee2 63 parents / 88 legs +claim_fee_event 127 parents / 187 legs +claim_fee2_event 78 parents / 118 legs +composition_fee_event 51 parents / 63 legs +withdraw_protocol_fee 14 parents / 20 legs +zap_protocol_fee 13 parents / 13 legs +claim_reward 15 parents / 1 scalar amount +claim_reward2 19 parents / 10 scalar amounts +claim_reward_event 34 parents / 25 scalar amounts +claim_reward2_event 19 parents / 10 scalar amounts +fund_reward 10 parents / 10 scalar amounts +fund_reward_event 10 parents / 10 scalar amounts +initialize_reward 9 parents / 0 amount, attendu car init/config +initialize_reward_event 9 parents / 0 amount, attendu car init/config +``` + +Checks de fermeture `0.7.57` : + +- fallback `upstream_git` `meteora_dlmm` pour entrées couvertes localement : vide ; +- `instruction_audit` observé : `0` ; +- decoded `meteora_dlmm` sans coverage : vide ; +- successful non-materialized sans `skip*Reason` ou policy explicite : vide ; +- failed transaction avec business materialization : vide ; +- multi-target materialization : vide ; +- non-swap vers trade/candle : vide ; +- parent fee scalaire sans leg : vide ; +- fee amount legs orphelins : vide ; +- limit/orderbook vers trade/candle : vide ; +- duplicate logical coverage rows : vide. + +Écart coverage restant et expliqué : `close_bin_array` affiche `16 observed / 14 materialized`, car `14` transactions sont OK et matérialisées, tandis que `2` transactions failed (`Custom 6015`) restent audit-only. + +Documents de référence : + +```text +docs/reports/METEORA_DLMM_EVENT_COVERAGE_REPORT.md +docs/reports/SQLITE_DB_TRANSACTION_MERGER_0_7_58.md +docs/VALIDATION_STATUS_0_7_57_FINAL.md +validation_sql/SQL_VALIDATION_METEORA_DLMM_0_7_57.sql +validation_sql/SQL_VALIDATION_DB_MERGE_0_7_58.sql +validation_sql/SQL_VALIDATION_CROSS_DEX_REGRESSION_0_7_58.sql +docs/prompts/PROMPT_0_7_58_SQLITE_DB_TRANSACTION_MERGER_BINARY.md +docs/prompts/PROMPT_0_7_59_DEMO4_PROGRAM_SURFACE_DISCOVERY.md +docs/prompts/PROMPT_0_7_60_METEORA_DAMM_NEXT_DEX.md +``` + +Tranche `0.7.58 sqlite_db_transaction_merger` préparée : package `kb_tools`, binaire `kb_db_merge`, tables de provenance/conflits et SQL de validation pour construire `final.db`/`final.next.db` puis lancer des replays anti-régression cross-DEX Pump/Raydium/Meteora. `demo4 / program surface discovery` est déplacé en `0.7.59` et exploitera cette base consolidée sans matérialisation automatique ni promotion automatique. + + + +## État final validé `0.7.56` — `meteora_dbc` + socle `fee_event_amounts` + +La tranche `0.7.56 meteora_dbc` est clôturée côté decoder local maximal, coverage, tests synthétiques, matérialisation prudente et validation SQL sur base dédiée. Le programme traité est : + +```text +dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN +``` + +Source IDL locale prioritaire : + +```text +idls/meteora_dbc.dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN.json +``` + +Surface couverte : `28` instructions, `23` events Anchor, `9` accounts et `59` types. Les instructions `swap` et `swap2` sont les seules candidates trade/candle directes, uniquement lorsque les montants et les mints base/quote sont fiables. Les initialisations de virtual pool, migrations, lockers, metadata/config/operator et transferts de créateur alimentent les tables non-trade adaptées ou restent decoded-only avec raison explicite. Les transactions failed restent audit-only. + +Validation locale finale rapportée : + +```text +cargo test -p kb_lib -> 446 passed / 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> OK +480 replayed +0 decode skipped +480 ledger upserts +454 unsafe ledger rows +264 trades +1 liquidity +122 lifecycle +0 tokenAccount +1056 candle upserts +instructionObservations = 7167 +resetDeleted = 3583 +catalog = 86 tokens / 60 pools / 60 pairs +``` + +Matérialisation DBC finale observée : + +```text +claim_creator_trading_fee 8 parents / 8 scalar / 8 legs +claim_partner_pool_creation_fee 10 parents / 10 scalar / 10 legs +claim_protocol_fee 10 parents / 10 scalar / 10 legs +claim_protocol_pool_creation_fee 10 parents / 10 scalar / 10 legs +claim_trading_fee 11 parents / 6 scalar / 18 legs +creator_withdraw_surplus 2 parents / 2 scalar / 2 legs +partner_withdraw_surplus 9 parents / 9 scalar / 9 legs +withdraw_leftover 10 parents / 10 scalar / 10 legs +withdraw_migration_fee 9 parents / 9 scalar / 9 legs +zap_protocol_fee 10 parents / 10 scalar / 10 legs +Total meteora_dbc 89 fee parents / 96 amount legs +``` + +La tranche introduit le socle générique `k_sol_fee_event_amounts` : + +- `k_sol_fee_events` reste l'événement fee parent ; +- `k_sol_fee_event_amounts` stocke les legs de montants, avec `fee_event_id`, `leg_index`, `token_mint`, `amount_raw`, comptes source/destination et `amount_source` ; +- tout parent fee avec `fee_token_mint + fee_amount_raw` crée automatiquement un leg scalaire ; +- les fees multi-mint/multi-leg laissent le parent sans montant scalaire et stockent les montants fiables dans les legs ; +- une recovery `allowlisted_inner_spl_transfer` existe pour les anciens DEX validés, mais aucun futur décodeur ne l'hérite par défaut ; +- tout futur décodeur doit déclarer explicitement sa policy de récupération des montants fee. + +Checks de fermeture `0.7.56` : + +- fallback `upstream_git` `meteora_dbc` pour entrées couvertes localement : vide ; +- decoded `meteora_dbc` sans coverage : vide ; +- successful non-materialized sans `skip*Reason` ou policy explicite : vide ; +- failed transaction avec business materialization : vide ; +- multi-target materialization : vide ; +- non-swap vers trade/candle : vide ; +- parent fee avec `fee_token_mint + fee_amount_raw` mais sans `k_sol_fee_event_amounts` : vide ; +- legs fee orphelins : vide ; +- recovery générique `allowlisted_inner_spl_transfer` non appliquée à `meteora_dbc`, qui reste couvert par ses chemins spécifiques. + +Contrôles croisés réalisés sur anciennes bases : `raydium_launchpad`, `raydium_cpmm`, `pump_swap`, `pump_fees`, `pump_fun`, `raydium_amm_v4`, `raydium_clmm`, `raydium_stable_swap`. Les parents fees scalaires ont des legs ; les events sans transfert exploitable restent documentés par `fee_instruction_has_no_actual_transfer` ou `fee_instruction_has_only_zero_amount_transfers`. + +Documents de référence : + +```text +docs/reports/METEORA_DBC_EVENT_COVERAGE_REPORT.md +docs/reports/FEE_EVENT_AMOUNTS_MODEL_NOTE_0_7_56.md +docs/VALIDATION_STATUS_0_7_56_FINAL.md +validation_sql/SQL_VALIDATION_METEORA_DBC_0_7_56.sql +docs/prompts/PROMPT_0_7_57_METEORA_DLMM_FULL_DECODE_MATERIALIZATION.md +``` + +La tranche `0.7.57 meteora_dlmm` est clôturée. La tranche `0.7.58 sqlite_db_transaction_merger` ajoute le socle CLI/documentaire pour construire `final.db`/`final.next.db` par merge de bases dédiées et rejouer la base consolidée afin de détecter les régressions cross-DEX. `0.7.59` est réservé à `demo4 / program surface discovery`. + +## État final validé `0.7.55` — `pump_fees` + +La tranche `0.7.55 pump_fees` est clôturée côté decoder local maximal, coverage, tests synthétiques, matérialisation prudente et validation SQL. Le programme `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` est traité comme surface fee/config/accounting : `get_fees` reste decoded-only, les claims social fee alimentent `k_sol_reward_events`, les donation/buyback alimentent `k_sol_fee_events`, les authority/config/tier/update alimentent `k_sol_pool_admin_events`, les créations/init/extend alimentent `k_sol_pool_lifecycle_events`, et aucun trade/candle direct n'est produit. + +Source IDL locale prioritaire : + +```text +idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json +``` + +Surface couverte : `29` instructions, `20` events Anchor, `9` accounts et `34` types. Les discriminators Solscan hors IDL locale `revoke_fee_sharing_authority_event` (`7217653c0ebe993e`) et `transfer_fee_sharing_authority_event` (`7c8fc6f54db808ec`) restent conservés en coverage comme surfaces futures `upstream_git_mapped_unverified`. + +Validation locale finale rapportée : + +```text +cargo test -p kb_lib -> 431 passed / 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> OK +127 replayed +0 decode skipped +150 ledger upserts +125 unsafe ledger rows +4 trades +0 liquidity +115 lifecycle +0 tokenAccount +16 candle upserts +instructionObservations = 2234 +resetDeleted = 1644 +catalog = 11 tokens / 10 pools / 10 pairs +``` + +Checks de fermeture Pump Fees : + +- fallback `upstream_git` `pump_fees` : vide ; +- `instruction_name` `pump_fees` vide : vide ; +- `event_family = unknown` ou vide pour instruction/event : vide ; +- decoded `pump_fees` sans coverage : vide ; +- fallback résiduel pour entrées couvertes localement : vide ; +- successful non-materialized sans skip/policy : vide ; +- failed transaction avec business materialization : vide ; +- multi-target materialization : vide ; +- anti-trade/candle direct `pump_fees` : vide ; +- watchlist globale : plus aucun `pump_fees`, reste seulement `jupiter_swap.route_v2` observé ponctuellement. + +Le SQL de validation propre et exécutable reste `validation_sql/SQL_VALIDATION_PUMP_FEES_0_7_55.sql`. + +## État final validé `0.7.54` — `pump_fun` + +La tranche `0.7.54 pump_fun` est clôturée côté coverage, décodage local maximal, matérialisation métier prudente et validation SQL. Elle ferme la surface Pump.fun principale avant l'ouverture de `0.7.55 pump_fees`. + +Program id canonique : + +```text +6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P +``` + +Source IDL locale prioritaire : + +```text +idls/pump_fun.6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P.json +``` + +Points verrouillés : + +- les `40` instructions et `23` events Anchor connus par l'IDL locale sont inventoriés et couverts localement ; +- les instructions IDL-only absentes du registre upstream initial sont intégrées côté coverage, notamment `buy_v2`, `sell_v2`, `buy_exact_quote_in_v2`, `migrate_v2`, `claim_cashback_v2`, `collect_creator_fee_v2`, `distribute_creator_fees_v2` et `update_buyback_config` ; +- `pump_fun.buy` et `pump_fun.sell` restent matérialisés directement comme trades quand les montants sont fiables ; +- `pump_fun.buy_exact_sol_in` est matérialisé directement, y compris pour les logs `Program data` Anchor tronqués quand les montants exacts sont extractibles ; +- `pump_fun.buy_v2`, `pump_fun.sell_v2` et `pump_fun.buy_exact_quote_in_v2` restent des instructions audit/coverage/routing : elles ne sont pas matérialisées directement ; +- la matérialisation canonique des trades v2/exact passe par `pump_fun.trade_event` quand l'event Anchor porte les montants exécutés et se corrèle sans ambiguïté à l'instruction ; +- les `trade_event` couverts par un trade direct reçoivent un skip explicite afin d'éviter le double-count ; +- les familles non-trade alimentent uniquement les tables prévues (`launch`, `fee`, `reward`, `admin`, `lifecycle`) ou restent decoded-only/audit-only avec raison explicite ; +- les transactions failed restent décodables pour audit mais ne produisent aucun business event. + +Validation locale finale rapportée après replay forcé : + +```text +1679 replayed +0 decode skipped +1679 ledger upserts +145 unsafe ledger rows +89 trades +0 liquidity +10 lifecycle +0 tokenAccount +348 candle upserts +instructionObservations = 13905 +resetDeleted = 1112 +catalog = 52 tokens / 50 pools / 50 pairs +``` + +Matérialisation Pump.fun finale observée : + +```text +pump_fun.buy 17 trades +pump_fun.sell 25 trades +pump_fun.buy_exact_sol_in 15 trades +pump_fun.trade_event 25 trades +``` + +Checks de fermeture : + +- fallback `upstream_git` Pump.fun : vide ; +- decoded Pump.fun sans coverage : vide ; +- fallback upstream résiduel pour entrées couvertes : vide ; +- successful non-materialized sans skip reason : vide ; +- failed transaction avec business materialization : vide ; +- multi-target materialization : vide ; +- trade candidates Pump.fun sans matérialisation ni skip : vide ; +- watchlist globale : plus aucun `pump_fun` ; la surface suivante `pump_fees` a été traitée en `0.7.55`. + + +## État final validé `0.7.53` — `pump_swap` + +La tranche `0.7.53 pump_swap` est clôturée côté décodage transaction/log et matérialisation métier. Elle ferme le program id unique `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA` sans rouvrir Raydium. + +Points verrouillés : + +- `pump_swap.buy` et `pump_swap.sell` restent matérialisés uniquement depuis montants exacts transaction/vault/balance-delta ; +- `pump_swap.buy_exact_quote_in` est matérialisable seulement lorsqu'un `BuyEvent` Anchor exact est présent (`amountSource=pump_swap_anchor_buy_event`) ; les cas `instruction_bounds_only` restent decoded-only avec raison explicite ; +- les events Anchor `*_event` sont décodés comme events autonomes audit-only, sauf exception explicitement matérialisable (`claim_token_incentives_event` si un corpus réussi apparaît) ; +- les transactions failed restent traçables mais non actionnables ; +- les non-trades PumpSwap alimentent uniquement les tables métier prévues (`liquidity`, `lifecycle`, `fee`, `reward`, `admin`) et ne créent jamais de trade/candle ; +- les tests synthétiques verrouillent les instructions/events IDL non observés dans le corpus local ; +- la surveillance globale distingue maintenant les vrais gaps locaux, le backlog `upstream_git` et les observations non attribuées. + +Validation locale finale rapportée : + +```text +cargo test -p kb_lib -> 421 passed / 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> OK +``` + +Dernier replay élargi rapporté après backfill pool : + +```text +1189 replayed +0 decode skipped +1189 ledger upserts +967 unsafe ledger rows +928 trades +13 liquidity +8 lifecycle +0 tokenAccount +3700 candle upserts +instructionObservations = 25724 +resetDeleted = 5622 +catalog = 76 tokens / 80 pools / 80 pairs +``` + +Checks de fermeture : + +- `pump_swap` decoded without coverage : vide ; +- fallback `upstream_git` PumpSwap couvert localement : vide ; +- successful trade candidates PumpSwap sans trade et sans raison explicite : vide ; +- failed transaction avec business trade : vide ; +- non-swap matérialisé en trade : vide ; +- multi-target materialization : vide ; +- Raydium AMM v4 / CLMM / CPMM targeted observation gaps : vide après normalisation. + +Livrables `0.7.53` : + +- `docs/reports/PUMP_SWAP_EVENT_COVERAGE_REPORT.md` ; +- `docs/reports/DEX_COVERAGE_GLOBAL_WATCHLIST_0_7_53.md` ; +- `validation_sql/SQL_VALIDATION_PUMP_SWAP_0_7_53.sql` ; +- `validation_sql/SQL_VALIDATION_DEX_COVERAGE_GLOBAL_0_7_53.sql` ; +- `idls/` comme corpus local d'IDL Solscan à comparer aux sources Git. + +La suite immédiate après `0.7.54 pump_fun` est `pump_fees` (`0.7.55`). Les petits gaps Meteora restent volontairement reportés aux tranches Meteora futures. + + +## État final validé `0.7.51` — `raydium_amm_v4` + +La tranche `0.7.51 raydium_amm_v4` est clôturable côté `kb_lib` après validation locale du decoder maximal AMM v4. + +Points verrouillés : + +- `raydium_amm_v4` est le code canonique local ; +- program id canonique : `675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8` ; +- tous les discriminants officiels AMM v4 `00..11` sont reconnus et observés localement ; +- les swaps sont spécialisés par discriminant : `swap_base_in`, `swap_base_out`, `swap_base_in_v2`, `swap_base_out_v2` ; +- le `event_kind` legacy `raydium_amm_v4.swap` est interdit et doit rester absent ; +- les discriminants AMM v4 sont indexés sur 1 octet, jamais comme discriminants Anchor 8 octets ; +- `pre_initialize` est conservé pour les scans historiques et matérialisé comme lifecycle audit minimal, sans création de pair exploitable ; +- `simulate_info` reste `decoded_events_only` ; +- `monitor_step`, `migrate_to_open_book` et `admin_cancel_orders` sont des side effects orderbook AMM v4 ; +- `raydium_pool_v4` reste une source d'audit/comparaison et ne devient pas un decoder autonome sans program id + corpus local. + +Validation locale finale rapportée : + +```text +cargo test -p kb_lib -> 405 passed / 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> OK +``` + +Dernier replay local : + +```text +195 replayed +0 decode skipped +195 ledger upserts +70 unsafe ledger rows +168 trades +7 liquidity +15 lifecycle +0 tokenAccount +668 candle upserts +instructionObservations = 2599 +resetDeleted = 1578 +catalog = 61 tokens / 65 pools / 65 pairs +``` + +Livrables `0.7.51` : + +- `docs/reports/RAYDIUM_AMM_V4_EVENT_COVERAGE_REPORT.md` ; +- `docs/reports/RAYDIUM_POOL_V4_DECISION_NOTE.md` ; +- `validation_sql/SQL_VALIDATION_RAYDIUM_AMM_V4_0_7_51.sql` ; +- `docs/VALIDATION_STATUS_0_7_51_FINAL.md`. + + +`khadhroony-bobobot` est un workspace Rust destiné à la détection, au décodage, à l’analyse et, à terme, au trading semi-automatisé de tokens Solana. + +Ce document reflète le point de reprise `0.7.43-E5C` et l’état de consolidation atteint après `0.7.45` pour `meteora_dlmm`. La version Cargo a évolué ensuite à `0.7.46` côté workspace. Le lot Meteora initialement ouvert en bloc a été redécoupé : `meteora_dlmm` est traité séparément, puis la suite reprend `meteora_damm_v1`, `meteora_damm_v2` et `meteora_dbc` un par un. + + +## État courant finalisé `0.7.49` + +La branche de travail `0.7.49` clôture la tranche `raydium_clmm` après la clôture fonctionnelle de `0.7.48 raydium_cpmm`. Le code Rust de `kb_lib` est considéré finalisé pour cette tranche, sous réserve des validations locales habituelles (`cargo fmt`, `cargo test -p kb_lib`, `cargo clippy -p kb_lib --all-targets -- -D warnings`). + +État CLMM validé sur corpus local après replay forcé : + +```text +listed_entry_count = 45 +decoded_entry_count = 33 +observed_entry_count = 33 +materialized_entry_count = 25 +total_observed_count = 2560 +total_materialized_count = 1367 +trade_count = 1186 +raydium_clmm.instruction_audit résiduel = 0 +upstream_git.instruction_match localement couvert = 0 +failed tx matérialisées = 0 +non-swap CLMM avec trade_count > 0 = 0 +``` + +Les 11 Anchor / `Program data` events CLMM restent listés en `upstream_git_unverified` car aucun corpus local ne les observe encore. Le code est préparé pour les accueillir en audit-only lorsqu’ils apparaîtront dans un corpus local, sans créer de trade/candle par défaut. + +Les tranches `0.7.51 raydium_amm_v4` et `0.7.52 raydium_stable_swap` sont maintenant validées côté `kb_lib`. La suite de roadmap reprend avec les rechecks conditionnels et les surfaces restantes, tandis que `raydium_pool_v4` reste un audit conditionnel ultérieur et ne doit pas être promu sans confirmation de program id/rôle/corpus. + +## Organisation documentaire + +La racine conserve uniquement les documents de pilotage principaux : + +- `README.md` ; +- `ROADMAP.md` ; +- `CHANGELOG.md`. + +Les documents spécialisés sont rangés dans : + +- `docs/` pour les matrices et revues de modèle ; +- `docs/reports/` pour les rapports de couverture DEX/version ; +- `docs/prompts/` pour les prompts de reprise ; +- `validation_sql/` pour les scripts SQL de validation. + +Voir aussi : + +- `docs/DEX_DECODER_MATRIX.md` pour la matrice DEX détaillée ; +- `docs/DEX_EVENT_COVERAGE_MATRIX.md` pour la matrice de familles d’events ; +- `docs/DB_EVENT_MODEL_REVIEW.md` pour la revue du modèle DB ; +- `docs/reports/RAYDIUM_CPMM_EVENT_COVERAGE_REPORT.md` et `validation_sql/SQL_VALIDATION_RAYDIUM_CPMM_0_7_48.sql` pour la clôture CPMM ; +- `docs/reports/RAYDIUM_CLMM_EVENT_COVERAGE_REPORT.md` et `validation_sql/SQL_VALIDATION_RAYDIUM_CLMM_0_7_49.sql` pour la clôture CLMM ; +- `docs/prompts/PROMPT_REPRISE_khadhroony-bobobot_0.7.50-raydium-launchpad.md` pour reprendre en `0.7.50`. + +## Sources upstream Git / IDL à utiliser en `0.7.47+` + +Les sources externes ci-dessous sont des **indices de décodage**, pas des preuves métier. Elles servent à extraire des `program_id`, discriminants, IDL, layouts et noms d’instructions/events, mais toute promotion locale doit rester conditionnée à : + +1. observation Demo3 ; +2. backfill Demo2 ; +3. replay local sur la base de travail ; +4. requêtes SQL de validation ; +5. invariants : aucun faux trade, aucune fausse candle, aucun `program_id` promu sans corpus. + +Sources prioritaires : + +| Source | Usage attendu | +|---|---| +| `idls/` | Corpus local d’IDL téléchargés depuis Solscan ; source de savoir locale à comparer aux sources Git avant promotion métier. | +| `https://github.com/sevenlabs-hq/carbon/tree/main/decoders` | Source principale de discriminants, instructions et events multi-protocoles. | +| `https://github.com/0xfnzero/solana-streamer` | Source complémentaire pour PumpFun, PumpSwap, Bonk et Raydium CPMM. | +| `https://github.com/0xfnzero/sol-parser-sdk/tree/main/idls` | IDL complémentaires pour programmes Solana supportés par parser SDK. | +| `https://github.com/pinax-network/substreams-solana-idls/tree/main/src` | IDL et layouts additionnels à comparer au registre local. | +| `https://github.com/hodlwarden/solana-tx-parser/tree/main/src` | Décodage transactionnel complémentaire et conventions de mapping. | +| `https://github.com/openbook-dex/openbook-v2` | Source officielle OpenBook v2 : programme, IDL et logs. | +| `https://github.com/all-in-one-blockchain/phoenix-onchain-mm` | Source Phoenix/MM complémentaire pour corpus et intégration. | +| `https://docs.vybenetwork.com/docs/available-dexs-amms` | Source de découverte de DEX/AMM supportés par Vybe, à traiter comme index externe non vérifié localement. | + + +## 1. Objectif + +L’objectif opérationnel est de construire progressivement une application capable de : + +- détecter l’apparition de nouveaux tokens, pools, paires et listings sur Solana ; +- identifier en priorité les DEX effectifs sur lesquels les swaps, liquidités et événements de marché sont réellement exécutés ; +- décoder les transactions pertinentes des DEX ciblés, puis seulement ensuite les launch surfaces et origines de mint/lancement ; +- séparer strictement les swaps/candles des événements utiles seulement à l’analyse : liquidité, cycle de vie de pool, fees, rewards, administration, wallet activity, mint/burn, migration ; +- produire des métriques exploitables : prix, volume, candles/OHLCV, activité, bursts, déséquilibres buy/sell, signaux analytiques ; +- préparer ensuite des règles déterministes de filtrage, d’achat, de vente, de stop-loss et de trailing stop ; +- conserver une traçabilité locale suffisante pour rejouer, diagnostiquer et améliorer les décodeurs sans retraiter inutilement toute la base. + +Le but court terme n’est pas encore le live trading. Le but court terme est de fiabiliser le décodage multi-DEX, la matérialisation des objets métier nécessaires au trading et le mécanisme de replay incrémental. + +## 2. Workspace + +Le workspace contient deux crates principales. + +| Crate | Rôle | +|---|---| +| `kb_lib` | Bibliothèque métier : configuration, tracing, clients réseau, pool HTTP, manager WS, résolution transactionnelle, décodage DEX, détection métier, persistance SQLite, backfill, metadata, candles, signaux analytiques, validation et diagnostics. | +| `kb_demo_app` | Application Tauri V2 de démonstration et d’inspection : fenêtres `Demo Ws`, `Demo Ws Manager`, `Demo Http`, `Demo Pipeline`, `Demo Pipeline 2`, `Demo3`, graphiques candles et commandes de backfill/replay. | + +La logique métier doit rester dans `kb_lib`. `kb_demo_app` doit rester une façade UI/Tauri utilisée pour inspecter, backfiller et constituer du corpus on-chain ; elle ne doit pas récupérer de logique DEX profonde. + +## 3. État actuel au point de reprise `0.7.43-E5C` + +### 3.1. Socle stabilisé à ne pas refactorer maintenant + +Ces éléments fonctionnent et ne sont pas bloquants pour les DEX. Ils ne doivent pas être remaniés dans la phase immédiate : + +- `ws_client.rs` ; +- `ws_manager.rs` ; +- `http_client.rs` ; +- `http_pool.rs` ; +- couches JSON-RPC WS/HTTP déjà stabilisées ; +- orchestration réseau utilisée par les fenêtres de démonstration. + +Ils pourront être améliorés plus tard, mais la priorité actuelle est le décodage DEX, les événements métier, les tables d’analyse et le replay incrémental. + +### 3.2. Pipeline métier existant + +Le pipeline `0.7.x` couvre déjà les étapes suivantes : + +1. réception d’observations via RPC WS ou backfill HTTP ; +2. résolution des transactions via HTTP RPC ; +3. projection transactionnelle normalisée en base ; +4. décodage DEX dans `k_sol_dex_decoded_events` ; +5. détection métier vers tokens, pools, paires, listings, origins et wallets observés ; +6. matérialisation des trades exploitables ; +7. matérialisation partielle des événements non-trade prouvés ; +8. agrégation pair metrics ; +9. génération candles/OHLCV ; +10. signaux analytiques simples ; +11. inspection via l’application de démonstration. + +### 3.3. Résultat local observé avant normalisation + +Un corpus local de reprise contient notamment : + +| Indicateur | Valeur observée | +|---|---:| +| transactions chain | `2956` | +| decoded events | `7159` | +| trade events | `2738` | +| liquidity events | `0` | +| pool lifecycle events | `1` | +| fee events | `0` | +| reward events | `0` | +| admin events | `0` | + +Cette distribution montre que les swaps sont déjà fortement présents, mais que la matérialisation non-trade n’est pas encore homogène sur le corpus courant. Les nombreux `instruction_audit`, surtout côté Meteora, doivent devenir un axe de travail DEX par DEX. + +### 3.4. Connecteurs validés ou observés via l’application de démo + +Les surfaces suivantes existent dans le code, dans la matrice ou dans le corpus local. Leur niveau de preuve doit rester explicite. + +| Code | Statut de travail | Commentaire | +|---|---|---| +| `pump_fun` | launch surface | Surface de launch / mint initial. À traiter après les DEX effectifs sauf besoin de migration. | +| `pump_swap` | DEX effectif | Swaps `buy` / `sell` observés. Non-trade à étendre plus tard. | +| `raydium_cpmm` | DEX effectif consolidé partiellement | Swaps et premiers events non-trade prouvés sur corpus antérieur. | +| `raydium_clmm` | DEX effectif consolidé partiellement | Swaps v2/legacy, positions et liquidity events prouvés sur corpus antérieur. | +| `raydium_amm_v4` | DEX effectif legacy | Swaps AMM v4 legacy matérialisés ; non-swaps legacy conservés en audit tant que le corpus ne permet pas une promotion fiable. | +| `meteora_dlmm` | DEX effectif consolidé en `0.7.45` | Swaps, Anchor CPI swap events, liquidity, positions, fees et lifecycle principaux validés par corpus local ; deux Anchor CPI audits résiduels `e8abf2613a4d232d` restent volontairement non mappés. | +| `meteora_damm_v1` | DEX effectif en consolidation `0.7.46` | Swaps présents ; decoder étendu aux create_pool, liquidity, claim_fee et lock events DAMM v1 mappés upstream Git/corpus local. Validation DB à rejouer sur base dédiée. | +| `meteora_damm_v2` | DEX effectif à reprendre séparément | Swaps et create_pool observés ; nombreux audits à traiter. | +| `meteora_dbc` | launch/bonding + DEX effectif partiel à reprendre séparément | Gros volume d’audits ; séparer bonding/launch, swap effectif et migration. | +| `orca_whirlpools` | DEX effectif à vérifier | À revalider par corpus dédié avant promotion. | +| `fluxbeam` | DEX effectif à vérifier | Program id, corpus et events à vérifier. | +| `dexlab` | DEX effectif à vérifier | Program id, corpus et events à vérifier. | +| `metaDAO` | candidat à vérifier | Aucun `program_id` ne doit être déclaré vérifié sans preuve/corpus. | +| `printr` | candidat à vérifier | Aucun `program_id` ne doit être déclaré vérifié sans preuve/corpus. | + +### 3.5. Statuts de preuve obligatoires + +Aucun `program_id`, DEX ou event ne doit être documenté comme vérifié sans preuve reproductible. + +| Statut | Sens | +|---|---| +| `known` | Connu/listé dans le code, une doc, une source externe ou la matrice. | +| `observed` | Vu dans une transaction, une instruction, une base locale ou un corpus on-chain. | +| `decoded` | Un decoder produit un event structuré ou un `instruction_audit` classé. | +| `materialized` | L’event alimente une table métier dédiée : trade, liquidity, lifecycle, fee, reward, admin, mint/burn, etc. | +| `verified_by_corpus` | Validé par requêtes SQL, signatures/corpus reproductibles et invariants de validation. | + +### 3.6. État validé de `meteora_dlmm` en `0.7.45` + +La tranche `0.7.45` clôt la normalisation séparée de `meteora_dlmm` sur le corpus DLMM élargi constitué via `Demo3`, backfill par signatures anciennes et backfill par pool address. + +Éléments validés : + +| Famille | Events DLMM couverts | +|---|---| +| Swaps | `swap`, `swap2`, `swap_exact_out` lorsque présents, avec enrichissement `anchorSwapEvent` pour `Swap` / `Swap2Evt`. | +| Création / lifecycle | `create_pool`, `lb_pair_create_event`, `initialize_bin_array`, `initialize_position`. | +| Positions | `position_create_event`, `position_close_event`, `close_position_if_empty`. | +| Liquidité | `add_liquidity_event`, `add_liquidity_by_strategy2`, `add_liquidity_by_weight`, `remove_liquidity_event`, `remove_liquidity`, `remove_liquidity_by_range2`. | +| Fees | `claim_fee_event`, `claim_fee2`. | +| Rewards | Décodeurs Anchor CPI présents pour `claim_reward_event` / `fund_reward_event`, mais non observés dans le corpus final `0.7.45`. | + +Validation locale finale sur la base DLMM dédiée : + +| Indicateur | Valeur observée | +|---|---:| +| transactions rejouées | `3027` | +| trades matérialisés | `530` | +| liquidity events matérialisés | `15` | +| lifecycle events matérialisés | `6` | +| candles upsert | `2120` | +| audits DLMM résiduels | `2` | + +Les deux audits restants sont `e445a52e51cb9a1d + e8abf2613a4d232d`. Ils restent en `meteora_dlmm.instruction_audit`, car aucun mapping upstream Git/IDL suffisamment fiable n’a été confirmé. Ils ne bloquent pas la clôture de `0.7.45`. + +### 3.7. État de travail de `meteora_damm_v1` en `0.7.46` + +La tranche `0.7.46` étend `meteora_damm_v1` à partir du mapping upstream Git decoder source `meteora-pools-decoder` et des discriminants observés dans le corpus local. Les events ajoutés couvrent `create_pool`, `add_liquidity`, `remove_liquidity`, `claim_fee`, `create_lock_escrow` et `lock_liquidity`. + +La version logique du replay local devient `dex_decode.v0.7.46.damm_v1_events1`, ce qui force le redécodage des transactions certifiées sous la version `0.7.45` pour vérifier les nouveaux events DAMM v1. + +Meteora Vault est traité prudemment : le programme associé peut apparaître comme compte dans les instructions DAMM v1, mais aucun decoder `meteora_vault` ni statut `verified_by_corpus` n’est ajouté sans corpus direct séparé. + +Demo3 dispose ensuite d’une correction ciblée pour la découverte `meteora_damm_v1` : les discriminants DAMM v1 connus sont classés directement côté recherche on-chain, le filtrage `target_event` est strict sur les surfaces explicites, et les transactions mixtes ne sont plus éliminées globalement quand une cible précise est demandée. Cela sert à alimenter les backfills par signature ou par pool dans Demo Pipeline 2 sans déplacer de logique métier profonde dans `kb_demo_app`. + + +## 4. Matrice DEX : priorité révisée + +À partir du point de reprise `0.7.43-E5C`, la priorité est : + +1. **DEX effectifs actuels** : programmes où les swaps, pools, liquidités, positions, fees, rewards, admin/config, burns/mints ou migrations sont réellement exécutés ; +2. **launch surfaces** : surfaces de mint, bonding, launchpad, migration ou origine ; +3. **DEX historiques / legacy / faibles priorités** : programmes anciens, peu observés, ou uniquement utiles à la compatibilité/replay historique. + +Chaque DEX ou variante de DEX doit avoir sa propre étape de validation. Les familles larges restent utiles pour la navigation, mais le travail de décodage doit être fait par version/protocole : `raydium_cpmm`, `raydium_clmm`, `raydium_amm_v4`, `meteora_dlmm`, `meteora_damm_v1`, `meteora_damm_v2`, `meteora_dbc`, etc. + +### 4.1. Ordre de travail DEX effectifs + +| Priorité | Code cible | Rôle | Action prochaine | +|---:|---|---|---| +| 1 | `pump_swap` | AMM / swap | Maintenir les invariants swaps et chercher les non-trade prouvés. | +| 2 | `raydium_cpmm` | AMM | Garder consolidé ; ne rouvrir que sur nouveaux discriminators/corpus. | +| 3 | `raydium_clmm` | CLMM | Garder consolidé ; ne rouvrir que sur nouveaux discriminators/corpus. | +| 4 | `raydium_amm_v4` | AMM legacy actif | Garder swaps ; ne promouvoir les non-swaps qu’avec corpus. | +| 5 | `meteora_dlmm` | DLMM | Reprendre séparément : swaps, liquidity, positions, lifecycle, fees/rewards/admin. | +| 6 | `meteora_damm_v1` | AMM | Reprendre séparément : swaps exploitables, pools, liquidity, fees/admin. | +| 7 | `meteora_damm_v2` | AMM | Reprendre séparément : create_pool, swaps exploitables, configs dynamiques, non-trade. | +| 8 | `meteora_dbc` | bonding / DEX effectif partiel | Reprendre séparément : swap effectif, bonding curve, migration, launch attribution. | +| 9 | `orca_whirlpools` | CLMM | Revalider par corpus dédié. | +| 10 | `fluxbeam` | AMM | Vérifier program id, events et corpus. | +| 11 | `dexlab` | AMM | Vérifier program id, events et corpus. | +| 12 | `metaDAO` | candidat DEX | Vérifier par corpus avant toute promotion. | +| 13 | `printr` | candidat DEX | Vérifier par corpus avant toute promotion. | + +### 4.2. Launch surfaces reportées + +À reprendre après les DEX effectifs, sauf si une surface est indispensable pour comprendre une migration vers un pool tradable : + +- `pump_fun` ; +- `raydium_launchpad` ; +- `letsbonk` / `bonk_fun` ; +- `bags` ; +- `moonshot` ; +- `moonit` ; +- `boop_fun` ; +- `believe` ; +- `heaven` ; +- autres launch origins découvertes par corpus. + +### 4.3. DEX historiques ou faibles priorités + +À garder dans la matrice mais sans bloquer les versions immédiates : + +- `raydium_stable_swap` est désormais démontré par corpus local en `0.7.52` ; le garder comme DEX effectif supporté, avec surveillance des nouveaux discriminants ; +- vieux programmes legacy uniquement utiles pour compatibilité ou replay historique ; +- agrégateurs/routeurs comme `okx_dex` tant qu’ils ne correspondent pas à un DEX direct matérialisable ; +- entrées ambiguës comme `zora` tant qu’aucun programme Solana pertinent n’est prouvé. + +## 5. Base de données et replay incrémental + +SQLite reste le stockage local initial. Le fichier `config.json` peut pointer vers une base différente pour travailler par corpus, par DEX ou sur base vierge. Le schéma est créé au lancement via les `CREATE TABLE IF NOT EXISTS` existants. + +Organisation actuelle à conserver : + +- `kb_lib/src/db/schema.rs` crée les tables et index ; +- chaque table/index est créée dans une fonction dédiée ; +- les requêtes sont sous `kb_lib/src/db/queries/` ; +- les entités persistées sont sous `kb_lib/src/db/entities/` ; +- les DTO applicatifs sont sous `kb_lib/src/db/dtos/`. + +### 5.1. Tables existantes importantes + +Le modèle actuel contient déjà notamment : + +- `k_sol_chain_transactions` ; +- `k_sol_chain_instructions` ; +- `k_sol_dexes` ; +- `k_sol_dex_decoded_events` ; +- `k_sol_tokens` ; +- `k_sol_pools` ; +- `k_sol_pairs` ; +- `k_sol_pool_tokens` ; +- `k_sol_trade_events` ; +- `k_sol_liquidity_events` ; +- `k_sol_pool_lifecycle_events` ; +- `k_sol_fee_events` ; +- `k_sol_reward_events` ; +- `k_sol_pool_admin_events` ; +- `k_sol_token_mint_events` ; +- `k_sol_token_burn_events` ; +- `k_sol_transaction_classifications` ; +- `k_sol_protocol_candidates`. + +### 5.2. Ledger de décodage/replay implémenté en `0.7.44` + +Le replay local dispose maintenant de la table `k_sol_dex_decode_replay_ledger`. Elle permet de ne pas relancer l’étape `DexDecodeService` lorsqu’une transaction a déjà été décodée avec certitude pour la même version logique de decoder. Les étapes de détection, matérialisation non-trade, trades, candles et classifications restent rejouées afin de reconstruire les tables dérivées après reset. + +Objectifs maintenus : + +- mémoriser qu’une transaction/instruction a déjà été traitée par un decoder donné ; +- stocker le statut de décodage : certain, partiel, inconnu, erreur, non-actionnable, multi-token ambigu ; +- associer le résultat au `decoder_code` et à une version logique de decoder ; +- permettre un mode `force` qui ignore le ledger ; +- permettre un mode de reprise ciblé lorsque le decoder change ; +- ne pas skipper automatiquement les transactions multi-token, multi-pool ou multi-event ambiguës ; +- conserver les failed transactions comme traçables mais non actionnables. + +Table actuelle : + +- `k_sol_dex_decode_replay_ledger`. + +Champs principaux : + +| Champ conceptuel | Rôle | +|---|---| +| `transaction_id` / `signature` | rattachement transactionnel stable | +| `decoder_scope` | périmètre logique du decoder, actuellement `dex_decode.local_pipeline` | +| `decoder_version` | version logique du decoder | +| `decode_status` | `decoded` ou `no_events` dans la première implémentation | +| `certainty` | `sure` ou `unsafe` | +| `event_count` | nombre total d’events persistés | +| `distinct_token_mint_count` | garde-fou multi-token | +| `force_replay_required` | indique que le décodage doit être relancé | +| `status_reason` | diagnostic lisible sans panic | +| `created_at` / `updated_at` | audit local | + +## 6. Politique de replay + +Règles cibles : + +- par défaut, ne pas retraiter une instruction dont le ledger indique un décodage certain avec le même decoder/version et la même entrée ; +- retraiter si `force = true` ; +- retraiter si le decoder concerné change de version logique ; +- retraiter si la transaction contient plusieurs tokens/pools/events et que le ledger la classe comme ambiguë ou partielle ; +- retraiter si un event précédemment `instruction_audit` devient décodable par un nouveau decoder ; +- ne jamais créer de faux trade/candle pour un event dont les montants ne sont pas fiables ; +- conserver les audits utiles pour améliorer les decoders. + +## 7. Contraintes de code + +Contraintes maintenues : + +- Rust 2024 ; +- pas de `mod.rs` ; +- fichiers Rust avec entête `// file: ...` ; +- fichiers `.toml` avec entête `# file: ...` ; +- exposition centralisée via `lib.rs` ; +- `#![deny(unreachable_pub)]` et `#![warn(missing_docs)]` dans les racines concernées ; +- pas de `anyhow` ; +- pas de `thiserror` ; +- pas de `?`, `unwrap`, `expect` dans le code applicatif de `kb_lib` ; +- `kb_demo_app` peut rester plus souple tant qu’elle reste une application de démonstration ; +- usage privilégié de `match`, `if let Err`, `let Err = ... else` dans `kb_lib` ; +- imports externes limités, sauf traits lorsque nécessaire ; +- tests unitaires et tests de replay maintenus. + +Si une requête DB est ajoutée ou modifiée, mettre à jour les re-exports dans `kb_lib/src/db.rs`, puis dans `kb_lib/src/lib.rs` si la surface publique l’exige. + +## 8. Priorité immédiate + +La priorité immédiate après la clôture `0.7.55 pump_fees` est la suivante : + +1. reprendre `0.7.57 meteora_dlmm` sur une base SQLite neuve ; +2. décoder toutes les instructions/events DBC connus par l'IDL locale et les sources Git ; +3. matérialiser uniquement ce qui est prouvable : launch/bonding, swaps fiables, migration, liquidity, fees/admin/config ; +4. ne créer aucun trade/candle DBC sans montants, sens économique, pool/pair et mints fiables ; +5. maintenir les checks Pump.fun/PumpSwap/Pump Fees/Raydium en non-régression ; +6. garder `jupiter_swap.route_v2` en watchlist résiduelle sans ouvrir Jupiter avant phasage dédié. + +Garde-fous constants : + +- pas de faux trade ; +- pas de fausse candle ; +- pas de `program_id` fictif ; +- pas de promotion d’un DEX sans corpus transactionnel ; +- pas de logique métier DEX profonde dans `kb_demo_app` ; +- pas de metadata manquante bloquante ; +- pas de refactor réseau inutile tant que les clients HTTP/WS existants suffisent. + +## 9. Fichiers utiles pour reprendre dans une nouvelle session + +Pour reprendre rapidement le codage dans une nouvelle session, fournir au minimum : + +- `README.md` ; +- `ROADMAP.md` ; +- `CHANGELOG.md` ; +- `Cargo.toml` racine ; +- `clippy.toml` ; +- `config.json` ; +- `kb_lib/Cargo.toml` ; +- `kb_lib/src/lib.rs` ; +- `kb_lib/src/constants.rs` ; +- `kb_lib/src/dex.rs` ; +- `kb_lib/src/dex/*.rs` ; +- `kb_lib/src/dex_decode.rs` ; +- `kb_lib/src/dex_detect.rs` ; +- `kb_lib/src/dex_support_matrix.rs` ; +- `kb_lib/src/dex_event_classification.rs` ; +- `kb_lib/src/non_trade_event_materialization.rs` ; +- `kb_lib/src/trade_aggregation.rs` ; +- `kb_lib/src/pair_candle_aggregation.rs` ; +- `kb_lib/src/local_pipeline_replay.rs` ; +- `kb_lib/src/local_pipeline_validation.rs` ; +- `kb_lib/src/local_pipeline_diagnostics.rs` ; +- `kb_lib/src/onchain_dex_pair_discovery.rs` ; +- `kb_lib/src/db/schema.rs` ; +- `kb_lib/src/db.rs` ; +- `kb_lib/src/db/entities.rs` et `kb_lib/src/db/entities/*` ; +- `kb_lib/src/db/dtos.rs` et `kb_lib/src/db/dtos/*` ; +- `kb_lib/src/db/queries.rs` et `kb_lib/src/db/queries/*`. + +Ajouter `kb_demo_app/src/demo_pipeline*.rs`, `kb_demo_app/src/demo3.rs`, les fichiers frontend associés et les nouvelles démos seulement si la tâche concerne l’UI, la recherche de corpus, les diagnostics affichés ou le watcher temps réel. + + +### Demo3 multi-target discovery + +Demo3 can search several event surfaces in one on-chain scan by checking multiple target event boxes. Internally this uses the existing `targetEvent` field with comma-separated normalized values, preserving compatibility with older single-target calls. + + +### Demo3 paged / multi-source discovery + +Demo3 can now scan one or several source addresses in a single on-chain discovery run. Source addresses may be pools, vaults, positions, config accounts or mints; the program id remains an instruction filter and no discovered address is promoted as verified automatically. + +The on-chain discovery form supports Solana `getSignaturesForAddress` pagination through `beforeSignature`, `untilSignature`, `maxPages` and `scanOrder`. `newest_first` preserves Solana RPC order. `oldest_first` reverses the fetched window after paging, which is useful when enough pages have been fetched to include the creation-side history of a pool. The JSON result includes `nextBeforeByAddress` cursor hints for subsequent manual windows. + + +### Note 0.7.46 DAMM v1 upstream Git coverage + +La couverture `meteora_damm_v1` inclut désormais les surfaces upstream Git decoder source `meteora-pools-decoder` connues. Les surfaces non rencontrées dans le corpus local restent marquées `upstream_git_mapped_unverified` et doivent être validées par Demo3 + backfill + replay avant d’être considérées comme corpus-confirmed. + +Sur le corpus local élargi, `swap`, `add_balance_liquidity`, `remove_balance_liquidity`, `claim_fee`, `create_lock_escrow`, `lock`, `InitializePermissionlessConstantProductPoolWithConfig` et `InitializePermissionlessConstantProductPoolWithConfig2` sont marqués `upstream_git_local_corpus_observed`. + + +### Note 0.7.47 Upstream Git Registry / DEX discovery preparation + +La version `0.7.47` n’est plus dédiée à un seul DEX. Elle doit introduire un registre upstream Git générique pour les `program_id`, discriminants d’instructions, discriminants d’events, noms d’instructions et familles de programmes issus de dépôts Git externes de decoders Solana. + +Les entrées de ce registre sont des indices de découverte, pas des preuves métier. Elles doivent être marquées `upstream_git_unverified` ou `upstream_git_mapped_unverified` tant qu’elles ne sont pas confirmées par Demo3, backfill, replay local et requêtes SQL. + +Le registre sert à accélérer la constitution de corpus pour les DEX et surfaces suivantes : Meteora DAMM v2/DBC/Vault, Raydium Launchpad/Stable/Locking, Orca Whirlpools, FluxBeam, DexLab, Lifinity AMM v2, Phoenix/OpenBook, Stabble, BonkSwap, Boop, Moonshot, Heaven, Wavebreak, Vertigo, Virtuals, Pancake Swap, OKX DEX, Jupiter/Kamino/Drift et autres programmes utiles à la découverte. + + +## Note 0.7.47-1FE5 — Event coverage et modèle DB + +La matrice DEX/version doit être complétée par une matrice événementielle exhaustive. Le projet ne vise pas seulement les swaps : les events `burn`, `mint`, `transfer`, `account_close`, `lock/unlock`, `vault_deposit/withdraw`, `admin/config`, `order_fill`, `settle_funds`, `launch` et `migration` peuvent influencer une décision de trading. + +Voir : + +- `docs/DEX_DECODER_MATRIX.md` pour le statut par DEX/version ; +- `docs/DEX_EVENT_COVERAGE_MATRIX.md` pour les familles d'events à couvrir ; +- `docs/DB_EVENT_MODEL_REVIEW.md` pour les ajouts DB à envisager avant `0.7.48+`. + + +## Note 0.7.48-pre — Event coverage DB checkpoint + +La micro-tranche `0.7.48-pre` introduit la persistance de couverture événementielle avant la reprise DEX par DEX. + +Ajouts côté `kb_lib` : + +- table `k_sol_dex_event_coverage_entries` ; +- entity, DTO et requêtes dédiées ; +- service `DexEventCoverageService` pour synchroniser les entrées du registre upstream Git vers SQLite ; +- refresh des compteurs locaux depuis `k_sol_dex_decoded_events` et les tables déjà existantes de matérialisation non-trade / trade ; +- exposition des summaries de coverage dans les diagnostics locaux ; +- ajout du profil de validation `0.7.48-pre_event_coverage_db_checkpoint`, qui synchronise le registre upstream avant validation ; +- le profil `0.7.48-pre` garde les invariants globaux de non-régression, mais borne le contrôle bloquant des trade candidates non matérialisés aux DEX Raydium attendus pour éviter qu’un DEX partiel hors scope bloque le checkpoint DB ; +- sélection du profil `0.7.48-pre` dans Demo Pipeline 2. + +Cette tranche ne modifie pas les decoders DEX, ne crée aucun trade/candle, et ne promeut aucun `program_id` comme vérifié. Elle sert uniquement à objectiver la couverture : `listed`, `decoded/audit`, `observed`, `materialized`, `trade_count` et statut de preuve. + +La suite fonctionnelle reprend par Raydium avant Meteora : + +1. `0.7.48` — `raydium_cpmm` ; +2. `0.7.49` — `raydium_clmm` ; +3. `0.7.50-pre-r2` — `raydium_launchpad` + clôture CPMM/CLMM ; +4. `0.7.51` — `raydium_amm_v4` ; +5. `0.7.52` — `raydium_stable_swap` — clôturé ; +6. `0.7.53` — `pump_swap` — clôturé ; +7. `0.7.54` — `pump_fun` ; +8. `0.7.55` — `pump_fees` — clôturé ; +9. `0.7.56` — `meteora_dbc` ; +10. `0.7.57+` — Meteora restants, routers/agrégateurs, Phoenix/OpenBook, Orca puis les autres DEX/surfaces. + +`raydium_pool_v4.json` reste repoussé en audit conditionnel tardif, pas une tranche bloquante. + +## Note 0.7.48 — Raydium CPMM event coverage + +La tranche `0.7.48` reprend `raydium_cpmm` avant Meteora, en s'appuyant sur la table `k_sol_dex_event_coverage_entries` ajoutée en `0.7.48-pre`. + +Le scope CPMM couvre désormais les entrées Carbon/fnzero/IDL suivantes : `close_permission_pda`, `collect_creator_fee`, `collect_fund_fee`, `collect_protocol_fee`, `create_amm_config`, `create_permission_pda`, `deposit`, `initialize`, `initialize_with_permission`, `lp_change_event`, `swap_base_input`, `swap_base_output`, `swap_event`, `update_amm_config`, `update_pool_status` et `withdraw`. + +Le decoder local spécialisé remplace le fallback `upstream_git.instruction_match` pour les instructions CPMM couvertes localement. Les events Anchor self-CPI `lp_change_event` et `swap_event` sont décodés comme preuve audit/coverage, mais ne produisent pas directement `trade_events`, metrics ou candles. Les swaps matérialisables restent les chemins instruction-scoped `swap_base_input` et `swap_base_output` lorsque les montants et le sens économique sont exploitables. + +Aucune nouvelle table DB n'est ajoutée en `0.7.48`. Les transfers, token account lifecycle, vaults, orderbook, launch/migration et locking restent documentés comme familles transversales futures, à promouvoir seulement après preuve multi-DEX. + +Voir aussi : + +- `docs/DEX_EVENT_COVERAGE_MATRIX.md` pour la couverture par familles ; +- `docs/reports/RAYDIUM_CPMM_EVENT_COVERAGE_REPORT.md` pour le rapport de tranche ; +- `validation_sql/SQL_VALIDATION_RAYDIUM_CPMM_0_7_48.sql` pour les requêtes de validation. + +Complément `0.7.48-raydium-cpmm-program-data` : la coverage DB est maintenant synchronisée automatiquement quand un refresh de coverage est demandé sur une base neuve et qu'aucune ligne n'existe encore. Les backfills token/pool/signature déclenchent aussi un refresh best-effort de la coverage afin d'éviter un état incohérent où `k_sol_dex_decoded_events` est rempli mais `k_sol_dex_event_coverage_entries` reste vide. + +Le decoder CPMM lit désormais les events `Program data:` émis par le programme Raydium CPMM. Les layouts `lp_change_event` et `swap_event` sont décodés depuis le payload event direct, en plus du chemin Anchor self-CPI `e445a52e51cb9a1d + event_discriminator`. `swap_event` reste `tradeCandidate=false` / `candleCandidate=false` : les seuls trades CPMM matérialisables restent `swap_base_input` et `swap_base_output`. `lp_change_event` peut alimenter la matérialisation liquidity si le corpus fournit un pool/pair fiable et si `changeType` distingue dépôt/retrait. + + + +### Note 0.7.48-part2-fix2 — Raydium CPMM coverage finalization + +La tranche CPMM reconnaît désormais tous les discriminants instruction-level listés par Carbon / Raydium CP-Swap côté classificateur local. `lp_change_event` est traité comme famille bidirectionnelle `liquidity`, avec sens add/remove résolu par `changeType`, et le refresh coverage est confirmé après replay local sans validation séparée. + +## Note 0.7.48 final — Raydium CPMM clôturable + +La tranche `0.7.48` clôture la couverture Raydium CPMM sur corpus local. Les entrées `deposit`, `withdraw` et `lp_change_event` matérialisent `k_sol_liquidity_events` sans créer de trade/candle ; `initialize` et `initialize_with_permission` matérialisent seulement `k_sol_pool_lifecycle_events` ; les fees matérialisent `k_sol_fee_events` ; les entrées admin/config observées matérialisent `k_sol_pool_admin_events`. + +La table technique `k_sol_instruction_observations` est ajoutée pour indexer localement les instructions observées par `decoder_code`, `instruction_name` et `discriminator_hex`. Demo3 peut rechercher par instruction/discriminant, ce qui reproduit localement l’usage pratique du filtre Solscan `instruction=`. + +État final CPMM observé : `561` trades, `50` liquidity events, `9` lifecycle events, `25/25` `lp_change_event` matérialisés, `swap_event` audit-only à `0` trade, et deux entrées connues mais non observées (`close_permission_pda`, `update_pool_status`) conservées en `upstream_git_mapped_unverified`. + +## Note 0.7.49 — Raydium CLMM event coverage final + +La tranche `0.7.49` clôture `raydium_clmm` comme deuxième tranche Raydium après CPMM. Elle ajoute la couverture complète des instructions CLMM observées depuis Carbon, IDL Raydium, Pinax, fnzero et corpus Solscan/backfill, ainsi que la table transversale `k_sol_orderbook_events` pour les instructions limit-order. + +Points finalisés : + +- `45` entrées listées dans `k_sol_dex_event_coverage_entries` ; +- `33` instructions CLMM avec `local_event_kind` spécialisé ; +- `33` instructions observées dans le corpus local ; +- `25` entrées matérialisées ; +- swaps matérialisés uniquement via `swap` / `swap_v2` ; +- limit orders `open`, `increase`, `decrease`, `close`, `settle` décodés et matérialisés en `k_sol_orderbook_events` quand la transaction réussit ; +- non-trades CLMM vers `liquidity`, `fee`, `reward`, `admin`, `lifecycle` et `orderbook` sans trade/candle ; +- transactions échouées conservées audit-only ; +- `raydium_clmm.instruction_audit` résiduel à zéro ; +- `upstream_git.instruction_match` localement couvert à zéro après replay ; +- 11 Anchor / `Program data` events CLMM préparés mais conservés `upstream_git_unverified` faute d’observation locale. + +La validation finale est dans `validation_sql/SQL_VALIDATION_RAYDIUM_CLMM_0_7_49.sql`. + + + +## Note 0.7.50 — Raydium Launchpad event coverage bootstrap + +La tranche `0.7.50` ouvre `raydium_launchpad` comme troisième tranche Raydium après CPMM et CLMM. Le code local canonique est `raydium_launchpad`. Le program id canonique est `LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj`. + +Points préparés dans le bootstrap : + +- normalisation des entrées launch surface, DEX support matrix, catalogue et registre upstream vers `raydium_launchpad` ; +- ajout de `RAYDIUM_LAUNCHPAD_PROGRAM_ID` ; +- inventaire initial de `1` entrée programme et `26` entrées discriminées Carbon/IDL ; +- fallback `raydium_launchpad.instruction_audit` pour les instructions non mappées, avec enrichissement Anchor self-CPI (`e445a52e51cb9a1d`) ; +- mapping conservatoire des discriminants Launchpad vers `raydium_launchpad.` ; +- cible coverage initiale forcée à `decoded_events_only`, y compris pour buy/sell/trade/migration, afin d'éviter toute fausse trade/candle avant corpus local ; +- rapport `docs/reports/RAYDIUM_LAUNCHPAD_EVENT_COVERAGE_REPORT.md` ; +- SQL `validation_sql/SQL_VALIDATION_RAYDIUM_LAUNCHPAD_0_7_50.sql`. +- pre3 : Demo3 contient le preset `Raydium Launchpad`; les `initialize*` Launchpad peuvent créer le catalogue pool/pair local, tandis que `trade_event` reste non promu en trade/candle. + +`raydium_pool_v4.json` reste un indice IDL annexe. Il n'est pas promu en surface métier tant que son program id, son rôle exact et un corpus local exploitable ne sont pas confirmés. + + +## Note 0.7.50-pre-r2 — CPMM/CLMM closure re-check + +Cette tranche complète la clôture Raydium en ajoutant `cpi_event` pour CPMM/CLMM, `update_dynamic_fee_config` pour CLMM, le rattachement local des Program-data events CLMM et la table `k_sol_token_account_events` pour `create_support_mint_associated`. + +Le discriminant CPMM `40f4bc78a7e9690a` est désormais codé comme `raydium_cpmm.anchor_idl_instruction` : les signatures inspectées correspondent aux instructions Anchor `IdlCreateAccount` / `IdlCloseAccount`, donc il reste `decoded_events_only` et ne matérialise aucune table métier. + +Rapport de clôture : `docs/reports/RAYDIUM_CPMM_CLMM_RECHECK_REPORT_0_7_50_PRE_R2.md`. +## Tranche clôturée — 0.7.52 raydium_stable_swap + +`0.7.52` clôture Raydium Stable Swap avec le code local canonique `raydium_stable_swap` et le program id `5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h`. + +Décisions finales : + +- Stable Swap est décodé en layout legacy **1 octet**. +- La surface locale observée `00..0d` est couverte : lifecycle, model setup, admin/config, liquidity, orderbook side effects, fees et swaps. +- `swap_base_in` / `swap_base_out` produisent trades/candles uniquement avec des montants exacts dérivés des deltas de vaults (`amountSource=stable_swap_vault_balance_delta`). +- Les arguments d’instruction `amountInRaw`, `minimumAmountOutRaw`, `maxAmountInRaw`, `amountOutRaw` sont conservés comme bornes d’instruction, mais ne sont pas utilisés comme prix/montants exacts. +- Les transactions failed restent decoded-only avec `skipTradeReason=failed_transaction` et `skipCandleReason=failed_transaction`. + +Livrables de clôture : + +- `kb_lib/src/dex/raydium_stable_swap.rs` +- `docs/reports/RAYDIUM_STABLE_SWAP_EVENT_COVERAGE_REPORT.md` +- `validation_sql/SQL_VALIDATION_RAYDIUM_STABLE_SWAP_0_7_52.sql` + +Validation locale finale : + +```text +cargo test -p kb_lib -> 407 passed, 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> ok +``` + +Replay final observé : + +```text +replayed=298, trades=290, liquidity=16, lifecycle=4, candle_upserts=1160, +instructionObservations=5317, catalog=40 tokens / 59 pools / 59 pairs +``` + +Statut : **clôturé côté code et validation locale**. diff --git a/olddocs/archivekbobobot/ROADMAP.md b/olddocs/archivekbobobot/ROADMAP.md new file mode 100644 index 0000000..71ce266 --- /dev/null +++ b/olddocs/archivekbobobot/ROADMAP.md @@ -0,0 +1,1900 @@ + + +# Roadmap — khadhroony-bobobot + +## État courant — clôture `0.7.57 meteora_dlmm` et plan intermédiaire consolidation DB / demo4 + +### `0.7.57 meteora_dlmm` — clos + +- Program id : `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo`. +- Source prioritaire : `idls/meteora_dlmm.LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo.json`. +- Surface IDL : `76` instructions, `30` events Anchor, `12` accounts. +- Build final : `cargo test -p kb_lib` -> `460 passed`; clippy `-D warnings` OK. +- Replay final DLMM : `769 replayed`, `106 trades`, `664 liquidity`, `1107 lifecycle`, `424 candle upserts`, `instructionObservations=8062`, catalogue `169/218/218`. +- Dernier discriminant résiduel `75c73e67068e1fcb` : identifié comme `initialize_preset_parameter_v2`, matérialisé `4/4` en admin/config. +- `instruction_audit` observé : `0`; fallback `upstream_git` DLMM couvert localement : vide. +- `close_bin_array` : `16/14` coverage expliqué par `14` transactions OK matérialisées et `2` failed tx `Custom 6015` audit-only. +- Checks bloquants : decoded sans coverage, successful non-materialized, failed matérialisé, multi-target, non-swap trade/candle, parent fee sans leg, legs orphelins et coverage duplicates sont propres. + +### Politique de découverte automatique future + +La suite ajoute d'abord le binaire de fusion SQLite en `0.7.58`, puis `demo4` en `0.7.59`. La future `demo4` ne doit pas matérialiser automatiquement des contenus inconnus : elle doit seulement afficher, scorer et regrouper les surfaces non encore prises en compte pour permettre une programmation manuelle ou semi-automatique contrôlée. + +À observer sans promotion automatique : + +- `program_id` inconnus ou non routés ; +- discriminators inconnus sur program id connu ; +- logs Anchor `Instruction: ...` non mappés ; +- `Program data` / Anchor events non mappés ; +- fallback `upstream_git.instruction_match` ; +- layouts accounts/data/inner instructions ; +- signatures samples et statut success/failed. + +### Prochaines tranches recommandées + +| Priorité | Tranche | Surface | Objectif | +|---:|---|---|---| +| 1 | `0.7.58` | `sqlite_db_transaction_merger` | Binaire de fusion de bases SQLite transactionnelles vers `final.db` / `final.next.db`, sans RPC/backfill/décodage pendant le merge, puis replay anti-régression cross-DEX Pump/Raydium/Meteora. | +| 2 | `0.7.59` | `demo4_program_surface_discovery` | UI/queries de découverte des contenus non pris en compte depuis la base consolidée : aucun auto-decode métier, aucune auto-materialization, aucune auto-promotion. | +| 3 | `0.7.60` | `meteora_damm_v1` | Clôture séparée DAMM v1 : pools, swaps, liquidity, lock, fees/admin, coverage et matérialisation complète. | +| 4 | `0.7.61` | `meteora_damm_v2` | Clôture séparée DAMM v2 : create/custom pools, swaps, liquidity, dynamic config, fees/admin. | +| 5 | `0.7.62` | `meteora_vault` | Vault deposit/withdraw/fee/accounting ; pas de candle directe. | + +Décision de planification : ne pas fusionner DAMM v1 et DAMM v2 dans une seule tranche. Ils peuvent partager des helpers, des tests et des conventions de matérialisation, mais les `program_id`, IDL, discriminants et corpus doivent rester séparés afin de garder les validations SQL lisibles et de réduire les risques de faux positif. + +Décision anti-régression : pour les futurs développements de décodeurs/materializers, travailler d'abord sur une base vide dédiée au DEX, puis fusionner cette base dans une copie de `final.db` avec le binaire `0.7.58`. La clôture d'une tranche DEX doit inclure un replay de la base fusionnée afin de détecter les régressions cross-surface, par exemple un decoder PumpFees qui interrompt une matérialisation PumpSwap dans la même transaction. + +## 0.7.47-1FE5 — Décision de planification : ne plus viser “tous les events en une session” + +La phase `0.7.47` a montré que l’objectif “réimplémenter tous les décodeurs Carbon et toutes les sources en un seul bloc” est trop large. Le plan est donc redécoupé en **un DEX/version par tranche**, avec une matrice documentaire dédiée : `docs/DEX_DECODER_MATRIX.md`. + +Règles de planification : + +- chaque DEX/version doit avoir sa propre phase de corpus ; +- chaque phase doit lister explicitement les sources Git/IDL consultées ; +- tous les events/instructions disponibles dans les sources doivent être inventoriés, même si seuls certains deviennent matérialisés ; +- le statut par event doit rester séparé : `upstream_git_unverified`, `upstream_git_mapped_unverified`, `upstream_git_local_corpus_observed`, `audit-only`, `materialized` ; +- un decoder local spécialisé peut remplacer `upstream_git.instruction_match`, mais ne doit pas créer de trade/candle sans validation de montants et de sens économique ; +- OpenBook v2 et Phoenix v1 restent `audit-only` à ce stade, malgré leurs layouts partiellement décodés. + +### Sources upstream obligatoires à vérifier + +| Source | Usage | +|---|---| +| `idls/` | Corpus local d’IDL Solscan téléchargés et versionnés dans le workspace ; source locale obligatoire à comparer aux liens Git avant décision de decoder. | +| `https://github.com/sevenlabs-hq/carbon/tree/main/decoders` | Source principale des decoders multi-protocoles. | +| `https://github.com/0xfnzero/solana-streamer` | Source complémentaire PumpFun/PumpSwap/Bonk/Raydium CPMM. | +| `https://github.com/0xfnzero/sol-parser-sdk/tree/main/idls` | IDL complémentaires. | +| `https://github.com/pinax-network/substreams-solana-idls/tree/main/src` | IDL et layouts additionnels. | +| `https://github.com/hodlwarden/solana-tx-parser/tree/main/src` | Parsers transactionnels complémentaires. | +| `https://github.com/openbook-dex/openbook-v2` | Source officielle OpenBook v2. | +| `https://github.com/all-in-one-blockchain/phoenix-onchain-mm` | Source Phoenix/MM complémentaire. | +| `https://docs.vybenetwork.com/docs/available-dexs-amms` | Source externe de découverte DEX/AMM, non vérifiante. | + +### Plan actif post-`0.7.57` — phasage par version + +Règle active après la clôture DLMM : les tranches `0.7.58` et `0.7.59` sont des tranches d’outillage, puis la règle **une version cible = un `program_id`** reprend à partir de `0.7.60`. + +Les comptes non-programmes (`platform_config`, token authority, comptes de configuration, comptes de pool, accounts de programme) ne créent pas de version decoder autonome. `SOLSCAN_ACCOUNT_SOURCES` reste un inventaire de découverte, pas une preuve de support local. + +| Version cible | Decoder / surface | Program id | Famille | Objectif de clôture | +|---|---|---|---|---| +| `0.7.53` | `pump_swap` | `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA` | Pump / AMM | **Clos** : `buy/sell/buy_exact_quote_in` matérialisés seulement depuis sources exactes ; events Anchor audit-only ; tests synthétiques IDL ; SQL global. | +| `0.7.54` | `pump_fun` | `6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P` | Pump / launch-bonding | **Clos** : decoder maximal IDL/local, trades directs `buy/sell/buy_exact_sol_in`, v2/exact via `trade_event`, non-trades matérialisés selon contexte, validations Pump.fun propres. | +| `0.7.55` | `pump_fees` | `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` | Pump / fee | **Clos** : `29` instructions, `20` events Anchor, fee/reward/admin/lifecycle, `get_fees` decoded-only, failed tx audit-only, aucun trade/candle direct. | +| `0.7.56` | `meteora_dbc` | `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN` | Meteora / DBC | Clos : `28` instructions et `23` events Anchor couverts, swaps `swap/swap2`, lifecycle/admin/fees, `k_sol_fee_event_amounts`, validations SQL propres. | +| `0.7.57` | `meteora_dlmm` | `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo` | Meteora / DLMM | **Clos** : full decode + full materialization ; `76` instructions IDL, `30` events Anchor, swaps, bins, positions, liquidity, fees/rewards/admin/limit-order, sans double-count. | +| `0.7.58` | `sqlite_db_transaction_merger` | n/a | Outillage / consolidation DB | Ajouter un binaire utilisant `kb_lib` pour fusionner des bases `.db` transactionnelles vers `final.db`/`final.next.db`, puis rejouer la base consolidée pour détecter les régressions cross-DEX Pump/Raydium/Meteora. | +| `0.7.59` | `demo4_program_surface_discovery` | n/a | Outillage / discovery | Afficher depuis la base consolidée les contenus non pris en compte : program ids, discriminators, Anchor logs/events, upstream fallbacks, layouts et samples ; aucune matérialisation automatique. | +| `0.7.60` | `meteora_damm_v1` | `Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB` | Meteora / DAMM v1 | Parité upstream finale : pools, swaps, liquidity, lock, fees/admin. | +| `0.7.61` | `meteora_damm_v2` | `cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG` | Meteora / DAMM v2 | Couverture complète : create/custom pools, swaps, liquidity, dynamic config, fees/admin. | +| `0.7.62` | `meteora_vault` | `24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi` | Meteora / vault | Vault deposit/withdraw/fee/accounting ; pas de candle directe. | +| `0.7.63` | `system_program` | `11111111111111111111111111111111` | Système Solana | Create/assign/transfer account ; side effects de contexte, pas de trade. | +| `0.7.64` | `spl_token` | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | SPL Token | Transfer, mint, burn, close account, sync native ; base transversale pour deltas. | +| `0.7.65` | `spl_token_2022` | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | Token-2022 | Transfers/extensions Token-2022, mint/burn/close, comptes et side effects. | +| `0.7.66` | `associated_token_account` | `ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL` | Système token | Création ATA, rattachement wallet/token/pool. | +| `0.7.67` | `compute_budget` | `ComputeBudget111111111111111111111111111111` | Contexte tx | Budget/prioritization fee ; utile scoring/MEV, pas de trade. | +| `0.7.68` | `memo` | `MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr` | Contexte tx | Mémo transactionnel et attribution éventuelle. | +| `0.7.69` | `address_lookup_table` | `AddressLookupTab1e1111111111111111111111111` | Contexte tx | Résolution/diagnostic ALT si nécessaire. | +| `0.7.70` | `mpl_token_metadata` | `metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s` | Metadata | Enrichissement token/NFT/mint metadata. | +| `0.7.71` | `mpl_core` | `CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d` | Metadata / asset | Contexte asset si présent dans corpus. | +| `0.7.72` | `bubblegum` | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | Compressed assets | Audit/contexte assets compressés, pas DEX. | +| `0.7.73` | `raydium_routing` | `routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS` | Router | Route/legs Raydium ; éviter le double-count avec DEX effectifs. | +| `0.7.74` | `jupiter_swap_v6` | `JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4` | Aggregator | Route attribution, legs, no duplicate trade/candle. | +| `0.7.75` | `jupiter_swap_v4` | `JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB` | Legacy aggregator | Audit/route only si corpus encore utile. | +| `0.7.76` | `dflow_aggregator_v4` | `DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH` | Aggregator | Route/intent/orderflow ; pas de double matérialisation. | +| `0.7.77` | `okx_dex` | `6m2CDdhRgxpH4WjvdzxAYbGxwdGUz5MziiL5jek2kBma` | Aggregator/router | Route attribution ; trades seulement si source exacte non doublonnée. | +| `0.7.78` | `onchain_labs_dex_v2` | `proVF4pMXVaYqmy4NjniPh4pqKNfMmsihgd4wdkCX3u` | Router/DEX candidat | Corpus d’abord ; classifier route vs DEX effectif. | +| `0.7.79` | `titan_router` | `T1TANpTeScyeqVzzgNViGDNrkQ6qHz9KrSBS4aNXvGT` | Router | Audit route-only sauf preuve de trade direct non doublonné. | +| `0.7.80` | `sanctum_router` | `stkitrT1Uoy18Dk1fTrgPw8W6MVzoCfYoAFT4MLsmhq` | Router | Route/liquid staking context ; pas de candle DEX directe. | +| `0.7.81` | `orca_whirlpools` | `whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc` | DEX avec IDL/source | Swaps, pools, positions, liquidity, fees/rewards. | +| `0.7.82` | `stabble_stable_swap` | `swapNyd8XiQwJ6ianp9snpu4brUqFxadzvHebnAXjJZ` | DEX avec IDL/source | Stable swap ; deltas exacts, liquidity/admin. | +| `0.7.83` | `stabble_weighted_swap` | `swapFpHZwjELNnjvThjajtiVmkz3yPQEHjLtka2fwHW` | DEX avec IDL/source | Weighted swap, deltas exacts, liquidity/admin. | +| `0.7.84` | `stabble_clmm` | `6dMXqGZ3ga2dikrYS9ovDXgHGh5RUsb2RTUj6hrQXhk6` | DEX avec IDL/source | CLMM Stabble si corpus utile. | +| `0.7.85` | `bonkswap` | `BSwp6bEBihVLdqJRKGgzjcGLHkcTuzmSo1TQkHepzH8p` | DEX avec IDL/source | Swap/liquidity/non-trade. | +| `0.7.86` | `boop_fun` | `boop8hVGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4` | Launch/DEX candidat | Launch/swap/migration selon corpus. | +| `0.7.87` | `byreal_clmm` | `REALQqNEomY6cQGZJUGwywTBD2UmDT32rZcNnfxQ5N2` | DEX avec IDL/source | CLMM ; corpus puis matérialisation contrôlée. | +| `0.7.88` | `fusionamm` | `fUSioN9YKKSa3CUC2YUc4tPkHJ5Y6XW1yz8y6F7qWz9` | DEX avec IDL/source | AMM ; swaps/liquidity si corpus. | +| `0.7.89` | `goosefx_v1` | `GAMMA7meSFWaBXF25oSUgmGRwaW6sCMFLmBNiMSdbHVT` | DEX avec IDL/source | DEX/AMM selon corpus. | +| `0.7.90` | `goosefx_v2` | `GFXsSL5sSaDfNFQUYsHekbWBW1TsFdjDYzACh62tEHxn` | DEX avec IDL/source | DEX/AMM selon corpus. | +| `0.7.91` | `guac_swap` | `Gswppe6ERWKpUTXvRPfXdzHhiCyJvLadVvXGfdpBqcE1` | DEX avec IDL/source | Swap/liquidity si corpus. | +| `0.7.92` | `hylo_exchange` | `HYEXCHtHkBagdStcJCp3xbbb9B7sdMdWXFNj6mdsG4hn` | DEX/source à classifier | Classer DEX/lending/stable selon IDL/corpus. | +| `0.7.93` | `printr` | `T8HsGYv7sMk3kTnyaRqZrbRPuntYzdh12evXBkprint` | Launch/DEX candidat | Corpus d’abord ; surface launch/swap à confirmer. | +| `0.7.94` | `moonit` | `MoonCVVNZFSYkqNXP6bxHLPL6QQJiMagDL3qcqUQTrG` | Launch/DEX candidat | Launch/migration/swap si prouvé. | +| `0.7.95` | `metadao_amm_v0_5` | `AMMJdEiCCa8mdugg6JPF7gFirmmxisTfDJoSNSUi5zDJ` | DEX avec source | AMM futarchy ; corpus et price semantics. | +| `0.7.96` | `metadao_bid_wall` | `WALL8ucBuUyL46QYxwYJjidaFYhdvxUFrgvBxPshERx` | Order/bid-wall | Order/bid-wall context ; pas de candle directe sans fill exact. | +| `0.7.97` | `metadao_launchpad` | `moontUzsdepotRGe5xsfip7vLPTJnVuafqdUWexVnPM` | Launch surface | Launch/ICO surface ; pas DEX effectif par défaut. | +| `0.7.98` | `vertigo` | `vrTGoBuy5rYSxAfV3jaRJWHH6nN9WK4NRExGxsk1bCJ` | DEX/source | Swap/launch selon corpus. | +| `0.7.99` | `virtuals` | `5U3EU2ubXtK84QcRjWVmYt9RaDyA8gKxdUrPFXmZyaki` | Launch/DEX candidat | Launch/AMM à confirmer. | +| `0.7.100` | `wavebreak` | `waveQX2yP3H1pVU8djGvEHmYg8uamQ84AuyGtpsrXTF` | DEX/source | Corpus et rôle exact. | +| `0.7.101` | `woofi` | `WooFif76YGRNjk1pA8wCsN67aQsD9f9iLsz4NcJ1AVb` | DEX/router | Swap/route selon corpus. | +| `0.7.102` | `pancake_swap` | `HpNfyc2Saw7RKkQd8nEL4khUcuPhQ7WwY1B2qjx8jxFq` | DEX/source | DEX Solana à confirmer par corpus. | +| `0.7.103` | `gavel` | `srAMMzfVHVAtgSJc8iH6CfKzuWuUTzLHVCE81QU1rgi` | Source upstream | Corpus d’abord ; rôle exact à classer. | +| `0.7.104` | `heaven` | `HEAVENoP2qxoeuF8Dj2oT1GHEnu49U5mJYkdeC8BAX2o` | Launch/DEX candidat | Launch/DEX selon corpus. | +| `0.7.105` | `lifinity_v2` | `2wT8Yq49kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c` | DEX legacy/actif | Support selon corpus. | +| `0.7.106` | `moonshot` | `MoonCVVNZFSYkqNXP6bxHLPL6QQJiMagDL3qcqUQTrG` | Source upstream/Solscan | À dédupliquer avec `moonit` si même program id. | +| `0.7.107` | `openbook_v2` | `opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb` | Orderbook | Audit/orderbook complet ; trade/candle seulement si fills exacts. | +| `0.7.108` | `phoenix_v1` | `PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY` | Orderbook | Audit-only complet avant toute matérialisation fill. | +| `0.7.109` | `alphaq` | `ALPHAQmeA7bjrVuccPsYPiCvsi428SNwte66Srvs4pHA` | Solscan/no IDL | Probe par Demo3 + corpus ; décider support ou abandon. | +| `0.7.110` | `aquifer` | `AQU1FRd7papthgdrwPTTq5JacJh8YtwEXaBfKU3bTz45` | Solscan/no IDL | Probe uniquement. | +| `0.7.111` | `bisonfi` | `BiSoNHVpsVZW2F7rx2eQ59yQwKxzU5NvBcmKshCSUypi` | Solscan/no IDL | Probe uniquement. | +| `0.7.112` | `dexlab` | `DSwpgjMvXhtGn6BsbqmacdBZyfLj6jSWf3HJpdJtmg6N` | Solscan/no IDL | Vérifier support partiel / corpus. | +| `0.7.113` | `fluxbeam` | `FLUXubRmkEi2q6K3Y9kBPg9248ggaZVsoSFhtJHSrm1X` | Solscan/no IDL | Vérifier support partiel / corpus. | +| `0.7.114` | `goonfi` | `goonERTdGsjnkZqWuVjs73BZ3Pb9qoCUdBUL17BnS5j` | Solscan/no IDL | Probe. | +| `0.7.115` | `goonfi_v2` | `goonuddtQRrWqqn5nFyczVKaie28f3kDkHWkHtURSLE` | Solscan/no IDL | Probe ; adresse à revérifier si erreur de taille. | +| `0.7.116` | `humidifi` | `9H6tua7jkLhdm3w8BvgpTn5LZNU7g4ZynDmCiNN3q6Rp` | Solscan/no IDL | Probe. | +| `0.7.117` | `obric_v2` | `obriQD1zbpyLz95G5n7nJe6a4DPjpFwa5XYPoNm113y` | Solscan/no IDL | Probe. | +| `0.7.118` | `ondo_global_market` | `XzTT4XB8m7sLD2xi6snefSasaswsKCxx5Tifjondogm` | Solscan IDL | Rôle marché/tokenized assets à confirmer. | +| `0.7.119` | `scorch` | `SCoRcH8c2dpjvcJD6FiPbCSQyQgu3PcUAWj2Xxx3mqn` | Solscan/no IDL | Probe. | +| `0.7.120` | `solfi` | `SoLFiHG9TfgtdUXUjWAxi3LtvYuFyDLVhBWxdMZxyCe` | Solscan/no IDL | Probe. | +| `0.7.121` | `solfi_v2` | `SV2EYYJyRz2YhfXwXnhNAevDEui5Q6yrfyo13WtupPF` | Solscan/no IDL | Probe. | +| `0.7.122` | `zerofi` | `ZERor4xhbUycZ6gb9ntrhqscUcZmAbQDjEAtCf4hbZY` | Solscan/no IDL | Probe. | +| `0.7.123` | `zora` | `zoRabwLGd5zXaV7Gxacppw8tcceXEiTrSKyNLSaSTUc` | Solscan/no IDL | Probe, pas de promotion sans corpus. | +| `0.7.124` | `1dex` | `DEXYosS6oEGvk8uCDayvwEZz4qEyDJRf9nFgYCaqPMTm` | Solscan/no IDL | Probe. | +| `0.7.125` | `aldrin_amm` | `AMM55ShdkoGRB5jVYPjWziwk8m5MpwyDgsMWHaMSQWH6` | Legacy/no IDL | Historique/probe. | +| `0.7.126` | `aldrin_amm_v2` | `CURVGoZn8zycx6FXwwevgBTB2gVvdbGTEpvMJDbgs2t4` | Legacy/no IDL | Historique/probe. | +| `0.7.127` | `crema_finance` | `CLMM9tUoggJu2wagPkkqs9eFG4BWhVBZWkP1qv3Sp7tR` | Legacy/no IDL | Historique/probe. | +| `0.7.128` | `cropper_finance` | `CTMAxxk34HjKWxQ3QLZK1HpaLXmBveao3ESePXbiyfzh` | Legacy/no IDL | Historique/probe. | +| `0.7.129` | `cropper_whirlpool` | `H8W3ctz92svYg6mkn1UtGfu2aQr2fnUFHM1RhScEtQDt` | Legacy/no IDL | Historique/probe. | +| `0.7.130` | `mercurial_stable_swap` | `MERLuDFBMmsHnsBPZw2sDQZHvXFMwp8EdjudcU2HKky` | Legacy/no IDL | Historique stable swap ; deltas exacts si support. | +| `0.7.131` | `saber_stable_swap` | `SSwpkEEcbUqx4vtoEByFjSkhKdCT862DNVb52nZg1UZ` | Legacy/no IDL | Historique stable swap. | +| `0.7.132` | `saros_amm` | `SSwapUtytfBdBn1b9NUGG6foMVPtcWgpRU32HToDUZr` | Legacy/no IDL | Historique/probe. | +| `0.7.133` | `step_finance_swap` | `SSwpMgqNDsyV7mAgN9ady4bDVu5ySjmmXejXvy2vLt1` | Legacy/no IDL | Historique/probe. | +| `0.7.134` | `stepn_dooar_swap` | `Dooar9JkhdZ7J3LHN3A7YCuoGRUggXhQaG4kijfLGU2j` | Legacy/no IDL | Historique/probe. | +| `0.7.135` | `raydium_amm_v2_legacy` | `RVKd61ztZW9GUwhRbbLoYVRE5Xf1B2tVscKqwZqXgEr` | Raydium legacy/no IDL | Historique Raydium ; corpus d’abord. | +| `0.7.136` | `raydium_amm_v3_legacy` | `27haf8L6oxUeXrHrgEgsexjSY5hbVUWEmvv9Nyxg8vQv` | Raydium legacy/no IDL | Historique Raydium ; ne pas confondre avec CLMM moderne. | +| `0.7.137` | `raydium_pool_v4_json_audit` | aucun `program_id` prouvé par le fichier seul | Audit source annexe | Vérifier `sol-parser-sdk/idls/raydium_pool_v4.json` après les surfaces documentées ; patch AMM v4 si amélioration, sinon clôture no-op. | +| `0.7.138` | cleanup `SOLSCAN_ACCOUNT_SOURCES` | n/a | Nettoyage registry/constants | Retirer doublons/promotions ; les programmes validés deviennent constantes/support matrix, les comptes non-programmes restent contexte ou sont supprimés. | +| `0.7.139` | base neuve multi-programmes | n/a | Validation consolidée | Replay consolidé, coverage global, zéro faux trade/candle, diagnostics bloquants à zéro. | + +Ce plan remplace les regroupements larges qui mélangeaient plusieurs DEX ou plusieurs `program_id` dans une seule tranche. `raydium_pool_v4.json` est explicitement repoussé vers la fin : il ne bloque plus `0.7.53`. + + + +## 1. Objet du projet + +`khadhroony-bobobot` est un workspace Rust destiné à la détection, l’observation, l’analyse de patterns et, à terme, à l’exécution semi-automatisée d’achats/ventes de tokens sur la blockchain Solana. + +Le projet vise en priorité : + +- la détection de création de tokens et de paires sur différents DEX, +- la réception et le tri des événements on-chain et RPC, +- la collecte de métriques utiles au filtrage, +- l’analyse statistique et comportementale des patterns, +- la préparation d’une couche wallet puis swap/trading. + +## 2. Principes d’architecture + +### 2.1. Structure générale + +Le workspace est organisé autour de deux sous-crates principales : + +- `kb_lib` : bibliothèque métier, réseau, config, tracing, stockage, analyse et logique applicative. +- `kb_demo_app` : application Demo Tauri V2 avec frontend TypeScript, chargée de l’interface et de la délégation vers `kb_lib`. + +### 2.2. Contraintes de code + +Le socle du projet doit respecter les contraintes suivantes : + +- Rust 2024. +- Aucun fichier `mod.rs`. +- Exposition centralisée à la racine des crates via `lib.rs` ou `main.rs`. +- Pas d’usage de `anyhow` ni `thiserror`. +- Pas d’usage de `?`, `unwrap`, `expect` dans le code applicatif. +- Utilisation de `match`, `if let Err`, `let Err = ... else`. +- Documentation Rust obligatoire sur les éléments publics. +- `#![deny(unreachable_pub)]` et `#![warn(missing_docs)]` activés et respectés. +- Pas de `use` pour les types/fonctions externes, sauf pour les traits. +- Tests unitaires importants et maintenus à chaque étape. + +### 2.3. Règles de responsabilité + +- `kb_demo_app` ne doit pas embarquer la logique métier réseau ou Solana. +- `kb_demo_app` doit seulement orchestrer l’UI, les commandes Tauri et les appels vers `kb_lib`. +- `kb_lib` doit porter les clients réseau, la config, le tracing, les types partagés, les registres et la logique métier. + +## 3. Vision fonctionnelle + +Le projet doit pouvoir évoluer progressivement vers les capacités suivantes : + +1. Connexion à plusieurs endpoints HTTP / WS RPC Solana. +2. Répartition des rôles par endpoint. +3. Réception des notifications de slots, comptes, programmes, logs, signatures, blocs. +4. Détection de créations de tokens, pools et paires sur plusieurs DEX. +5. Collecte de métriques : liquidité, market cap, volume, prix, activité. +6. Persistance locale dans SQLite, puis évolution possible vers PostgreSQL. +7. Analyse de patterns et filtrage des tokens non tradables. +8. Gestion de wallets Solana. +9. Préparation puis exécution semi-automatisée de swaps/trading. +10. Intégration future de gRPC Yellowstone. + +## 4. Configuration cible + +La configuration applicative est stockée dans un fichier `config.json`. + +### 4.1. Points à couvrir dans la configuration + +Le fichier doit permettre de configurer : + +- les endpoints HTTP, +- les endpoints WebSocket, +- un nom logique par endpoint, +- le rôle ou les tâches affectées à chaque endpoint, +- les limites de débit par endpoint, +- les options spécifiques aux providers publics ou privés, +- les chemins de stockage local, +- le répertoire des wallets Solana, +- le tracing et ses formats, +- la stratégie de reconnexion, +- les paramètres de base de données, +- les options d’UI persistées plus tard. + +### 4.2. Exemple de catégories attendues + +- `app` +- `logging` +- `database` +- `wallets` +- `network` +- `solana` +- `http_endpoints` +- `ws_endpoints` + +### 4.3. Exigences particulières + +Chaque endpoint doit pouvoir porter sa propre configuration, par exemple : + +- nom logique, +- URL, +- provider, +- présence ou non d’une clé API, +- variable d’environnement pour clé API, +- plafond de requêtes, +- burst, +- timeout, +- usages autorisés, +- rôle principal. + +Exemples de rôles futurs : + +- `slot_notifications` +- `program_subscriptions` +- `account_subscriptions` +- `logs_subscriptions` +- `http_queries` +- `fallback` + +## 5. Tracing cible + +Le tracing est centralisé dans `kb_lib`. + +### 5.1. Exigences initiales + +- sortie console paramétrable, +- sortie fichier paramétrable, +- niveau de log configurable, +- format du message configurable, +- format du temps configurable, +- ANSI console activable/désactivable, +- fonctionnement compatible tests, +- séparation claire entre initialisation et usage. + +### 5.2. Objectifs complémentaires + +- pouvoir distinguer les logs du transport WS, +- distinguer les logs HTTP, +- distinguer les logs Tauri/UI, +- distinguer les logs DB, +- préparer une traçabilité par endpoint et par client. + +## 6. Phasage par versions + +### 6.001. Version `0.0.2` — Socle conforme +Objectif : corriger le squelette et poser la base de travail. + +Réalisé : + +- correction de `kb_lib/src/lib.rs`, +- création de `kb_lib::Error`, +- création de `kb_lib::Config`, +- création de `kb_lib::init_tracing`, +- création des constantes Solana officielles, +- préparation des modules `ws_client` et `http_client`, +- remise de `kb_demo_app/src/lib.rs` en conformité, +- documentation de `kb_demo_app/src/splash.rs`, +- UI Tauri minimale. + +### 6.002. Version `0.1.x` — Transport WebSocket générique +Objectif : construire un vrai `WsClient` asynchrone clonable. + +Réalisé : + +- `connect`, `disconnect`, `connection_state`, +- flux de lecture séparé du flux d’écriture, +- identifiant incrémental interne par client, +- canal sortant borné, +- émission d’événements internes, +- support de l’arrêt propre, +- fermeture avec timeout, +- tests offline avec serveur mock. + +### 6.003. Version `0.1.1` — Intégration Tauri minimale du `WsClient` +Objectif : valider le transport via l’application desktop. + +Réalisé : + +- intégration minimale de `WsClient` dans `kb_demo_app`, +- boutons start/stop, +- zone de logs, +- validation du flux `frontend -> tauri -> kb_lib -> frontend`. + +### 6.004. Version `0.2.0` — Couche JSON-RPC WS Solana +Objectif : séparer clairement transport, réponses RPC et notifications. + +Réalisé : + +- enveloppes JSON-RPC 2.0, +- gestion des `request_id`, +- parsing des réponses et erreurs, +- parsing des notifications, +- premiers helpers JSON-RPC sur `WsClient`. + +### 6.005. Version `0.3.0` — Registre subscriptions / notifications +Objectif : fiabiliser la gestion des subscriptions. + +Réalisé : + +- stockage des subscriptions actives, +- mapping entre requête de subscribe et `subscription_id` serveur, +- unsubscribe propre avant fermeture, +- timeout d’attente sur unsubscribe, +- purge locale si nécessaire, +- routage séparé des notifications. + +### 6.006. Version `0.3.1` — Helpers subscribe/unsubscribe WebSocket +Objectif : ajouter les helpers haut niveau correspondant aux principales méthodes PubSub Solana. + +Réalisé : + +- helpers pour `account`, `block`, `logs`, `program`, `root`, `signature`, `slot`, `slotsUpdates`, `vote`, +- helpers d’unsubscribe correspondants, +- premiers tests de validation des noms de méthodes. + +### 6.007. Version `0.3.2` — Helpers typed et notifications typed +Objectif : s’appuyer principalement sur `solana-rpc-client-api` pour typer les subscribe et les notifications. + +Réalisé : + +- helpers typed pour `account`, `block`, `logs`, `program`, `signature`, +- parsing typed des notifications, +- base de travail pour réduire l’usage direct de `serde_json::Value`. + +### 6.008. Version `0.3.3` — Distinction API typed / raw +Objectif : clarifier l’API publique de `WsClient`. + +Réalisé : + +- suffixe `_raw` sur les helpers raw, +- conservation des helpers typed comme interface plus propre, +- préparation d’une hiérarchie API plus explicite. + +### 6.009. Version `0.3.4` — Fenêtre `Demo Ws` dans `kb_demo_app` +Objectif : tester manuellement les souscriptions live dans une fenêtre dédiée. + +Réalisé : + +- fenêtre séparée `demo_ws`, +- ouverture depuis la fenêtre principale, +- connexion/déconnexion d’un client de démo, +- test de souscriptions live, +- affichage des événements raw et typed, +- premiers tests réels sur `wss://api.mainnet.solana.com`. + +### 6.010. Version `0.3.5` — Stabilisation de `Demo Ws` +Objectif : rendre la fenêtre de démonstration robuste sous flux élevé et cohérente avec la configuration. + +Réalisé : + +- lire correctement les endpoints activés depuis la config et refléter les URLs résolues avec `api_key_env_var`, +- améliorer la sélection réelle des endpoints affichés et utilisables, +- ajouter du throttling / rate limiting de l’affichage UI sous fort débit, +- limiter ou résumer les événements affichés côté fenêtre, +- conserver l’intégralité des traces côté `tracing`, +- éviter le gel de la fenêtre sur `logsSubscribe` et `programSubscribe`, +- conserver des compteurs et états UI exploitables, +- mieux gérer les fermetures/ralentissements d’endpoints publics. + +### 6.011. Version `0.4.x` — Transport HTTP générique et helpers RPC + +Objectif : construire un `HttpClient` clonable, limité et extensible, puis ajouter les premiers helpers HTTP Solana. + +### 6.012. Version `0.4.0` — Socle `HttpClient` +Réalisé : + +- client `reqwest` asynchrone clonable, +- résolution d’URL avec support de `api_key_env_var`, +- limiteur local req/sec, +- burst configurable, +- délais configurables, +- profils par endpoint, +- abstraction JSON-RPC HTTP générique, +- premiers appels de validation Solana. + +Livrables : + +- `HttpClient`, +- enveloppes JSON-RPC HTTP, +- premiers appels : + - `getHealth` + - `getVersion` + - `getSlot` + +### 6.013. Version `0.4.1` — Helpers HTTP Solana +Réalisé : + +- ajouter des helpers HTTP haut niveau comme pour le client WS, +- distinguer helpers raw et helpers typed quand cela est pertinent, +- couvrir les premières méthodes utiles du RPC HTTP Solana, +- conserver `HttpClient` comme couche générique réutilisable. + +### 6.014. Version `0.4.2` — Politique HTTP avancée +Réalisé : + +- préparer un état de pause avant envoi pour un endpoint HTTP, +- préparer plusieurs quotas par famille de méthodes, +- distinguer quota RPC général et quota `sendTransaction`, +- préparer un futur pool d’endpoints HTTP et l’arbitrage entre eux. + +### 6.015. Version `0.4.3` — Pool d’endpoints HTTP +Réalisé : + +- ajouter un pool d’`HttpClient`, +- sélectionner un endpoint selon le rôle demandé, +- ignorer les endpoints `Paused` ou `Disabled`, +- préparer une rotation simple entre endpoints actifs, +- prendre en compte la classe de méthode HTTP, +- préparer le routage multi-RPC et la limitation de concurrence par endpoint. + +### 6.016. Version `0.4.4` — Démo HTTP dans `kb_demo_app` +Réalisé : + +- ajout d’une fenêtre `Demo Http`, +- ouverture depuis la fenêtre principale, +- exécution manuelle de méthodes HTTP via le pool d’endpoints, +- affichage des réponses JSON-RPC HTTP et des erreurs associées, +- affichage de l’état du pool HTTP et des statuts des endpoints, +- alignement visuel de la fenêtre sur le gabarit `Demo Ws`, +- amélioration des presets UI, copie de réponse et bascule pretty/raw. + +### 6.017. Version `0.5.x` — Base de données SQLite +Objectif : poser la persistance locale avec une organisation préparée dès le départ à une future évolution vers PostgreSQL ou un autre backend. + +### 6.018. Version `0.5.0` — Socle SQLite +Réalisé : + +- configuration DB dans `config.json`, +- ouverture/validation SQLite, +- façade `kb_lib::Database`, +- premier schéma technique, +- table `k_sol_db_metadata`, +- séparation `db/entities`, `db/dtos`, `db/queries`, `db/types`. + +### 6.019. Version `0.5.1` — Premières tables métier de stockage local +Réalisé : + +- ajout des tables de référence pour les endpoints connus HTTP/WS, +- ajout des tables techniques pour les événements runtime locaux, +- mise en place des `entities`, `dtos`, `queries` et `types` associés, +- préparation du stockage local des endpoints HTTP/WS connus et de leur état utile. + +### 6.020. Version `0.5.2` — Stockage des tokens observés +Réalisé : + +- ajout de la table `k_sol_observed_tokens`, +- stockage minimal des mints, symboles, noms, statuts et dates d’observation, +- ajout du `token_program`, +- préparation des relations futures avec pools, paires et événements on-chain, +- conservation d’unicité locale par mint sans duplication par endpoint. + +### 6.021. Version `0.5.3` — Événements et signaux locaux +Réalisé : + +- conservation des événements runtime techniques via `k_sol_db_runtime_events`, +- ajout des observations on-chain brutes via `k_sol_onchain_observations`, +- ajout des signaux d’analyse via `k_sol_analysis_signals`, +- distinction explicite entre événements runtime, observations on-chain et événements métier, +- préparation de la traçabilité de provenance par type de source et endpoint, sans remettre en cause l’unicité locale d’un token par mint. + +### 6.022. Version `0.5.4` — Modèle métier normalisé initial +Réalisé : + +- ajouter les tables de référence métier pour les DEX, tokens, pools et paires, +- distinguer clairement objets de référence et événements d’activité, +- préparer les relations entre tokens, pools, paires et listings, +- éviter que la détection technique `0.6.x` écrive directement dans des tables trop brutes ou ambiguës. + +### 6.023. Version `0.5.5` — Activité métier normalisée +Réalisé : + +- ajout des tables de swaps, +- ajout des événements de liquidité, +- ajout des événements de mint et burn utiles au suivi des tokens, +- préparation de l’historique métier nécessaire avant l’arrivée des connecteurs DEX complets. + +### 6.024. Version `0.5.6` — Consolidation de la couche stockage +Objectif : stabiliser le schéma avant la détection technique réelle. + +À faire : + +- conserver l’abstraction du backend dès le départ, +- limiter la dépendance directe au SQL concret aux modules `queries`, +- garder les conversions explicites entre entités DB et DTOs applicatifs, +- durcir les relations, contraintes et index utiles, +- préparer une future compatibilité PostgreSQL sans casser l’organisation générale. + +### 6.025. Version `0.6.0` — Pipeline de détection technique +Objectif : relier les connecteurs RPC à la couche de stockage technique et métier. + +À faire : + +- ajouter une façade de persistance pour les observations et signaux issus des connecteurs, +- préparer l’enregistrement des candidats tokens détectés depuis les sources RPC, +- éviter que les futurs watchers RPC écrivent directement dans la DB sans couche intermédiaire, +- préparer les prochaines étapes de détection technique on-chain / RPC. + +### 6.026. Version `0.6.1` — Détection technique RPC +Réalisé : + +- ajout d’un bridge `Solana WS notification -> pipeline de détection`, +- persistance des notifications WS utiles comme observations on-chain normalisées, +- génération d’un candidat token quand une `programNotification` expose un mint SPL / Token-2022 en JSON parsé, +- préparation du branchement futur des watchers et règles RPC réelles sur une façade de détection unique. + +### 6.027. Version `0.6.2` — Branchement `WsClient` vers la détection +Réalisé : + +- ajouter un relais interne de notifications WS vers la couche de détection, +- permettre à `WsClient` de forwarder les `JsonRpcWsNotification` vers un worker dédié, +- conserver le découplage entre transport WS et logique de détection, +- éviter de bloquer la boucle de lecture WS si la détection est lente. + +### 6.028. Version `0.6.3` — Enrichissement des notifications WS utiles +Réalisé : + +- enrichir `accountNotification`, `logsNotification` et `signatureNotification`, +- mieux extraire slot, pubkey, signature, owner, parsed account type et clés pertinentes, +- produire des observations plus précises et plus homogènes, +- préparer les règles de détection techniques réelles. + +### 6.029. Version `0.6.4` — Premières règles de détection technique +Réalisé : + +- détection des premiers candidats pools/listings techniques depuis `programNotification`, +- appui sur les DEX connus en base via `program_id` / `router_program_id`, +- enregistrement des pools candidats et de leur listing initial sans parsing DEX complet, +- alimentation conjointe des observations techniques, signaux d’analyse et tables métier normalisées, +- maintien d’une logique encore indépendante des connecteurs DEX `0.7.x`. + +### 6.030. Version `0.6.5` — Orchestration multi-clients WebSocket +Réalisé : + +- introduction d’une abstraction `ws_manager.rs` pour piloter plusieurs `WsClient`, +- construction des clients WS activés depuis la configuration d’endpoints, +- démarrage et arrêt centralisés par endpoint ou globalement, +- republication d’un flux unifié de `WsEvent` pour l’ensemble des clients gérés, +- branchement optionnel du relais de détection WS sur tous les clients orchestrés, +- préparation des futures politiques de répartition, supervision et reconnexion. + +### 6.031. Version `0.6.6` — Démo légère `WsManager` dans `kb_demo_app` +Réalisé : + +- ajout d’une fenêtre `Demo Ws Manager` dans `kb_demo_app`, +- ouverture depuis la fenêtre principale, +- affichage du snapshot consolidé du `WsManager`, +- pilotage des endpoints WS gérés via `start/stop all` et `start/stop role`, +- visualisation du flux unifié de `WsEvent`, +- validation UI du branchement centralisé du relais de détection, +- amélioration des messages de log UI pour les actions idempotentes déjà démarrées ou déjà arrêtées. + +### 6.032. Version `0.7.0` — Résolution transactionnelle orientée DEX +Réalisé : + +- introduction d’une file de résolution transactionnelle alimentée par les signatures issues des flux WS utiles, +- corrélation initiale des `logsNotification` et `signatureNotification` avec des appels `getTransaction`, +- utilisation du pool HTTP existant pour enrichir les signaux détectés côté WS, +- persistance des résolutions transactionnelles dans `k_sol_onchain_observations` et `k_sol_analysis_signals`, +- préparation du futur modèle transactionnel enrichi sans bloquer les flux temps réel. + +### 6.033. Version `0.7.1` — Modèle transactionnel Solana enrichi +Réalisé : + +- ajout des tables techniques `k_sol_chain_slots`, `k_sol_chain_transactions` et `k_sol_chain_instructions`, +- distinction claire entre slot, transaction résolue et instructions normalisées, +- support des instructions principales et inner instructions, +- ajout des entités, DTOs et requêtes associées, +- ajout d’un service de projection pour transformer une transaction JSON-RPC résolue en modèle transactionnel interne, +- ajout des tests de roundtrip et de projection. + +### 6.034. Version `0.7.2` — Décodeurs DEX spécifiques par programme et version +Réalisé : + +- ajout d’un premier décodeur transactionnel spécifique Raydium AmmV4 / initialize2, +- lecture combinée du `transaction_json` et des instructions projetées, +- extraction des comptes utiles à l’initialisation du pool, +- persistance des événements DEX décodés dans une table dédiée, +- émission d’observations et de signaux dérivés du décodage DEX, +- branchement automatique du décodage DEX depuis le pipeline de résolution transactionnelle, +- préparation de la future détection métier pool / pair / listing. + +### 6.035. Version `0.7.3` — Détection des nouveaux pools et paires via logs + transaction +Réalisé : + +- transformation des événements DEX décodés en objets métier pool / pair / listing, +- alimentation de `k_sol_pools`, `k_sol_pairs`, `k_sol_pool_tokens` et `k_sol_pool_listings`, +- première détection métier pour Raydium AmmV4 / initialize2, +- branchement automatique de la détection métier après résolution, projection et décodage DEX, +- émission de signaux dédiés pour `new_pool`, `new_pair` et `first_listing_seen`, +- garantie d’idempotence sur une même transaction déjà traitée. + +### 6.036. Version `0.7.4` — Connecteurs DEX v1, vague 1 +Réalisé : + +- ajout du décodeur `Pump.fun` pour les créations `create_v2`, +- ajout du décodeur `PumpSwap` pour les trades `buy / sell`, +- intégration des nouveaux décodeurs dans le pipeline générique `dex_decode`, +- ajout de la détection métier `Pump.fun` vers `token / pool / pair / listing`, +- maintien de `PumpSwap` au niveau décodage en attendant un mapping transactionnel plus riche, +- préparation de l’extension vers `Meteora`, `Meteora DBC` et `LaunchLab`. + +### 6.037. Version `0.7.5` — Connecteurs DEX v1, vague 2 +Réalisé : + +- enrichissement du décodeur `PumpSwap` avec extraction des mints et du `pool_v2`, +- persistance des événements `PumpSwap` enrichis dans `k_sol_dex_decoded_events`, +- ajout de la détection métier `PumpSwap` vers `pool / pair / listing`, +- émission des signaux dédiés `new_pool`, `new_pair` et `first_listing_seen`, +- garantie d’idempotence sur une même transaction déjà traitée, +- préparation du lot suivant pour `Meteora`, `Meteora DBC` et `LaunchLab`. + +### 6.038. Version `0.7.6` — Connecteurs DEX v1, vague 3 +Réalisé : + +- ajout du premier décodeur `Meteora DBC`, +- prise en charge initiale des événements `create_pool` et `swap`, +- persistance des événements `Meteora DBC` dans `k_sol_dex_decoded_events`, +- ajout de la détection métier `Meteora DBC` vers `pool / pair / listing`, +- émission des signaux dédiés `new_pool`, `new_pair` et `first_listing_seen`, +- préparation du lot suivant pour `Meteora DAMM v2`, `Meteora DAMM v1` et `LaunchLab / Fun Launch`. + +### 6.039. Version `0.7.7` — Meteora DAMM v2 +Réalisé : + +- ajout du premier décodeur `Meteora DAMM v2`, +- prise en charge initiale des événements de création de pool via `initialize_pool`, `initialize_pool_with_dynamic_config` et `initialize_customizable_pool`, +- prise en charge initiale des swaps via `swap` et `swap2`, +- persistance des événements `Meteora DAMM v2` dans `k_sol_dex_decoded_events`, +- ajout de la détection métier `Meteora DAMM v2` vers `pool / pair / listing`, +- préparation du rattachement futur entre `Meteora DBC` et `Meteora DAMM v2`. + +### 6.040. Version `0.7.8` — Meteora DAMM v1 +Réalisé : + +- ajout du premier décodeur `Meteora DAMM v1`, +- prise en charge initiale des événements de création de pool via `initialize_pool` et `initialize_pool_with_config`, +- prise en charge initiale des swaps via `swap`, +- persistance des événements `Meteora DAMM v1` dans `k_sol_dex_decoded_events`, +- ajout de la détection métier `Meteora DAMM v1` vers `pool / pair / listing`, +- préparation du rattachement futur entre `Meteora DBC` et `Meteora DAMM v1`. + +### 6.041. Version `0.7.9` — Launch origins / Fun Launch +Réalisé : + +- ajout d’un registre des surfaces de lancement, +- ajout d’un registre de clés observables par surface de lancement, +- ajout d’une attribution entre événements/pools détectés et surfaces connues, +- premier support de `Meteora Fun Launch` comme surface d’origine au-dessus de `Meteora DBC`, +- branchement automatique de l’attribution depuis le pipeline de résolution transactionnelle, +- conservation d’une séparation stricte entre protocole on-chain et origine de lancement. + +### 6.042. Version `0.7.10` — Orca / Whirlpools +Réalisé : + +- ajout du premier décodeur `Orca Whirlpools`, +- prise en charge initiale des événements de création de pool via `initialize_pool` et `initialize_pool_v2`, +- prise en charge initiale des swaps via `swap` et `swap_v2`, +- persistance des événements `Orca Whirlpools` dans `k_sol_dex_decoded_events`, +- ajout de la détection métier `Orca Whirlpools` vers `pool / pair / listing`, +- utilisation de `PoolKind::Clmm` pour refléter la nature concentrée de `Whirlpools`. + +### 6.043. Version `0.7.11` — FluxBeam +Réalisé : + +- ajout du premier décodeur `FluxBeam`, +- prise en charge initiale des événements de création de pool via un premier décodage `create_pool / initialize_pool`, +- prise en charge initiale des swaps via `swap`, +- persistance des événements `FluxBeam` dans `k_sol_dex_decoded_events`, +- ajout de la détection métier `FluxBeam` vers `pool / pair / listing`, +- conservation d’un premier décodage heuristique à raffiner ultérieurement avec des transactions FluxBeam réelles. + +### 6.044. Version `0.7.12` — DexLab +Réalisé : + +- ajout du premier décodeur `DexLab Swap/Pool`, +- prise en charge initiale des événements de création de pool via un premier décodage `create_pool / initialize_pool`, +- prise en charge initiale des swaps via `swap`, +- persistance des événements `DexLab` dans `k_sol_dex_decoded_events`, +- ajout de la détection métier `DexLab` vers `pool / pair / listing`, +- conservation d’une séparation entre pool DexLab natif et éventuel `OpenBook Market ID` créé ensuite. + +### 6.045. Version `0.7.13` — Bags / Moonit comme origines de lancement +Réalisé : + +- extension de la couche `launch origins` à `Bags` et `Moonit`, +- ajout d’un enregistrement programmatique des mappings `Bags` à partir des champs `tokenMint`, `dbcConfigKey`, `dbcPoolKey` et `dammV2PoolKey`, +- prise en charge de l’attribution `Bags` par matching exact sur `config_account`, `pool_account` et `token_mint`, +- prise en charge de l’attribution `Moonit` par détection automatique des token mints se terminant par `moon`, +- conservation d’une séparation stricte entre origine de lancement et protocole on-chain. + +### 6.046. Version `0.7.14` — Consolidation multi-DEX +Réalisé : + +- ajout d’une couche commune `pool origins` pour enregistrer la première signature vue par le modèle pour chaque pool détecté, +- rattachement d’un pool à son `decoded_event`, à son `pair`, à son `pool_listing` et à son éventuelle `launch_attribution`, +- amélioration de la traçabilité inter-protocoles sans modifier les connecteurs DEX déjà validés, +- conservation d’une logique idempotente avec mise à jour douce des liens `pair / listing / launch attribution`, +- préparation de la future couche analytique sur une base multi-DEX plus cohérente. + +### 6.047. Version `0.7.15` — Wallets, holdings et participants observés +Réalisé : + +- ajout d’une première couche `wallets` pour les adresses observées dans le pipeline, +- ajout d’une première couche `wallet participations` pour rattacher une adresse à une transaction, un decoded event, un pool et un pair, +- extraction des rôles observés depuis les payloads décodés (`creator`, `payer`, `owner`, `user`), +- branchement automatique depuis le pipeline de résolution transactionnelle, +- report des holdings à l’étape suivante afin de conserver une séparation nette entre acteurs observés et balances observées. + +### 6.048. Version `0.7.16` — Séries de prix, volumes et agrégats DEX +Réalisé : + +- ajout d’une première table `trade events` pour normaliser les swaps observés, +- ajout d’une première table `pair metrics` pour agréger les swaps par paire, +- prise en charge des compteurs `trade_count`, `buy_count`, `sell_count`, +- prise en charge optionnelle des volumes bruts `base` / `quote` et du dernier prix dérivé `quote_per_base`, +- branchement automatique dans le pipeline de résolution transactionnelle, +- conservation d’un modèle simple et idempotent en préparation de futures candles / séries temporelles. + +### 6.049. Version `0.7.17` — Renforcement temps réel WS hybride +Réalisé : + +- conservation de `logsSubscribe` comme source canonique de signatures candidates, +- ajout d’une collecte de cibles `programSubscribe` à partir des DEX actifs connus, +- ajout d’une collecte de cibles `accountSubscribe` à partir des pools actifs connus, +- ajout d’une couche d’observations techniques WS hybrides pour `logs / program / account`, +- ajout d’une première déduplication en mémoire des notifications techniques reçues en parallèle, +- ajout d’une façade runtime pour exposer ce comportement au branchement `ws_manager`. + +### 6.050. Version `0.7.18` — Backfill historique ciblé par token +Réalisé : + +- ajout d’un premier service de backfill ciblé par `token_mint`, +- récupération des signatures historiques via `getSignaturesForAddress`, +- résolution des transactions pertinentes via `getTransaction`, +- relecture du pipeline interne pour reconstruire transactions, décodage DEX, détection métier, origins, wallets et trade metrics, +- ajout d’une seconde passe sur les pools découverts pour le token afin de récupérer des signatures supplémentaires liées à l’activité du pool, +- conservation d’un périmètre ciblé sur des tokens encore actifs au lieu d’un scan exhaustif de la blockchain. + +### 6.051. Version `0.7.19` — Holdings observés +Réalisé : + +- ajout d’une première table `wallet holdings` pour agréger les couples `wallet/token` observés, +- rattachement des holdings observés à la dernière transaction, au dernier decoded event, au dernier pool et au dernier pair connus, +- conservation d’un champ `balance_raw` optionnel sans prétendre encore reconstruire un portefeuille complet, +- alimentation automatique à partir des événements DEX déjà décodés et des wallets déjà observés, +- branchement automatique dans le pipeline de résolution transactionnelle. + +### 6.052. Version `0.7.20` — Candles / OHLCV +Réalisé : + +- ajout d’une première table `pair candles` pour matérialiser les agrégats OHLCV par paire, +- stockage en base des timeframes usuels (`1m`, `5m`, `15m`, `1h`), +- conservation de `trade events` comme source brute de vérité, +- ajout d’un service de régénération à la demande pour un timeframe arbitraire, +- possibilité de choisir dynamiquement le timeframe lors d’une requête analytique, +- branchement automatique dans le pipeline de résolution transactionnelle pour maintenir les candles matérialisées à jour. + +### 6.053. Version `0.7.21` — Signaux analytiques plus riches +Réalisé : + +- ajout d’une première table `pair analytic signals` dédiée aux signaux dérivés par paire, +- prise en charge initiale des signaux `first_trade_seen`, `trade_burst_60s`, `buy_sell_imbalance_60s`, `price_jump_up_60s`, `price_jump_down_60s` et `volume_spike_60s`, +- calcul des signaux à partir des `pair metrics`, `pair candles` et `trade events`, +- persistance idempotente des signaux par paire et par bucket, +- branchement automatique dans le pipeline de résolution transactionnelle. + +### 6.054. Version `0.7.22` — `kb_demo_app` : inspection et tests du pipeline `0.7.x` +Réalisé : + +- ajout d’une fenêtre dédiée `Demo Pipeline` dans `kb_demo_app`, +- inspection du pipeline persistant par `signature`, +- inspection du pipeline persistant par `token mint`, +- inspection du pipeline persistant par `pair id`, +- inspection du pipeline persistant par `pool address`, +- affichage structuré des transactions résolues, événements DEX décodés, pools, paires, listings, launch origins, pool origins, wallets observés, holdings observés, trade events, pair metrics, candles et signaux analytiques, +- possibilité d’utiliser un timeframe custom pour régénérer à la demande les candles non matérialisées, +- conservation d’une instance partagée de `Database` dans `kb_demo_app` afin d’éviter la réouverture de la base et la réinitialisation du schéma à chaque commande UI, +- validation pratique de l’inspection du pipeline `0.7.x` sans dépendre uniquement des logs bruts ou de la consultation manuelle de SQLite. + +### 6.055. Version `0.7.23` — `kb_demo_app` : backfill token ciblé +Réalisé : + +- ajout d’un pilotage UI du backfill historique ciblé par `token mint` dans `kb_demo_app`, +- sélection du `token mint`, du rôle HTTP et des limites de signatures `mint / pool`, +- exécution de `TokenBackfillService` depuis une commande Tauri dédiée, +- affichage du résumé de backfill dans `Demo Pipeline`, +- réinspection automatique du token après backfill lorsque des objets persistés exploitables sont effectivement reconstruits, +- gestion explicite du cas où le backfill réussit sans matérialiser de token exploitable dans la base locale. + +### 6.056. Version `0.7.24` — `kb_demo_app` : visualisation candles / OHLCV +Réalisé : + +- ajout d’un affichage graphique des candles / OHLCV dans `kb_demo_app` via `echarts`, +- sélection dynamique de la paire inspectée, +- sélection dynamique du timeframe disponible, +- affichage conjoint des chandeliers OHLC et du volume, +- prise en charge des candles matérialisées et des candles régénérées à la demande pour un timeframe custom, +- intégration du rendu graphique directement dans `Demo Pipeline`. + +### 6.057. Version `0.7.25` — Enrichissement metadata des tokens +Réalisé : + +- Ajout : + - relecture locale du pipeline à partir des transactions brutes persistantes de la chaîne, + - actualisation optionnelle des métadonnées de jetons manquantes lors de la relecture locale, + - reconstruction des symboles de paires à partir des métadonnées des jetons, + - commandes d’interface utilisateur dans le pipeline de démonstration 2 pour la relecture locale, + - flux de travail d’actualisation du catalogue de jetons/paires piloté par les métadonnées. +- Modifications : + - les symboles de paires sont désormais dérivés comme `BASE/QUOTE` lorsque les deux symboles de jetons sont disponibles, + - l’actualisation des métadonnées évite de nécessiter un remplissage complet de la blockchain lorsque les données de transaction brutes existent déjà localement. +- Corrections : + - suppression des cycles complets de suppression/remplissage répétés pour les métadonnées et les entités locales dérivées, + - conservation de l’accès SQL dans les modules de requêtes de base de données au lieu du SQL brut au niveau du service. + +### 6.058. Version `0.7.26` — Diagnostics locaux, replay et extraction instruction-scoped +Réalisé : + +- Ajout du diagnostic local complet du pipeline persisté : + - transactions OK / échouées, + - événements décodés, + - trade candidates, + - trade events, + - candles, + - tokens, + - pools, + - pairs, + - diagnostics par DEX, + - diagnostics par paire, + - samples d’événements manquants ou multi-trades. +- Ajout des compteurs de santé du pipeline : + - `diagnosticsClean`, + - `blockingIssueCount`, + - `actionableMissingTradeEventCount`, + - `ignoredFailedTransactionTradeCandidateCount`, + - `duplicateDecodedEventTradeCount`, + - `multiTradeSignaturePairCount`, + - `duplicateCandleBucketCount`. +- Correction de l’agrégation des trades Raydium via extraction instruction-scoped des transferts SPL Token depuis `meta.innerInstructions`. +- Correction des cas CPMM contenant plusieurs swaps dans une même transaction, sans mélange des montants entre instructions. +- Conservation des transactions échouées comme événements décodés traçables, sans génération de `k_sol_trade_events`. +- Clarification des compteurs de replay : + - `pairCandleUpsertCount`, + - `analyticSignalUpsertCount`. +- Validation : + - aucun trade candidate issu d’une transaction OK n’est perdu, + - aucun trade event invalide n’est persisté, + - aucun doublon réel par `decoded_event_id`, + - aucune candle dupliquée par bucket, + - aucune paire sans trade ni candle après replay, + - seuls les trade candidates issus de transactions échouées restent ignorés. + +### 6.059. Version `0.7.27` — Validation multi-DEX des connecteurs déjà branchés +Objectif : verrouiller la non-régression du pipeline actuel avant d’ajouter de nouveaux DEX ou d’ouvrir la phase d’analyse `0.8.x`. + +Réalisé / validé : + +- replay local et bases neuves de test utilisés pour stabiliser `pump_fun`, `pump_swap`, `raydium_cpmm` et `raydium_clmm` ; +- aucun nouveau DEX ajouté dans cette étape : la version a bien servi de verrou de non-régression ; +- vérification du triptyque `decoded_event_count / trade_event_count / pair_candle_count` par DEX ; +- garde-fous maintenus sur `diagnosticsClean`, `blockingIssueCount`, `actionableMissingTradeEventCount`, `duplicateDecodedEventTradeCount` et `duplicateCandleBucketCount` ; +- refus des trades sans montant ou prix exploitable ; +- conservation des transactions échouées comme decoded events traçables sans produire de `k_sol_trade_events` ; +- maintien des champs d’enrichissement dans `payload_json` : `eventCategory`, `tradeCandidate`, `candleCandidate`, `liquidityCandidate`, `feeCandidate`, `rewardCandidate`, `adminCandidate`, `poolLifecycleCandidate` ; +- couverture testée dans les zones critiques : `dex_decode`, `dex_detect`, `trade_aggregation`, `pair_candle_aggregation`, `pair_analytic_signal`, `local_pipeline_replay`, `local_pipeline_diagnostics` ; +- requêtes SQL de diagnostic conservées comme contrôle manuel après backfill ou replay local. + +### 6.060. Version `0.7.28` — Refactor DEX commun et préparation extension +Réalisé : + +- ne pas toucher à `ws_client.rs`, `ws_manager.rs`, `http_client.rs`, `http_pool.rs` ni aux couches JSON-RPC déjà stabilisées, +- extraire depuis `dex_decode.rs` les catégories communes d’événements : trade, candle candidate, liquidity candidate, fee candidate, reward candidate, admin candidate, pool lifecycle candidate, +- créer une représentation interne documentée pour les familles d’événements DEX afin d’éviter les chaînes dispersées dans plusieurs fichiers, +- clarifier la différence entre événement décodé, événement actionnable, trade candidate, candle candidate et événement conservé seulement pour analyse, +- simplifier `dex_decode.rs` en gardant son rôle de service de persistance-orchestration, +- simplifier `dex_detect.rs` en extrayant les helpers communs pool/pair/listing/origin/wallet quand cela réduit la duplication, +- homogénéiser les contrats des modules `kb_lib/src/dex/*.rs` sans imposer trop tôt un trait générique lourd, +- vérifier la rustdoc publique : utile, courte, orientée responsabilité ; supprimer la documentation redondante ou trop chargée, +- conserver les tests verts et ajouter des tests de non-régression sur les catégories d’événements existantes. + +Contraintes : + +- refactor agressif autorisé si le résultat est plus propre, +- chaque changement doit rester rejouable et testable, +- aucun changement de comportement métier volontaire dans cette version, +- aucun événement non price-action ne doit devenir un trade ou une candle. + +### 6.061. Version `0.7.29` — Matrice DEX commune et validation baseline +Réalisé : + +- ajouter `kb_lib/src/dex_support_matrix.rs` comme source commune de metadata DEX/surfaces ; +- exposer pour chaque entrée : code interne, famille, version, type de surface, program id connu ou à vérifier, support actuel, statut, confiance, raisons de skip et activation catalogue ; +- raccorder `dex_catalog`, `transaction_classification` et `protocol_candidate_recording` à cette matrice ; +- ajouter le profil `0.7.29_multi_dex_matrix_baseline` ; +- exposer la matrice dans le rapport de validation local ; +- conserver explicitement le comportement `0.7.28` : transactions failed traçables mais non actionnables, et `meteora_damm_v1.swap` sans payload montant/prix non candidat trade/candle. + +Matrice cible initiale : + +| Code cible | Type | Statut `0.7.29` | Objectif immédiat | +|---|---:|---|---| +| `pump_fun` | launch + bonding curve | partiel | rattacher mint initial, bonding curve et migration | +| `pump_swap` | AMM / swap | supporté | conserver trades/candles | +| `raydium_cpmm` | AMM | supporté | conserver trades/candles | +| `raydium_clmm` | CLMM | supporté | conserver trades/candles | +| `raydium_launchpad` | launch surface | planifié, program id local connu | ajouter decoder/materialization dédiée | +| `raydium_amm_v4` | AMM legacy | partiel | corpus dédié après autres Raydium | +| `raydium_router` | router | partiel | ne pas matérialiser en trade direct avant preuve | +| `raydium_stable_swap` | AMM legacy | supporté / 0.7.52 clos | swaps depuis deltas vault exacts ; failed tx decoded-only | +| `meteora_dlmm` | DLMM | supporté | verrouiller corpus et non-régression | +| `meteora_damm_v1` | AMM legacy | partiel | garder skip explicite sans payload montant/prix | +| `meteora_damm_v2` | AMM | partiel | corpus et séparation events | +| `meteora_dbc` | launch / bonding curve | partiel | lifecycle, migration, swaps utiles | +| `meteora_dlc` | à vérifier | à vérifier | confirmer surface/program id avant intégration | +| `orca_whirlpools` | CLMM | partiel | validation par corpus | +| `fluxbeam` | AMM | partiel | validation par corpus | +| `dexlab` | AMM | partiel | validation par corpus | +| `bags` | launch surface | planifié | attribution fiable, migration si prouvée | +| `letsbonk` / `bonk` | launch surface | planifié | origine mint/lancement, sans supposer un AMM autonome | +| `okx_dex` | aggregator/router | planifié | classifier sans trade direct avant preuve | +| `boop_fun` | launch surface | planifié | origine mint/lancement/migration | +| `moonshot` / `moonit` | launch surface | planifié | corpus, éviter heuristique faible | +| `believe` | launch surface | planifié | confirmer comptes et migrations | +| `heaven` | launch + AMM candidat | planifié | corpus et séparation launch/swap | +| `zora` | à vérifier | à vérifier | hors phasage actif avant preuve Solana | + +### 6.062. Version `0.7.30` — Classification fine des événements DEX décodés +Réalisé : + +- ajouter `DexEventLifecycleKind` pour distinguer `trade_swap`, `pool_creation`, `pair_creation`, `liquidity_add`, `liquidity_remove`, `position_open`, `position_close`, `migration`, `launch`, `mint`, `burn`, `fee_collection`, `reward`, `admin_config` et `unknown`, +- ajouter `DexEventActionability` pour distinguer `trade_candidate`, `non_actionable_trade`, `non_trade_useful`, `failed_transaction`, `informational` et `unknown`, +- enrichir les payloads décodés avec `eventLifecycleKind`, `eventActionability` et `nonTradeUseful`, +- exposer les compteurs diagnostics `decodedNonTradeUsefulEventCount`, `decodedNonActionableTradeEventCount` et `decodedUnknownEventCount`, +- ajouter un résumé diagnostic par catégorie / lifecycle / actionability, +- ajouter le profil `0.7.30_non_trade_event_classification`, +- ne pas matérialiser encore les événements non-trade dans leurs tables dédiées. + +### 6.063. Version `0.7.31` — Politique de matérialisation des failed transactions +Réalisé : + +- empêcher `TradeAggregationService` de matérialiser une transaction dont `err_json` est renseigné ; +- conserver les événements DEX décodés des failed transactions pour audit et diagnostic ; +- réinitialiser les tables dérivées de marché pendant le replay local : `k_sol_trade_events`, `k_sol_pair_metrics`, `k_sol_pair_candles`, `k_sol_pair_analytic_signals` ; +- reconstruire ensuite les trades/candles uniquement à partir des événements `tradeCandidate=true` et de transactions OK ; +- exposer `resetMarketMaterializationDeletedCount` dans le résultat de replay UI ; +- conserver la validation multi-DEX et la matrice DEX comme garde-fous avant d’ajouter les surfaces restantes. + +### 6.064. Version `0.7.32` — Sémantique des diagnostics et compteurs de validation +Réalisé : + +- conserver la politique `0.7.31` : transactions failed traçables mais exclues des `trade_events`, metrics et candles ; +- clarifier que `pairWithoutTradeCount` et `pairWithoutCandleCount` sont des compteurs de gaps bloquants/actionnables, pas des compteurs littéraux sur tout le catalogue ; +- ajouter `literalPairWithoutTradeCount` et `literalPairWithoutCandleCount` pour les paires de catalogue sans trade/candle matérialisé ; +- ajouter `blockingPairWithoutTradeCount` et `blockingPairWithoutCandleCount` comme noms explicites des anciens compteurs bloquants ; +- ajouter les compteurs de matérialisation par paire : `tradeMaterializedPairCount`, `candleMaterializedPairCount`, `actionablePairCount`, `candleBucketTimeframeCount` et `candlesAreBucketed` ; +- ajouter `pairActionabilitySummaries` pour distinguer les paires matérialisées, actionnables sans matérialisation, candidates failed, non-actionables, décodées sans trade candidate et catalog-only ; +- ajouter le profil `0.7.32_validation_report_semantics` ; +- ajouter des garde-fous de validation sur la matrice DEX : entrées `supported` entièrement matérialisées, entrées `partial` avec `skipReason`, entrées `planned/to_verify` non activées au catalogue ; +- ne pas modifier la logique de replay, trade aggregation ou candle aggregation validée en `0.7.31`. + +Repoussé après cette clarification : consolider les transactions inconnues et protocol candidates sans polluer les trades/candles. + +### 6.065. Version `0.7.33` — Readiness trading des paires +Réalisé : + +- ajouter une classification diagnostique `pairTradingReadiness` pour chaque paire inspectée localement ; +- distinguer `direct_wsol_quote`, `direct_stable_quote`, `inverse_wsol_base`, `inverse_stable_base`, `cross_quote_requires_router`, `unknown_quote` et `non_trade_materialized` ; +- exposer `quoteAssetClass` et `tradingRouteRequired` dans les diagnostics par paire ; +- ajouter `pairTradingReadinessSummaries` dans le résumé local du pipeline ; +- ajouter le profil `0.7.33_pair_trading_readiness` ; +- valider que les résumés de readiness couvrent toutes les paires et restent cohérents avec les compteurs `tradeMaterializedPairCount`, `tradeEventCount` et `pairCandleCount` ; +- ne pas modifier la logique de replay, `trade_events`, metrics ou candles. + +Objectif : préparer la future couche d’achat/vente en distinguant les paires immédiatement exploitables contre WSOL/stable des paires qui nécessitent inversion de lecture ou routeur/aggregator. + +### 6.066. Version `0.7.34` — Événements non-trade v1 : liquidité et cycle de vie pool +Réalisé : + +- stabiliser et étendre `k_sol_liquidity_events` au lieu de la recréer inutilement, +- ajouter `k_sol_pool_lifecycle_events`, +- matérialiser les événements `initialize`, `create_pool`, `migrate`, `open_position`, `close_position`, `increase_liquidity`, `decrease_liquidity`, `add_liquidity`, `remove_liquidity` et assimilés, +- rattacher chaque événement à `dex_id`, `pool_id`, `pair_id`, `transaction_id`, `decoded_event_id`, `signature` et `slot` lorsque les informations existent, +- conserver le `payload_json` source pour audit, +- alimenter les diagnostics locaux avec les compteurs liquidité/lifecycle, +- garantir qu’un événement de liquidité ou de cycle de vie ne produit jamais de candle directement. + +### 6.067. Version `0.7.35` — Événements non-trade v2 : fees, rewards et administration +Objectif : conserver les événements utiles au risque, au scoring, à l’économie du pool et à la traçabilité opérationnelle. + +Réalisé : + +- ajout des tables `k_sol_fee_events`, `k_sol_reward_events` et `k_sol_pool_admin_events` ; +- ajout des DTO, entities, requêtes, index et re-exports associés ; +- matérialisation contrôlée des événements fees/rewards/admin lorsque la classification et les comptes le permettent ; +- rattachement aux transactions, decoded events, pools et paires lorsque les données disponibles sont fiables ; +- raccordement aux diagnostics locaux via `feeEventCount`, `rewardEventCount` et `poolAdminEventCount` ; +- ajout du profil `0.7.35_non_trade_fee_reward_admin` ; +- invariant maintenu : aucun fee/reward/admin ne produit de trade, metric ou candle. + +Limite connue : le corpus local `0.7.38` ne contient pas encore d’événements fee/reward/admin matérialisés ; les compteurs peuvent donc rester à zéro sans bloquer la validation. + +### 6.068. Version `0.7.36` — Meteora : DBC / DAMM v1 / DAMM v2 / DLMM +Réalisé : + +- consolidation de Meteora comme famille multi-programmes au lieu de traiter `DBC`, `DAMM v1`, `DAMM v2` et `DLMM` comme des cas isolés ; +- ajout/correction des discriminants et classifications utiles pour `meteora_damm_v2`, `meteora_dbc`, `meteora_damm_v1` et `meteora_dlmm` ; +- correction du cas `meteora_damm_v2` où la classification de data était appelée depuis le mauvais scope ; +- ajout de garde-fous sur les fixtures et les instructions internes afin d’éviter les faux positifs ; +- validation du profil `0.7.36_meteora_family_consolidation` sur corpus local mixte ; +- conservation de `meteora_damm_v2.swap` et `meteora_dbc.swap` sans payload montant/prix fiable comme `non_actionable_trade` ; +- suppression des faux diagnostics bloquants liés aux swaps Meteora sans amounts : `missingTradeEventCount = 0`, `decodedTradeCandidateWithoutTradeEventCount = 0`, `decodedTradeCandidateWithoutAmountPayloadCount = 0` ; +- maintien de l’invariant : aucun événement sans montant/prix exploitable ne peut alimenter `trade_events`, `pair_metrics` ou `pair_candles` ; +- documentation de la limite connue : `meteora_damm_v2` et `meteora_dbc` peuvent être observés et décodés sans être encore matérialisables en trades/candles. + +### 6.069. Version `0.7.37` — Token metadata et catalogue local +Objectif : rendre le catalogue local exploitable et lisible avant d’ajouter davantage de launch surfaces. + +Réalisé : + +- ajout du profil `0.7.37_token_metadata_catalog_enrichment` ; +- exposition des compteurs metadata/catalog dans les diagnostics et le rapport de validation : `tokenCount`, `tokenMetadataMissingCount`, `tradableTokenMetadataMissingCount`, `quoteTokenMetadataMissingCount`, `pairSymbolFallbackCount`, `pairSymbolResolvedCount`, `wsolQuotePairCount`, `stableQuotePairCount` ; +- raccordement UI Demo Pipeline 2 au profil `0.7.37` puis au profil `0.7.38` ; +- maintien volontaire du caractère non bloquant des metadata manquantes ; +- backfill metadata des tokens déjà présents dans `k_sol_tokens` sans nécessiter un nouveau backfill transactionnel ; +- enrichissement depuis les sources disponibles : registre local, payloads Pump.fun, comptes SPL/Token-2022, Metaplex lorsque le service dispose d’un `HttpEndpointPool` ; +- rafraîchissement des `pair_symbol` après enrichissement des tokens ; +- commande UI disponible via `Demo Pipeline 2 > Replay local > Refresh missing token metadata` avec limite dédiée ; +- idempotence attendue : le backfill metadata met à jour tokens et symboles de paires sans recréer pools, paires, trades, candles ou origins ; +- registre local minimal consolidé : `SOL`, `WSOL`, `USDC`, `USDT`. + +Limite non bloquante : les diagnostics détaillés par origine de découverte restent une amélioration de confort ; l’étape `0.7.38` fournit déjà une liste priorisée exploitable via `tokenMetadataGapSamples`. + +### 6.070. Version `0.7.38` — Priorisation des metadata manquantes +Objectif : transformer les compteurs metadata/catalog de `0.7.37` en liste d’action priorisée sans rendre les metadata manquantes bloquantes. + +Réalisé : + +- ajout du profil `0.7.38_token_metadata_gap_prioritization` ; +- exposition de `tokenMetadataGapSamples` dans les diagnostics locaux, la validation et les bindings Demo Pipeline 2 ; +- priorisation des tokens manquants par usage : `tradable_quote_missing_metadata`, `tradable_token_missing_metadata`, `quote_token_missing_metadata`, puis `catalog_token_missing_metadata` ; +- raccordement Demo Pipeline 2 au nouveau profil par défaut ; +- conservation de l’invariant : les metadata manquantes ne créent pas de blocking issue tant que les trades/candles actionnables restent sains ; +- validation locale confirmée avec `validationPassed = true`, `blockingIssueCount = 0`, `missingTradeEventCount = 0`, `decodedTradeCandidateWithoutTradeEventCount = 0` ; +- les samples permettent de sélectionner les prochains mints à enrichir via registre local, payloads DEX, Token-2022, Metaplex ou backfill HTTP. + +Décision : `0.7.38` est clos. La clôture `0.7.38-B` conserve la logique de stable quotes limitée à `USDC`/`USDT` et ajoute un registre metadata local pour `JUP`, `RAY` et `BONK` sans les classer automatiquement comme quotes. La suite de développement commence à `0.7.39` avec une priorité DEX-first : consolider les DEX effectifs de swap avant de revenir aux launch surfaces. + +### 6.071. Version `0.7.39` — Réorientation DEX-first et inventaire des DEX effectifs +Objectif : remplacer la priorité précédemment donnée aux launch surfaces par une consolidation des vrais DEX sur lesquels les swaps et événements de marché sont exécutés. + +Réalisé : + +- modification de la matrice DEX pour distinguer explicitement les rôles de surface : `dex_effective`, `aggregator_router`, `launch_surface`, `to_verify` ; +- suppression de l’alias ambigu `raydium` comme code DEX autonome ; `raydium` reste uniquement une famille, avec `raydium_amm_v4` comme surface legacy explicite ; +- ajout de `metaDAO` et `Printr` comme entrées `to_verify` sans `program_id` inventé ; +- conservation des DEX de swap principaux déjà connus dans la matrice : `pump_swap`, `raydium_cpmm`, `raydium_clmm`, `raydium_amm_v4`, `raydium_stable_swap`, `meteora_dlmm`, `meteora_damm_v1`, `meteora_damm_v2`, `meteora_dbc`, `orca_whirlpools`, `fluxbeam`, `dexlab` ; +- maintien des launch surfaces comme surfaces reportées et non prioritaires ; +- ajout du profil `0.7.39_dex_first_effective_swap_surfaces` ; +- validation locale confirmée avec `validationPassed = true`, `blockingIssueCount = 0`, `actionableMissingTradeEventCount = 0` et `missingTradeEventCount = 0` ; +- confirmation par corpus local initial que Raydium CLMM est observé ; les tranches ultérieures ont ensuite clôturé Raydium AMM v4 en `0.7.51` et Stable Swap en `0.7.52`. + +Décision : `0.7.39` est clos. La suite immédiate ne doit pas commencer par un décodeur Raydium AMM v4 sans corpus. Il faut d’abord ajouter les outils de découverte on-chain et de backfill ciblé afin d’obtenir des signatures, pools/state accounts, token mints et instructions exploitables. + +### 6.072. Version `0.7.40` — Demo3 on-chain discovery et backfill par signature +Objectif : ajouter les outils de constitution de corpus nécessaires avant de consolider les décodeurs DEX incomplets. + +Réalisé : + +- ajout de `Demo3` dans `kb_demo_app` pour rechercher on-chain à partir d’un `dex_code` et/ou d’un `program_id` ; +- utilisation de la chaîne `getSignaturesForAddress(program_id)` puis `getTransaction(signature)` pour récupérer des transactions récentes liées à un programme DEX ; +- extraction générique, indépendante des décodeurs DEX existants, de preuves on-chain : `observedTokenMints`, `tokenBalanceDeltas`, `candidatePoolAccounts`, `candidateTokenVaultAccounts` et `candidateProgramAccounts` ; +- distinction explicite entre `verifiedPoolAddress` et comptes candidats : un compte candidat n’est pas promu en pool vérifié sans décodage/layout/corpus fiable ; +- conservation de `metaDAO` et `Printr` comme surfaces à vérifier sans `program_id` ; +- ajout du backfill par signature dans Demo Pipeline 2, en complément du backfill par token mint et pool address ; +- réutilisation du pipeline existant pour le backfill signature : résolution transactionnelle, projection `k_sol_chain_transactions` / `k_sol_chain_instructions`, décodage DEX existant, détection, matérialisation non-trade, trades, candles et classification ; +- validation pratique sur `raydium_amm_v4` : les signatures et inner instructions associées au programme `675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8` sont maintenant persistées et inspectables ; +- observation de patterns Raydium AMM v4 récurrents dans les instructions projetées : `accounts_json[1]` comme candidat pool/state, `accounts_json[2]` comme autorité Raydium AMM, `accounts_json[3]` et `accounts_json[4]` comme vaults candidats, avec les comptes utilisateur en fin d’instruction ; +- maintien des invariants : aucune transaction failed ne produit `trade_events`, metrics ou candles ; aucun candidat sans montants exploitables ne devient trade/candle ; aucun `program_id` n’est inventé. + +Décision : `0.7.40` est clos. `Demo3` et Demo Pipeline 2 suffisent pour constituer le corpus nécessaire à la suite immédiate. `Demo4` est décalée à une version ultérieure, car la priorité est maintenant d’utiliser le corpus on-chain local pour consolider `raydium_amm_v4`. + +### 6.073. Version `0.7.41` — Raydium AMM v4 swap decoder v1 +Objectif : ajouter un premier décodeur fiable pour les swaps Raydium AMM v4 observés dans le corpus constitué avec Demo3 et Demo Pipeline 2. + +Réalisé : + +- ajout du décodeur `raydium_amm_v4.swap` pour les instructions de swap AMM v4 ; +- prise en charge des inner instructions dont `program_id = 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8`, notamment lorsqu’elles sont appelées via Jupiter ou un autre routeur top-level ; +- conservation dans le payload décodé des informations de routage utiles : `routeSource`, programme parent, `innerInstruction`, `instructionIndex`, `innerInstructionIndex` et comptes complets ; +- extraction des comptes selon les layouts observés : token program, pool/state, authority, vault A, vault B, comptes intermédiaires et comptes utilisateur lorsque disponibles ; +- dérivation des mints et montants via deltas SPL Token et transferts instruction-scoped, avec refus des cas sans payload exploitable ; +- production de `eventActionability = trade_candidate` uniquement lorsque les mints et montants sont exploitables ; +- matérialisation des pools, paires, listings, `trade_events`, metrics et candles uniquement pour les transactions OK ; +- maintien des transactions failed comme traçables mais sans `trade_events`, metrics ni candles ; +- ajout du profil `0.7.41_raydium_amm_v4_swap_decoder` dans la validation locale et dans Demo Pipeline 2 ; +- mise à jour de la matrice DEX : `raydium_amm_v4` passe en `observed = true`, `status = supported`, `confidence = high`, sans `skipReason` ; +- validation locale confirmée avec `validationPassed = true`, `blockingIssueCount = 0`, `warningCount = 0`, `actionableMissingTradeEventCount = 0`, `missingTradeEventCount = 0`, `decodedTradeCandidateWithoutAmountPayloadCount = 0` et `invalidTradeEventCount = 0`. + +Résultat de corpus validé : `raydium_amm_v4` produit 58 decoded events, 58 trade candidates, 58 trade events, 11 pools/paires et 147 candles sur la base de test Raydium AMM v4. Les routes Jupiter ou routeurs top-level restent annotées comme sources de route, tandis que le decoded event métier est attribué au DEX effectif `raydium_amm_v4`. + +Décision : `0.7.41` est clos. La suite immédiate est `0.7.42_raydium_family_consolidation` afin de verrouiller ensemble `raydium_cpmm`, `raydium_clmm`, `raydium_amm_v4` et les surfaces Raydium non encore matérialisées. + +### 6.074. Version `0.7.42` — Raydium family consolidation +Objectif : verrouiller ensemble `raydium_cpmm`, `raydium_clmm` et `raydium_amm_v4` comme surfaces Raydium effectives supportées, avec swaps et premiers non-swaps prouvés. + +Réalisé : + +- ajout du profil `0.7.42_raydium_family_event_coverage` ; +- conservation audit des instructions Raydium non décodées en `raydium_*.instruction_audit`, non-actionnables, sans trade/candle ; +- enrichissement des audits avec comptes, data base58, discriminator hex, `instructionIndex`, `innerInstructionIndex`, programme parent et statut de transaction ; +- décodage du legacy CLMM `raydium_clmm.swap` en plus de `raydium_clmm.swap_v2` ; +- cleanup des audits remplacés : un audit d’instruction est supprimé lorsqu’un vrai événement est maintenant décodé pour la même instruction ; +- adaptation du backfill historique : `getTransaction` classé en requête HTTP lourde, retry/backoff et poursuite du backfill en cas d’erreur transitoire ; +- mapping des discriminators CLMM prouvés : `decrease_liquidity_v2`, `increase_liquidity_v2`, `open_position_with_token22_nft`, `close_position` ; +- mapping des discriminators CPMM prouvés : `initialize`, `withdraw`, `collect_creator_fee` ; +- matérialisation des événements non-trade Raydium prouvés dans les tables dédiées : `k_sol_liquidity_events`, `k_sol_pool_lifecycle_events`, `k_sol_fee_events` ; +- validation manuelle par SQL du corpus Raydium : swaps AMM v4/CLMM/CPMM matérialisés, `25` liquidity events, `1` lifecycle event, `2` fee events, aucune instruction Raydium orpheline ; +- conservation des non-swaps AMM v4 legacy en audit informatif : les discriminators AMM v4 restants ne sont pas promus sans preuve suffisante ; +- correction de validation rapide pour grosses bases SQLite afin d’éviter de charger les diagnostics détaillés par paire pendant la validation. + +Limite connue non-Raydium : un corpus local peut encore contenir des événements `orca_whirlpools.swap` partiels. Orca Whirlpools est explicitement reporté à `0.7.44`; cela ne remet pas en cause la clôture Raydium `0.7.42`. + +Décision : `0.7.42` est clos côté Raydium. Le lot `0.7.43` ouvert pour Meteora n’est pas considéré comme clos : il devient le point de reprise `0.7.43-E5C`, puis la suite est découpée en étapes plus petites pour éviter les lots multi-DEX trop larges. + +### 6.075. Version `0.7.43` — Point de reprise, normalisation DEX-first et documentation +Objectif : figer le point de reprise après saturation de session, clarifier l’état réel du corpus et empêcher la roadmap de regrouper plusieurs DEX/versions dans une seule tranche de validation. + +À faire / acté : + +- documenter que `0.7.43` n’est pas une clôture Meteora complète ; +- conserver les résultats locaux observés : `2956` transactions, `7159` decoded events, `2738` trade events, `0` liquidity events sur le corpus courant, `1` lifecycle event, `0` fee/reward/admin events ; +- acter que les nombreux `instruction_audit` Meteora sont une dette de décodage, pas une preuve d’événements non-trade matérialisés ; +- imposer un ordre de travail : vrais DEX effectifs, puis launch surfaces, puis DEX historiques/legacy ; +- imposer une validation séparée par DEX/version : `meteora_dlmm`, `meteora_damm_v1`, `meteora_damm_v2`, `meteora_dbc`, etc. ; +- distinguer les statuts `known`, `observed`, `decoded`, `materialized`, `verified_by_corpus` ; +- maintenir la règle : aucun `program_id` n’est vérifié sans signature/corpus/requête de validation. + +### 6.076. Version `0.7.44` — Ledger de décodage/replay et skip sûr +Objectif : empêcher le replay local de rescanner inutilement les transactions dont le décodage DEX est déjà certifié pour la même version logique de decoder, tout en laissant les tables dérivées se reconstruire normalement. + +Statut : implémenté en première tranche transaction-level. + +Fait : + +- ajout de `k_sol_dex_decode_replay_ledger` dans `kb_lib/src/db/schema.rs` ; +- stockage de `transaction_id`, `signature`, `decoder_scope`, `decoder_version`, `decode_status`, `certainty`, `event_count`, `distinct_token_mint_count`, `force_replay_required`, reason et timestamps ; +- ajout des entities/dtos/queries associées ; +- mise à jour des re-exports dans `kb_lib/src/db.rs` puis `kb_lib/src/lib.rs` ; +- intégration dans `local_pipeline_replay.rs` sans changer la sémantique trade/candle : le skip ne concerne que `DexDecodeService`, pas la détection, la matérialisation non-trade, les trades, candles, signaux analytiques ou classifications ; +- ajout de `skip_certified_dex_decode` et `force_decode_replay` dans `LocalPipelineReplayConfig` ; +- marquage `unsafe` des transactions multi-event ou avec plus de deux mints distincts dans les events décodés ; +- version logique initiale `dex_decode.v0.7.44.ledger1`, à incrémenter lorsqu’un decoder change de comportement. + +Reste à faire plus tard : + +- descendre le ledger au niveau instruction/program lorsque nécessaire ; +- ajouter un hash d’entrée transaction/instruction pour détecter les mutations de payload ; +- ajouter des filtres plus fins côté UI pour diagnostiquer les lignes ledger `unsafe` ; +- ajouter des diagnostics dédiés dans `local_pipeline_diagnostics`. + +### 6.077. Version `0.7.45` — `meteora_dlmm` séparé +Objectif : consolider `meteora_dlmm` comme DEX effectif séparé, avec corpus dédié et events utiles au trading, sans mélanger DAMM v1, DAMM v2 ou DBC. + +Statut : clos sur le corpus DLMM local élargi. + +Fait : + +- constitution d’un corpus dédié `meteora_dlmm` via `Demo3`, backfill manuel des signatures anciennes du pool `HTvjzsfX3yU6BUodCjZ5vZkUrAxMDTrBs3CJaq43ashR`, puis backfill par pool address ; +- confirmation locale du programme DLMM observé `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo` dans les transactions du corpus ; +- traitement du wrapper Anchor `anchor_self_cpi_log` `e445a52e51cb9a1d` ; +- mapping prouvé localement et par IDL/upstream Git des Anchor CPI swap events : `516ce3becdd00ac4` -> `Swap`, `2e7452d7941b544d` -> `Swap2Evt` ; +- enrichissement du payload `meteora_dlmm.swap` avec `anchorSwapEvent`, montants et fees CPI décodés ; +- cleanup conservatoire des audits Anchor CPI swap déjà couverts par un swap DLMM matérialisé ; +- ajout des events Anchor CPI non-swap DLMM observés : `lb_pair_create_event`, `add_liquidity_event`, `remove_liquidity_event`, `claim_fee_event`, `claim_reward_event` / `fund_reward_event` côté decoder, `position_create_event`, `position_close_event` ; +- promotion du discriminant direct `claim_fee2` vers `meteora_dlmm.claim_fee2` ; +- promotion de `close_position_if_empty` comme event de lifecycle/position close prouvé localement ; +- promotion de `remove_liquidity_by_range2`, `add_liquidity_by_strategy2` et `add_liquidity_by_weight` selon les layouts upstream Git et le corpus local ; +- matérialisation validée des families non-trade dans les tables dédiées, notamment `k_sol_liquidity_events`, `k_sol_pool_lifecycle_events` et `k_sol_fee_events` ; +- maintien du ledger replay avec `effective_event_count`, afin que les `.instruction_audit` informatifs ne rendent pas inutilement les transactions `unsafe` ; +- version logique finale du replay pour la tranche : `dex_decode.v0.7.45.dlmm_add_liquidity_strategies1` ; +- maintien de la règle : aucun nouveau `program_id` n’est vérifié sans corpus. + +Validation locale finale observée sur la base DLMM dédiée : + +| Indicateur | Valeur | +|---|---:| +| transactions rejouées | `3027` | +| trades matérialisés | `530` | +| liquidity events matérialisés | `15` | +| lifecycle events matérialisés | `6` | +| candles upsert | `2120` | +| audits DLMM résiduels | `2` | + +Events DLMM observés après replay : + +- `meteora_dlmm.swap` ; +- `meteora_dlmm.create_pool` ; +- `meteora_dlmm.lb_pair_create_event` ; +- `meteora_dlmm.initialize_bin_array` ; +- `meteora_dlmm.initialize_position` ; +- `meteora_dlmm.position_create_event` ; +- `meteora_dlmm.position_close_event` ; +- `meteora_dlmm.close_position_if_empty` ; +- `meteora_dlmm.add_liquidity_event` ; +- `meteora_dlmm.add_liquidity_by_strategy2` ; +- `meteora_dlmm.add_liquidity_by_weight` ; +- `meteora_dlmm.remove_liquidity_event` ; +- `meteora_dlmm.remove_liquidity` ; +- `meteora_dlmm.remove_liquidity_by_range2` ; +- `meteora_dlmm.claim_fee_event` ; +- `meteora_dlmm.claim_fee2`. + +Limite conservée : + +- `e445a52e51cb9a1d + e8abf2613a4d232d` reste en `meteora_dlmm.instruction_audit` avec `proofStatus = observed_local_corpus_anchor_self_cpi_log`, faute de mapping upstream Git/IDL confirmé. Ces deux audits ne sont pas promus et ne bloquent pas la clôture de `0.7.45`. + +Décision : `0.7.45` est clos pour `meteora_dlmm`. La suite immédiate est `0.7.46 — Demo3 multi-target discovery enabled` sur `meteora_damm_v1` uniquement. + +### 6.078. Version `0.7.46` — `meteora_damm_v1` séparé +Objectif : reprendre `meteora_damm_v1` sans le mélanger à DAMM v2, DBC ou DLMM. + +Tranche `0.7.46` engagée sur les audits `meteora_damm_v1` observés dans le corpus local et mappés contre upstream Git decoder source `meteora-pools-decoder`. + +Events DAMM v1 ajoutés côté decoder : + +- `meteora_damm_v1.create_pool` pour les créations constant-product avec config upstream Git `InitializePermissionlessConstantProductPoolWithConfig` et `InitializePermissionlessConstantProductPoolWithConfig2`, en plus des chemins legacy déjà présents ; +- `meteora_damm_v1.add_liquidity` pour `AddBalanceLiquidity`, `AddImbalanceLiquidity` et `BootstrapLiquidity` ; +- `meteora_damm_v1.remove_liquidity` pour `RemoveBalanceLiquidity` et `RemoveLiquiditySingleSide` ; +- `meteora_damm_v1.claim_fee` pour `ClaimFee` ; +- `meteora_damm_v1.create_lock_escrow` et `meteora_damm_v1.lock_liquidity` pour les instructions de verrouillage LP. + +Discriminants DAMM v1 traités dans cette tranche : + +| Discriminant | Mapping upstream Git | Event local | Statut | +|---|---|---|---| +| `07a68aabceabecf4` | `InitializePermissionlessConstantProductPoolWithConfig` | `meteora_damm_v1.create_pool` | observé dans corpus local | +| `3095dc823d0b09b2` | `InitializePermissionlessConstantProductPoolWithConfig2` | `meteora_damm_v1.create_pool` | observé dans corpus local | +| `856d2cb338ee7221` | `RemoveBalanceLiquidity` | `meteora_damm_v1.remove_liquidity` | observé dans corpus local | +| `a9204f8988e84689` | `ClaimFee` | `meteora_damm_v1.claim_fee` | observé dans corpus local | +| `3657a51345e3dae0` | `CreateLockEscrow` | `meteora_damm_v1.create_lock_escrow` | observé dans corpus local | +| `1513d02bed3eff57` | `Lock` | `meteora_damm_v1.lock_liquidity` | observé dans corpus local | + +Discriminants DAMM v1 ajoutés au decoder pour complétude upstream Git, même s’ils devront rester soumis au corpus avant mention `verified_by_corpus` : + +- `9118acc2db7d03be` — `InitializeCustomizablePermissionlessConstantProductPool` ; +- `a8e3323ebdab54b0` — `AddBalanceLiquidity` ; +- `4f237a54ad0f5dbf` — `AddImbalanceLiquidity` ; +- `04e4d747e1fd77ce` — `BootstrapLiquidity` ; +- `5454b142feb90afb` — `RemoveLiquiditySingleSide`. + +Le replay passe à la version logique `dex_decode.v0.7.46.damm_v1_events1` afin de redécoder les transactions certifiées sous la version `0.7.45` quand la tranche DAMM v1 est rejouée. + +Validation locale obtenue après replay : + +- `meteora_damm_v1.instruction_audit` vide sur le corpus local DAMM v1 rejoué ; +- `meteora_damm_v1.claim_fee`, `create_pool`, `create_lock_escrow`, `lock_liquidity` et `remove_liquidity` matérialisés dans les tables non-trade attendues ; +- invariant maintenu : aucun event non-trade DAMM v1 ne produit de trade/candle ; +- `cargo test -p kb_lib` et `cargo clippy -p kb_lib --all-targets -- -D warnings` validés localement après correction du warning Clippy. + +Correction Demo3 adossée à `0.7.46` : + +- ajout d’un décodage léger instruction-scoped pour `meteora_damm_v1` dans `onchain_dex_pair_discovery`, sans écriture DB et sans promotion de nouveau `program_id` ; +- les discriminants DAMM v1 connus par upstream Git/corpus sont classés directement en `swap`, `create_pool`, `add_liquidity`, `remove_liquidity`, `claim_fee`, `create_lock_escrow` ou `lock_liquidity` ; +- le filtre `target_event` devient strict pour les surfaces explicites afin qu’un swap ne ressorte pas comme liquidity, et inversement, quand les logs de transaction sont mixtes ; +- `excludeSwaps` ne supprime plus toute une transaction mixte lorsqu’un `target_event` explicite est sélectionné, afin de permettre la découverte d’instructions non-swap dans des routes agrégées ; +- les cibles UI `create_lock_escrow` et `lock_liquidity` sont ajoutées pour faciliter les backfills via Demo Pipeline 2. + +Aucun `program_id` Meteora Vault n’est promu comme vérifié sans corpus direct séparé. + +### 6.079. Version `0.7.47` — Upstream Git Registry / DEX discovery preparation +Objectif : accélérer la découverte multi-DEX en indexant les `program_id`, discriminants d’instructions, discriminants d’events et noms d’instructions issus de dépôts Git externes de decoders Solana, sans les considérer vérifiés par défaut. + +À faire : + +- créer un registre `upstream_registry` dans `kb_lib`, sans dépendre d’un nom de dépôt particulier ; +- stocker pour chaque entrée : `source_repo`, `decoder_code`, `program_id`, famille, type de surface, instruction/event name, discriminator hex, longueur de discriminator, statut de preuve et notes ; +- utiliser les statuts génériques : `upstream_git_unverified`, `upstream_git_mapped_unverified`, `upstream_git_local_corpus_observed`, `upstream_git_local_corpus_materialized` ; +- exposer les entrées à Demo3 pour filtrer par decoder, famille, `program_id`, discriminant, instruction/event name ou statut ; +- permettre à Demo3 de rechercher `any_upstream_unverified` pour trouver des signatures candidates à backfiller ; +- ne produire aucun trade/candle/liquidity/fee/reward/admin automatique depuis le registre ; +- n’utiliser les entrées upstream Git que comme indices de découverte et d’audit tant qu’elles ne sont pas validées par Demo3 + backfill + replay + SQL ; +- garder `kb_demo_app` comme façade UI : toute logique de registry/mapping doit rester dans `kb_lib`. + +Familles prioritaires à indexer en premier : + +- DEX / AMM / CLMM / orderbook : `meteora_damm_v2`, `meteora_dbc`, `meteora_dlmm`, `meteora_vault`, `raydium_amm_v4`, `raydium_clmm`, `raydium_cpmm`, `raydium_launchpad`, `raydium_liquidity_locking`, `raydium_stable_swap`, `orca_whirlpools`, `fluxbeam`, `lifinity_v2`, `phoenix_v1`, `openbook_v2`, `stabble_stable_swap`, `stabble_weighted_swap`, `bonkswap`, `boop`, `moonshot`, `heaven`, `okx_dex`, `pancake_swap`, `vertigo`, `virtuals`, `wavebreak`, `onchain_labs_dex_v1`, `onchain_labs_dex_v2` ; +- agrégateurs / ordres / perps / lending utiles au routage ou à l’analyse : `jupiter_swap`, `jupiter_dca`, `jupiter_limit_order`, `jupiter_limit_order_2`, `jupiter_perpetuals`, `jupiter_lend`, `kamino_lending`, `kamino_vault`, `kamino_farms`, `kamino_limit_order`, `drift_v2`, `marginfi_v2`, `dflow_aggregator_v4`, `zeta` ; +- contexte transactionnel non DEX : `system_program`, `token_program`, `token_2022`, `associated_token_account`, `address_lookup_table`, `memo_program`, `stake_program`, `mpl_token_metadata`, `mpl_core`, `bubblegum`, `name_service`, `marinade_finance`, `solayer_restaking_program`, `swig`, `sharky`, `circle_message_transmitter_v2`, `circle_token_messenger_v2`. + +Aucun de ces programmes ne doit être marqué `verified_by_corpus` uniquement parce qu’il existe dans un dépôt Git externe. + + +### 6.079B. Version `0.7.48-pre` — Event coverage et checkpoint DB + +Objectif : éviter de limiter la matrice aux DEX/versions et imposer une couverture événementielle exhaustive avant la reprise DEX par DEX. + +Statut : implémenté en micro-tranche DB/reporting, sans modifier les decoders ni la matérialisation marché. + +Fait : + +- maintien de `docs/DEX_EVENT_COVERAGE_MATRIX.md` en plus de `docs/DEX_DECODER_MATRIX.md` ; +- ajout de `k_sol_dex_event_coverage_entries` dans `kb_lib/src/db/schema.rs` ; +- ajout des entity/DTO/queries/re-exports associés ; +- ajout de `DexEventCoverageService` pour synchroniser les entrées du registre upstream Git vers la table de coverage ; +- refresh des compteurs `observed_count`, `materialized_count`, `trade_count`, `first_signature` et `last_signature` depuis les events décodés et les tables métier existantes ; +- inférence conservatoire de `event_family`, `expected_db_target` et `local_event_kind`, sans promotion de `program_id` ni validation métier automatique ; +- correction du refresh SQL pour rester compatible avec `sqlx::query` en SQL statique ; +- exposition des summaries de coverage dans `LocalPipelineDiagnosticSummaryDto` et `LocalPipelineValidationReportDto` ; +- ajout du profil de validation `0.7.48-pre_event_coverage_db_checkpoint`, avec synchronisation upstream préalable ; +- contrôle bloquant des trade candidates non matérialisés borné aux DEX Raydium attendus dans ce profil, afin que les DEX partiels hors scope restent diagnostiqués sans bloquer le checkpoint DB/reporting ; +- sélection du profil `0.7.48-pre` dans Demo Pipeline 2. + +Reste à faire dans les tranches DEX : + +- compléter la liste exhaustive des events/instructions/logs par DEX depuis Carbon, fnzero, IDL, Pinax, HODL Warden, OpenBook, Phoenix et Vybe ; +- inclure explicitement les familles non-trade : `burn`, `mint`, `transfer`, `account_create`, `account_close`, `wrap_sol`, `unwrap_sol`, `lock`, `unlock`, `vault_deposit`, `vault_withdraw`, `admin/config`, `fee`, `reward`, `launch`, `migration` ; +- ajouter plus tard `k_sol_token_transfer_events` et `k_sol_orderbook_events` quand le besoin métier est prouvé par plusieurs DEX ; +- ne pas créer de trade/candle depuis ces nouveaux chemins sans validation économique et corpus. + + +### 6.080. Version `0.7.48` — `raydium_cpmm` event coverage +Objectif : reprendre `raydium_cpmm` en premier, avant Meteora, avec une couverture complète des events listés depuis Carbon/fnzero/IDL. + +À faire : + +- utiliser `k_sol_dex_event_coverage_entries` comme ledger de couverture attendu/observé/matérialisé ; +- lister tous les discriminants/instructions/events CPMM depuis les sources upstream ; +- comparer avec les events déjà connus localement : swap, initialize, withdraw, collect_creator_fee et audits restants ; +- conserver les swaps matérialisés uniquement si les montants et le sens économique restent validés ; +- compléter les events non-trade CPMM en audit ou matérialisation existante uniquement avec corpus local ; +- vérifier par SQL que les non-trades ne produisent aucun trade/candle. + +### 6.081. Version `0.7.49` — `raydium_clmm` event coverage +Objectif : clôturer `raydium_clmm` après CPMM. + +Réalisé : + +- couverture locale de `45` entrées CLMM ; +- `33` instructions spécialisées, observées et décodées ; +- matérialisation contrôlée de `25` entrées vers trade, liquidity, fee, reward, admin, lifecycle et orderbook ; +- ajout de `k_sol_orderbook_events` pour les limit orders CLMM ; +- suppression automatique des fallbacks `upstream_git.instruction_match` localement couverts ; +- préparation audit-only des 11 Anchor / `Program data` events non encore observés ; +- invariants validés : aucun faux trade/candle, aucune matérialisation sur transaction échouée, `raydium_clmm.instruction_audit` résiduel à zéro. + +### 6.082. Version `0.7.50-pre-r2` — Raydium CPMM/CLMM coverage closure +Objectif : clôturer la vérification CPMM/CLMM après la tranche Launchpad, en comparant le code local avec Carbon, Solscan Program IDL et `sol-parser-sdk`, puis en supprimant les familles ambiguës restantes de la matrice coverage. + +Réalisé : ajout des entrées `cpi_event` CPMM/CLMM (`e445a52e51cb9a1d`), ajout de `update_dynamic_fee_config` CLMM (`0707500802c784f0`), rattachement local des Program-data events CLMM (`swap_event`, `pool_created_event`, `liquidity_change_event`, `create_personal_position_event`, `config_change_event`, `collect_protocol_fee_event`, `update_reward_infos_event`) et ajout de `k_sol_token_account_events` pour les événements type `create_support_mint_associated`. Les familles `unknown` restantes sont remplacées par `cpi_transport`, `liquidity_calculation`, `liquidity_change`, `position_open`, `pool_create`, `admin_config` ou `account_create` selon le cas. + +Point audit résolu : le discriminant CPMM local `40f4bc78a7e9690a` est codé comme `raydium_cpmm.anchor_idl_instruction` avec `event_family=idl_management` et `expected_db_target=k_sol_dex_decoded_events_only`. Les signatures Solscan montrent `IdlCreateAccount` / `IdlCloseAccount` sur le compte `anchor:idl`; cette entrée reste donc informative et ne doit pas produire trade, candle, liquidity, fee ou admin métier. + +Décisions de clôture CLMM : `swap_event` et `swap_router_base_in` restent `decoded_events_only` pour éviter le double comptage avec les instructions `swap` / `swap_v2`; `liquidity_calculate_event` reste diagnostic ; `close_position` / `close_protocol_position` restent décodés mais non matérialisés tant que le corpus ne fournit pas un rattachement pool/pair fiable. La matérialisation liquidity tente désormais un contexte de secours via événements frères de la même transaction quand un event CLMM porte les montants mais pas directement le pool/pair. + +Suite locale : rebrancher les bases CPMM/CLMM, rejouer `forceDexDecode=yes`, vérifier que les requêtes `unknown`, fallback upstream, audit résiduel et matérialisation attendue ne remontent plus que des cas explicitement `decoded_events_only` ou des transactions failed. + +Rapport associé : `docs/reports/RAYDIUM_CPMM_CLMM_RECHECK_REPORT_0_7_50_PRE_R2.md`. + +### 6.083. Version `0.7.51` — `raydium_amm_v4` event coverage +Objectif : hisser AMM v4 legacy au niveau de couverture CPMM/CLMM. + +Réalisé : decoder maximal AMM v4 pour tous les discriminants officiels `00..11`, spécialisation des swaps (`swap_base_in`, `swap_base_out`, `swap_base_in_v2`, `swap_base_out_v2`), suppression du legacy `raydium_amm_v4.swap`, observation locale de tous les discriminants, matérialisation validée des familles trade, liquidity, lifecycle, fee, admin/config et orderbook, `pre_initialize` conservé comme lifecycle audit deprecated/partial, `simulate_info` conservé en decoded-only, gaps successful non matérialisés expliqués, et validation des invariants failed/non-swap/single-target. + +### 6.084. Version `0.7.52` — `raydium_stable_swap` event coverage +Objectif : reprendre Raydium Stable comme tranche Raydium dédiée après AMM v4. + +Réalisé : decoder legacy 1 octet, surface locale `00..0d`, matérialisation lifecycle/liquidity/admin/fee/orderbook selon contexte, swaps `swap_base_in/out` matérialisés uniquement depuis deltas vault exacts (`stable_swap_vault_balance_delta`), transactions failed decoded-only, invariants trade/candle propres. + +### 6.085. Versions `0.7.53` à `0.7.139` — phasage actif post-DLMM + +Objectif : maintenir un phasage lisible après la clôture `0.7.57 meteora_dlmm`. + +Décisions actives : + +- `0.7.58` est réservé au binaire de consolidation de bases SQLite : fusion de corpus transactionnels déjà présents, sans RPC/backfill, puis replay `final.db`/`final.next.db` pour non-régression cross-DEX. +- `0.7.59` est réservé à `demo4_program_surface_discovery` : affichage et revue de surfaces non prises en compte depuis la base consolidée, sans matérialisation automatique. +- `0.7.60` reprend le travail DEX avec `meteora_damm_v1`. +- `0.7.61` cible `meteora_damm_v2`. +- `0.7.62` cible `meteora_vault`. +- Après `0.7.62`, le décalage de deux versions est assumé et documenté. + +| Version cible | Decoder / surface | Program id | Famille | Objectif de clôture | +|---|---|---|---|---| +| `0.7.53` | `pump_swap` | `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA` | Pump / AMM | **Clos** : `buy/sell/buy_exact_quote_in` matérialisés seulement depuis sources exactes ; events Anchor audit-only ; tests synthétiques IDL ; SQL global. | +| `0.7.54` | `pump_fun` | `6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P` | Pump / launch-bonding | **Clos** : decoder maximal IDL/local, trades directs `buy/sell/buy_exact_sol_in`, v2/exact via `trade_event`, non-trades matérialisés selon contexte, validations Pump.fun propres. | +| `0.7.55` | `pump_fees` | `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` | Pump / fee | **Clos** : `29` instructions, `20` events Anchor, fee/reward/admin/lifecycle, `get_fees` decoded-only, failed tx audit-only, aucun trade/candle direct. | +| `0.7.56` | `meteora_dbc` | `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN` | Meteora / DBC | Clos : `28` instructions et `23` events Anchor couverts, swaps `swap/swap2`, lifecycle/admin/fees, `k_sol_fee_event_amounts`, validations SQL propres. | +| `0.7.57` | `meteora_dlmm` | `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo` | Meteora / DLMM | **Clos** : full decode + full materialization ; `76` instructions IDL, `30` events Anchor, swaps, bins, positions, liquidity, fees/rewards/admin/limit-order, sans double-count. | +| `0.7.58` | `sqlite_db_transaction_merger` | n/a | Outillage / consolidation DB | Ajouter un binaire utilisant `kb_lib` pour fusionner des bases `.db` transactionnelles vers `final.db`/`final.next.db`, puis rejouer la base consolidée pour détecter les régressions cross-DEX Pump/Raydium/Meteora. | +| `0.7.59` | `demo4_program_surface_discovery` | n/a | Outillage / discovery | Afficher depuis la base consolidée les contenus non pris en compte : program ids, discriminators, Anchor logs/events, upstream fallbacks, layouts et samples ; aucune matérialisation automatique. | +| `0.7.60` | `meteora_damm_v1` | `Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB` | Meteora / DAMM v1 | Parité upstream finale : pools, swaps, liquidity, lock, fees/admin. | +| `0.7.61` | `meteora_damm_v2` | `cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG` | Meteora / DAMM v2 | Couverture complète : create/custom pools, swaps, liquidity, dynamic config, fees/admin. | +| `0.7.62` | `meteora_vault` | `24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi` | Meteora / vault | Vault deposit/withdraw/fee/accounting ; pas de candle directe. | +| `0.7.63` | `system_program` | `11111111111111111111111111111111` | Système Solana | Create/assign/transfer account ; side effects de contexte, pas de trade. | +| `0.7.64` | `spl_token` | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | SPL Token | Transfer, mint, burn, close account, sync native ; base transversale pour deltas. | +| `0.7.65` | `spl_token_2022` | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | Token-2022 | Transfers/extensions Token-2022, mint/burn/close, comptes et side effects. | +| `0.7.66` | `associated_token_account` | `ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL` | Système token | Création ATA, rattachement wallet/token/pool. | +| `0.7.67` | `compute_budget` | `ComputeBudget111111111111111111111111111111` | Contexte tx | Budget/prioritization fee ; utile scoring/MEV, pas de trade. | +| `0.7.68` | `memo` | `MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr` | Contexte tx | Mémo transactionnel et attribution éventuelle. | +| `0.7.69` | `address_lookup_table` | `AddressLookupTab1e1111111111111111111111111` | Contexte tx | Résolution/diagnostic ALT si nécessaire. | +| `0.7.70` | `mpl_token_metadata` | `metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s` | Metadata | Enrichissement token/NFT/mint metadata. | +| `0.7.71` | `mpl_core` | `CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d` | Metadata / asset | Contexte asset si présent dans corpus. | +| `0.7.72` | `bubblegum` | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | Compressed assets | Audit/contexte assets compressés, pas DEX. | +| `0.7.73` | `raydium_routing` | `routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS` | Router | Route/legs Raydium ; éviter le double-count avec DEX effectifs. | +| `0.7.74` | `jupiter_swap_v6` | `JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4` | Aggregator | Route attribution, legs, no duplicate trade/candle. | +| `0.7.75` | `jupiter_swap_v4` | `JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB` | Legacy aggregator | Audit/route only si corpus encore utile. | +| `0.7.76` | `dflow_aggregator_v4` | `DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH` | Aggregator | Route/intent/orderflow ; pas de double matérialisation. | +| `0.7.77` | `okx_dex` | `6m2CDdhRgxpH4WjvdzxAYbGxwdGUz5MziiL5jek2kBma` | Aggregator/router | Route attribution ; trades seulement si source exacte non doublonnée. | +| `0.7.78` | `onchain_labs_dex_v2` | `proVF4pMXVaYqmy4NjniPh4pqKNfMmsihgd4wdkCX3u` | Router/DEX candidat | Corpus d’abord ; classifier route vs DEX effectif. | +| `0.7.79` | `titan_router` | `T1TANpTeScyeqVzzgNViGDNrkQ6qHz9KrSBS4aNXvGT` | Router | Audit route-only sauf preuve de trade direct non doublonné. | +| `0.7.80` | `sanctum_router` | `stkitrT1Uoy18Dk1fTrgPw8W6MVzoCfYoAFT4MLsmhq` | Router | Route/liquid staking context ; pas de candle DEX directe. | +| `0.7.81` | `orca_whirlpools` | `whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc` | DEX avec IDL/source | Swaps, pools, positions, liquidity, fees/rewards. | +| `0.7.82` | `stabble_stable_swap` | `swapNyd8XiQwJ6ianp9snpu4brUqFxadzvHebnAXjJZ` | DEX avec IDL/source | Stable swap ; deltas exacts, liquidity/admin. | +| `0.7.83` | `stabble_weighted_swap` | `swapFpHZwjELNnjvThjajtiVmkz3yPQEHjLtka2fwHW` | DEX avec IDL/source | Weighted swap, deltas exacts, liquidity/admin. | +| `0.7.84` | `stabble_clmm` | `6dMXqGZ3ga2dikrYS9ovDXgHGh5RUsb2RTUj6hrQXhk6` | DEX avec IDL/source | CLMM Stabble si corpus utile. | +| `0.7.85` | `bonkswap` | `BSwp6bEBihVLdqJRKGgzjcGLHkcTuzmSo1TQkHepzH8p` | DEX avec IDL/source | Swap/liquidity/non-trade. | +| `0.7.86` | `boop_fun` | `boop8hVGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4` | Launch/DEX candidat | Launch/swap/migration selon corpus. | +| `0.7.87` | `byreal_clmm` | `REALQqNEomY6cQGZJUGwywTBD2UmDT32rZcNnfxQ5N2` | DEX avec IDL/source | CLMM ; corpus puis matérialisation contrôlée. | +| `0.7.88` | `fusionamm` | `fUSioN9YKKSa3CUC2YUc4tPkHJ5Y6XW1yz8y6F7qWz9` | DEX avec IDL/source | AMM ; swaps/liquidity si corpus. | +| `0.7.89` | `goosefx_v1` | `GAMMA7meSFWaBXF25oSUgmGRwaW6sCMFLmBNiMSdbHVT` | DEX avec IDL/source | DEX/AMM selon corpus. | +| `0.7.90` | `goosefx_v2` | `GFXsSL5sSaDfNFQUYsHekbWBW1TsFdjDYzACh62tEHxn` | DEX avec IDL/source | DEX/AMM selon corpus. | +| `0.7.91` | `guac_swap` | `Gswppe6ERWKpUTXvRPfXdzHhiCyJvLadVvXGfdpBqcE1` | DEX avec IDL/source | Swap/liquidity si corpus. | +| `0.7.92` | `hylo_exchange` | `HYEXCHtHkBagdStcJCp3xbbb9B7sdMdWXFNj6mdsG4hn` | DEX/source à classifier | Classer DEX/lending/stable selon IDL/corpus. | +| `0.7.93` | `printr` | `T8HsGYv7sMk3kTnyaRqZrbRPuntYzdh12evXBkprint` | Launch/DEX candidat | Corpus d’abord ; surface launch/swap à confirmer. | +| `0.7.94` | `moonit` | `MoonCVVNZFSYkqNXP6bxHLPL6QQJiMagDL3qcqUQTrG` | Launch/DEX candidat | Launch/migration/swap si prouvé. | +| `0.7.95` | `metadao_amm_v0_5` | `AMMJdEiCCa8mdugg6JPF7gFirmmxisTfDJoSNSUi5zDJ` | DEX avec source | AMM futarchy ; corpus et price semantics. | +| `0.7.96` | `metadao_bid_wall` | `WALL8ucBuUyL46QYxwYJjidaFYhdvxUFrgvBxPshERx` | Order/bid-wall | Order/bid-wall context ; pas de candle directe sans fill exact. | +| `0.7.97` | `metadao_launchpad` | `moontUzsdepotRGe5xsfip7vLPTJnVuafqdUWexVnPM` | Launch surface | Launch/ICO surface ; pas DEX effectif par défaut. | +| `0.7.98` | `vertigo` | `vrTGoBuy5rYSxAfV3jaRJWHH6nN9WK4NRExGxsk1bCJ` | DEX/source | Swap/launch selon corpus. | +| `0.7.99` | `virtuals` | `5U3EU2ubXtK84QcRjWVmYt9RaDyA8gKxdUrPFXmZyaki` | Launch/DEX candidat | Launch/AMM à confirmer. | +| `0.7.100` | `wavebreak` | `waveQX2yP3H1pVU8djGvEHmYg8uamQ84AuyGtpsrXTF` | DEX/source | Corpus et rôle exact. | +| `0.7.101` | `woofi` | `WooFif76YGRNjk1pA8wCsN67aQsD9f9iLsz4NcJ1AVb` | DEX/router | Swap/route selon corpus. | +| `0.7.102` | `pancake_swap` | `HpNfyc2Saw7RKkQd8nEL4khUcuPhQ7WwY1B2qjx8jxFq` | DEX/source | DEX Solana à confirmer par corpus. | +| `0.7.103` | `gavel` | `srAMMzfVHVAtgSJc8iH6CfKzuWuUTzLHVCE81QU1rgi` | Source upstream | Corpus d’abord ; rôle exact à classer. | +| `0.7.104` | `heaven` | `HEAVENoP2qxoeuF8Dj2oT1GHEnu49U5mJYkdeC8BAX2o` | Launch/DEX candidat | Launch/DEX selon corpus. | +| `0.7.105` | `lifinity_v2` | `2wT8Yq49kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c` | DEX legacy/actif | Support selon corpus. | +| `0.7.106` | `moonshot` | `MoonCVVNZFSYkqNXP6bxHLPL6QQJiMagDL3qcqUQTrG` | Source upstream/Solscan | À dédupliquer avec `moonit` si même program id. | +| `0.7.107` | `openbook_v2` | `opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb` | Orderbook | Audit/orderbook complet ; trade/candle seulement si fills exacts. | +| `0.7.108` | `phoenix_v1` | `PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY` | Orderbook | Audit-only complet avant toute matérialisation fill. | +| `0.7.109` | `alphaq` | `ALPHAQmeA7bjrVuccPsYPiCvsi428SNwte66Srvs4pHA` | Solscan/no IDL | Probe par Demo3 + corpus ; décider support ou abandon. | +| `0.7.110` | `aquifer` | `AQU1FRd7papthgdrwPTTq5JacJh8YtwEXaBfKU3bTz45` | Solscan/no IDL | Probe uniquement. | +| `0.7.111` | `bisonfi` | `BiSoNHVpsVZW2F7rx2eQ59yQwKxzU5NvBcmKshCSUypi` | Solscan/no IDL | Probe uniquement. | +| `0.7.112` | `dexlab` | `DSwpgjMvXhtGn6BsbqmacdBZyfLj6jSWf3HJpdJtmg6N` | Solscan/no IDL | Vérifier support partiel / corpus. | +| `0.7.113` | `fluxbeam` | `FLUXubRmkEi2q6K3Y9kBPg9248ggaZVsoSFhtJHSrm1X` | Solscan/no IDL | Vérifier support partiel / corpus. | +| `0.7.114` | `goonfi` | `goonERTdGsjnkZqWuVjs73BZ3Pb9qoCUdBUL17BnS5j` | Solscan/no IDL | Probe. | +| `0.7.115` | `goonfi_v2` | `goonuddtQRrWqqn5nFyczVKaie28f3kDkHWkHtURSLE` | Solscan/no IDL | Probe ; adresse à revérifier si erreur de taille. | +| `0.7.116` | `humidifi` | `9H6tua7jkLhdm3w8BvgpTn5LZNU7g4ZynDmCiNN3q6Rp` | Solscan/no IDL | Probe. | +| `0.7.117` | `obric_v2` | `obriQD1zbpyLz95G5n7nJe6a4DPjpFwa5XYPoNm113y` | Solscan/no IDL | Probe. | +| `0.7.118` | `ondo_global_market` | `XzTT4XB8m7sLD2xi6snefSasaswsKCxx5Tifjondogm` | Solscan IDL | Rôle marché/tokenized assets à confirmer. | +| `0.7.119` | `scorch` | `SCoRcH8c2dpjvcJD6FiPbCSQyQgu3PcUAWj2Xxx3mqn` | Solscan/no IDL | Probe. | +| `0.7.120` | `solfi` | `SoLFiHG9TfgtdUXUjWAxi3LtvYuFyDLVhBWxdMZxyCe` | Solscan/no IDL | Probe. | +| `0.7.121` | `solfi_v2` | `SV2EYYJyRz2YhfXwXnhNAevDEui5Q6yrfyo13WtupPF` | Solscan/no IDL | Probe. | +| `0.7.122` | `zerofi` | `ZERor4xhbUycZ6gb9ntrhqscUcZmAbQDjEAtCf4hbZY` | Solscan/no IDL | Probe. | +| `0.7.123` | `zora` | `zoRabwLGd5zXaV7Gxacppw8tcceXEiTrSKyNLSaSTUc` | Solscan/no IDL | Probe, pas de promotion sans corpus. | +| `0.7.124` | `1dex` | `DEXYosS6oEGvk8uCDayvwEZz4qEyDJRf9nFgYCaqPMTm` | Solscan/no IDL | Probe. | +| `0.7.125` | `aldrin_amm` | `AMM55ShdkoGRB5jVYPjWziwk8m5MpwyDgsMWHaMSQWH6` | Legacy/no IDL | Historique/probe. | +| `0.7.126` | `aldrin_amm_v2` | `CURVGoZn8zycx6FXwwevgBTB2gVvdbGTEpvMJDbgs2t4` | Legacy/no IDL | Historique/probe. | +| `0.7.127` | `crema_finance` | `CLMM9tUoggJu2wagPkkqs9eFG4BWhVBZWkP1qv3Sp7tR` | Legacy/no IDL | Historique/probe. | +| `0.7.128` | `cropper_finance` | `CTMAxxk34HjKWxQ3QLZK1HpaLXmBveao3ESePXbiyfzh` | Legacy/no IDL | Historique/probe. | +| `0.7.129` | `cropper_whirlpool` | `H8W3ctz92svYg6mkn1UtGfu2aQr2fnUFHM1RhScEtQDt` | Legacy/no IDL | Historique/probe. | +| `0.7.130` | `mercurial_stable_swap` | `MERLuDFBMmsHnsBPZw2sDQZHvXFMwp8EdjudcU2HKky` | Legacy/no IDL | Historique stable swap ; deltas exacts si support. | +| `0.7.131` | `saber_stable_swap` | `SSwpkEEcbUqx4vtoEByFjSkhKdCT862DNVb52nZg1UZ` | Legacy/no IDL | Historique stable swap. | +| `0.7.132` | `saros_amm` | `SSwapUtytfBdBn1b9NUGG6foMVPtcWgpRU32HToDUZr` | Legacy/no IDL | Historique/probe. | +| `0.7.133` | `step_finance_swap` | `SSwpMgqNDsyV7mAgN9ady4bDVu5ySjmmXejXvy2vLt1` | Legacy/no IDL | Historique/probe. | +| `0.7.134` | `stepn_dooar_swap` | `Dooar9JkhdZ7J3LHN3A7YCuoGRUggXhQaG4kijfLGU2j` | Legacy/no IDL | Historique/probe. | +| `0.7.135` | `raydium_amm_v2_legacy` | `RVKd61ztZW9GUwhRbbLoYVRE5Xf1B2tVscKqwZqXgEr` | Raydium legacy/no IDL | Historique Raydium ; corpus d’abord. | +| `0.7.136` | `raydium_amm_v3_legacy` | `27haf8L6oxUeXrHrgEgsexjSY5hbVUWEmvv9Nyxg8vQv` | Raydium legacy/no IDL | Historique Raydium ; ne pas confondre avec CLMM moderne. | +| `0.7.137` | `raydium_pool_v4_json_audit` | aucun `program_id` prouvé par le fichier seul | Audit source annexe | Vérifier `sol-parser-sdk/idls/raydium_pool_v4.json` après les surfaces documentées ; patch AMM v4 si amélioration, sinon clôture no-op. | +| `0.7.138` | cleanup `SOLSCAN_ACCOUNT_SOURCES` | n/a | Nettoyage registry/constants | Retirer doublons/promotions ; les programmes validés deviennent constantes/support matrix, les comptes non-programmes restent contexte ou sont supprimés. | +| `0.7.139` | base neuve multi-programmes | n/a | Validation consolidée | Replay consolidé, coverage global, zéro faux trade/candle, diagnostics bloquants à zéro. | + +Garde-fous constants : pas de faux trade, pas de fausse candle, pas de `program_id` fictif, pas de promotion sans corpus transactionnel local, pas de double matérialisation router/leg, pas de logique métier DEX profonde dans `kb_demo_app`. + +### 6.091. Version `0.8.x` — Analyse et filtrage +Objectif : transformer les événements bruts en signaux exploitables. + +À faire : + +- agrégation des métriques ; +- règles de filtrage ; +- exclusions des tokens non tradables ; +- statistiques de comportement ; +- premiers patterns ; +- enrichissement des signaux analytiques préparés en fin de `0.7.x` ; +- indicateurs graphiques optionnels comme Ichimoku / Kumo ; +- outils de sélection manuelle de points ABC et projection d’un point D selon des règles temps/prix explicites ; +- séparation stricte entre signaux analytiques observés, projections hypothétiques et décisions de trading. + +### 6.083. Version `1.x.y` — Wallets, comptes et transferts +Objectif : préparer la couche d’action sans encore brancher l’achat/vente automatique. + +À faire : + +- gestion du répertoire wallets ; +- création de wallet/keypair ; +- chargement sécurisé des keypairs ; +- inspection des informations wallet ; +- transfert de fonds depuis cette wallet vers un autre account ; +- garde-fous d’affichage, confirmation et simulation ; +- préparation d’ordres et de swaps seulement après stabilisation des transferts de base. + +### 6.084. Version `2.x.y` — Trading semi-automatisé +Objectif : brancher l’analyse à l’action tout en gardant des garde-fous explicites. + +À faire : + +- scénarios d’achat/vente ; +- règles d’entrée/sortie ; +- limites de risque ; +- confirmations explicites ou semi-automatiques ; +- journaux d’exécution. + +### 6.085. Version `3.x.y` — Yellowstone gRPC +Objectif : ajouter le connecteur gRPC dédié. + +À faire : + +- `GrpcClient` basé sur `yellowstone-grpc-client` ; +- adaptation du pipeline d’événements ; +- coexistence HTTP / WS / gRPC ; +- politique de répartition par source. + +## 7. Organisation des modules ciblés + +### 7.1. `kb_lib` +Modules stables à ne pas remanier dans la phase immédiate : + +- `ws_client.rs` +- `ws_manager.rs` +- `http_client.rs` +- `http_pool.rs` +- `json_rpc_ws.rs` +- `solana_pubsub_ws.rs` + +Modules ciblés par le refactor et la consolidation DEX : + +- `dex.rs` +- `dex/*.rs` +- `dex_decode.rs` +- `dex_detect.rs` +- `trade_aggregation.rs` +- `pair_candle_aggregation.rs` +- `pair_analytic_signal.rs` +- `launch_origin.rs` +- `pool_origin.rs` +- `wallet_observation.rs` +- `wallet_holding_observation.rs` +- `token_metadata.rs` +- `local_pipeline_replay.rs` +- `local_pipeline_validation.rs` +- `local_pipeline_diagnostics.rs` + +`local_pipeline_diagnostics.rs` est volontairement conservé comme outil temporaire de validation. Il pourra devenir obsolète ou être remplacé lorsque les tests DEX seront stabilisés. Il n’est pas prioritaire de le refactorer maintenant. + +### 7.2. Base de données + +Organisation de la couche DB à conserver : + +- `db/schema.rs` : création des tables et index uniquement ; chaque table ou index reste dans une fonction dédiée, +- `db/entities/*` : entités proches des lignes persistées, +- `db/dtos/*` : DTOs applicatifs, +- `db/queries/*` : requêtes SQL regroupées par table ou usage, +- `db/queries/local_pipeline_diagnostics.rs` : requêtes de diagnostic local, utiles pendant la validation DEX. + +`schema.rs` peut rester long tant qu’il reste strictement un fichier de schéma. Le split prioritaire concerne plutôt les responsabilités métier dans `dex_decode.rs`, `dex_detect.rs` et `trade_aggregation.rs`. + +### 7.3. `kb_demo_app` +Responsabilités cibles : + +- lancement Tauri, +- commandes UI, +- affichage des états et messages, +- réception des événements venant de `kb_lib`, +- fenêtres de démonstration / diagnostic isolées, +- inspection du pipeline persisté, +- `Demo3` pour la recherche de paires/pools par DEX ou `program_id`, +- `Demo4` pour les requêtes DEX Screener et la comparaison avec la base locale, +- `Demo10` pour le watcher WebSocket live DEX avec start/stop, +- affichage candles et futurs overlays analytiques. + +`kb_demo_app` ne doit pas contenir de logique métier DEX profonde. + +## 8. Ligne de conduite sur le `WsClient` +Le `WsClient` doit être conçu en plusieurs couches : + +1. transport brut WebSocket, +2. encodage/décodage JSON texte, +3. couche JSON-RPC 2.0, +4. couche Solana subscribe/unsubscribe/notification, +5. couche métier pour la répartition des messages. + +Cette séparation évite de mélanger : + +- les réponses à requêtes simples, +- les réponses de subscribe, +- les réponses de unsubscribe, +- les notifications push. + +## 9. Politique initiale de reconnexion +Au départ : + +- pas de reconnexion automatique, +- pas de resubscribe automatique, +- comportement explicite contrôlé par l’appelant. + +Plus tard, ce comportement pourra devenir configurable dans `config.json` et pilotable depuis l’application. + +## 10. Politique initiale de fermeture +À la fermeture d’un `WsClient` : + +1. marquer le client en arrêt, +2. tenter les `unsubscribe` actifs, +3. attendre les réponses dans une fenêtre bornée, +4. forcer la purge locale si nécessaire, +5. fermer proprement le flux d’écriture, +6. laisser se terminer le flux de lecture, +7. journaliser clairement les cas dégradés. + +## 10.5. Jalons `0.7.29` + +Réalisé / à maintenir : + +- matrice DEX commune dans `kb_lib/src/dex_support_matrix.rs` ; +- raccordement minimal du catalogue DEX à cette matrice ; +- raccordement des mappings program id -> protocole utilisés par la classification transactionnelle et les protocol candidates ; +- profil `0.7.29_multi_dex_matrix_baseline` ; +- exposition de la matrice dans le rapport de validation local ; +- aucune modification volontaire du comportement trade/candle validé en `0.7.28`. + +Validé en `0.7.30` : classification fine des événements décodés via `eventLifecycleKind`, `eventActionability` et `nonTradeUseful`, avec diagnostics associés et sans changement volontaire sur les trades/candles. + +À poursuivre après `0.7.31` : transactions inconnues/protocol candidates, puis matérialisation contrôlée des événements non-trade utiles, sans alimenter les trades/candles actionnables. + +## 11. Documentation et livrables de référence +Le projet doit maintenir au minimum : + +- un `README.md` global, +- un `ROADMAP.md` global, +- un `CHANGELOG.md` global, +- des `README.md` et `TODO.md` par crate à mesure de l’évolution, +- des tests unitaires robustes, +- les bindings TS générés via `cargo test export_bindings` lorsque les types partagés évoluent. + +## 12. Priorité immédiate + +La priorité immédiate après le point de reprise `0.7.43-E5C` n’est plus de terminer Meteora en un seul bloc. Le lot Meteora groupé a montré ses limites : les events, les audits, les surfaces bonding/launch et les variantes de DEX doivent être traités séparément. + +Préconditions considérées acquises avant cette reprise : + +1. validation `0.7.36` acquise : Meteora consolidé au niveau baseline, transactions failed traçables mais non actionnables, swaps sans amounts classés `non_actionable_trade`, aucun diagnostic bloquant masqué ; +2. validation `0.7.37` acquise : compteurs metadata/catalog exposés, backfill metadata idempotent, `pair_symbol` rafraîchissables, metadata manquantes non bloquantes ; +3. validation `0.7.38` acquise : `tokenMetadataGapSamples` priorisés, Demo Pipeline 2 raccordé, registre local `WSOL`/`USDC`/`USDT`/`JUP`/`RAY`/`BONK` disponible ; +4. `0.7.39` acquis : matrice DEX-first, suppression de l’alias `raydium`, `metaDAO` et `Printr` en `to_verify`, aucun `program_id` fictif ; +5. `0.7.40` acquis : `Demo3` découvre on-chain des signatures, mints, deltas et comptes candidats ; Demo Pipeline 2 peut backfiller une signature précise ; +6. `0.7.41` acquis : `raydium_amm_v4.swap` décode les inner instructions `675kPX...`, produit des trades/candles lorsque les montants sont exploitables, et conserve les transactions failed sans matérialisation marché ; +7. `0.7.42` acquis côté Raydium : CLMM/CPMM couvrent swaps et premiers non-swaps prouvés ; AMM v4 couvre les swaps et conserve les non-swaps legacy en audit ; +8. `0.7.43-E5C` est le point de reprise documentaire et technique, avec Clippy `kb_lib` validé localement après correction. + +Ordre de travail recommandé pour la suite : + +1. `0.7.44` : ledger de décodage/replay et skip sûr — acquis ; +2. `0.7.45` : `meteora_dlmm` historique — clos ; +3. `0.7.46` : `meteora_damm_v1` historique — clos côté corpus local ; +4. `0.7.47` : Upstream Git Registry / DEX discovery preparation — acquis ; +5. `0.7.48-pre` : event coverage + DB model checkpoint — clos ; +6. `0.7.48` : `raydium_cpmm` — clos ; +7. `0.7.49` : `raydium_clmm` — clos ; +8. `0.7.50-pre-r2` : `raydium_launchpad` clos + re-vérification CPMM/CLMM ; +9. `0.7.51` : `raydium_amm_v4` — clos ; +10. `0.7.52` : `raydium_stable_swap` — clos ; +11. `0.7.53` : `pump_swap` — clos ; +12. `0.7.54` : `pump_fun` — clos ; +13. `0.7.55` : `pump_fees` — clos ; +14. `0.7.56` : `meteora_dbc` — clos ; +15. `0.7.57` : `meteora_dlmm` — clos ; +16. `0.7.58` : `sqlite_db_transaction_merger` + validation anti-régression Pump/Raydium/Meteora — outillage ajouté, validation locale à exécuter ; +17. `0.7.59` : `demo4_program_surface_discovery` — à faire ; +18. `0.7.60` : `meteora_damm_v1` — prochaine tranche DEX ; +19. `0.7.61` : `meteora_damm_v2` — après DAMM v1 ; +20. `0.7.62+` : appliquer le phasage actif défini en section `6.085`. + +Garde-fous constants : + +- pas de faux trade ; +- pas de fausse candle ; +- pas de `program_id` fictif ; +- pas de promotion d’un DEX sans corpus transactionnel ; +- pas de logique métier DEX profonde dans `kb_demo_app` ; +- pas de metadata manquante bloquante ; +- pas de refactor réseau inutile tant que les clients HTTP/WS existants suffisent ; +- pas de skip replay sur transaction/instruction ambiguë, multi-token ou multi-event sans preuve ledger. + + +### Demo3 discovery note + +Demo3 supports multiple selected target surfaces in one scan. The UI serializes selected checkboxes into the existing `targetEvent` filter as comma-separated values, so the backend remains backward compatible with single-target requests. + + +### Demo3 paged / multi-source note + +Demo3 discovery now supports multiple source addresses, `before` / `until` pagination cursors, per-address max pages and `newest_first` / `oldest_first` processing order. This is intended for targeted corpus construction from known pool/pair addresses, especially when the first signatures can be identified externally with an explorer and then replayed/backfilled through Demo Pipeline 2. External explorers remain discovery aids only; verification still requires local decoder corpus and DB replay. + + +### 0.7.46 — clôture DAMM v1 upstream Git coverage + +La tranche DAMM v1 doit couvrir les instructions/events listés par upstream Git decoder source `meteora-pools-decoder`. Les surfaces non observées localement sont volontairement persistées avec `proofStatus=upstream_git_mapped_unverified`; elles restent à valider par signatures réelles, replay et requêtes SQL. + +Après backfills ciblés, les surfaces `swap` et `add_balance_liquidity` sont confirmées par corpus local et ne doivent plus rester en `upstream_git_mapped_unverified`. Les deux `remove_liquidity` non matérialisés en table liquidity sont expliqués par l’absence de `pool_id/pair_id` local pour leurs pools, pas par un échec de décodage. + +### 6.080B. Clôture `0.7.48` — `raydium_cpmm` event coverage + +Statut : delta préparé. + +Fait : + +- inventaire des entrées `raydium_cpmm` depuis Carbon et fnzero/IDL ; +- mapping local spécialisé des instructions CPMM non-swap connues ; +- ajout du décodage Anchor self-CPI audit-only `lp_change_event` et `swap_event` ; +- mise à jour de `known_local_event_kind` pour que la coverage DB reflète la couverture locale CPMM ; +- conservation de `swap_event` comme audit-only pour éviter un doublon avec les trades matérialisés depuis `swap_base_input` / `swap_base_output` ; +- maintien des règles : non-trade = zéro trade/candle, failed transaction = audit-only, upstream Git/IDL = indice et non preuve métier. + +Reste à exécuter localement après application du delta : + +```bash +cargo fmt +cargo test -p kb_lib +cargo clippy -p kb_lib --all-targets -- -D warnings +``` + +Puis relancer la validation SQL `validation_sql/SQL_VALIDATION_RAYDIUM_CPMM_0_7_48.sql` sur la base de corpus CPMM. + +Complément appliqué après constitution du corpus CPMM : + +- auto-sync conservatoire de `k_sol_dex_event_coverage_entries` lors d'un refresh coverage si la base neuve ne contient encore aucune entrée coverage ; +- refresh coverage best-effort après backfill token, pool ou signature ; +- décodage des events `Program data:` CPMM sans sélecteur Anchor self-CPI pour `swap_event` et `lp_change_event` ; +- maintien de `swap_event` en decoded/audit-only pour ne jamais doubler les `trade_events` issus des instructions swap ; +- matérialisation liquidity possible pour `lp_change_event` lorsque le pool/pair local est connu, avec `changeType=0` comme add/deposit et `changeType=1` comme remove/withdraw ; +- aucun changement de règle trade/candle pour les swaps existants. + + + +### Note 0.7.48-part2-fix2 — Raydium CPMM coverage finalization + +La tranche CPMM reconnaît désormais tous les discriminants instruction-level listés par Carbon / Raydium CP-Swap côté classificateur local. `lp_change_event` est traité comme famille bidirectionnelle `liquidity`, avec sens add/remove résolu par `changeType`, et le refresh coverage est confirmé après replay local sans validation séparée. + +### Note 0.7.48 final — Raydium CPMM + +`0.7.48` est clôturable côté `raydium_cpmm`. Le decoder couvre les instructions/events CPMM listés par Carbon/fnzero/Raydium CP-Swap, avec matérialisation locale validée pour trades, liquidity, lifecycle, fees et admin/config. `swap_event` reste audit-only pour éviter les doublons avec `swap_base_input` / `swap_base_output`. Les side effects SPL Token / Token-2022 observés via Solscan (`burn`, `transfer`, `transferChecked`, `closeAccount`) restent hors decoder CPMM direct et alimenteront une réflexion transversale future. + +La suite après `0.7.52 raydium_stable_swap` a été clôturée par `0.7.53 pump_swap`, puis continue avec le phasage strict “une version = un `program_id`”. `raydium_pool_v4.json` reste repoussé vers la fin comme audit conditionnel : source Git/IDL utile seulement si elle apporte une amélioration concrète à `raydium_amm_v4` ou prouve un nouveau scope par corpus local. + +## Clôture `0.7.51` — Raydium AMM v4 + +La tranche `0.7.51 raydium_amm_v4` est clôturable côté code et corpus local AMM v4. + +Résultats de validation : + +- `cargo test -p kb_lib` : `405 passed`, `0 failed` ; +- `cargo clippy -p kb_lib --all-targets -- -D warnings` : OK ; +- dernier replay : `195 replayed`, `0 decode skipped`, `168 trades`, `7 liquidity`, `15 lifecycle`, `668 candle upserts`, `instructionObservations=2599`, `resetDeleted=1578` ; +- tous les discriminants AMM v4 `00..11` sont observés localement ; +- `raydium_amm_v4.swap` legacy, decoded sans coverage, instruction observations 8 octets, non-swap trade, failed tx trade et multi-target materialization sont vides ; +- `pre_initialize` est matérialisé comme lifecycle audit minimal pour les transactions successful, sans création de pair exploitable ; +- `migrate_to_open_book` est orderbook-only ; +- `simulate_info` reste decoded-only. + +Décision `raydium_pool_v4` : ne pas ouvrir de decoder autonome dans cette tranche. La roadmap conserve uniquement une entrée conditionnelle : + +- même program id/layout compatible AMM v4 : intégrer dans `raydium_amm_v4` ; +- autre program id/surface strategy/wrapper/farm/lending : future tranche dédiée après corpus ; +- IDL ambiguë sans corpus : rester en audit roadmap. + +Le rapport de décision est `docs/reports/RAYDIUM_POOL_V4_DECISION_NOTE.md`. + +La tranche `0.7.52 raydium_stable_swap` est clôturée et `0.7.53 pump_swap` est désormais clôturé également. L'audit `raydium_pool_v4.json` reste repoussé vers la fin du phasage, avant le nettoyage/consolidation, afin de ne pas bloquer les surfaces Pump/Meteora/système/routers/DEX documentés. + +### Addendum final — `0.7.52 raydium_stable_swap` + +Statut : **clôturé**. + +Décision finale : `raydium_stable_swap` est le code local canonique pour le program id `5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h`. Le decoder utilise un layout legacy 1 octet et couvre la surface localement observée `00..0d`. + +Résultat de tranche : + +- `initialize` matérialise le lifecycle quand le contexte est complet ; +- `init_model_data` reste decoded-only expliqué ; +- `update_model_data` matérialise `k_sol_pool_admin_events` ; +- `deposit` / `withdraw` matérialisent `k_sol_liquidity_events` ; +- `monitor_step` / `admin_cancel_orders` matérialisent `k_sol_orderbook_events` quand le contexte est complet ; +- `set_params` matérialise `k_sol_pool_admin_events` ; +- `withdraw_pnl` / `withdraw_srm` matérialisent `k_sol_fee_events` quand le contexte est complet ; +- `simulate_info` reste decoded-only ; +- `swap_base_in` / `swap_base_out` matérialisent trades/candles uniquement depuis `amountSource=stable_swap_vault_balance_delta` ; +- `stable_swap_instruction_bounds_only` reste decoded-only et ne matérialise pas de trade/candle ; +- les transactions failed restent decoded-only avec `failed_transaction`. + +Validation finale : + +```text +cargo test -p kb_lib -> 407 passed, 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> ok +``` + +Replay final observé : + +```text +replayed=298, trades=290, liquidity=16, lifecycle=4, candle_upserts=1160, +instructionObservations=5317, catalog=40 tokens / 59 pools / 59 pairs +``` + +Clôture swap spécifique : + +```text +swap_base_in stable_swap_vault_balance_delta success 171 decoded / 171 trades +swap_base_in stable_swap_instruction_bounds_only failed 27 decoded / 0 trades +swap_base_out stable_swap_vault_balance_delta success 4 decoded / 4 trades +swap_base_out stable_swap_instruction_bounds_only failed 2 decoded / 0 trades +``` + +SQL de validation : `validation_sql/SQL_VALIDATION_RAYDIUM_STABLE_SWAP_0_7_52.sql`. + +Rapport : `docs/reports/RAYDIUM_STABLE_SWAP_EVENT_COVERAGE_REPORT.md`. + +### Addendum — `0.7.53 pump_swap` + +La reprise après `0.7.52 raydium_stable_swap` cible uniquement le program id `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA`. Le decoder local `pump_swap` couvre désormais les discriminants d’instructions upstream connus : trades matérialisables (`buy`, `sell`), swap decoded-only provisoire (`buy_exact_quote_in` tant que les montants exacts ne sont pas prouvés), liquidity (`deposit`, `withdraw`), pool/config (`create_pool`, `create_config`, `update_fee_config`), creator/protocol fee paths, cashback/token incentives et volume accumulator. Les events Program-data associés sont conservés comme entrées de coverage explicites ; ils ne doivent pas créer de doublon trade si l’instruction locale matérialise déjà le swap effectif. + +Delta post-replay : `toggle_cashback_enabled` est admin-only, `migrate_pool_coin_creator` est admin/config et l’index `k_sol_instruction_observations` nomme les discriminants PumpSwap observés. Les trois discriminants d’abord inconnus (`01214eb921432c5c`, `fbe0ab92a01a71e9`, `cfbdb247a77a44b4`) sont maintenant nommés : `transfer_creator_fees_to_pump_v2` et `update_buyback_config` sont confirmés par le raw Solscan IDL ; `set_reserved_fee_recipient` reste une entrée observée dans les logs locaux, probablement une instruction ancienne/supprimée ou non exposée dans ce raw. + +Critères de fermeture : corpus Demo3/backfill/replay dédié, coverage `pump_swap` synchronisée, zéro fallback `upstream_git.instruction_match` pour les instructions couvertes localement, failed tx sans trade/candle, non-swap sans trade/candle, et SQL `validation_sql/SQL_VALIDATION_PUMP_SWAP_0_7_53.sql` vide sur les requêtes d’anomalies. + diff --git a/olddocs/archivekbobobot/docs/ARCHIVE_ORGANIZATION.md b/olddocs/archivekbobobot/docs/ARCHIVE_ORGANIZATION.md new file mode 100644 index 0000000..43e4610 --- /dev/null +++ b/olddocs/archivekbobobot/docs/ARCHIVE_ORGANIZATION.md @@ -0,0 +1,22 @@ + + +# Organisation de l’archive documentaire + +La racine du workspace garde les documents de pilotage principaux : + +```text +README.md +ROADMAP.md +CHANGELOG.md +``` + +Les documents spécialisés sont rangés par usage : + +```text +docs/ matrices et revues transversales +docs/reports/ rapports de couverture par tranche DEX/version +docs/prompts/ prompts de reprise de session +validation_sql/ scripts SQL de validation +``` + +Cette réorganisation ne modifie pas le code Rust/Tauri. Elle sert uniquement à séparer les fichiers de pilotage, les rapports, les prompts et les validations SQL. diff --git a/olddocs/archivekbobobot/docs/DB_EVENT_MODEL_REVIEW.md b/olddocs/archivekbobobot/docs/DB_EVENT_MODEL_REVIEW.md new file mode 100644 index 0000000..fac59a9 --- /dev/null +++ b/olddocs/archivekbobobot/docs/DB_EVENT_MODEL_REVIEW.md @@ -0,0 +1,401 @@ + + +# Database Event Model Review — `khadhroony-bobobot` `0.7.47-1FE5` + + +## Note `0.7.56` — modèle fee parent + amount legs + +`0.7.56` ajoute `k_sol_fee_event_amounts` comme table enfant de `k_sol_fee_events`. Cette table est obligatoire dès qu'un event fee porte plusieurs montants, plusieurs mints ou plusieurs destinations. Le parent `k_sol_fee_events` reste l'ancre logique liée au `decoded_event_id`; les legs portent `leg_index`, `token_mint`, `amount_raw`, comptes source/destination et `amount_source`. + +Invariants : + +- tout parent fee avec `fee_token_mint + fee_amount_raw` doit avoir un leg scalaire automatique ; +- un fee multi-leg/multi-mint ne doit pas agréger artificiellement le parent ; +- les replays doivent supprimer/remplacer les legs avec le parent ; +- les transactions failed restent audit-only ; +- la recovery `allowlisted_inner_spl_transfer` est strictement allowlistée et ne s'applique pas par défaut aux futurs decoders. + +Le contrôle standard `parent scalar without leg` doit être vide sur toute base de validation. Voir `docs/reports/FEE_EVENT_AMOUNTS_MODEL_NOTE_0_7_56.md`. + +## Conclusion courte + +La base actuelle est **suffisante pour continuer le décodage exhaustif en audit-only**, parce que `k_sol_dex_decoded_events` garde les events décodés avec `payload_json`. + +La base actuelle est **partiellement insuffisante pour exploiter tous les events en requêtes métier**, parce que certaines familles importantes n’ont pas encore de tables dédiées ou de modèle normalisé : + +- transfers SPL / Token-2022 ; +- token account create/close ; +- wrap/unwrap SOL ; +- orderbook orders/fills/settlements ; +- vault deposit/withdraw ; +- launch/migration ; +- lock/unlock LP ; +- staking/unstaking ; +- coverage matrix persistée par discriminator/event. + +## Ce qui existe déjà + +D’après le README, le modèle contient déjà notamment : + +- `k_sol_chain_transactions`; +- `k_sol_chain_instructions`; +- `k_sol_dex_decoded_events`; +- `k_sol_trade_events`; +- `k_sol_liquidity_events`; +- `k_sol_pool_lifecycle_events`; +- `k_sol_fee_events`; +- `k_sol_reward_events`; +- `k_sol_pool_admin_events`; +- `k_sol_token_mint_events`; +- `k_sol_token_burn_events`; +- `k_sol_transaction_classifications`; +- `k_sol_protocol_candidates`; +- `k_sol_dex_decode_replay_ledger`. + +Ces tables couvrent déjà les besoins principaux : + +| Besoin | Couverture actuelle | +|---|---| +| Stockage brut/audit de tout event décodé | Oui, via `k_sol_dex_decoded_events.payload_json`. | +| Trades/candles | Oui. | +| Liquidity/lifecycle/fee/reward/admin | Oui, au moins structurellement. | +| Mint/burn | Oui, structurellement. | +| Replay/skip sûr | Oui, via ledger. | +| Event coverage attendu vs observé | Non ou seulement implicite. | +| Transfers/token account lifecycle | Non spécialisé. | +| Orderbook events | Non spécialisé. | +| Vault events | Non spécialisé. | +| Launch/migration | Non spécialisé ou dispersé. | + +## Ne pas modifier la DB trop vite + +Il ne faut pas créer une table pour chaque DEX ou chaque event upstream. + +La bonne stratégie : + +1. Décoder tout ce qu’on peut en `k_sol_dex_decoded_events`. +2. Ajouter `eventFamily`, `eventSemanticKind`, `eventActionability`, `proofStatus`, `sourceRepo`, `sourcePath`. +3. Matérialiser seulement les familles prouvées et utiles. +4. Ajouter des tables transversales uniquement quand plusieurs DEX en ont besoin. + +## Ajouts DB recommandés + +### 1. `k_sol_dex_event_coverage_entries` + +But : stocker ce qui est **attendu/listé** depuis les sources upstream, même si non observé. + +Colonnes conceptuelles : + +```text +id +decoder_code +program_id +program_family +surface_kind +source_repo +source_path +entry_kind -- instruction/event/account/log/program_data +entry_name +discriminator_hex +discriminator_len +event_family -- swap/burn/mint/admin/etc. +expected_db_target +proof_status +local_event_kind +observed_count +materialized_count +trade_count +first_signature +last_signature +notes +created_at +updated_at +``` + +Rôle : rendre la couverture objectivable. Exemple : “Carbon liste 42 instructions Raydium CPMM, notre code en décode 18, 4 sont matérialisées”. + +### 2. `k_sol_token_transfer_events` + +But : matérialiser les transfers significatifs hors trade. + +Colonnes conceptuelles : + +```text +id +transaction_id +instruction_id +decoded_event_id +signature +slot +program_id +token_program_id +mint +source_token_account +destination_token_account +source_owner +destination_owner +amount_raw +amount_ui +transfer_kind -- transfer, transfer_checked, routed_transfer, vault_transfer +reason -- audit_only, vault_movement, migration, settlement, unknown +payload_json +``` + +Important : ne pas créer de trade depuis cette table. Elle sert au risque/analyse. + +### 3. `k_sol_token_account_events` + +But : suivre create/close/init ATA/token accounts. + +```text +id +transaction_id +instruction_id +decoded_event_id +signature +slot +event_kind -- create_ata, init_account, close_account, wrap_sol, unwrap_sol +account_address +mint +owner +token_program_id +lamports_delta +payload_json +``` + +Cela aide à comprendre WSOL wrap/unwrap, close accounts, cleanup bots, préparation de trades. + +### 4. `k_sol_orderbook_events` + +But : stocker OpenBook/Phoenix et autres CLOB sans les confondre avec swaps AMM. + +```text +id +transaction_id +instruction_id +decoded_event_id +signature +slot +protocol_name +market_account +event_kind -- order_place, order_cancel, order_fill, settle_funds, consume_events, open_orders_create, open_orders_close +side +price_lots +base_lots +quote_lots +maker +taker +client_order_id +raw_event_name +interpretation_status +payload_json +``` + +Les fills ne deviennent `trade_events` que quand maker/taker, base/quote, lots/decimals et sens économique sont validés. + +### 5. `k_sol_vault_events` + +But : suivre vault deposit/withdraw, Meteora Vault, Kamino/Vault-like programs. + +```text +id +transaction_id +instruction_id +decoded_event_id +signature +slot +protocol_name +vault_account +event_kind -- deposit, withdraw, claim, rebalance, update_config +mint_a +mint_b +amount_a_raw +amount_b_raw +owner +payload_json +``` + +### 6. `k_sol_launch_events` + +But : séparer launch/bonding/migration du DEX effectif. + +```text +id +transaction_id +instruction_id +decoded_event_id +signature +slot +launch_protocol +event_kind -- create, buy, sell, migrate, graduate, initialize_curve, close_curve +token_mint +curve_account +migration_target_program +migration_pool +quote_mint +amount_token_raw +amount_quote_raw +payload_json +``` + +### 7. `k_sol_liquidity_lock_events` + +But : traiter LP lock/unlock explicitement. + +```text +id +transaction_id +instruction_id +decoded_event_id +signature +slot +protocol_name +pool_id +pair_id +lock_account +owner +event_kind -- create_lock, lock, unlock, extend_lock, close_lock +lp_mint +lp_amount_raw +unlock_time +payload_json +``` + +## Alternative minimaliste + +Si on veut éviter trop de migrations immédiates, le minimum à ajouter d’abord est : + +1. `k_sol_dex_event_coverage_entries`; +2. `k_sol_token_transfer_events`; +3. `k_sol_orderbook_events`. + +Les autres tables peuvent attendre. + +## Impact sur le plan des versions + +Chaque version DEX doit répondre à deux questions : + +### Couverture decoder + +- A-t-on listé tous les events upstream ? +- A-t-on un decoder audit pour chaque discriminator connu ? +- Les events non observés sont-ils marqués `upstream_git_mapped_unverified` ? + +### Couverture DB + +- L’event peut-il rester dans `k_sol_dex_decoded_events` ? +- Doit-il être matérialisé dans une table existante ? +- Faut-il une table transversale nouvelle ? +- Une table nouvelle peut-elle servir à plusieurs DEX ? + +## Décision pratique pour `0.7.48` + +Avant de reprendre `raydium_cpmm`, faire une micro-tranche DB/doc : + +```text +0.7.48-pre — event coverage + DB model checkpoint +``` + +Objectif : + +- ajouter ou documenter `k_sol_dex_event_coverage_entries`; +- ne pas encore ajouter toutes les tables métier ; +- produire un rapport par DEX : + - listed events, + - decoded events, + - materialized events, + - missing DB target, + - trade_count invariant. + +## Note `0.7.48` — Raydium CPMM sans nouvelle table DB + +La tranche `0.7.48` confirme que `k_sol_dex_decoded_events` suffit pour continuer la couverture exhaustive CPMM en audit-only. + +Aucune nouvelle table n'est ajoutée pour CPMM : + +- les swaps exploitables restent dans `k_sol_trade_events` via les chemins existants ; +- `deposit` / `withdraw` utilisent les tables non-trade existantes seulement si le corpus et le rattachement pool/pair sont fiables ; +- les fees/admin/config/permission restent non-trade et ne peuvent pas produire candles ; +- les transfers SPL, account lifecycle, wrap/unwrap SOL, vault et launch/migration restent des familles transversales futures, à promouvoir seulement si plusieurs DEX en justifient le besoin. + +## Note 0.7.48 final — Instruction observations et CPMM + +La tranche `raydium_cpmm` ajoute `k_sol_instruction_observations` comme table technique d’index local, non comme table métier. Elle sert à chercher les instructions observées par `decoder_code`, `instruction_name` et `discriminator_hex`, puis à relier ces observations au corpus backfillé/rejoué. + +La matérialisation métier reste limitée aux tables existantes : `k_sol_trade_events`, `k_sol_liquidity_events`, `k_sol_pool_lifecycle_events`, `k_sol_fee_events` et `k_sol_pool_admin_events`. Les opérations SPL Token / Token-2022 visibles dans Solscan (`burn`, `transfer`, `transferChecked`, `closeAccount`) ne sont pas promues en tables métier dans `0.7.48`; elles justifient seulement une future table transversale si plusieurs DEX le nécessitent. + +## Note 0.7.49 — Raydium CLMM sans nouvelle table transversale immédiate + +La reprise `raydium_clmm` confirme que la table `k_sol_dex_event_coverage_entries` suffit pour inventorier les instructions/events CLMM avant promotion métier. Les entrées IDL-only ajoutées en `0.7.49` restent des lignes de coverage et de recherche, pas des tables métier. + +Aucune nouvelle table transversale n'est ajoutée dans ce delta : + +- les swaps spécialisés restent dans `k_sol_trade_events` seulement lorsque les montants et le sens économique sont validés ; +- les liquidity/positions CLMM restent à distinguer : une position NFT/tick n'est pas forcément une liquidity row simple ; +- les fees et rewards peuvent utiliser `k_sol_fee_events` / `k_sol_reward_events` seulement après preuve de corpus et typage fin ; +- les side effects SPL Token / Token-2022 (`mint`, `burn`, `transfer`, `closeAccount`, wrap/unwrap SOL) restent indirects tant qu'une preuve multi-DEX ne justifie pas une table transversale. + +La table `k_sol_instruction_observations` reste technique : elle sert à trouver des signatures et discriminants observés localement, sans être une preuve métier. + + +## Note `0.7.50-pre-r2` — `k_sol_token_account_events` + +La re-vérification Raydium CLMM introduit une table dédiée `k_sol_token_account_events` pour les événements de cycle de vie de comptes token qui ne sont ni des swaps, ni de la liquidité, ni du lifecycle pool. Le premier cas d'usage est `raydium_clmm.create_support_mint_associated`. + +### Règle de matérialisation + +- `create_support_mint_associated` cible `k_sol_token_account_events`. +- `cpi_event` reste `k_sol_dex_decoded_events_only` : c'est un transport Anchor/CPI, pas un event métier autonome. +- `liquidity_calculate_event` reste `k_sol_dex_decoded_events_only` : c'est un event de calcul/diagnostic, pas une mutation de liquidité fiable. +- `create_operation_account` et `update_operation_account` relèvent de `k_sol_pool_admin_events` quand le corpus le permet. + +### Colonnes principales + +`k_sol_token_account_events` conserve `transaction_id`, `decoded_event_id`, `dex_id`, `pool_id`, `pair_id`, `signature`, `instruction_index`, `slot`, `protocol_name`, `program_id`, `event_kind`, `token_account`, `token_mint`, `owner_wallet`, `account_action`, `payload_json`, `executed_at` et `created_at`. + +Cette table permet de suivre les événements Token-2022/ATA significatifs sans les confondre avec les trades ou les liquidités. + +## Note `0.7.51` — impact AMM v4 sur le modèle DB + +Aucune nouvelle table n'est ajoutée pour `raydium_amm_v4`. + +Décisions DB maintenues : + +- `k_sol_instruction_observations` reste une table technique d'indexation instruction/discriminant ; +- AMM v4 utilise des discriminants d'un octet, donc l'index technique doit conserver `09`, `0b`, `10`, `11`, etc. sans les convertir en discriminants Anchor huit octets ; +- le refresh de `k_sol_instruction_observations` reconstruit les observations par transaction avant upsert, afin de supprimer les restes historiques en huit octets après changement de stratégie d'indexation ; +- les side effects SPL Token / Token-2022 restent transversaux et ne doivent pas être promus comme events directs `raydium_amm_v4.*` ; +- les side effects Serum/OpenBook de AMM v4 doivent être documentés comme contexte orderbook, pas comme trades OpenBook autonomes ; +- `raydium_pool_v4` ne justifie aucune table ni aucun decoder séparé sans corpus local. + +Le modèle actuel suffit pour ouvrir la tranche : decoded events + coverage entries + instruction observations + matérialisations existantes trade/liquidity/lifecycle/fee/admin/orderbook. Une extension future orderbook/vault/token-account ne doit être ajoutée qu'après preuves multi-DEX. + + + +### Clôture `0.7.51` — AMM v4 et modèle DB + +La validation finale AMM v4 confirme qu'aucune nouvelle table n'est requise pour `raydium_amm_v4`. + +Règles validées : + +- chaque decoded event AMM v4 matérialisé cible au plus une table métier principale ; +- `migrate_to_open_book`, `monitor_step` et `admin_cancel_orders` alimentent `k_sol_orderbook_events` uniquement ; +- `pre_initialize` alimente `k_sol_pool_lifecycle_events` comme audit deprecated/partial, sans création de paire exploitable ; +- `simulate_info` reste dans `k_sol_dex_decoded_events` uniquement ; +- les `deposit` / `withdraw` sans pool/pair catalogue ou sans deltas exploitables restent decoded-only expliqués ; +- les side effects SPL Token / Token-2022 restent transversaux. + +Contrôle final AMM v4 : le SQL `materialized_target_count > 1` doit rester vide. + +## 0.7.52 — Raydium Stable Swap DB model decision + +No schema migration is introduced for `raydium_stable_swap` at tranche opening. + +Stable Swap maps to existing DB targets: + +- `initialize` / `pre_initialize` → `k_sol_pool_lifecycle_events` when pool context is sufficient; +- `deposit` / `withdraw` → `k_sol_liquidity_events` when pool/pair context is sufficient; +- `swap_base_in` / `swap_base_out` → `k_sol_trade_events` and candles only when mints and amounts are reliable; +- `swap_event` → `k_sol_dex_decoded_events` only until a corpus-backed materialization decision exists. + +Side effects from SPL Token, Token-2022, Serum/OpenBook-style accounts or router transport remain transverse evidence and are not promoted as direct `raydium_stable_swap.*` business events without an explicit later DB decision. diff --git a/olddocs/archivekbobobot/docs/DEX_DECODER_MATRIX.md b/olddocs/archivekbobobot/docs/DEX_DECODER_MATRIX.md new file mode 100644 index 0000000..a3e9cf8 --- /dev/null +++ b/olddocs/archivekbobobot/docs/DEX_DECODER_MATRIX.md @@ -0,0 +1,365 @@ + + +# DEX Decoder Matrix — `khadhroony-bobobot` `0.7.57 meteora_dlmm closed` + + + +## Note `0.7.57 closed` — Meteora DLMM clôturé et suite discovery + +La tranche `0.7.57` ferme `meteora_dlmm` / `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo`. Elle remplace la couverture partielle historique `0.7.45` par un decoder local maximal aligné sur l'IDL locale, avec correction du discriminant `75c73e67068e1fcb` en `initialize_preset_parameter_v2`. Les résidus observés utiles ne restent plus en decoded-only. + +La prochaine étape n'est pas un nouveau decoder direct : `0.7.58 sqlite_db_transaction_merger` construit d'abord un corpus consolidé de non-régression, puis `0.7.59 demo4_program_surface_discovery` affichera et scorera les contenus inconnus/non pris en compte, sans auto-materialization ni auto-promotion. + +## Note `0.7.56 closed` — Meteora DBC clôturé, DLMM ensuite + +La tranche `0.7.56` ferme `meteora_dbc` / `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN` depuis l'IDL locale `idls/meteora_dbc.dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN.json`. + +Le decoder local couvre les `28` instructions et les `23` events Anchor IDL. Les trades/candles ne sont produits que depuis `swap` / `swap2` avec montants et mints fiables. Les migrations, lockers, lifecycle, admin/config et fees sont matérialisés quand le contexte est fiable ; sinon ils restent decoded-only/audit-only avec raison explicite. Les transactions failed restent audit-only. + +Le modèle fee est maintenant transversal : `k_sol_fee_events` reste le parent, `k_sol_fee_event_amounts` porte les legs. Les parents fees scalaires créent automatiquement un leg ; les fees multi-leg/multi-mint n'agrègent pas artificiellement le parent. La recovery `allowlisted_inner_spl_transfer` est allowlistée et ne s'applique jamais par défaut à un futur decoder. + +La prochaine tranche programmée est `0.7.57 meteora_dlmm` avec objectif full decode + full materialization sur `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo`. + +## Note `0.7.55 closed` — Pump Fees clôturé, Meteora DBC ensuite + +La tranche `0.7.55` ferme `pump_fees` comme surface fee/config/accounting. Le decoder local couvre les `29` instructions et `20` events Anchor de l'IDL locale, avec tests synthétiques pour les Anchor events IDL non observés. Les transactions failed restent audit-only, `get_fees` reste decoded-only, et aucun trade/candle direct n'est créé. + +Deux discriminators Solscan non présents dans l'IDL locale restent conservés en coverage comme surfaces futures : `revoke_fee_sharing_authority_event` (`7217653c0ebe993e`) et `transfer_fee_sharing_authority_event` (`7c8fc6f54db808ec`). + +La tranche suivante après `0.7.55` a été `0.7.56 meteora_dbc`, désormais clôturée ; la prochaine tranche courante est `0.7.57 meteora_dlmm`. + +## Note `0.7.54 closed` — Pump.fun clôturé + +La tranche `0.7.54` ferme `pump_fun` avant `pump_fees`. La surface Pump.fun principale est couverte depuis le code local, l'IDL Solscan locale `idls/pump_fun.6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P.json`, le registre upstream et le corpus SQLite. + +Décisions structurantes : + +- `pump_fun` est `supported / closed` côté decoder et validation locale ; +- toutes les instructions/events connus de l'IDL locale sont inventoriés ; +- `buy`, `sell`, `buy_exact_sol_in` peuvent être matérialisés directement avec montants fiables ; +- `buy_v2`, `sell_v2`, `buy_exact_quote_in_v2` restent decoded/audit/routing et s'appuient sur `pump_fun.trade_event` pour la matérialisation canonique ; +- `pump_fun.trade_event` matérialise les v2/exact quand les montants exécutés et la corrélation instruction sont prouvés ; +- les non-trades Pump.fun alimentent uniquement les tables business adaptées ou restent audit-only avec skip reason. + +`pump_fees` est clôturé en `0.7.55`; la prochaine tranche est `0.7.56 meteora_dbc`. + +## Note `0.7.53 final` — PumpSwap clôturé et sources IDL locales + +Le répertoire `idls/` devient une source locale de savoir en plus des liens Git. Les IDL Solscan locales doivent être comparées au registre upstream et au corpus avant promotion métier. `pump_swap` est clôturé côté transaction/log decoder : instructions IDL, events Anchor audit-only, `buy_exact_quote_in` via `BuyEvent` exact, tests synthétiques et SQL global. Raydium AMM v4 / CLMM / CPMM ne nécessitent pas de correction dans cette clôture ; les gaps Meteora sont reportés. + +`sol-parser-sdk/idls/raydium_pool_v4.json` a été vérifié comme source annexe distincte des fichiers `idls/raydium_*.json` présents localement : il expose notamment `swapBaseIn` et des comptes OpenBook/Serum, mais aucun fichier local ne porte ce nom ni ne correspond à son empreinte/format. Il reste donc un audit conditionnel, pas une source bloquante pour `0.7.53`. + +Cette matrice complète `kb_lib/src/dex_support_matrix.rs`. Elle documente **ce qui est fait**, **ce qui reste à faire**, et **le niveau de preuve attendu** par DEX/version. + +## Règle de lecture + +| Statut | Sens | +|---|---| +| `supported` | Decoder local actif et matérialisation métier possible sur corpus validé. | +| `partial` | Decoder partiel ou surface partielle : des events existent, mais la couverture n’est pas complète. | +| `audit-only` | Decoder local spécialisé, mais aucun trade/candle/matérialisation marché. | +| `planned` | Program id ou surface connue, mais decoder non prioritaire ou non activé. | +| `to_verify` | Source externe ou candidat : aucun statut vérifié sans corpus local. | +| `ignored/historical` | À conserver pour historique ou compatibilité, mais non prioritaire. | + +## Sources upstream à comparer + +- Carbon decoders : `https://github.com/sevenlabs-hq/carbon/tree/main/decoders` +- Solana Streamer : `https://github.com/0xfnzero/solana-streamer` +- Sol Parser SDK IDLs : `https://github.com/0xfnzero/sol-parser-sdk/tree/main/idls` +- Pinax Substreams Solana IDLs : `https://github.com/pinax-network/substreams-solana-idls/tree/main/src` +- HODL Warden Solana Tx Parser : `https://github.com/hodlwarden/solana-tx-parser/tree/main/src` +- OpenBook v2 : `https://github.com/openbook-dex/openbook-v2` +- Phoenix on-chain MM : `https://github.com/all-in-one-blockchain/phoenix-onchain-mm` +- Vybe DEX/AMM support list : `https://docs.vybenetwork.com/docs/available-dexs-amms` + +## Matrice prioritaire DEX/version + +| Ordre | DEX/version | État actuel | Fait | Reste à faire | +|---:|---|---|---|---| +| 1 | `raydium_cpmm` | `supported / 0.7.50-pre-r2 closure recheck` | Couverture CPMM clôturée : swaps, lifecycle, fees, admin/config, deposit/withdraw, `lp_change_event`, `swap_event` decoded-only, `cpi_event` transport Carbon et `anchor_idl_instruction` Solscan/manual pour `40f4bc78a7e9690a`. | Ne pas promouvoir `anchor_idl_instruction` : c'est de la gestion Anchor IDL, pas un événement AMM métier. | +| 2 | `raydium_clmm` | `supported / 0.7.50-pre-r2 closure recheck` | Couverture CLMM complétée : `cpi_event`, `update_dynamic_fee_config`, Program-data events locaux, `create_support_mint_associated` vers `k_sol_token_account_events`, familles sans `unknown`, router/swap Program-data en decoded-only. | Rejouer la base CLMM et confirmer que les seuls résidus sont `decoded_events_only`, transactions failed ou absence prouvée de contexte pool/pair. | +| 3 | `raydium_launchpad` | `bootstrap / 0.7.50` | Surface canonique normalisée, 1 entrée programme + 26 discriminants Carbon/IDL listés, fallback audit/mapped decoder, SQL dédié. | Créer DB neuve, backfill par discriminant, replay forcé, promouvoir seulement après corpus local. | +| 4 | `raydium_amm_v4` | `supported / 0.7.51 closed` | Decoder maximal AMM v4 `00..11`, swaps spécialisés, lifecycle/liquidity/fees/admin/orderbook validés. | Stable Swap clôturé ensuite en `0.7.52`; surveiller les surfaces restantes. | +| 5 | `raydium_stable_swap` | `supported / 0.7.52 closed` | Decoder legacy 1 octet, surface `00..0d`, swaps matérialisés depuis deltas vault exacts. | Surveiller seulement de nouveaux discriminants ou `swap_event` observé. | +| 6 | `raydium_pool_v4` | `to_verify / late-phase conditional audit` | IDL annexe mentionnée par fnzero, non présente dans l'archive locale, pas de program id/rôle confirmé ici. | Ne pas promouvoir tant que program id distinct, rôle exact et corpus exploitable ne sont pas confirmés. | +| 7 | `pump_swap` | `supported / 0.7.53 closed` | `buy`, `sell` + `buy_exact_quote_in` matérialisable via `BuyEvent` exact ; instructions non-trade spécialisées : liquidity, fee/creator fee, admin/config, cashback/token incentives, volume accumulator ; events Anchor autonomes audit-only. | Trades/candles uniquement depuis montants exacts ; failed tx decoded-only ; `instruction_bounds_only` reste decoded-only ; tests synthétiques IDL et SQL global ajoutés. | +| 8 | `pump_fun` | `supported / 0.7.54 closed` | Surface launch/bonding/migration Pump.fun couverte localement ; trades directs et `trade_event` canonique validés. | Ne rouvrir que pour bug prouvé ou changement externe. | +| 9 | `pump_fees` | `supported / 0.7.55 closed` | Surface fee/config/accounting couverte localement : `29` instructions, `20` events Anchor, fee/reward/admin/lifecycle, tests synthétiques Anchor IDL non observés, failed tx audit-only. | Aucun trade/candle direct ; conserver les deux discriminators Solscan hors IDL comme futures surfaces non observées. | +| 10 | `meteora_dbc` | `supported / closed 0.7.56` | Decoder local maximal : `28` instructions, `23` events Anchor, swaps `swap/swap2`, lifecycle/admin/fees, `k_sol_fee_event_amounts`, validation SQL propre. | Ne pas rouvrir sauf bug prouvé ; préserver la policy fee parent+legs et la recovery allowlistée. | +| 11 | `meteora_dlmm` | `supported / closed 0.7.57` | Decoder local maximal : `76` instructions IDL, `30` events Anchor, `12` accounts, correction `initialize_preset_parameter_v2`, swaps/exact-out, liquidity, bins, positions, lifecycle, fees/rewards, admin/config et orderbook. | Ne pas rouvrir sauf bug prouvé ; `swap_event/swap2_evt` restent lifecycle `swap_log`, pas trade ; préserver recovery fee/reward allowlistée. | +| 12 | `meteora_damm_v1` | `supported / 0.7.58 parity` | Couverture `0.7.46` : swap, create_pool, add/remove liquidity, claim_fee, create_lock_escrow, lock_liquidity. | Vérifier les surfaces upstream non observées ; améliorer rattachement pool/pair pour remove_liquidity non matérialisés ; revalidation stricte. | +| 13 | `meteora_damm_v2` | `partial / 0.7.59 planned` | `swap`, `instruction_audit`, registry/discriminants et corpus Demo3 existent. | Couvrir tous les events Carbon/source : create pool, liquidity, fees, dynamic config, admin ; déterminer actionability des swaps ; matérialiser si montants fiables. | +| 14 | `phoenix_v1` | `audit-only / 0.7.60 planned` | Decoder local audit-only ; `log_audit`, order place/cancel, withdraw ; parsing strict `0x0f`; events `Reduce`, `Place`, `TimeInForce` observés ; `trade_count=0`. | Terminer tous les events Git : `Fill`, `FillSummary`, `Fee`, `Evict`, `ExpiredOrder`, etc. ; ajouter counts/flags audit ; seulement ensuite étudier trade materialization. | +| 15 | `openbook_v2` | `audit-only / 0.7.61 planned` | Decoder local audit-only ; instructions order/cancel/consume/settle ; `Program data` mappé : `FillLog`, `OpenOrdersPositionLog`, `TotalOrderFillEvent`, `SettleFundsLog`; `trade_count=0`. | Vérifier layouts fill/out et sens maker/taker/base/quote ; ajouter table audit éventuelle ; ne matérialiser trades qu’après validation du sens économique. | +| 16 | `orca_whirlpools` | `partial / 0.7.62 planned` | Premier decoder historique présent ; swaps/create_pool partiels. | Comparer Carbon/IDL complet ; couvrir liquidity, positions, fees/rewards, tick arrays ; valider swaps exploitables et non-trades. | +| 17 | `legacy_launch_candidates` | `planned launch` | Anciennes entrées launch à réévaluer après `raydium_launchpad`. | Ne pas confondre Launchpad, LaunchLab, CPMM/CLMM/AMM v4 ; rattacher aux pools tradables seulement après corpus. | +| 18 | `meteora_vault` | `to_verify` | Présent comme indice upstream / compte associé. | Corpus direct obligatoire ; decoder séparé si events vault réels ; aucune promotion via DAMM indirect. | +| 19 | `fluxbeam` | `partial/to_verify` | Decoder initial existant ; Demo3 peut produire des candidats. | Vérifier source/IDL ; compléter swap, pool, liquidity, fees/admin ; matérialisation uniquement après corpus. | +| 20 | `dexlab` | `partial/to_verify` | Decoder initial historique ; ancienne entrée beta supprimée. | Reconfirmer program id/source ; décoder events disponibles ; distinguer DexLab natif et liens OpenBook/market. | +| 19 | `lifinity_v2` | `to_verify` | Program id listé par sources externes/Vybe ; pas de corpus concluant. | Trouver IDL/source ; Demo3 par program/market ; audit-only d’abord. | +| 20 | `stabble_stable_swap` / `stabble_weighted_swap` | `to_verify` | Program ids/indices via sources externes ; candidats Demo3 observables. | Source/IDL + corpus + decoder audit-only ; déterminer surface AMM et montants exploitables. | +| 21 | `bonkswap` | `to_verify` | Program id/Carbon/Vybe selon registre ; swaps candidats possibles. | Vérifier program id, source et corpus ; décoder tous events ; pas de trade sans montants. | +| 22 | `boop` / `boop_fun` | `to_verify / launch` | Entrée de découverte. | Séparer launch surface et swap effectif ; corpus + source obligatoire. | +| 23 | `moonshot` / `moonit` | `to_verify / launch` | Moonshot buy/sell observés via upstream candidates ; Moonit launch attribution historique. | Source/IDL + migration + rattachement pools ; éviter heuristiques seules. | +| 24 | `heaven` | `to_verify` | Program id/candidat ajouté en matrice. | Vérifier s’il est launch, AMM ou les deux ; corpus dédié. | +| 25 | `printr` | `to_verify` | Preset Demo3 ajouté ; candidats observables. | Source/IDL, discriminants, corpus, decoder audit-only. | +| 26 | `metadao_*` | `to_verify` | Presets spécifiques : launchpad, bid wall, futarchy, AMM. | Traiter par programme séparé ; ne pas utiliser mint ids comme program ids ; corpus obligatoire. | +| 27 | `jupiter_*`, `dflow_aggregator_v4`, `okx_dex` | `aggregator_router` | Registry/discovery pour contexte transactionnel. | Ne pas matérialiser en DEX direct ; utiliser pour routeSource/routing/context. | + +## Checklist obligatoire par DEX/version + +Pour chaque DEX ou version, la tranche doit fermer les points suivants : + +- [ ] Source Git/IDL recensée. +- [ ] Tous les `program_id` vérifiés localement ou marqués `to_verify`. +- [ ] Tous les discriminants d’instructions listés. +- [ ] Tous les discriminants d’events/logs listés. +- [ ] Demo3 corpus constitué. +- [ ] Demo2 backfill de signatures réussies. +- [ ] Replay forcé sur base `0.7.47+`. +- [ ] SQL : decoded events par kind. +- [ ] SQL : `trade_count=0` pour audit-only. +- [ ] SQL : trade/candle uniquement si montants exploitables. +- [ ] Cleanup `upstream_git.instruction_match` si decoder spécialisé local. +- [ ] Décision finale : `audit-only`, `materialized`, `partial`, ou `to_verify`. + +## Notes de matérialisation + +Un event peut devenir `materialized` uniquement si : + +1. la transaction est `OK` ; +2. les comptes nécessaires sont identifiés ; +3. les mints sont fiables ; +4. les montants sont fiables ; +5. le sens base/quote est validé ; +6. les requêtes SQL prouvent l’absence de faux trades/candles ; +7. les tests et clippy sont verts. + + +## Annexe — snapshot de `kb_lib/src/dex_support_matrix.rs` (`1FE5`) + +| Code | Rôle | Surface | Program id status | Observed | Decoded | Materialized | Status | Skip reason | +|---|---|---|---|---:|---:|---:|---|---| +| `pump_fun` | `launch_surface` | `launch/bonding` | `known` | oui | oui | oui | `0.7.54_closed` | Decoder maximal IDL/local ; v2/exact matérialisés via `trade_event` canonique ; non-trades selon contexte. | +| `pump_swap` | `dex_effective` | `AMM` | `known` | oui | oui | oui | `supported` | | +| `raydium_cpmm` | `dex_effective` | `AMM` | `known` | oui | oui | oui | `supported` | | +| `raydium_clmm` | `dex_effective` | `CLMM` | `known` | oui | oui | oui | `supported` | | +| `raydium_amm_v4` | `dex_effective` | `AMM` | `known` | oui | oui | oui | `supported` | | +| `raydium_launchpad` | `launch_surface` | `launch` | `known` | non | oui | non | `bootstrap` | decoded_events_only_until_local_corpus | +| `raydium_liquidity_locking` | `to_verify` | `liquidity_locking` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `raydium_router` | `aggregator_router` | `router` | `known` | non | non | non | `partial` | router_not_materialized_as_direct_trade_surface | +| `raydium_stable_swap` | `dex_effective` | `AMM` | `known` | oui | oui | oui | `supported` | 0.7.52 closed; swaps via `stable_swap_vault_balance_delta` uniquement | +| `meteora_dlmm` | `dex_effective` | `DLMM` | `known` | oui | oui | oui | `supported` | | +| `meteora_dlc` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | surface_and_program_id_to_verify | +| `meteora_damm_v1` | `dex_effective` | `AMM` | `known` | oui | oui | non | `partial` | meteora_damm_v1_swap_without_amount_payload | +| `meteora_damm_v2` | `dex_effective` | `AMM` | `known` | non | oui | oui | `partial` | not_observed_in_0_7_28_replay | +| `meteora_dbc` | `dex_effective` | `bonding_curve` | `known` | non | oui | oui | `partial` | not_observed_in_0_7_28_replay | +| `orca_whirlpools` | `dex_effective` | `CLMM` | `known` | non | oui | oui | `partial` | not_observed_in_0_7_28_replay | +| `fluxbeam` | `dex_effective` | `AMM` | `known` | non | oui | oui | `partial` | not_observed_in_0_7_28_replay | +| `dexlab` | `dex_effective` | `AMM` | `known` | non | oui | oui | `partial` | not_observed_in_0_7_28_replay | +| `bags` | `launch_surface` | `launch` | `unknown` | non | non | non | `planned` | program_id_to_verify | +| `letsbonk` | `launch_surface` | `launch` | `unknown` | non | non | non | `planned` | program_id_to_verify | +| `bonk` | `launch_surface` | `launch` | `unknown` | non | non | non | `planned` | program_id_to_verify | +| `bonk_fun` | `launch_surface` | `launch` | `unknown` | non | non | non | `planned` | program_id_to_verify | +| `okx_dex` | `aggregator_router` | `aggregator` | `to_verify` | non | non | non | `planned` | program_id_to_verify | +| `boop_fun` | `launch_surface` | `launch` | `to_verify` | non | non | non | `planned` | program_id_to_verify | +| `moonshot` | `launch_surface` | `launch` | `to_verify` | non | non | non | `planned` | historical_entities_py_program_id_requires_corpus_verification | +| `believe` | `launch_surface` | `launch` | `unknown` | non | non | non | `planned` | program_id_to_verify | +| `metadao` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | umbrella_surface_programs_split_into_specific_discovery_targets | +| `metadao_launchpad_v0_7_0` | `to_verify` | `launch` | `to_verify` | non | non | non | `to_verify` | official_metadao_program_id_requires_local_corpus_verification | +| `metadao_bid_wall_v0_7_0` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | official_metadao_program_id_requires_local_corpus_verification | +| `metadao_futarchy_v0_6_0` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | official_metadao_program_id_requires_local_corpus_verification | +| `metadao_amm_v0_5_0` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | official_metadao_program_id_requires_local_corpus_verification | +| `printr` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | solscan_program_label_requires_local_corpus_verification | +| `zora` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | solscan_program_label_requires_local_corpus_verification | +| `moonit` | `launch_surface` | `launch` | `unknown` | non | non | non | `planned` | program_id_to_verify | +| `launchbeam` | `launch_surface` | `launch` | `unknown` | non | non | non | `planned` | program_id_to_verify | +| `heaven` | `launch_surface` | `launch` | `to_verify` | non | non | non | `planned` | program_id_to_verify | +| `gavel` | `to_verify` | `auction` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `pump_fees` | `supported` | `fee_program` | `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` | non | non | non | `0.7.55 closed` | fee/reward/admin/lifecycle only ; no trade/candle | +| `meteora_pools` | `dex_effective` | `AMM` | `alias_of_meteora_damm_v1` | non | non | non | `to_verify` | program_id_alias_held_by_meteora_damm_v1 | +| `dflow_aggregator_v4` | `aggregator_router` | `aggregator` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `drift_v2` | `to_verify` | `perps` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `jupiter_swap` | `aggregator_router` | `aggregator` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `jupiter_dca` | `aggregator_router` | `dca` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `jupiter_limit_order` | `aggregator_router` | `limit_order` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `jupiter_limit_order_2` | `aggregator_router` | `limit_order` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `jupiter_perpetuals` | `to_verify` | `perps` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `jupiter_lend` | `to_verify` | `lending` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `kamino_lending` | `to_verify` | `lending` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `kamino_vault` | `to_verify` | `vault` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `kamino_farms` | `to_verify` | `farms` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `kamino_limit_order` | `to_verify` | `limit_order` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `marginfi_v2` | `to_verify` | `lending` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `onchain_labs_dex_v1` | `dex_effective` | `AMM` | `alias_of_okx_dex` | non | non | non | `to_verify` | program_id_alias_held_by_okx_dex | +| `onchain_labs_dex_v2` | `dex_effective` | `AMM` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `pancake_swap` | `dex_effective` | `AMM` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `vertigo` | `dex_effective` | `AMM` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `virtuals` | `launch_surface` | `launch` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `wavebreak` | `dex_effective` | `AMM` | `to_verify` | non | non | non | `to_verify` | upstream_git_program_id_requires_local_corpus_verification | +| `aldrin` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `aldrin_v2` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `crema` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `cropper` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `lifinity_v1` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `lifinity_v2` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `mercurial` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `orca_v1` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `orca_v2` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `phoenix` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `saber` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `saber_decimals` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `openbook_v2` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `fox` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `sanctum_infinity` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `saros` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `stabble_stable_swap` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `stabble_weighted_swap` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `stepn` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `solayer` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `penguin` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `sanctum` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `one_dex` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `solfi` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `bonkswap` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `guacswap` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `invariant` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `oasis` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `token_swap` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `helium_network` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `marinade_liquid_staking` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `francium_yield_pools` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `marinade_governance` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `serum_dao` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `port_finance` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `solend_classic` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `hyperspace_nft_amm` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `magic_eden_nft_amm` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `raydium_staking_early` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `orca_aquafarm_v1` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `quarry_merge_mining` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | historical_entities_py_program_id_requires_corpus_verification | +| `goosefx_v1` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `obric_v2` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `ondo_global_market` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `scorch` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `zerofi` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `manifest_clob` | `to_verify` | `orderbook` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `alphaq` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `goonfi` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `goonfi_v2` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `byreal` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `bisonfi` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `fusionamm` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `woofi` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `aquifer` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `humidifi` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | +| `solfi_v2` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | + +## Note `0.7.48` — Raydium CPMM + +`raydium_cpmm` reste `supported`, mais sa couverture est maintenant explicitée au niveau entry/event coverage. + +Entrées CPMM couvertes localement depuis Carbon/fnzero/IDL : + +- swaps : `swap_base_input`, `swap_base_output` ; +- events Anchor self-CPI audit-only : `lp_change_event`, `swap_event` ; +- pool/lifecycle : `initialize`, `initialize_with_permission` ; +- liquidity : `deposit`, `withdraw` ; +- fees : `collect_creator_fee`, `collect_fund_fee`, `collect_protocol_fee` ; +- admin/config/permission : `create_amm_config`, `update_amm_config`, `update_pool_status`, `create_permission_pda`, `close_permission_pda`. + +`create_amm_config` est traité comme admin/config, pas comme pool creation. `swap_event` est conservé comme audit-only pour ne pas doubler les trades matérialisés depuis les instructions `swap_base_input` / `swap_base_output`. + +## Note `0.7.48 final` — Raydium CPMM + +`raydium_cpmm` est considéré `supported` et clôturable pour la tranche `0.7.48`. Les entrées matérialisées couvrent swaps (`swap_base_input`, `swap_base_output`), liquidity (`deposit`, `withdraw`, `lp_change_event`), lifecycle (`initialize`, `initialize_with_permission`), fees (`collect_creator_fee`, `collect_fund_fee`, `collect_protocol_fee`) et admin/config (`create_amm_config`, `create_permission_pda`, `update_amm_config`). + +`swap_event` reste audit-only pour éviter tout doublon de trade/candle. `close_permission_pda` et `update_pool_status` restent connus upstream mais non observés localement. + +## Note `0.7.49` — Raydium CLMM initial coverage sync + +`raydium_clmm` reste `supported`, mais la tranche `0.7.49` rouvre sa couverture événementielle complète au lieu de se limiter aux swaps. + +État local repris : `swap`, `swap_v2`, `increase_liquidity_v2`, `decrease_liquidity_v2`, `open_position_with_token22_nft` et `close_position` disposent déjà d'un chemin local spécialisé ou mappé. Les autres entrées CLMM restent à confirmer par corpus avant toute promotion. + +Le registre est complété avec les entrées issues de l'IDL officiel Raydium non présentes dans le snapshot Carbon courant : `close_limit_order`, `close_protocol_position`, `create_customizable_pool`, `create_dynamic_fee_config`, `create_support_mint_associated` et `settle_limit_order`. + +Règle de clôture : les positions CLMM, fees/rewards et surfaces limit-order ne doivent produire aucune ligne trade/candle tant que le sens économique, les montants, les comptes et les mints ne sont pas prouvés par replay local. + + + +## Note `0.7.50-pre-r2` — CPMM/CLMM source parity + +La clôture `0.7.50-pre-r2` complète les tranches `0.7.48` et `0.7.49` sans rouvrir leur logique trade/candle : + +- `raydium_cpmm.cpi_event` est ajouté comme transport Anchor/CPI decoded-only, distinct de `swap_base_input` / `swap_base_output`. +- Le discriminant CPMM `40f4bc78a7e9690a` est codé comme `raydium_cpmm.anchor_idl_instruction` decoded-only après inspection Solscan : gestion Anchor IDL, aucune matérialisation métier. +- `raydium_clmm.cpi_event` et `raydium_clmm.update_dynamic_fee_config` sont ajoutés depuis Carbon. +- Les Program-data events CLMM reçoivent des `local_event_kind` et familles explicites. +- `create_support_mint_associated` introduit une cible métier spécialisée : `k_sol_token_account_events`. + +## Note `0.7.51` — `raydium_amm_v4` + +| Champ | Décision `0.7.51` | +|---|---| +| Code local | `raydium_amm_v4` | +| Program id canonique | `675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8` | +| Statut | `supported / 0.7.51 closed` ; max-decoder local `00..11` validé | +| Sources principales | Carbon `raydium-amm-v4-decoder`, Pinax `src/raydium/amm`, fnzero `raydium_amm_v4.json`, Solscan Program IDL | +| Swaps | `swap_base_in`, `swap_base_out`, `swap_base_in_v2`, `swap_base_out_v2` | +| Pool lifecycle | `initialize`, `initialize2`, `pre_initialize` | +| Liquidity | `deposit`, `withdraw` | +| Fees/admin/orderbook side effects | `withdraw_pnl`, `withdraw_srm`, `set_params`, `monitor_step`, `admin_cancel_orders`, `migrate_to_open_book`, config account ops | +| SPL Token / Token-2022 side effects | transversaux, non promus comme `raydium_amm_v4.*` directs | +| `raydium_pool_v4` | audit comparatif uniquement ; pas de decoder autonome sans program id et corpus local | + +La tranche a été validée sur base SQLite dédiée : tous les discriminants `00..11` sont observés localement. Les gaps de matérialisation restants sont expliqués par decoded-only, transaction failed ou absence de catalogue/deltas exploitables. + + +## 0.7.52 — Raydium Stable Swap + +| decoder_code | program id | status | layout | notes | +|---|---|---|---|---| +| `raydium_stable_swap` | `5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h` | supported / closed | legacy 1 octet | Surface locale `00..0d` couverte ; swaps `swap_base_in/out` matérialisés uniquement depuis deltas vault exacts ; instruction bounds et failed tx restent decoded-only. | + + +## 0.7.54 — Pump.fun + +| Decoder | Program id | Statut | Source discriminants | Couverture locale initiale | Règles métier | +|---|---|---:|---|---|---| +| `pump_fun` | `6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P` | supported / 0.7.54 closed | upstream registry + `idls/pump_fun.6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P.json` + corpus SQLite validé | `40` instructions et `23` events Anchor connus couverts ; `buy/sell/buy_exact_sol_in` matérialisés ; `buy_v2/sell_v2/buy_exact_quote_in_v2` audit/routing ; `trade_event` matérialise les montants exécutés v2/exact | `k_sol_trade_events` uniquement avec montants exacts ; `create/migrate` vers `k_sol_launch_events` ; creator fees vers `k_sol_fee_events` ; cashback/incentives vers `k_sol_reward_events` ; admin/config vers `k_sol_pool_admin_events` ; decoded-only/audit-only avec skip reason sinon | + +## 0.7.53 — PumpSwap + +| Decoder | Program id | Statut | Source discriminants | Couverture locale | Règles métier | +|---|---|---:|---|---|---| +| `pump_swap` | `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA` | supported / 0.7.53 closed | upstream registry + `idls/pump_swap.pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA.json` + corpus Demo3/replay | instructions : `buy`, `sell`, `buy_exact_quote_in`, `deposit`, `withdraw`, `create_pool`, `create_config`, `update_fee_config`, creator-fee, cashback, token incentives, volume accumulator, admin/config ; events Anchor autonomes audit-only | `buy_exact_quote_in` trade uniquement avec `pump_swap_anchor_buy_event`; aucun non-swap en trade/candle ; failed tx decoded-only ; `buy_event`/`sell_event` Program-data audit-only ; `transfer_creator_fees_to_pump_v2` et `update_buyback_config` confirmés par Solscan IDL ; `set_reserved_fee_recipient` conservé sur preuve log locale | + + +## 0.7.55 — Pump Fees + +| Decoder | Program id | Statut | Source discriminants | Couverture locale | Règles métier | +|---|---|---:|---|---|---| +| `pump_fees` | `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` | supported / `0.7.55 closed` | `idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json` + Carbon partiel + Solscan discriminators | `29` instructions et `20` events Anchor couverts ; tests synthétiques pour les Anchor events IDL non observés ; replay final propre ; watchlist `pump_fees` vide | Aucun trade/candle direct ; `get_fees` decoded-only ; social claim vers reward ; donation/buyback vers fee ; config/authority/tier/admin vers admin/lifecycle ; failed tx audit-only ; deux events Solscan hors IDL conservés non observés. | + + +## 0.7.56 — Meteora DBC clôturé + +| Decoder | Program id | Statut | Source locale | Couverture | Décision métier | +|---|---|---|---|---|---| +| `meteora_dbc` | `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN` | `supported / closed 0.7.56` | `idls/meteora_dbc.dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN.json` | `28` instructions IDL + `23` events Anchor IDL, tests synthétiques et validation SQL dédiée | `swap`/`swap2` seuls vers trade/candle direct ; lifecycle/admin/fee selon contexte ; fees parent+legs ; failed tx audit-only. | + +Validation finale : `446` tests, clippy OK, `480 replayed`, `264 trades`, `1 liquidity`, `122 lifecycle`, `1056 candles`, `89` parents fee DBC, `96` fee amount legs, invariants SQL propres. + +## 0.7.57 — Meteora DLMM clôturé + +| Decoder | Program id | Statut | Source locale | Couverture finale | Décision métier | +|---|---|---|---|---|---| +| `meteora_dlmm` | `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo` | `supported / closed 0.7.57` | `idls/meteora_dlmm.LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo.json` | `76` instructions IDL, `30` events Anchor, `12` accounts, `initialize_preset_parameter_v2` ajouté depuis corpus local | Les 6 swaps instructionnels produisent seuls les trades/candles ; Anchor `swap_event/swap2_evt` = lifecycle `swap_log`; liquidity/bin/position/lifecycle/admin/orderbook/fee/reward matérialisés selon cible ; failed tx audit-only. | + +Validation finale : `460` tests, clippy OK, `769 replayed`, `106 trades`, `664 liquidity`, `1107 lifecycle`, `424 candles`, `8062` instruction observations, catalogue `169/218/218`. Checks SQL bloquants propres. + +### 0.7.57 pre.001 — Meteora DLMM + +`meteora_dlmm` passe de tranche `next` à tranche ouverte `pre.001` : l’IDL locale complète est inventoriée, tous les discriminants instruction/event sont classifiés localement, et les familles non prouvées restent decoded-only/audit-safe avec `skip*Reason`. diff --git a/olddocs/archivekbobobot/docs/DEX_EVENT_COVERAGE_MATRIX.md b/olddocs/archivekbobobot/docs/DEX_EVENT_COVERAGE_MATRIX.md new file mode 100644 index 0000000..c663601 --- /dev/null +++ b/olddocs/archivekbobobot/docs/DEX_EVENT_COVERAGE_MATRIX.md @@ -0,0 +1,353 @@ + + +# DEX Event Coverage Matrix — `khadhroony-bobobot` `0.7.57 meteora_dlmm closed` + +Cette matrice complète `docs/DEX_DECODER_MATRIX.md` avec une lecture par familles d'événements. Elle ne remplace pas la preuve locale : une entrée Git/IDL reste un indice tant qu'elle n'est pas observée dans le corpus local puis validée par replay et SQL. + +## Règles de statut + +| Statut | Sens | +|---|---| +| `decoded` | Un decoder local produit un event spécialisé ou un event audit-only classé. | +| `materialized` | L'event alimente une table métier existante validée par corpus. | +| `audit-only` | L'event reste dans `k_sol_dex_decoded_events` et ne produit jamais trade/candle. | +| `upstream_git_mapped_unverified` | L'entrée est connue depuis Carbon/fnzero/IDL, mais non observée localement. | +| `not_applicable` | La famille n'existe pas pour ce DEX/version ou appartient à un autre programme. | + +## `0.7.48` — `raydium_cpmm` + +Sources inventoriées : Carbon `carbon-raydium-cpmm-decoder`, fnzero `solana-streamer` / `sol-parser-sdk` IDL `raydium_cpmm.json`. + +| Famille | Entrées Raydium CPMM | Statut `0.7.48` | Cible DB | Justification / règle | +|---|---|---|---|---| +| `swap` | `swap_base_input`, `swap_base_output`, `swap_event` | `materialized` pour `swap_base_*`; `swap_event` audit-only | `k_sol_trade_events` seulement pour `swap_base_*`; `k_sol_dex_decoded_events_only` pour `swap_event` | `swap_event` est décodé mais ne produit jamais trade/candle afin d'éviter les doublons. | +| `pool_create` | `initialize`, `initialize_with_permission` | `materialized` | `k_sol_pool_lifecycle_events` | `initialize_with_permission` est lifecycle-only et ne crée plus d'admin row. | +| `add_liquidity` | `deposit`, `lp_change_event(changeType=0)` | `materialized` | `k_sol_liquidity_events` | `deposit` et `lp_change_event(changeType=0)` matérialisent liquidity, sans trade/candle. | +| `remove_liquidity` | `withdraw`, `lp_change_event(changeType=1)` | `materialized` | `k_sol_liquidity_events` | `withdraw` et `lp_change_event(changeType=1)` matérialisent liquidity, sans trade/candle. | +| `position_open` | `-` | `not_applicable` | `-` | CPMM n'a pas de position CLMM. | +| `position_close` | `-` | `not_applicable` | `-` | CPMM n'a pas de position CLMM. | +| `fee` | `collect_creator_fee`, `collect_fund_fee`, `collect_protocol_fee` | `materialized` | `k_sol_fee_events` | Les trois familles de fee CPMM observées sont matérialisées avec `trade_count=0`. | +| `reward` | `-` | `not_applicable` | `-` | Aucune entrée reward CPMM dans Carbon/fnzero IDL inventoriée pour cette tranche. | +| `admin/config` | `create_amm_config`, `update_amm_config`, `create_permission_pda`, `update_pool_status`, `close_permission_pda` | `materialized` pour les entrées observées ; `upstream_git_mapped_unverified` pour `update_pool_status` / `close_permission_pda` | `k_sol_pool_admin_events` ou decoded-only selon corpus | `create_amm_config`, `create_permission_pda` et `update_amm_config` sont matérialisés ; les deux autres restent non observés localement. | +| `mint` | `-` direct | `not_applicable` | `-` | Mint LP implicite possible dans les instructions, mais pas d'instruction CPMM `mint` dédiée. | +| `burn` | `-` direct | `not_applicable` | `-` | Burn LP implicite possible dans `withdraw`, mais pas d'instruction CPMM `burn` dédiée. | +| `transfer` | SPL Token inner transfers | `audit-only` indirect | `k_sol_dex_decoded_events` pour cette tranche | Pas de table `k_sol_token_transfer_events` ajoutée en `0.7.48`. | +| `account_create` | comptes système/ATA indirects | `audit-only` indirect | decoded-only | Hors programme CPMM direct. | +| `account_close` | comptes système/ATA indirects | `audit-only` indirect | decoded-only | Hors programme CPMM direct. | +| `wrap_sol` | user/router side | `not_applicable` | `-` | Préparation WSOL hors CPMM. | +| `unwrap_sol` | user/router side | `not_applicable` | `-` | Cleanup WSOL hors CPMM. | +| `order_place` | `-` | `not_applicable` | `-` | CPMM est AMM, pas orderbook. | +| `order_cancel` | `-` | `not_applicable` | `-` | CPMM est AMM, pas orderbook. | +| `order_fill` | `-` | `not_applicable` | `-` | CPMM est AMM, pas orderbook. | +| `consume_events` | `-` | `not_applicable` | `-` | CPMM est AMM, pas orderbook. | +| `settle_funds` | `-` | `not_applicable` | `-` | CPMM est AMM, pas orderbook. | +| `vault_deposit` | `-` | `not_applicable` | `-` | Les vaults CPMM sont des comptes de pool, pas une surface vault séparée. | +| `vault_withdraw` | `-` | `not_applicable` | `-` | Les vaults CPMM sont des comptes de pool, pas une surface vault séparée. | +| `lock` | `-` | `not_applicable` | `-` | Raydium liquidity locking est une surface séparée. | +| `unlock` | `-` | `not_applicable` | `-` | Raydium liquidity locking est une surface séparée. | +| `launch` | `-` | `not_applicable` | `-` | Raydium LaunchLab/Launchpad est séparé de CPMM. | +| `migration` | `-` | `not_applicable` | `-` | Les migrations launch → pool relèvent des launch surfaces. | +| `stake` | `-` | `not_applicable` | `-` | Hors CPMM. | +| `unstake` | `-` | `not_applicable` | `-` | Hors CPMM. | +| `unknown/unmapped audit` | `raydium_cpmm.instruction_audit` | `audit-only` | `k_sol_dex_decoded_events_only` | Toute instruction observée mais non mappée reste audit-only et ne produit jamais trade/candle. | + +## Validation attendue + +- `k_sol_dex_event_coverage_entries.decoder_code = 'raydium_cpmm'` contient toutes les entrées Carbon/fnzero synchronisées. +- `upstream_git.instruction_match` ne doit plus apparaître pour une instruction CPMM remplacée par un decoder local spécialisé. +- Les familles non-trade CPMM doivent rester `trade_count = 0`. +- Les transactions failed CPMM doivent rester décodées/auditables mais non matérialisées en trade/candle. + + +## Note `0.7.48-part2-fix2` — CPMM official instruction parity + +La couverture `raydium_cpmm` est alignée avec les instructions exposées par le programme officiel Raydium CP-Swap et par Carbon : `create_amm_config`, `update_amm_config`, `update_pool_status`, `collect_protocol_fee`, `collect_fund_fee`, `collect_creator_fee`, `create_permission_pda`, `close_permission_pda`, `initialize`, `initialize_with_permission`, `deposit`, `withdraw`, `swap_base_input`, `swap_base_output`, `lp_change_event` et `swap_event`. + +`lp_change_event` est maintenant classé `event_family=liquidity` dans la table coverage, parce que l'event couvre à la fois dépôt et retrait. La matérialisation reste déterminée par `changeType` dans le payload décodé : `0` = add/deposit, `1` = remove/withdraw. + + +## Note `0.7.48 final` — Raydium CPMM clôturable + +Validation finale locale : `deposit` = `11/11` liquidity, `withdraw` = `14/14` liquidity, `lp_change_event` = `25/25` liquidity, fees = `26/26` fee, admin/config observés = `23/23` admin, lifecycle = `9/9`, `swap_event` = audit-only avec `0` trade, et trades matérialisés uniquement depuis `swap_base_input` / `swap_base_output`. + +`close_permission_pda` et `update_pool_status` restent `upstream_git_mapped_unverified` faute de corpus local. Les filtres Solscan `instruction=9c5420764587467b` et `instruction=82576c062ee0757b` n'ont pas fourni de signatures exploitables dans l'horizon testé. + +## `0.7.49` — `raydium_clmm` final coverage + +Sources inventoriées : Carbon `raydium-clmm-decoder`, fnzero `sol-parser-sdk`, Pinax `substreams-solana-idls/src/raydium/clmm`, Raydium/Solscan Program IDL. + +État final validé : `45` entrées listées, `33` instructions locales observées/décodées, `25` entrées matérialisées, `1186` trades, `raydium_clmm.instruction_audit = 0`, fallback `upstream_git.instruction_match` localement couvert = `0`. + +| Famille | Entrées Raydium CLMM | Statut `0.7.49` | Cible DB | Justification / règle | +|---|---|---|---|---| +| `swap` | `swap`, `swap_v2` | `materialized` | `k_sol_trade_events` | Seuls ces swaps produisent trades/candles lorsque les montants sont exploitables. | +| `swap audit` | `swap_event`, `swap_router_base_in` | `observed/audit` ou `upstream_git_unverified` selon corpus | `k_sol_dex_decoded_events_only` | Pas de double trade/candle. | +| `pool_create` | `create_pool`, `create_customizable_pool` | `decoded`; `create_pool` matérialisé quand prouvé | `k_sol_pool_lifecycle_events` | Création de pool = lifecycle, pas admin. | +| `add_liquidity` | `increase_liquidity`, `increase_liquidity_v2`, open position variants | `decoded`; variantes prouvées matérialisées | `k_sol_liquidity_events` | CLMM implique position/tick/NFT ; matérialisation seulement sur corpus OK. | +| `remove_liquidity` | `decrease_liquidity`, `decrease_liquidity_v2`, close position variants | `decoded`; variantes prouvées matérialisées | `k_sol_liquidity_events` | Aucune promotion trade/candle. | +| `fee` | `collect_fund_fee`, `collect_protocol_fee` | `decoded`; protocol fee matérialisé si tx OK | `k_sol_fee_events` | Mapping fee sans trade/candle. | +| `reward` | `initialize_reward`, `collect_remaining_rewards`, `set_reward_params`, `transfer_reward_owner`, `update_reward_infos` | `decoded`; variantes prouvées matérialisées | `k_sol_reward_events` / `k_sol_pool_admin_events` | Reward/config selon instruction. | +| `admin/config` | `create_amm_config`, `create_dynamic_fee_config`, `create_operation_account`, `update_amm_config`, `update_operation_account`, `update_pool_status` | `decoded`; variantes prouvées matérialisées | `k_sol_pool_admin_events` ou decoded-only | Config/admin sans trade/candle. | +| `account_create` | `create_support_mint_associated` | `observed/decoded` | `k_sol_token_account_events` prévu / decoded-only selon corpus | Side effect technique ; pas de trade/candle. | +| `order_place` | `open_limit_order`, `increase_limit_order` | `decoded/materialized` | `k_sol_orderbook_events` | Orderbook CLMM, jamais trade/candle. | +| `order_cancel` | `decrease_limit_order`, `close_limit_order` | `decoded/materialized` | `k_sol_orderbook_events` | Orderbook CLMM, jamais trade/candle. | +| `settle_funds` | `settle_limit_order` | `decoded/materialized` | `k_sol_orderbook_events` | Settlement orderbook, pas trade direct. | +| `mint/burn/transfer/account_close/wrap/unwrap` | Side effects SPL Token / Token-2022 | `indirect` | decoded-only | Pas de promotion en `raydium_clmm.*` sans instruction directe. | +| `launch/migration/lock/unlock/stake/unstake/vault` | `-` | `not_applicable` | `-` | Surfaces hors CLMM direct. | +| `unknown/unmapped audit` | `raydium_clmm.instruction_audit`, fallback upstream | `closed` | `k_sol_dex_decoded_events_only` | Résidu validé à zéro après replay. | + +Les 11 Anchor / `Program data` events restent `upstream_git_unverified` et préparés audit-only faute d’observation locale : `collect_personal_fee_event`, `collect_protocol_fee_event`, `config_change_event`, `create_personal_position_event`, `decrease_liquidity_event`, `increase_liquidity_event`, `liquidity_calculate_event`, `liquidity_change_event`, `pool_created_event`, `swap_event`, `update_reward_infos_event`. + +## `0.7.50` — `raydium_launchpad` bootstrap + +Sources inventoriées : Carbon `raydium-launchpad-decoder`, Solscan Program IDL `LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj`, fnzero IDL listings, Raydium SDK Launchpad examples. Code local canonique : `raydium_launchpad`. Aucun alias Rust `raydium_launchlab` ne doit être conservé dans l’API publique. + +État de départ préparé : `1` entrée programme et `26` entrées discriminées listées depuis Carbon/IDL. Toutes les entrées Launchpad sont gardées `decoded_events_only` en bootstrap, même si leur famille inférée est `swap`, `pool_create`, `fee`, `admin_config`, `launch` ou `migration`. La matérialisation métier est volontairement différée jusqu'au corpus local. + +| Famille | Entrées Raydium Launchpad | Statut `0.7.50` bootstrap | Cible DB initiale | Justification / règle | +|---|---|---|---|---| +| `swap` | `buy_exact_in`, `buy_exact_out`, `sell_exact_in`, `sell_exact_out`, `trade_event` | `upstream_git_mapped_unverified` puis `decoded/audit-only` si observé | `k_sol_dex_decoded_events_only` | Aucun trade/candle avant preuve locale de montants, sens et absence de doublon avec la surface DEX de migration. | +| `pool_create` | `initialize`, `initialize_v2`, `initialize_with_token_2022`, `pool_create_event` | `upstream_git_mapped_unverified` | `decoded_events_only` | Lifecycle launch/pool non promu tant que le compte pool/mint/quote n'est pas validé localement. | +| `add_liquidity` | `-` direct confirmé | `not_applicable` | `-` | Peut apparaître via DEX de destination ou SPL side effects, pas comme instruction Launchpad directe prouvée. | +| `remove_liquidity` | `-` direct confirmé | `not_applicable` | `-` | Même règle que `add_liquidity`. | +| `position_open` | `-` | `not_applicable` | `-` | Pas de position CLMM/LP NFT directe confirmée. | +| `position_close` | `-` | `not_applicable` | `-` | Pas de position CLMM/LP NFT directe confirmée. | +| `fee` | `claim_creator_fee`, `claim_platform_fee`, `claim_platform_fee_from_vault`, `claim_vested_event`, `claim_vested_token`, `collect_fee`, `collect_migrate_fee` | `upstream_git_mapped_unverified` puis `decoded/audit-only` si observé | `decoded_events_only` | Fee/vesting/migration fee utile pour stratégie, mais pas matérialisé sans corpus. | +| `reward` | `-` direct confirmé | `not_applicable` | `-` | Vesting n'est pas promu en reward transversal dans cette tranche. | +| `admin/config` | `create_config`, `create_platform_config`, `remove_platform_curve_param`, `update_config`, `update_platform_config`, `update_platform_curve_param` | `upstream_git_mapped_unverified` puis `decoded/audit-only` si observé | `decoded_events_only` | Admin/config utile pour audit, pas de table métier promue. | +| `mint` | SPL Token / Token-2022 side effects possibles | `indirect` | `decoded_events_only` | Ne devient pas `raydium_launchpad.*` sans instruction directe du programme. | +| `burn` | SPL Token / Token-2022 side effects possibles | `indirect` | `decoded_events_only` | Même règle que `mint`. | +| `transfer` | SPL Token / Token-2022 side effects attendus | `indirect` | `decoded_events_only` | Même règle que CPMM/CLMM : side effect transversal. | +| `account_create` | `create_vesting_account`, `create_vesting_event` | `upstream_git_mapped_unverified` | `decoded_events_only` | Vesting/account audit uniquement, pas de nouvelle table transversale. | +| `account_close` | `-` direct confirmé | `not_applicable` | `-` | Aucun close direct Launchpad confirmé. | +| `wrap_sol` | Side effect utilisateur/router possible | `indirect` | `decoded_events_only` | Hors programme Launchpad direct. | +| `unwrap_sol` | Side effect utilisateur/router possible | `indirect` | `decoded_events_only` | Hors programme Launchpad direct. | +| `order_place` | `-` | `not_applicable` | `-` | Launchpad n'est pas traité comme orderbook. | +| `order_cancel` | `-` | `not_applicable` | `-` | Launchpad n'est pas traité comme orderbook. | +| `order_fill` | `-` | `not_applicable` | `-` | Launchpad n'est pas traité comme orderbook. | +| `consume_events` | `-` | `not_applicable` | `-` | Launchpad n'est pas traité comme orderbook. | +| `settle_funds` | `-` | `not_applicable` | `-` | Launchpad n'est pas traité comme orderbook. | +| `vault_deposit` | `-` direct confirmé | `not_applicable` | `-` | Aucun vault direct Launchpad confirmé. | +| `vault_withdraw` | `-` direct confirmé | `not_applicable` | `-` | Aucun vault direct Launchpad confirmé. | +| `lock` | `-` direct confirmé | `not_applicable` | `-` | Liquidity locking reste une autre surface Raydium. | +| `unlock` | `-` direct confirmé | `not_applicable` | `-` | Liquidity locking reste une autre surface Raydium. | +| `launch` | `initialize*`, `pool_create_event` | `upstream_git_mapped_unverified` | `decoded_events_only` | La promotion `k_sol_launch_events` est différée. | +| `migration` | `migrate_to_amm`, `migrate_to_cpswap`, `collect_migrate_fee` | `upstream_git_mapped_unverified` | `decoded_events_only` | Destination AMM/CPMM à valider localement avant liaison métier. | +| `stake` | `-` | `not_applicable` | `-` | Aucun stake direct Launchpad confirmé. | +| `unstake` | `-` | `not_applicable` | `-` | Aucun unstake direct Launchpad confirmé. | +| `unknown/unmapped audit` | `raydium_launchpad.instruction_audit` | `audit-only` | `decoded_events_only` | Résidu à réduire par discriminant après backfill ciblé et replay. | + +Rapport détaillé : `docs/reports/RAYDIUM_LAUNCHPAD_EVENT_COVERAGE_REPORT.md`. + +SQL de validation : `validation_sql/SQL_VALIDATION_RAYDIUM_LAUNCHPAD_0_7_50.sql`. + + + +### 0.7.50-pre3 Launchpad note + +pre3 correction: Launchpad self-CPI selector `e445a52e51cb9a1d` is transport only. Known embedded event discriminators are decoded as `raydium_launchpad.trade_event` and `raydium_launchpad.pool_create_event`. The Launchpad `initialize*` instruction family now supplies pool/pair catalog context; `trade_event` remains decoded-only until trade/candle promotion is explicitly proven. + + +## Note `0.7.50-pre-r2` — Raydium CPMM/CLMM closure re-check + +Sources ajoutées à la vérification CPMM/CLMM : Carbon `raydium-cpmm-decoder`, Carbon `raydium-clmm-decoder`, Solscan Program IDL CPMM/CLMM et `sol-parser-sdk` IDL Raydium. + +### CPMM + +- `cpi_event` est ajouté à la matrice CPMM avec `event_family=cpi_transport`, `expected_db_target=k_sol_dex_decoded_events_only`, `local_event_kind=raydium_cpmm.cpi_event` et discriminant `e445a52e51cb9a1d`. +- `swap_event` reste `decoded_events_only` pour éviter le double comptage avec `swap_base_input` / `swap_base_output`. +- Le discriminant local `40f4bc78a7e9690a` est codé comme `raydium_cpmm.anchor_idl_instruction`, `event_family=idl_management`, `expected_db_target=k_sol_dex_decoded_events_only`, après inspection Solscan des logs `IdlCreateAccount` / `IdlCloseAccount`. + +### CLMM + +- `cpi_event` est ajouté à la matrice CLMM avec `event_family=cpi_transport`, `expected_db_target=k_sol_dex_decoded_events_only`, `local_event_kind=raydium_clmm.cpi_event` et discriminant `e445a52e51cb9a1d`. +- `update_dynamic_fee_config` est ajouté avec `event_family=admin_config`, `expected_db_target=k_sol_pool_admin_events`, `local_event_kind=raydium_clmm.update_dynamic_fee_config` et discriminant `0707500802c784f0`. +- Les Program-data events CLMM sont maintenant rattachés localement : `swap_event`, `pool_created_event`, `liquidity_change_event`, `create_personal_position_event`, `decrease_liquidity_event`, `increase_liquidity_event`, `collect_protocol_fee_event`, `config_change_event`, `update_reward_infos_event`. +- `swap_event` et `swap_router_base_in` restent `decoded_events_only` : les trades canoniques sont `swap` / `swap_v2`, afin d'éviter le double comptage et la matérialisation de routes sans pool direct. +- `liquidity_calculate_event` est classé `liquidity_calculation` et reste `decoded_events_only`, car il sert au diagnostic/calcul et non à une mutation de liquidité fiable. +- `create_support_mint_associated` cible la nouvelle table `k_sol_token_account_events`. +- `create_operation_account` et `update_operation_account` sont normalisés en `admin_config`. + +Validation attendue après replay : aucune entrée CPMM/CLMM ne doit rester en `event_family='unknown'` hors `program`, les fallbacks `upstream_git.instruction_match` ne doivent pas dupliquer une entrée locale couverte, et les transactions failed ne doivent matérialiser ni trade, ni liquidity, ni fee/admin/reward/orderbook/token-account. + +Rapport associé : `docs/reports/RAYDIUM_CPMM_CLMM_RECHECK_REPORT_0_7_50_PRE_R2.md`. + +## `0.7.51` — `raydium_amm_v4` + +Sources inventoriées : Carbon `raydium-amm-v4-decoder`, Pinax `src/raydium/amm`, fnzero `raydium_amm_v4.json`, Solscan Program IDL. `raydium_pool_v4` est comparé mais non promu. + +Validation locale finale : tous les discriminants AMM v4 officiels `00..11` sont observés ; `instruction_audit`, fallback upstream, decoded sans coverage, observations 8 octets, non-swap trade, failed tx trade, gaps inexpliqués et multi-target materialization sont vides. + +| Famille | Entrées AMM v4 | Statut `0.7.51-final` | Cible DB | Règle | +|---|---|---|---|---| +| `swap` | `swap_base_in`, `swap_base_out`, `swap_base_in_v2`, `swap_base_out_v2` | observed/materialized partiel expliqué | `k_sol_trade_events` | Trade/candle seulement si tx successful + montants vault fiables ; sinon `skipTradeReason`. | +| `pool_create` | `initialize`, `initialize2_pool` | observed/materialized | `k_sol_pool_lifecycle_events` | Alimente lifecycle et catalogue seulement quand les mints/pool sont prouvés. | +| `pool_create` deprecated | `pre_initialize` | observed/materialized audit minimal | `k_sol_pool_lifecycle_events` | Lifecycle deprecated/partial ; ne crée pas de pair exploitable sans mints. | +| `liquidity_add` | `deposit` | observed/materialized partiel expliqué | `k_sol_liquidity_events` | Jamais trade/candle ; pools absents du catalogue restent decoded-only expliqués. | +| `liquidity_remove` | `withdraw` | observed/materialized partiel expliqué | `k_sol_liquidity_events` | Jamais trade/candle ; deltas/catalogue manquants doivent être explicités. | +| `fee` | `withdraw_pnl`, `withdraw_srm` | observed/materialized partiel expliqué | `k_sol_fee_events` | Jamais trade/candle. | +| `admin/config` | `set_params`, `create_config_account`, `update_config_account` | observed/materialized | `k_sol_pool_admin_events` | Preuve métier par corpus uniquement. | +| `orderbook side effects` | `monitor_step`, `migrate_to_open_book`, `admin_cancel_orders` | observed/materialized | `k_sol_orderbook_events` | Side effects OpenBook/Serum ; pas de trade OpenBook autonome, pas de lifecycle en double. | +| `cpi/informational` | `simulate_info` | observed decoded-only | `k_sol_dex_decoded_events_only` | Audit technique uniquement. | +| `token side effects` | SPL Token / Token-2022 inner instructions | transversal | decoded-only actuellement | Ne pas promouvoir comme AMM v4 direct. | +| `unknown/unmapped audit` | residual `raydium_amm_v4.instruction_audit` | vide | decoded-only si futur inconnu | Tout residual doit être expliqué avant promotion. | + +## 0.7.52 — `raydium_stable_swap` + +Status: **closed on local corpus**. + +| entry | discriminator | family | expected target | local event kind | status | +|---|---:|---|---|---|---| +| `initialize` | `00` | `pool_create` | `k_sol_pool_lifecycle_events` | `raydium_stable_swap.initialize` | observed/materialized when context complete | +| `init_model_data` | `01` | `model_setup` | decoded-only | `raydium_stable_swap.init_model_data` | observed decoded-only / explained | +| `update_model_data` | `02` | `admin_config` | `k_sol_pool_admin_events` | `raydium_stable_swap.update_model_data` | observed/materialized | +| `deposit` | `03` | `liquidity_add` | `k_sol_liquidity_events` | `raydium_stable_swap.deposit` | observed/materialized | +| `withdraw` | `04` | `liquidity_remove` | `k_sol_liquidity_events` | `raydium_stable_swap.withdraw` | observed/materialized | +| `monitor_step` | `05` | `order_place` | `k_sol_orderbook_events` | `raydium_stable_swap.monitor_step` | observed/materialized | +| `set_params` | `06` | `admin_config` | `k_sol_pool_admin_events` | `raydium_stable_swap.set_params` | observed/materialized | +| `withdraw_pnl` | `07` | `fee` | `k_sol_fee_events` | `raydium_stable_swap.withdraw_pnl` | observed/materialized | +| `withdraw_srm` | `08` | `fee` | `k_sol_fee_events` | `raydium_stable_swap.withdraw_srm` | observed/materialized when context complete | +| `swap_base_in` | `09` | `swap` | `k_sol_trade_events` from vault deltas only | `raydium_stable_swap.swap_base_in` | success/vault-delta materialized; failed decoded-only | +| `pre_initialize` | `0a` | `pool_create` | lifecycle or decoded-only | `raydium_stable_swap.pre_initialize` | observed decoded-only / explained in current corpus | +| `swap_base_out` | `0b` | `swap` | `k_sol_trade_events` from vault deltas only | `raydium_stable_swap.swap_base_out` | success/vault-delta materialized; failed decoded-only | +| `simulate_info` | `0c` | `cpi_transport` | decoded-only | `raydium_stable_swap.simulate_info` | observed decoded-only / explained | +| `admin_cancel_orders` | `0d` | `orderbook_admin` | `k_sol_orderbook_events` | `raydium_stable_swap.admin_cancel_orders` | observed/materialized when context complete | +| `swap_event` | `40c6cde8260871e2` | `cpi_transport` | decoded-only | `raydium_stable_swap.swap_event` | upstream mapped; not observed locally | + +Stable Swap swaps are not materialized from instruction min/max bounds. `swap_base_in/out` require `amountSource=stable_swap_vault_balance_delta`; `stable_swap_instruction_bounds_only` remains decoded-only and, in the final corpus, appears only on failed transactions. + + +## 0.7.54 — `pump_fun` closed + +Program id unique : `6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P`. + +Source locale prioritaire : `idls/pump_fun.6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P.json`. + +Replay final rapporté : `1679 replayed`, `89 trades`, `10 lifecycle`, `348 candle upserts`, catalogue `52 tokens / 50 pools / 50 pairs`. + +| Entry / groupe | Discriminator | Family | Expected DB target | Local event kind cible | Status final | +|---|---:|---|---|---|---| +| `create` / `create_v2` / `create_event` | `181ec828051c0777` / `d6904cec5f8b31b4` / `1b72a94ddeeb6376` | `launch` | `k_sol_launch_events` ou decoded-only | `pump_fun.create*` | couvert ; launch matérialisé quand mint/bonding/creator sont fiables | +| `migrate` / `migrate_v2` / migration events | `9beae792ec9ea21e` / `bbcb121fceedfe29` / voir IDL | `migration` | `k_sol_launch_events` ou decoded-only | `pump_fun.migrate*` | couvert ; migration matérialisée quand contexte fiable | +| `buy` / `sell` | `66063d1201daebea` / `33e685a4017f83ad` | `swap` | `k_sol_trade_events` | `pump_fun.buy` / `pump_fun.sell` | matérialisés directement avec montants fiables : `17` buy, `25` sell | +| `buy_exact_sol_in` | `38fc74089edfcd5f` | `swap` | `k_sol_trade_events` | `pump_fun.buy_exact_sol_in` | matérialisé directement ; `15` trades, y compris logs `Program data` tronqués exploitables | +| `buy_v2` / `sell_v2` / `buy_exact_quote_in_v2` | `b817ee6167c5d33d` / `5df6823ce7e940b2` / `c2ab1c46684d5b2f` | `swap` | audit/routing + `trade_event` canonique | `pump_fun.*_v2` | decoded/covered, non matérialisés directement ; les montants exécutés sont matérialisés via `pump_fun.trade_event` | +| `trade_event` | `bddb7fd34ee661ee` | `swap` | `k_sol_trade_events` | `pump_fun.trade_event` | `72` decoded / `25` trades ; source canonique des v2/exact quand corrélée ; skip explicite si couvert par trade direct | +| `collect_creator_fee*` / `distribute_creator_fees*` | voir IDL | `fee` | `k_sol_fee_events` ou decoded-only | `pump_fun.collect_creator_fee*`, `pump_fun.distribute_creator_fees*` | couvert ; matérialisation fee seulement avec montant/acteur fiables | +| `claim_cashback*` / `claim_token_incentives` / volume accumulators | voir IDL | `reward` | `k_sol_reward_events` ou decoded-only | `pump_fun.claim_*`, volume accumulator events | couvert ; rewards matérialisées seulement si preuve suffisante | +| creator/admin/config group | voir IDL | `admin_config` | `k_sol_pool_admin_events` ou decoded-only | `pump_fun.admin_*`, `pump_fun.set_*`, `pump_fun.toggle_*`, quote/buyback/reserve entries | couvert ; promotion seulement si action/comptes exploitables | + +### Invariants de fermeture `0.7.54` + +- Aucun `pump_fun` local decoded event sans coverage. +- Aucun fallback `upstream_git` résiduel pour les entrées Pump.fun couvertes localement. +- Aucun business event matérialisé depuis transaction failed. +- Aucun non-swap Pump.fun matérialisé en trade/candle. +- Aucun double-count entre instruction trade directe et `trade_event` Anchor. +- Aucun trade candidate Pump.fun réussi sans matérialisation ni skip reason. +- Les entrées IDL-only sont couvertes localement ; les non observées restent `mapped_unverified` ou audit-only, pas des gaps bloquants. + +## 0.7.53 — `pump_swap` + +Program id unique : `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA`. + +| Entry | Discriminator | Family | Expected DB target | Local event kind | Status | +|---|---:|---|---|---|---| +| `buy` | `66063d1201daebea` | `swap` | `k_sol_trade_events` | `pump_swap.buy` | local specialized decoder ; materialize only from exact transfer/vault deltas | +| `sell` | `33e685a4017f83ad` | `swap` | `k_sol_trade_events` | `pump_swap.sell` | local specialized decoder ; materialize only from exact transfer/vault deltas | +| `buy_exact_quote_in` | `c62e1552b4d9e870` | `swap` | `k_sol_trade_events` only when exact Anchor `BuyEvent` is present ; otherwise decoded-only | `pump_swap.buy_exact_quote_in` | local specialized decoder ; `amountSource=pump_swap_anchor_buy_event` materializes trades ; `instruction_bounds_only` rows keep explicit `skipTradeReason` | +| `create_pool` | `e992d18ecf6840bc` | `pool_create` | `k_sol_pool_lifecycle_events` or decoded-only | `pump_swap.create_pool` | local specialized instruction ; non-trade | +| `deposit` | `f223c68952e1f2b6` | `liquidity_add` | `k_sol_liquidity_events` or decoded-only | `pump_swap.deposit` | local specialized instruction ; non-trade | +| `withdraw` | `b712469c946da122` | `liquidity_remove` | `k_sol_liquidity_events` or decoded-only | `pump_swap.withdraw` | local specialized instruction ; non-trade | +| `collect_coin_creator_fee` | `a039592ab58b2b42` | `fee` | `k_sol_fee_events` or decoded-only | `pump_swap.collect_coin_creator_fee` | local specialized instruction ; non-trade | +| `transfer_creator_fees_to_pump` | `8b348655e4e56cf1` | `fee` | `k_sol_fee_events` or decoded-only | `pump_swap.transfer_creator_fees_to_pump` | local specialized instruction ; non-trade | +| `transfer_creator_fees_to_pump_v2` | `01214eb921432c5c` | `fee` | `k_sol_fee_events` or decoded-only | `pump_swap.transfer_creator_fees_to_pump_v2` | Solscan IDL proof + local log proof: `transfer_creator_fees_to_pump_v2` / `Instruction: TransferCreatorFeesToPumpV2` ; non-trade | +| `claim_cashback` | `253a237ebe35e4c5` | `reward` | `k_sol_reward_events` or decoded-only | `pump_swap.claim_cashback` | local specialized instruction ; non-trade | +| `claim_token_incentives` | `1004471ccc01281b` | `reward` | `k_sol_reward_events` or decoded-only | `pump_swap.claim_token_incentives` | local specialized instruction ; non-trade | +| `init_user_volume_accumulator` | `5e06ca73ff60e8b7` | `reward` | `k_sol_reward_events` or decoded-only | `pump_swap.init_user_volume_accumulator` | local specialized instruction ; non-trade | +| `sync_user_volume_accumulator` | `561fc057a3574fee` | `reward` | `k_sol_reward_events` or decoded-only | `pump_swap.sync_user_volume_accumulator` | local specialized instruction ; non-trade | +| `close_user_volume_accumulator` | `f945a4da9667548a` | `reward` | `k_sol_reward_events` or decoded-only | `pump_swap.close_user_volume_accumulator` | local specialized instruction ; non-trade | +| `update_buyback_config` | `fbe0ab92a01a71e9` | `admin_config` | `k_sol_pool_admin_events` or decoded-only | `pump_swap.update_buyback_config` | Solscan IDL proof + local log proof: `update_buyback_config` / `Instruction: UpdateBuybackConfig` ; non-trade | +| `set_reserved_fee_recipient` | `cfbdb247a77a44b4` | `admin_config` | `k_sol_pool_admin_events` or decoded-only | `pump_swap.set_reserved_fee_recipient` | local log proof only: `Instruction: SetReservedFeeRecipient` ; absent from checked Solscan IDL raw ; non-trade | +| admin/config group | see report | `admin_config` | `k_sol_pool_admin_events` or decoded-only | `pump_swap.*` | local specialized instruction ; non-trade ; includes `toggle_cashback_enabled` and `migrate_pool_coin_creator` as admin-only | +| `buy_event` / `sell_event` | `67f4521f2cf57777` / `3e2f370aa503dc2a` | `swap_event_audit` | decoded-only | not local-instruction mapped | Program-data event discriminators listed; not used to duplicate local instruction trades | +| auxiliary Program-data events | see report | fee/reward/admin/liquidity | decoded-only until payload-specific materializer exists | not local-instruction mapped | explicit upstream status required after replay | + + + +### Fermeture `0.7.53` + +- `pump_swap` ne présente plus de decoded event local sans coverage dans le corpus de clôture. +- `buy_exact_quote_in` est matérialisé seulement quand le `BuyEvent` Anchor donne les montants exacts ; les bornes d’instruction seules restent non actionnables. +- Les events Anchor `*_event` sont décodés en audit-only pour éviter les doublons, sauf exception matérialisable explicitement testée. +- Les gaps globaux Pump.fun/PumpSwap/Pump Fees sont fermés ; la watchlist résiduelle courante ne contient plus `pump_fees` et garde seulement `jupiter_swap.route_v2` comme observation ponctuelle. +- Les checks Raydium AMM v4 / CLMM / CPMM normalisés sont vides ; aucune correction Raydium n’est incluse dans cette clôture. + +## 0.7.55 — Pump Fees + +| Entry group | Discriminants | Famille | Target attendu | Local event kind | Notes | +|---|---:|---|---|---|---| +| `get_fees` | `e7257e55cf5b3f34` | audit | decoded-only | `pump_fees.get_fees` | Calcul/preview de fees ; ne pas matérialiser comme fee payé sans transfert réalisé. | +| social fee claim/create | IDL locale | reward / lifecycle | `k_sol_reward_events` ou `k_sol_pool_lifecycle_events` | `pump_fees.claim_social_fee_pda*`, `pump_fees.social_fee_pda_*` | Claim matérialisable seulement avec montant/acteur/mint fiables et transaction OK. | +| donation fee PDA | IDL locale | fee / lifecycle | `k_sol_fee_events` ou `k_sol_pool_lifecycle_events` | `pump_fees.*donation_fee_pda*` | Crank avec montant fiable vers fee ; création de PDA vers lifecycle. | +| buyback | IDL locale | fee / admin/lifecycle | `k_sol_fee_events`, `k_sol_pool_admin_events` ou lifecycle | `pump_fees.*buyback*` | Sweep matérialisable comme fee si montant fiable ; init/update comme lifecycle/admin. | +| fee sharing/config/authority/tier | IDL locale + Carbon partiel | admin_config / lifecycle | `k_sol_pool_admin_events` ou `k_sol_pool_lifecycle_events` | `pump_fees.*config*`, `pump_fees.*authority*`, `pump_fees.*tier*`, `pump_fees.update_fee_shares*` | Aucun trade/candle ; decoded-only/audit-only si données métier insuffisantes. | + +## 0.7.55 Pump Fees — clôture + +Programme : `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ`. Source locale prioritaire : `idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json`. + +| Famille | Entrées | Target | Statut | Notes | +|---|---|---|---|---| +| fee calculation | `get_fees` / `e7257e55cf5b3f34` | `k_sol_dex_decoded_events_only` | decoded-only validé | Calcul/preview ; ne représente pas une fee payée. | +| reward/social fee | `claim_social_fee_pda`, `claim_social_fee_pda_v2`, `social_fee_pda_claimed` | `k_sol_reward_events` | matérialisé si tx OK | Écarts expliqués par failed tx. | +| donation fee | `create_donation_fee_pda`, `crank_donation_fee_pda`, events associés | lifecycle / `k_sol_fee_events` | matérialisé si tx OK | Création PDA vers lifecycle ; crank vers fee. | +| buyback | `initialize_buyback`, `sweep_buyback`, authority/rate-limit | lifecycle / fee / admin | matérialisé si tx OK | `sweep_buyback` et `sweep_buyback_event` alimentent fee. | +| fee sharing/config/authority/tier | config/reset/transfer/revoke/update/upsert | `k_sol_pool_admin_events` ou lifecycle | matérialisé si tx OK | Aucun trade/candle ; failed tx audit-only. | +| Anchor IDL non observés | `SetAuthorityEvent`, `SetClaimRateLimitEvent`, `SetDisableFlagsEvent`, `SetSocialClaimAuthorityEvent` | admin/audit | tests synthétiques | Aucun corpus Solscan au moment de clôture ; decoder conservé pour transactions futures. | +| Solscan hors IDL locale | `revoke_fee_sharing_authority_event`, `transfer_fee_sharing_authority_event` | admin | mapped_unverified | Discriminators trouvés via Solscan ; conservés comme surfaces futures. | + +Invariants propres : fallback `pump_fees` vide, decoded sans coverage vide, successful non-materialized sans skip/policy vide, failed tx matérialisée vide, multi-target vide, anti-trade/candle direct vide, watchlist globale sans `pump_fees`. + + + +## 0.7.56 — Meteora DBC clôturé + +Programme : `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN`. Source locale prioritaire : `idls/meteora_dbc.dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN.json`. + +| Groupe | Entrées | Famille | Cible DB | Local event kind | Décision finale | +|---|---|---|---|---|---| +| swaps | `swap`, `swap2` | swap | `k_sol_trade_events` + candles | `meteora_dbc.swap`, `meteora_dbc.swap2` | Matérialisés seulement avec montants et mints base/quote fiables ; `swap2` validé via transferts CPI/amount inference. | +| virtual pool init | `initialize_virtual_pool_with_spl_token`, `initialize_virtual_pool_with_token2022`, `EvtInitializePool` | pool_create | `k_sol_pool_lifecycle_events` + catalog si contexte complet | `meteora_dbc.initialize_virtual_pool_with_*`, `meteora_dbc.evt_initialize_pool_event` | Lifecycle/catalog prudent ; failed tx audit-only. | +| migration / lockers | `migrate_meteora_damm*`, `migration_damm_v2*`, `create_locker`, `EvtCurveComplete` | migration / lifecycle | `k_sol_pool_lifecycle_events` | `meteora_dbc.migrate_*`, `meteora_dbc.migration_*`, `meteora_dbc.create_locker` | Lifecycle, pas liquidity artificielle pour LP claim/lock ; metadata-only decoded-only si contexte insuffisant. | +| fees/surplus/leftover | `claim_*fee*`, `withdraw_migration_fee`, `zap_protocol_fee`, `*_withdraw_surplus`, `withdraw_leftover`, events Anchor fee | fee | `k_sol_fee_events` + `k_sol_fee_event_amounts` | `meteora_dbc.*fee*`, `meteora_dbc.*surplus*`, `meteora_dbc.*leftover*` | Montants réels depuis CPI SPL ou lamport delta ; maxima d'instruction refusés ; multi-leg/multi-mint dans `k_sol_fee_event_amounts`. | +| admin/config/metadata/operator | `create_config`, `create_operator_account`, `close_*operator*`, metadata, `transfer_pool_creator`, config events | admin_config | `k_sol_pool_admin_events` ou decoded-only | `meteora_dbc.*config*`, `meteora_dbc.*operator*`, `meteora_dbc.*metadata*`, `meteora_dbc.transfer_pool_creator` | Admin si compte/acteur fiables ; payload metadata générique decoded-only avec raison. | +| Anchor swap events | `EvtSwap`, `EvtSwap2` | swap/audit | decoded-only sauf corrélation sûre | `meteora_dbc.evt_swap_event`, `meteora_dbc.evt_swap2_event` | Les events portent des montants mais pas toujours le contexte mint/pair ; pas de double-count avec l'instruction swap matérialisée. | + +Validation finale DBC : `89` parents fee, `96` legs fee amount, aucun parent scalaire sans leg, aucun leg orphelin, aucun decoded event local sans coverage, aucun failed tx matérialisé, aucun multi-target, aucun non-swap vers trade/candle. + +## `0.7.57` — `meteora_dlmm` final coverage + +Programme : `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo`. Source locale : `idls/meteora_dlmm.LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo.json`. Surface finale : `76` instructions IDL, `30` events Anchor, `12` accounts, plus correction locale `initialize_preset_parameter_v2` (`75c73e67068e1fcb`) observée dans le corpus. + +Validation finale : `460` tests, clippy OK, `769` replayed, `106` trades, `664` liquidity, `1107` lifecycle, `424` candle upserts, `8062` instruction observations. Les checks decoded sans coverage, successful non-materialized, failed tx materialized, multi-target, non-swap trade/candle, fee scalar sans leg, orphan fee legs et coverage duplicates sont vides. + +| Famille | Entrées DLMM | Statut `0.7.57` | Cible DB | Justification / règle | +|---|---|---|---|---| +| `swap` | `swap`, `swap2`, `swap_exact_out`, `swap_exact_out2`, `swap_with_price_impact`, `swap_with_price_impact2` | `materialized` | `k_sol_trade_events` + candles | Seules ces instructions produisent trade/candle direct quand montants/mints/pool sont fiables. | +| `swap_log` | `swap_event`, `swap2_evt` | `materialized` | `k_sol_pool_lifecycle_events` | Logs Anchor informatifs matérialisés sans double-count trade/candle. | +| `pool_create` | `create_pool`, `lb_pair_create_event`, `initialize_*_lb_pair*`, `initialize_permission_lb_pair` | `materialized` si observé, sinon `upstream_git_mapped_unverified` | `k_sol_pool_lifecycle_events` | Pool lifecycle ; pas de trade direct. | +| `liquidity_add` | `add_liquidity*`, `add_liquidity_event` | `materialized` | `k_sol_liquidity_events` | Montants/side effects liquidity ; aucun trade/candle. | +| `liquidity_remove` | `remove_liquidity*`, `remove_all_liquidity`, `remove_liquidity_event` | `materialized` | `k_sol_liquidity_events` | Retrait liquidity ; failed tx audit-only. | +| `liquidity_change` | `rebalance_liquidity`, `rebalancing_event` | `materialized` | `k_sol_liquidity_events` | Changement de liquidité/bin ; pas de trade. | +| `position_open` | `initialize_position*`, `position_create_event` | `materialized` | `k_sol_pool_lifecycle_events` | Position/bin lifecycle, pas liquidity artificielle quand l'opération est structurelle. | +| `position_close` | `close_position*`, `position_close_event` | `materialized` | `k_sol_pool_lifecycle_events` | Fermeture position lifecycle. | +| `position_update` | `increase_position_length*`, `decrease_position_length*`, `update_position_operator*`, position update events | `materialized` si observé | `k_sol_pool_lifecycle_events` | Mise à jour de position ; pas admin générique. | +| `bin/oracle lifecycle` | `initialize_bin_array*`, `close_bin_array`, `go_to_a_bin*`, `increase_oracle_length`, `migrate_bin_array` | `materialized` si observé | `k_sol_pool_lifecycle_events` | `close_bin_array` a `16/14` car `2` failed tx `Custom 6015`, comportement attendu. | +| `fee` | `claim_fee*`, `claim_fee*_event`, `composition_fee_event`, `withdraw_protocol_fee`, `zap_protocol_fee` | `materialized` | `k_sol_fee_events` + `k_sol_fee_event_amounts` | Recovery inner SPL transfer strictement allowlistée ; legs multi-mint conservés sans agrégation artificielle. | +| `reward` | `claim_reward*`, `claim_reward*_event`, `fund_reward*`, `initialize_reward*`, `withdraw_ineligible_reward*` | `materialized` si observé | `k_sol_reward_events` | Claims/funding avec amounts récupérés quand transfert réel ; `initialize_reward*` sans amount est normal. | +| `admin/config` | `update_base_fee_parameters`, `fee_parameter_update_event`, `set_pair_status*`, `set_activation_point`, `set_pre_activation*`, preset/token badge/operator/config, `initialize_preset_parameter_v2` | `materialized` si observé | `k_sol_pool_admin_events` | Admin/config non financier ; pas trade/candle. | +| `orderbook` | `place_limit_order*`, `cancel_limit_order*`, `close_limit_order*` | `materialized` | `k_sol_orderbook_events` | Limit/orderbook events sans trade/candle. | +| `account metadata` | `lb_pair`, `bin_array`, `position_v2`, `oracle`, `operator`, `token_badge`, etc. | `upstream_git_mapped_unverified` / non observé | `k_sol_dex_decoded_events_only` | Accounts IDL listés pour coverage, pas de matérialisation métier directe. | +| `instruction_audit` | résidu inconnu | `closed` | `k_sol_pool_admin_events` seulement si observé | Résidu final observé = `0`; `75c73e67068e1fcb` a été promu en `initialize_preset_parameter_v2`. | + diff --git a/olddocs/archivekbobobot/docs/RAYDIUM_LAUNCHPAD_EVENT_COVERAGE_REPORT.md b/olddocs/archivekbobobot/docs/RAYDIUM_LAUNCHPAD_EVENT_COVERAGE_REPORT.md new file mode 100644 index 0000000..d8f7bd4 --- /dev/null +++ b/olddocs/archivekbobobot/docs/RAYDIUM_LAUNCHPAD_EVENT_COVERAGE_REPORT.md @@ -0,0 +1,213 @@ + + +# Raydium Launchpad event coverage report — `0.7.50` + +## Scope + +`0.7.50` opens the `raydium_launchpad` tranche after the functional closure of `0.7.49 raydium_clmm`. + +Local canonical decoder/surface code: + +```text +raydium_launchpad +``` + +Canonical program id: + +```text +LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj +``` + +The legacy local name `raydium_launchlab` is not kept in the public Rust API. Coverage rows, upstream registry rows, launch origin entries, and support matrix rows use `raydium_launchpad`. + +## Sources used + +Primary source hints for this tranche: + +- Carbon decoder registry/source: `sevenlabs-hq/carbon/decoders/raydium-launchpad-decoder`. +- Solscan Program IDL/account page: `https://solscan.io/account/LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj#programIdl`. +- fnzero IDL sources: `sol-parser-sdk` / `solana-program-idls` listings, including `raydium_launchpad.json` and separate `raydium_pool_v4.json` as an audit-only source. +- Raydium SDK Launchpad examples for account-shape hints only. + +These sources are not treated as final business proof. Promotion still requires local corpus observation and SQL validation. + +## Bootstrap implementation delta + +Implemented in this delta: + +- `RAYDIUM_LAUNCHPAD_PROGRAM_ID` added as the canonical public constant. +- Upstream generated registry rows normalized from `raydium_launchlab` to `raydium_launchpad`. +- Built-in launch surface code normalized to `raydium_launchpad`. +- DEX support/catalog entries normalized to `raydium_launchpad`. +- Raydium instruction audit fallback now recognizes Launchpad program id. +- Launchpad mapped instruction fallback added for locally listed Launchpad discriminators. +- Coverage target override keeps Launchpad rows `decoded_events_only` until corpus promotion. +- SQL validation file added for the `0.7.50` tranche. + +## Listed Launchpad entries + +The local upstream registry now lists one program entry plus the following 26 discriminator entries. + +| Entry kind | Entry name | Discriminator | Initial family | Initial DB target | +|---|---:|---:|---|---| +| instruction | `buy_exact_in` | `faea0d7bd59c13ec` | swap | decoded_events_only | +| instruction | `buy_exact_out` | `18d3742869039938` | swap | decoded_events_only | +| instruction | `claim_creator_fee` | `1a618acb84ab8dfc` | fee | decoded_events_only | +| instruction | `claim_platform_fee` | `9c27d0874ced3d48` | fee | decoded_events_only | +| instruction | `claim_platform_fee_from_vault` | `75f1c6a8f8da501d` | fee | decoded_events_only | +| event | `claim_vested_event` | `15c2725778d3e220` | fee/vesting audit | decoded_events_only | +| instruction | `claim_vested_token` | `3121681ebd9d4f23` | fee/vesting audit | decoded_events_only | +| instruction | `collect_fee` | `3cadf767045d8230` | fee | decoded_events_only | +| instruction | `collect_migrate_fee` | `ffba96dfeb76c9ba` | fee/migration audit | decoded_events_only | +| instruction | `create_config` | `c9cff3724b6f2fbd` | admin_config | decoded_events_only | +| instruction | `create_platform_config` | `b05ac4affd71dc14` | admin_config | decoded_events_only | +| instruction | `create_vesting_account` | `81b2020dd9ace6da` | account_create/vesting audit | decoded_events_only | +| event | `create_vesting_event` | `96980bb334d2bf7d` | account_create/vesting audit | decoded_events_only | +| instruction | `initialize` | `afaf6d1f0d989bed` | pool_create/launch | decoded_events_only | +| instruction | `initialize_v2` | `4399af27da102620` | pool_create/launch | decoded_events_only | +| instruction | `initialize_with_token_2022` | `25be7ede2c9aab11` | pool_create/launch | decoded_events_only | +| instruction | `migrate_to_amm` | `cf52c091fecf91df` | migration | decoded_events_only | +| instruction | `migrate_to_cpswap` | `885cc8671cda908c` | migration | decoded_events_only | +| event | `pool_create_event` | `97d7e20976a173ae` | pool_create | decoded_events_only | +| instruction | `remove_platform_curve_param` | `1b1e3ea95de01891` | admin_config | decoded_events_only | +| instruction | `sell_exact_in` | `9527de9bd37c981a` | swap | decoded_events_only | +| instruction | `sell_exact_out` | `5fc8472208090ba6` | swap | decoded_events_only | +| event | `trade_event` | `bddb7fd34ee661ee` | swap | decoded_events_only | +| instruction | `update_config` | `1d9efcbf0a53db63` | admin_config | decoded_events_only | +| instruction | `update_platform_config` | `c33c4c81922d438f` | admin_config | decoded_events_only | +| instruction | `update_platform_curve_param` | `8a908afadc800439` | admin_config | decoded_events_only | + +Notes: + +- The buy/sell instruction account hints currently use account index `4` as candidate pool account and indexes `9`/`10` as candidate token mints, based on Carbon/Raydium Launchpad account shape hints. This is an audit helper, not a materialization proof. +- Fee/admin/migration/vesting entries intentionally do not infer pool/token accounts until corpus confirms the account semantics. +- Program-data transport is represented by `cpi_event`; embedded events are decoded by their own discriminators and materialized only when their event family has a validated target. + +## Family audit matrix + +| Family | Launchpad status in `0.7.50` final | Decision | +|---|---|---| +| swap | `trade_event` materialized as trades/candles; buy/sell instructions materialized as launch breadcrumbs. | No duplicate trades from instruction breadcrumbs. | +| pool_create | `initialize`, `initialize_v2`, `initialize_with_token_2022`, `pool_create_event`. | Pool lifecycle/catalogue materialized when transaction succeeded. | +| add_liquidity | No direct Launchpad entry confirmed. | Non-applicable unless local corpus proves direct Launchpad liquidity instruction. | +| remove_liquidity | No direct Launchpad liquidity remove entry confirmed. | Non-applicable unless local corpus proves direct Launchpad liquidity instruction. | +| position_open | No direct Launchpad position instruction confirmed. | Non-applicable. | +| position_close | No direct Launchpad position instruction confirmed. | Non-applicable. | +| fee | claim/collect fee entries listed. | Fee table materialization enabled for observed successful transactions. | +| reward | No direct reward instruction confirmed. | Non-applicable unless local corpus proves otherwise. | +| admin/config | create/update config and platform curve/config entries listed. | Pool admin materialization enabled for observed successful transactions. | +| mint | Token minting may appear as SPL Token/Token-2022 side effect. | Not `raydium_launchpad.*` without direct program proof. | +| burn | Token burn may appear as SPL Token/Token-2022 side effect. | Not `raydium_launchpad.*` without direct program proof. | +| transfer | Transfers are expected as SPL Token/Token-2022 side effects. | Not `raydium_launchpad.*` without direct program proof. | +| account_create / vesting | `create_vesting_account`, `create_platform_vesting_account`, vesting events. | Launch event materialization enabled for observed successful transactions; unobserved events remain mapped. | +| account_close | No direct Launchpad account close confirmed. | Non-applicable. | +| wrap_sol | No direct Launchpad wrap SOL confirmed. | Side effect only unless corpus proves direct instruction. | +| unwrap_sol | No direct Launchpad unwrap SOL confirmed. | Side effect only unless corpus proves direct instruction. | +| order_place | No orderbook surface confirmed. | Non-applicable. | +| order_cancel | No orderbook surface confirmed. | Non-applicable. | +| order_fill | No orderbook surface confirmed. | Non-applicable. | +| consume_events | No orderbook surface confirmed. | Non-applicable. | +| settle_funds | No orderbook surface confirmed. | Non-applicable. | +| vault_deposit | No direct vault deposit confirmed. | Non-applicable. | +| vault_withdraw | No direct vault withdraw confirmed. | Non-applicable. | +| lock | No direct lock confirmed. | Non-applicable. | +| unlock | No direct unlock confirmed. | Non-applicable. | +| launch | initialize/pool_create path listed. | Decode/audit only. | +| migration | `migrate_to_amm`, `migrate_to_cpswap`, `collect_migrate_fee` listed. | Decode/audit only. Destination DEX materialization must be proven locally. | +| stake | No direct stake confirmed. | Non-applicable. | +| unstake | No direct unstake confirmed. | Non-applicable. | +| unknown/unmapped audit | `raydium_launchpad.instruction_audit` retained for unmatched program instructions. | Must trend toward zero for locally covered discriminators after backfill/replay. | + +## SQL validation expectations + +After targeted backfill and replay: + +1. `k_sol_dex_event_coverage_entries` should contain the Launchpad program entry and discriminator entries. +2. Mapped entries should have `local_event_kind = raydium_launchpad.` and initial `proof_status = upstream_git_mapped_unverified` until observed. +3. Locally observed instructions should increment `k_sol_instruction_observations` for `decoder_code = raydium_launchpad`. +4. `upstream_git.instruction_match` fallback rows for `upstreamDecoderCode = raydium_launchpad` should be zero for locally covered instruction discriminators. +5. `raydium_launchpad.*` rows must not produce trades/candles unless a later corpus-backed patch explicitly promotes a specific event. +6. Failed transactions may be decoded/audited, but must not be materialized in trade/candle tables. + +Validation file: + +```text +validation_sql/SQL_VALIDATION_RAYDIUM_LAUNCHPAD_0_7_50.sql +``` + +## Suggested targeted Solscan discovery loop + +For each discriminator: + +```text +https://solscan.io/account/LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj?instruction=&hide_spam=true&hide_failed=true&show_related=false&sort=desc +``` + +Then: + +1. copy a small batch of recent non-failed signatures; +2. backfill through Demo2 textarea batch; +3. replay with `forceDexDecode=yes` and `deferInstructionObservations=yes`; +4. run the validation SQL; +5. promote only entries whose local payload and account semantics are proven. + +## `raydium_pool_v4.json` audit status + +The current workspace archive does not contain a local `raydium_pool_v4.json` copy. External fnzero IDL listings expose a separate `raydium_pool_v4.json` beside `raydium_launchpad.json`, but this delta does not confirm its program id or business role. + +Decision for `0.7.50`: + +- do not promote `raydium_pool_v4` as a DEX/surface; +- keep `0.7.53 raydium_pool_v4 audit / program-id decision` conditional; +- require program id confirmation and local corpus before any roadmap promotion. + +## Current limitations + +This delta was prepared from the provided archive only. No live RPC backfill, fresh SQLite replay, `cargo fmt`, `cargo test`, or `cargo clippy` could be executed in the current environment because the Rust toolchain is unavailable here. The SQL and code paths are prepared for local validation in the normal project environment. + +## Local corpus snapshot from first 0.7.50 backfill + +Observed after targeted Demo2 backfills and pool backfill on a fresh 0.7.50 DB: + +- coverage listed entries: `27`; +- decoded/local mapped entries: `26`; +- observed entries: `21`; +- materialized entries: `0`; +- total observed coverage count: `672`; +- total materialized count: `0`; +- trade count: `0`; +- residual `upstream_git.instruction_match` for `raydium_launchpad`: `0`; +- residual `raydium_launchpad.instruction_audit`: `287`; +- residual audit discriminators: `e445a52e51cb9a1d` (`276`), `9247ad4562130f6a` (`10`), `a25b92c75d85eaed` (`1`). + +The `e445a52e51cb9a1d` selector is handled as Anchor self-CPI event transport. It is not promoted as a Raydium Launchpad business instruction. The two low-count residual discriminators remain local-corpus audit-only until an IDL/upstream mapping is confirmed. + + +## pre3 correction — Demo3 preset and Launchpad pool catalog + +The first replay after pre2 confirmed that Anchor self-CPI selector `e445a52e51cb9a1d` carries Launchpad `trade_event` (`bddb7fd34ee661ee`) and `pool_create_event` (`97d7e20976a173ae`). pre3 therefore decodes those two self-CPI event rows as direct `raydium_launchpad.*` events instead of leaving them under `raydium_launchpad.instruction_audit`. `trade_event` remains audit/decoded-only and is still not promoted to `k_sol_trade_events` or candles. + +pre3 also fixes the Launchpad `initialize`, `initialize_v2` and `initialize_with_token_2022` account mapping using the Carbon account shape: `pool_state` index 5, `base_mint` index 6 and `quote_mint` index 7. These initialize rows are now routed to business-level pool detection as `raydium_launchpad` bonding-curve pools with pending status, which should allow pool `6HLQPoLrzX6LqePRiXQ1GGs2Dd9K3dp9VhTSHBugYzzZ` to appear in the local catalog after a forced replay when its initialize transaction is present locally. + +Demo3 now exposes a `Raydium Launchpad` preset with program id `LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj`. + + +## Final `0.7.50` closure snapshot + +Validated closure state reported by local replay: + +- `cargo test -p kb_lib`: 404 passed, 0 failed. +- Local replay: 437 replayed, 437 ledger upserts, 30 unsafe ledger rows, 256 trades, 115 lifecycle rows, 1024 candle upserts, 6205 instruction observations. +- Launchpad catalogue: 58 tokens, 58 pools, 58 pairs after replay. +- Coverage normalization: no ambiguous `unknown` family remains; only the synthetic `program` row may have an empty family. +- `trade_event`: 260 decoded, 250 successful materialized trades; 10 failed transactions intentionally not materialized. +- `buy_exact_*` / `sell_exact_*`: materialized as `k_sol_launch_events` swap-instruction breadcrumbs, not as trades. +- `cpi_event`: kept as `cpi_transport` / decoded-only; embedded events are decoded by direct event discriminator. +- Successful `trade_event` rows without materialized `k_sol_trade_events`: zero. + +Post-closure recheck assets added: + +- `validation_sql/SQL_VALIDATION_RAYDIUM_CPMM_0_7_50_PRE_R2.sql` +- `validation_sql/SQL_VALIDATION_RAYDIUM_CLMM_0_7_50_PRE_R2.sql` +- `docs/SOLSCAN_ACCOUNT_SOURCE_MATRIX.md` +- `kb_lib::SOLSCAN_ACCOUNT_SOURCES` diff --git a/olddocs/archivekbobobot/docs/SOLSCAN_ACCOUNT_SOURCE_MATRIX.md b/olddocs/archivekbobobot/docs/SOLSCAN_ACCOUNT_SOURCE_MATRIX.md new file mode 100644 index 0000000..c5ddcd7 --- /dev/null +++ b/olddocs/archivekbobobot/docs/SOLSCAN_ACCOUNT_SOURCE_MATRIX.md @@ -0,0 +1,159 @@ + + +# Solscan account source matrix + +This file records the manual Solscan account inventory added during the `0.7.50` Raydium Launchpad closure. It is a source catalogue, not a support guarantee. Entries with `solscan_program_idl` can be used as IDL candidates; entries with `no_idl` require source/corpus work before decoder promotion. + +| Label | Account id | IDL status | Source | +|---|---|---|---| +| `1Dex Program` | `DEXYosS6oEGvk8uCDayvwEZz4qEyDJRf9nFgYCaqPMTm` | `no_idl` | https://solscan.io/account/DEXYosS6oEGvk8uCDayvwEZz4qEyDJRf9nFgYCaqPMTm | +| `AlphaQ` | `ALPHAQmeA7bjrVuccPsYPiCvsi428SNwte66Srvs4pHA` | `no_idl` | https://solscan.io/account/ALPHAQmeA7bjrVuccPsYPiCvsi428SNwte66Srvs4pHA | +| `Aldrin AMM` | `AMM55ShdkoGRB5jVYPjWziwk8m5MpwyDgsMWHaMSQWH6` | `no_idl` | https://solscan.io/account/AMM55ShdkoGRB5jVYPjWziwk8m5MpwyDgsMWHaMSQWH6 | +| `Aldrin AMM V2` | `CURVGoZn8zycx6FXwwevgBTB2gVvdbGTEpvMJDbgs2t4` | `no_idl` | https://solscan.io/account/CURVGoZn8zycx6FXwwevgBTB2gVvdbGTEpvMJDbgs2t4 | +| `ApePro Smart Wallet Program` | `JSW99DKmxNyREQM14SQLDykeBvEUG63TeohrvmofEiw` | `solscan_program_idl` | https://solscan.io/account/JSW99DKmxNyREQM14SQLDykeBvEUG63TeohrvmofEiw#programIdl | +| `Aquifer` | `AQU1FRd7papthgdrwPTTq5JacJh8YtwEXaBfKU3bTz45` | `no_idl` | https://solscan.io/account/AQU1FRd7papthgdrwPTTq5JacJh8YtwEXaBfKU3bTz45 | +| `Axiom Trade` | `FLASHX8DrLbgeR8FcfNV1F5krxYcYMUdBkrP1EPBtxB9` | `no_idl` | https://solscan.io/account/FLASHX8DrLbgeR8FcfNV1F5krxYcYMUdBkrP1EPBtxB9 | +| `Bags: Token Authority` | `BAGSB9TpGrZxQbEsrEznv5jXXdwyP6AXerN8aVRiAmcv` | `solscan_account` | https://solscan.io/account/BAGSB9TpGrZxQbEsrEznv5jXXdwyP6AXerN8aVRiAmcv | +| `Believe : Token Authority` | `5qWya6UjwWnGVhdSBL3hyZ7B45jbk6Byt1hwd7ohEGXE` | `no_idl` | https://solscan.io/account/5qWya6UjwWnGVhdSBL3hyZ7B45jbk6Byt1hwd7ohEGXE | +| `BisonFi` | `BiSoNHVpsVZW2F7rx2eQ59yQwKxzU5NvBcmKshCSUypi` | `no_idl` | https://solscan.io/account/BiSoNHVpsVZW2F7rx2eQ59yQwKxzU5NvBcmKshCSUypi | +| `BonkSwap` | `BSwp6bEBihVLdqJRKGgzjcGLHkcTuzmSo1TQkHepzH8p` | `solscan_program_idl` | https://solscan.io/account/BSwp6bEBihVLdqJRKGgzjcGLHkcTuzmSo1TQkHepzH8p#programIdl | +| `Boop.fun` | `boop8hVGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4` | `solscan_program_idl` | https://solscan.io/account/boop8hVGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4#programIdl | +| `Byreal: CLMM` | `REALQqNEomY6cQGZJUGwywTBD2UmDT32rZcNnfxQ5N2` | `solscan_program_idl` | https://solscan.io/account/REALQqNEomY6cQGZJUGwywTBD2UmDT32rZcNnfxQ5N2#programIdl | +| `Bubblegum` | `BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY` | `solscan_program_idl` | https://solscan.io/account/BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY#programIdl | +| `Carrot DeFi` | `CarrotwivhMpDnm27EHmRLeQ683Z1PufuqEmBZvD282s` | `solscan_program_idl` | https://solscan.io/account/CarrotwivhMpDnm27EHmRLeQ683Z1PufuqEmBZvD282s#programIdl | +| `CCTP TokenMessengerMinter` | `CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3` | `solscan_program_idl` | https://solscan.io/account/CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3#programIdl | +| `CCTP TokenMessengerMinterV2` | `CCTPV2vPZJS2u2BBsUoscuikbYjnpFmbFsvVuJdgUMQe` | `solscan_program_idl` | https://solscan.io/account/CCTPV2vPZJS2u2BBsUoscuikbYjnpFmbFsvVuJdgUMQe#programIdl | +| `Clone` | `C1onEW2kPetmHmwe74YC1ESx3LnFEpVau6g2pg4fHycr` | `solscan_program_idl` | https://solscan.io/account/C1onEW2kPetmHmwe74YC1ESx3LnFEpVau6g2pg4fHycr#programIdl | +| `Crema Finance Program` | `CLMM9tUoggJu2wagPkkqs9eFG4BWhVBZWkP1qv3Sp7tR` | `no_idl` | https://solscan.io/account/CLMM9tUoggJu2wagPkkqs9eFG4BWhVBZWkP1qv3Sp7tR | +| `Cropper Finance` | `CTMAxxk34HjKWxQ3QLZK1HpaLXmBveao3ESePXbiyfzh` | `no_idl` | https://solscan.io/account/CTMAxxk34HjKWxQ3QLZK1HpaLXmBveao3ESePXbiyfzh | +| `Cropper Whirlpool` | `H8W3ctz92svYg6mkn1UtGfu2aQr2fnUFHM1RhScEtQDt` | `no_idl` | https://solscan.io/account/H8W3ctz92svYg6mkn1UtGfu2aQr2fnUFHM1RhScEtQDt | +| `deBridge Destination` | `dst5MGcFPoBeREFAA5E3tU5ij8m5uVYwkzkSAbsLbNo` | `no_idl` | https://solscan.io/account/dst5MGcFPoBeREFAA5E3tU5ij8m5uVYwkzkSAbsLbNo | +| `deBridge Source` | `src5qyZHqTqecJV4aY6Cb6zDZLMDzrDKKezs22MPHr4` | `no_idl` | https://solscan.io/account/src5qyZHqTqecJV4aY6Cb6zDZLMDzrDKKezs22MPHr4 | +| `Dexlab Swap` | `DSwpgjMvXhtGn6BsbqmacdBZyfLj6jSWf3HJpdJtmg6N` | `no_idl` | https://solscan.io/account/DSwpgjMvXhtGn6BsbqmacdBZyfLj6jSWf3HJpdJtmg6N | +| `DFlow Aggregator v4` | `DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH` | `solscan_program_idl` | https://solscan.io/account/DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH#programIdl | +| `Drift V2 Program` | `dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH` | `solscan_program_idl` | https://solscan.io/account/dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH#programIdl | +| `Fluxbeam Program` | `FLUXubRmkEi2q6K3Y9kBPg9248ggaZVsoSFhtJHSrm1X` | `no_idl` | https://solscan.io/account/FLUXubRmkEi2q6K3Y9kBPg9248ggaZVsoSFhtJHSrm1X | +| `Fusion AMM` | `fUSioN9YKKSa3CUC2YUc4tPkHJ5Y6XW1yz8y6F7qWz9` | `solscan_program_idl` | https://solscan.io/account/fUSioN9YKKSa3CUC2YUc4tPkHJ5Y6XW1yz8y6F7qWz9#programIdl | +| `Futarchy AMM` | `FUTARELBfJfQ8RDGhg1wdhddq1odMAJUePHFuBYfUxKq` | `solscan_program_idl` | https://solscan.io/account/FUTARELBfJfQ8RDGhg1wdhddq1odMAJUePHFuBYfUxKq#programIdl | +| `Gavel` | `srAMMzfVHVAtgSJc8iH6CfKzuWuUTzLHVCE81QU1rgi` | `no_idl` | https://solscan.io/account/srAMMzfVHVAtgSJc8iH6CfKzuWuUTzLHVCE81QU1rgi | +| `GoonFi` | `goonERTdGsjnkZqWuVjs73BZ3Pb9qoCUdBUL17BnS5j` | `no_idl` | https://solscan.io/account/goonERTdGsjnkZqWuVjs73BZ3Pb9qoCUdBUL17BnS5j | +| `GoonFi V2` | `goonuddtQRrWqqn5nFyczVKaie28f3kDkHWkHtURSLE` | `no_idl` | https://solscan.io/account/goonuddtQRrWqqn5nFyczVKaie28f3kDkHWkHtURSLE | +| `GooseFX: GAMMA` | `GAMMA7meSFWaBXF25oSUgmGRwaW6sCMFLmBNiMSdbHVT` | `solscan_program_idl` | https://solscan.io/account/GAMMA7meSFWaBXF25oSUgmGRwaW6sCMFLmBNiMSdbHVT#programIdl | +| `GooseFX V2` | `GFXsSL5sSaDfNFQUYsHekbWBW1TsFdjDYzACh62tEHxn` | `solscan_program_idl` | https://solscan.io/account/GFXsSL5sSaDfNFQUYsHekbWBW1TsFdjDYzACh62tEHxn#programIdl | +| `Guac Swap` | `Gswppe6ERWKpUTXvRPfXdzHhiCyJvLadVvXGfdpBqcE1` | `solscan_program_idl` | https://solscan.io/account/Gswppe6ERWKpUTXvRPfXdzHhiCyJvLadVvXGfdpBqcE1#programIdl | +| `HawkFi Program` | `FqGg2Y1FNxMiGd51Q6UETixQWkF5fB92MysbYogRJb3P` | `no_idl` | https://solscan.io/account/FqGg2Y1FNxMiGd51Q6UETixQWkF5fB92MysbYogRJb3P | +| `Heaven DEX` | `HEAVENoP2qxoeuF8Dj2oT1GHEnu49U5mJYkdeC8BAX2o` | `no_idl` | https://solscan.io/account/HEAVENoP2qxoeuF8Dj2oT1GHEnu49U5mJYkdeC8BAX2o | +| `Helium Treasury Management` | `treaf4wWBBty3fHdyBpo35Mz84M8k3heKXmjmi9vFt5` | `solscan_program_idl` | https://solscan.io/account/treaf4wWBBty3fHdyBpo35Mz84M8k3heKXmjmi9vFt5#programIdl | +| `HumidiFi` | `9H6tua7jkLhdm3w8BvgpTn5LZNU7g4ZynDmCiNN3q6Rp` | `no_idl` | https://solscan.io/account/9H6tua7jkLhdm3w8BvgpTn5LZNU7g4ZynDmCiNN3q6Rp | +| `Hylo Exchange` | `HYEXCHtHkBagdStcJCp3xbbb9B7sdMdWXFNj6mdsG4hn` | `solscan_program_idl` | https://solscan.io/account/HYEXCHtHkBagdStcJCp3xbbb9B7sdMdWXFNj6mdsG4hn#programIdl | +| `Hylo Stability Pool` | `HysTabVUfmQBFcmzu1ctRd1Y1fxd66RBpboy1bmtDSQQ` | `solscan_program_idl` | https://solscan.io/account/HysTabVUfmQBFcmzu1ctRd1Y1fxd66RBpboy1bmtDSQQ#programIdl | +| `Invariant Swap` | `HyaB3W9q6XdA5xwpU4XnSZV94htfmbmqJXZcEbRaJutt` | `no_idl` | https://solscan.io/account/HyaB3W9q6XdA5xwpU4XnSZV94htfmbmqJXZcEbRaJutt | +| `Jito Tip Distribution` | `4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7` | `solscan_program_idl` | https://solscan.io/account/4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7#programIdl | +| `Jupiter Aggregator v6` | `JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4` | `solscan_program_idl` | https://solscan.io/account/JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4#programIdl | +| `Jupiter Aggregator v4` | `JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB` | `solscan_program_idl` | https://solscan.io/account/JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB#programIdl | +| `Jupiter DCA program` | `DCA265Vj8a9CEuX1eb1LWRnDT7uK6q1xMipnNyatn23M` | `solscan_program_idl` | https://solscan.io/account/DCA265Vj8a9CEuX1eb1LWRnDT7uK6q1xMipnNyatn23M#programIdl | +| `Jupiter Lend Borrow` | `jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi` | `no_idl` | https://solscan.io/account/jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi | +| `Jupiter Lend Earn` | `jup3YeL8QhtSx1e253b2FDvsMNC87fDrgQZivbrndc9` | `solscan_program_idl` | https://solscan.io/account/jup3YeL8QhtSx1e253b2FDvsMNC87fDrgQZivbrndc9#programIdl | +| `Jupiter Lend Flash Loan` | `jupgfSgfuAXv4B6R2Uxu85Z1qdzgju79s6MfZekN6XS` | `no_idl` | https://solscan.io/account/jupgfSgfuAXv4B6R2Uxu85Z1qdzgju79s6MfZekN6XS | +| `Jupiter Lend Liquidity` | `jupeiUmn818Jg1ekPURTpr4mFo29p46vygyykFJ3wZC` | `no_idl` | https://solscan.io/account/jupeiUmn818Jg1ekPURTpr4mFo29p46vygyykFJ3wZC | +| `Jupiter Limit Order` | `jupoNjAxXgZ4rjzxzPMP4oxduvQsQtZzyknqvzYNrNu` | `solscan_program_idl` | https://solscan.io/account/jupoNjAxXgZ4rjzxzPMP4oxduvQsQtZzyknqvzYNrNu#programIdl | +| `Jupiter Limit Order V2` | `j1o2qRpjcyUwEvwtcfhEQefh773ZgjxcVRry7LDqg5X` | `solscan_program_idl` | https://solscan.io/account/j1o2qRpjcyUwEvwtcfhEQefh773ZgjxcVRry7LDqg5X#programIdl | +| `Jupiter Lock` | `LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn` | `solscan_program_idl` | https://solscan.io/account/LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn#programIdl | +| `Jupiter Perpetuals` | `PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu` | `solscan_program_idl` | https://solscan.io/account/PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu#programIdl | +| `Jupiter Prediction Market` | `3ZZuTbwC6aJbvteyVxXUS7gtFYdf7AuXeitx6VyvjvUp` | `no_idl` | https://solscan.io/account/3ZZuTbwC6aJbvteyVxXUS7gtFYdf7AuXeitx6VyvjvUp | +| `Jupiter Stable Program` | `JUPUSDecMzAVgztLe6eGhwUBj1Pn3j9WAXwmtHmfbRr` | `solscan_program_idl` | https://solscan.io/account/JUPUSDecMzAVgztLe6eGhwUBj1Pn3j9WAXwmtHmfbRr#programIdl | +| `Jup Studio: Authority` | `8rE9CtCjwhSmbwL5fbJBtRFsS3ohfMcDFeTTC7t4ciUA` | `no_idl` | https://solscan.io/account/8rE9CtCjwhSmbwL5fbJBtRFsS3ohfMcDFeTTC7t4ciUA | +| `Kamino Program` | `6LtLpnUFNByNXLyCoK9wA2MykKAmQNZKBdY8s47dehDc` | `solscan_program_idl` | https://solscan.io/account/6LtLpnUFNByNXLyCoK9wA2MykKAmQNZKBdY8s47dehDc#programIdl | +| `Kamino Lending Program` | `KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD` | `solscan_program_idl` | https://solscan.io/account/KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD#programIdl | +| `Kamino Farm` | `FarmsPZpWu9i7Kky8tPN37rs2TpmMrAZrC7S7vJa91Hr` | `solscan_program_idl` | https://solscan.io/account/FarmsPZpWu9i7Kky8tPN37rs2TpmMrAZrC7S7vJa91Hr#programIdl | +| `Kamino Vault Program` | `kvauTFR8qm1dhniz6pYuBZkuene3Hfrs1VQhVRgCNrr` | `solscan_program_idl` | https://solscan.io/account/kvauTFR8qm1dhniz6pYuBZkuene3Hfrs1VQhVRgCNrr#programIdl | +| `Kvault Program` | `KvauGMspG5k6rtzrqqn7WNn3oZdyKqLKwK2XWQ8FLjd` | `solscan_program_idl` | https://solscan.io/account/KvauGMspG5k6rtzrqqn7WNn3oZdyKqLKwK2XWQ8FLjd#programIdl | +| `LayerZero Endpoint` | `76y77prsiCMvXMjuoZ5VRrhG5qYBrUMYTE5WgHqgjEn6` | `solscan_program_idl` | https://solscan.io/account/76y77prsiCMvXMjuoZ5VRrhG5qYBrUMYTE5WgHqgjEn6#programIdl | +| `LayerZero Executor` | `6doghB248px58JSSwG4qejQ46kFMW4AMj7vzJnWZHNZn` | `solscan_program_idl` | https://solscan.io/account/6doghB248px58JSSwG4qejQ46kFMW4AMj7vzJnWZHNZn#programIdl | +| `letsbonk.fun: PlatformConfig` | `FfYek5vEz23cMkWsdJwG2oa6EphsvXSHrGpdALN4g6W1` | `no_idl` | https://solscan.io/account/FfYek5vEz23cMkWsdJwG2oa6EphsvXSHrGpdALN4g6W1 | +| `Lifinity Swap` | `EewxydAPCCVuNEyrVN68PuSYdQ7wKn27V9Gjeoi8dy3S` | `no_idl` | https://solscan.io/account/EewxydAPCCVuNEyrVN68PuSYdQ7wKn27V9Gjeoi8dy3S | +| `Lifinity Swap V2` | `2wT8Yq49kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c` | `solscan_program_idl` | https://solscan.io/account/2wT8Yq49kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c#programIdl | +| `Manifest` | `MNFSTqtC93rEfYHB6hF82sKdZpUDFWkViLByLd1k1Ms` | `no_idl` | https://solscan.io/account/MNFSTqtC93rEfYHB6hF82sKdZpUDFWkViLByLd1k1Ms | +| `Marcopolo Swap` | `9tKE7Mbmj4mxDjWatikzGAtkoWosiiZX9y6J4Hfm2R8H` | `no_idl` | https://solscan.io/account/9tKE7Mbmj4mxDjWatikzGAtkoWosiiZX9y6J4Hfm2R8H | +| `Marginfi` | `MFLQPPPPjNinkdKoy2odNFBhvpY43XtCDZjBwG2fwn5` | `no_idl` | https://solscan.io/account/MFLQPPPPjNinkdKoy2odNFBhvpY43XtCDZjBwG2fwn5 | +| `Marginfi V2` | `MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA` | `solscan_program_idl` | https://solscan.io/account/MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA#programIdl | +| `Marinade Finance` | `MarBmsSgKXdrN1egZf5sqe1TMai9K1rChYNDJgjq7aD` | `solscan_program_idl` | https://solscan.io/account/MarBmsSgKXdrN1egZf5sqe1TMai9K1rChYNDJgjq7aD#programIdl | +| `Mercurial Stable Swap` | `MERLuDFBMmsHnsBPZw2sDQZHvXFMwp8EdjudcU2HKky` | `no_idl` | https://solscan.io/account/MERLuDFBMmsHnsBPZw2sDQZHvXFMwp8EdjudcU2HKky | +| `MetaDAO AMM Program v0.5` | `AMMJdEiCCa8mdugg6JPF7gFirmmxisTfDJoSNSUi5zDJ` | `solscan_program_idl` | https://solscan.io/account/AMMJdEiCCa8mdugg6JPF7gFirmmxisTfDJoSNSUi5zDJ#programIdl | +| `MetaDAO Bid Wall Program` | `WALL8ucBuUyL46QYxwYJjidaFYhdvxUFrgvBxPshERx` | `solscan_program_idl` | https://solscan.io/account/WALL8ucBuUyL46QYxwYJjidaFYhdvxUFrgvBxPshERx#programIdl | +| `MetaDAO ICO` | `moontUzsdepotRGe5xsfip7vLPTJnVuafqdUWexVnPM` | `solscan_program_idl` | https://solscan.io/account/moontUzsdepotRGe5xsfip7vLPTJnVuafqdUWexVnPM#programIdl | +| `Metaplex Token Metadata` | `metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s` | `no_idl` | https://solscan.io/account/metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s | +| `Meteora DLMM Program` | `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo` | `solscan_program_idl` | https://solscan.io/account/LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo#programIdl | +| `Meteora Pools Program` | `Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB` | `solscan_program_idl` | https://solscan.io/account/Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB#programIdl | +| `Meteora Dynamic Bonding Curve` | `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN` | `solscan_program_idl` | https://solscan.io/account/dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN#programIdl | +| `Meteora DAMM v2` | `cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG` | `solscan_program_idl` | https://solscan.io/account/cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG#programIdl | +| `Meteora Vault Program` | `24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi` | `solscan_program_idl` | https://solscan.io/account/24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi#programIdl | +| `Moonit` | `MoonCVVNZFSYkqNXP6bxHLPL6QQJiMagDL3qcqUQTrG` | `solscan_program_idl` | https://solscan.io/account/MoonCVVNZFSYkqNXP6bxHLPL6QQJiMagDL3qcqUQTrG#programIdl | +| `Moonshot : Token Authority` | `7rtiKSUDLBm59b1SBmD9oajcP8xE64vAGSMbAN5CXy1q` | `no_idl` | https://solscan.io/account/7rtiKSUDLBm59b1SBmD9oajcP8xE64vAGSMbAN5CXy1q | +| `Mpl Core` | `CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d` | `no_idl` | https://solscan.io/account/CoREENxT6tW1HoK8ypY1SxRMZTcVPm7R94rH4PZNhX7d | +| `Name Service Program` | `namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX` | `no_idl` | https://solscan.io/account/namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX | +| `Numeraire` | `NUMERUNsFCP3kuNmWZuXtm1AaQCPj9uw6Guv2Ekoi5P` | `solscan_program_idl` | https://solscan.io/account/NUMERUNsFCP3kuNmWZuXtm1AaQCPj9uw6Guv2Ekoi5P#programIdl | +| `Obric V2` | `obriQD1zbpyLz95G5n7nJe6a4DPjpFwa5XYPoNm113y` | `no_idl` | https://solscan.io/account/obriQD1zbpyLz95G5n7nJe6a4DPjpFwa5XYPoNm113y | +| `OKX Labs 1` | `6m2CDdhRgxpH4WjvdzxAYbGxwdGUz5MziiL5jek2kBma` | `solscan_program_idl` | https://solscan.io/account/6m2CDdhRgxpH4WjvdzxAYbGxwdGUz5MziiL5jek2kBma#programIdl | +| `OKX: DEX Router` | `proVF4pMXVaYqmy4NjniPh4pqKNfMmsihgd4wdkCX3u` | `solscan_program_idl` | https://solscan.io/account/proVF4pMXVaYqmy4NjniPh4pqKNfMmsihgd4wdkCX3u#programIdl | +| `Ondo Global Markets` | `XzTT4XB8m7sLD2xi6snefSasaswsKCxx5Tifjondogm` | `solscan_program_idl` | https://solscan.io/account/XzTT4XB8m7sLD2xi6snefSasaswsKCxx5Tifjondogm#programIdl | +| `Openbook V2` | `opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb` | `solscan_program_idl` | https://solscan.io/account/opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb#programIdl | +| `Orca Whirlpools Program` | `whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc` | `solscan_program_idl` | https://solscan.io/account/whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc#programIdl | +| `Orca Wavebreak` | `waveQX2yP3H1pVU8djGvEHmYg8uamQ84AuyGtpsrXTF` | `solscan_program_idl` | https://solscan.io/account/waveQX2yP3H1pVU8djGvEHmYg8uamQ84AuyGtpsrXTF#programIdl | +| `Orca Token Swap` | `DjVE6JNiYqPL2QXyCUUh8rNjHrbz9hXHNYt99MQ59qw1` | `no_idl` | https://solscan.io/account/DjVE6JNiYqPL2QXyCUUh8rNjHrbz9hXHNYt99MQ59qw1 | +| `Orca Token Swap V2` | `9W959DqEETiGZocYWCQPaJ6sBmUzgfxXfqGeTEdp3aQP` | `no_idl` | https://solscan.io/account/9W959DqEETiGZocYWCQPaJ6sBmUzgfxXfqGeTEdp3aQP | +| `Ore V3 Program` | `oreV3EG1i9BEgiAJ8b177Z2S2rMarzak4NMv1kULvWv` | `no_idl` | https://solscan.io/account/oreV3EG1i9BEgiAJ8b177Z2S2rMarzak4NMv1kULvWv | +| `PancakeSwap` | `HpNfyc2Saw7RKkQd8nEL4khUcuPhQ7WwY1B2qjx8jxFq` | `solscan_program_idl` | https://solscan.io/account/HpNfyc2Saw7RKkQd8nEL4khUcuPhQ7WwY1B2qjx8jxFq#programIdl | +| `Penguin Finance` | `PSwapMdSai8tjrEXcxFeQth87xC4rRsa4VA5mhGhXkP` | `no_idl` | https://solscan.io/account/PSwapMdSai8tjrEXcxFeQth87xC4rRsa4VA5mhGhXkP | +| `Phoenix` | `PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY` | `no_idl` | https://solscan.io/account/PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY | +| `Printr` | `T8HsGYv7sMk3kTnyaRqZrbRPuntYzdh12evXBkprint` | `solscan_program_idl` | https://solscan.io/account/T8HsGYv7sMk3kTnyaRqZrbRPuntYzdh12evXBkprint#programIdl | +| `Pump.fun` | `6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P` | `solscan_program_idl` | https://solscan.io/account/6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P#programIdl | +| `Pump.fun AMM` | `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA` | `solscan_program_idl` | https://solscan.io/account/pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA#programIdl | +| `Pump Fees Program` | `pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ` | `solscan_program_idl` | https://solscan.io/account/pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ#programIdl | +| `pumpup.ai` | `PdMDrKEMaX8q7CCJb7NvUCxerBCcsFUa4LjBEynTtEd` | `solscan_program_idl` | https://solscan.io/account/PdMDrKEMaX8q7CCJb7NvUCxerBCcsFUa4LjBEynTtEd#programIdl | +| `Raydium AMM Routing` | `routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS` | `no_idl` | https://solscan.io/account/routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS | +| `Raydium Concentrated Liquidity` | `CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK` | `solscan_program_idl` | https://solscan.io/account/CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK#programIdl | +| `Raydium CPMM` | `CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C` | `solscan_program_idl` | https://solscan.io/account/CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C#programIdl | +| `Raydium LaunchLab` | `LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj` | `solscan_program_idl` | https://solscan.io/account/LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj#programIdl | +| `Raydium LaunchLab: PlatformConfig` | `4Bu96XjU84XjPDSpveTVf6LYGCkfW5FK7SNkREWcEfV4` | `no_idl` | https://solscan.io/account/4Bu96XjU84XjPDSpveTVf6LYGCkfW5FK7SNkREWcEfV4 | +| `Raydium liquidity pool AMM` | `5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h` | `no_idl` | https://solscan.io/account/5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h | +| `Raydium Liquidity Pool V2` | `RVKd61ztZW9GUwhRbbLoYVRE5Xf1B2tVscKqwZqXgEr` | `no_idl` | https://solscan.io/account/RVKd61ztZW9GUwhRbbLoYVRE5Xf1B2tVscKqwZqXgEr | +| `Raydium Liquidity Pool V3` | `27haf8L6oxUeXrHrgEgsexjSY5hbVUWEmvv9Nyxg8vQv` | `no_idl` | https://solscan.io/account/27haf8L6oxUeXrHrgEgsexjSY5hbVUWEmvv9Nyxg8vQv | +| `Raydium Liquidity Pool V4` | `675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8` | `no_idl` | https://solscan.io/account/675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 | +| `Raydium Lock LP` | `LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE` | `solscan_program_idl` | https://solscan.io/account/LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE#programIdl | +| `Saber Decimal Wrapper` | `DecZY86MU5Gj7kppfUCEmd4LbXXuyZH1yHaP2NTqdiZB` | `solscan_program_idl` | https://solscan.io/account/DecZY86MU5Gj7kppfUCEmd4LbXXuyZH1yHaP2NTqdiZB#programIdl | +| `Saber Stable Swap` | `SSwpkEEcbUqx4vtoEByFjSkhKdCT862DNVb52nZg1UZ` | `no_idl` | https://solscan.io/account/SSwpkEEcbUqx4vtoEByFjSkhKdCT862DNVb52nZg1UZ | +| `Saros AMM` | `SSwapUtytfBdBn1b9NUGG6foMVPtcWgpRU32HToDUZr` | `no_idl` | https://solscan.io/account/SSwapUtytfBdBn1b9NUGG6foMVPtcWgpRU32HToDUZr | +| `Sanctum Multi-Validator SPL Stake Pool Program` | `SPMBzsVUuoHA4Jm6KunbsotaahvVikZs1JyTW6iJvbn` | `no_idl` | https://solscan.io/account/SPMBzsVUuoHA4Jm6KunbsotaahvVikZs1JyTW6iJvbn | +| `Sanctum Router Program` | `stkitrT1Uoy18Dk1fTrgPw8W6MVzoCfYoAFT4MLsmhq` | `no_idl` | https://solscan.io/account/stkitrT1Uoy18Dk1fTrgPw8W6MVzoCfYoAFT4MLsmhq | +| `Sanctum: S Controller` | `5ocnV1qiCgaQR8Jb8xWnVbApfaygJ8tNoZfgPwsgx9kx` | `no_idl` | https://solscan.io/account/5ocnV1qiCgaQR8Jb8xWnVbApfaygJ8tNoZfgPwsgx9kx | +| `Sanctum Single Validator SPL Stake Pool Program` | `SP12tWFxD9oJsVWNavTTBZvMbA6gkAmxtVgxdqvyvhY` | `solscan_account` | https://solscan.io/account/SP12tWFxD9oJsVWNavTTBZvMbA6gkAmxtVgxdqvyvhY | +| `SharkyFi` | `SHARKobtfF1bHhxD2eqftjHBdVSCbKo9JtgK71FhELP` | `no_idl` | https://solscan.io/account/SHARKobtfF1bHhxD2eqftjHBdVSCbKo9JtgK71FhELP | +| `Solayer` | `sSo1iU21jBrU9VaJ8PJib1MtorefUV4fzC9GURa2KNn` | `no_idl` | https://solscan.io/account/sSo1iU21jBrU9VaJ8PJib1MtorefUV4fzC9GURa2KNn | +| `Solend Protocol` | `So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo` | `no_idl` | https://solscan.io/account/So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo | +| `SolFi` | `SoLFiHG9TfgtdUXUjWAxi3LtvYuFyDLVhBWxdMZxyCe` | `no_idl` | https://solscan.io/account/SoLFiHG9TfgtdUXUjWAxi3LtvYuFyDLVhBWxdMZxyCe | +| `SolFi V2` | `SV2EYYJyRz2YhfXwXnhNAevDEui5Q6yrfyo13WtupPF` | `no_idl` | https://solscan.io/account/SV2EYYJyRz2YhfXwXnhNAevDEui5Q6yrfyo13WtupPF | +| `stabble CLMM` | `6dMXqGZ3ga2dikrYS9ovDXgHGh5RUsb2RTUj6hrQXhk6` | `solscan_program_idl` | https://solscan.io/account/6dMXqGZ3ga2dikrYS9ovDXgHGh5RUsb2RTUj6hrQXhk6#programIdl | +| `stabble Stable Swap` | `swapNyd8XiQwJ6ianp9snpu4brUqFxadzvHebnAXjJZ` | `solscan_program_idl` | https://solscan.io/account/swapNyd8XiQwJ6ianp9snpu4brUqFxadzvHebnAXjJZ#programIdl | +| `stabble Weighted Swap` | `swapFpHZwjELNnjvThjajtiVmkz3yPQEHjLtka2fwHW` | `solscan_program_idl` | https://solscan.io/account/swapFpHZwjELNnjvThjajtiVmkz3yPQEHjLtka2fwHW#programIdl | +| `Stake Pool` | `SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy` | `no_idl` | https://solscan.io/account/SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy | +| `Stake Program` | `Stake11111111111111111111111111111111111111` | `no_idl` | https://solscan.io/account/Stake11111111111111111111111111111111111111 | +| `Step Finance Swap Program` | `SSwpMgqNDsyV7mAgN9ady4bDVu5ySjmmXejXvy2vLt1` | `no_idl` | https://solscan.io/account/SSwpMgqNDsyV7mAgN9ady4bDVu5ySjmmXejXvy2vLt1 | +| `StepN DOOAR Swap` | `Dooar9JkhdZ7J3LHN3A7YCuoGRUggXhQaG4kijfLGU2j` | `no_idl` | https://solscan.io/account/Dooar9JkhdZ7J3LHN3A7YCuoGRUggXhQaG4kijfLGU2j | +| `Scorch` | `SCoRcH8c2dpjvcJD6FiPbCSQyQgu3PcUAWj2Xxx3mqn` | `no_idl` | https://solscan.io/account/SCoRcH8c2dpjvcJD6FiPbCSQyQgu3PcUAWj2Xxx3mqn | +| `Streamflow` | `strmRqUCoQUgGUan5YhzUZa6KqdzwX5L6FpUxfmKg5m` | `solscan_program_idl` | https://solscan.io/account/strmRqUCoQUgGUan5YhzUZa6KqdzwX5L6FpUxfmKg5m#programIdl | +| `Swap Program` | `SwaPpA9LAaLfeLi3a68M4DjnLqgtticKg6CnyNwgAC8` | `no_idl` | https://solscan.io/account/SwaPpA9LAaLfeLi3a68M4DjnLqgtticKg6CnyNwgAC8 | +| `Swig Program` | `swigypWHEksbC64pWKwah1WTeh9JXwx8H1rJHLdbQMB` | `no_idl` | https://solscan.io/account/swigypWHEksbC64pWKwah1WTeh9JXwx8H1rJHLdbQMB | +| `System Program` | `11111111111111111111111111111111` | `no_idl` | https://solscan.io/account/11111111111111111111111111111111 | +| `Tessera V` | `TessVdML9pBGgG9yGks7o4HewRaXVAMuoVj4x83GLQH` | `no_idl` | https://solscan.io/account/TessVdML9pBGgG9yGks7o4HewRaXVAMuoVj4x83GLQH | +| `Titan Exchange Router` | `T1TANpTeScyeqVzzgNViGDNrkQ6qHz9KrSBS4aNXvGT` | `no_idl` | https://solscan.io/account/T1TANpTeScyeqVzzgNViGDNrkQ6qHz9KrSBS4aNXvGT | +| `Token 2022 Program` | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | `no_idl` | https://solscan.io/account/TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb | +| `Token Program` | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | `no_idl` | https://solscan.io/account/TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | +| `Vertigo Program` | `vrTGoBuy5rYSxAfV3jaRJWHH6nN9WK4NRExGxsk1bCJ` | `solscan_program_idl` | https://solscan.io/account/vrTGoBuy5rYSxAfV3jaRJWHH6nN9WK4NRExGxsk1bCJ#programIdl | +| `Virtuals` | `5U3EU2ubXtK84QcRjWVmYt9RaDyA8gKxdUrPFXmZyaki` | `solscan_program_idl` | https://solscan.io/account/5U3EU2ubXtK84QcRjWVmYt9RaDyA8gKxdUrPFXmZyaki#programIdl | +| `Woofi` | `WooFif76YGRNjk1pA8wCsN67aQsD9f9iLsz4NcJ1AVb` | `solscan_program_idl` | https://solscan.io/account/WooFif76YGRNjk1pA8wCsN67aQsD9f9iLsz4NcJ1AVb#programIdl | +| `Wormhole: Bridge` | `wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb` | `no_idl` | https://solscan.io/account/wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb | +| `ZeroFi` | `ZERor4xhbUycZ6gb9ntrhqscUcZmAbQDjEAtCf4hbZY` | `no_idl` | https://solscan.io/account/ZERor4xhbUycZ6gb9ntrhqscUcZmAbQDjEAtCf4hbZY | +| `Zeta Matching Engine` | `zDEXqXEG7gAyxb1Kg9mK5fPnUdENCGKzWrM21RMdWRq` | `no_idl` | https://solscan.io/account/zDEXqXEG7gAyxb1Kg9mK5fPnUdENCGKzWrM21RMdWRq | +| `Zeta Program` | `ZETAxsqBRek56DhiGXrn75yj2NHU3aYUnxvHXpkf3aD` | `solscan_program_idl` | https://solscan.io/account/ZETAxsqBRek56DhiGXrn75yj2NHU3aYUnxvHXpkf3aD#programIdl | +| `Zora Program` | `zoRabwLGd5zXaV7Gxacppw8tcceXEiTrSKyNLSaSTUc` | `no_idl` | https://solscan.io/account/zoRabwLGd5zXaV7Gxacppw8tcceXEiTrSKyNLSaSTUc | diff --git a/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51.md b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51.md new file mode 100644 index 0000000..5e4ab40 --- /dev/null +++ b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51.md @@ -0,0 +1,42 @@ + + +# Validation status — `0.7.51 raydium_amm_v4` + +## Commandes demandées + +```bash +cargo fmt +cargo test -p kb_lib +cargo clippy -p kb_lib --all-targets -- -D warnings +``` + +## Résultat dans le sandbox + +Non exécuté : `cargo`, `rustc` et `rustfmt` ne sont pas disponibles dans l'environnement de génération. + +```text +cargo fmt -> cargo: command not found +``` + +## Contrôles statiques effectués + +- Extraction et modification de l'archive `0.7.50-raydium-launchpad-final`. +- Vérification de l'équilibre basique `{}` et `()` sur les fichiers Rust modifiés. +- Vérification des occurrences ajoutées : aucun `unwrap` / `expect` ajouté dans les nouveaux blocs AMM v4. +- Création des livrables docs + SQL demandés. + +## Validation locale requise + +Appliquer le delta, puis exécuter localement : + +```bash +cargo fmt +cargo test -p kb_lib +cargo clippy -p kb_lib --all-targets -- -D warnings +``` + +Ensuite créer une base SQLite vide dédiée `0.7.51`, constituer le corpus Demo3/Demo2 AMM v4, replay avec `forceDexDecode=yes`, puis exécuter : + +```text +validation_sql/SQL_VALIDATION_RAYDIUM_AMM_V4_0_7_51.sql +``` diff --git a/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51_FINAL.md b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51_FINAL.md new file mode 100644 index 0000000..5314465 --- /dev/null +++ b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51_FINAL.md @@ -0,0 +1,47 @@ + + +# Validation Status — `0.7.51 raydium_amm_v4 final` + +## Rust + +```text +cargo test -p kb_lib -> 405 passed / 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> OK +``` + +## Replay final + +```text +195 replayed +0 decode skipped +195 ledger upserts +70 unsafe ledger rows +168 trades +7 liquidity +15 lifecycle +0 tokenAccount +668 candle upserts +instructionObservations = 2599 +resetDeleted = 1578 +catalog = 61 tokens / 65 pools / 65 pairs +``` + +## SQL blocking checks + +Résultat attendu et rapporté : `vide` pour les contrôles suivants. + +- `raydium_amm_v4.swap` legacy ; +- decoded events AMM v4 sans coverage entry ; +- observations AMM v4 en discriminant plus long qu'un octet ; +- non-swap AMM v4 avec trade ; +- failed tx AMM v4 avec trade ; +- successful non-materialized AMM v4 sans raison explicite ; +- matérialisation multi-target AMM v4. + +## Points validés + +- Tous les discriminants officiels AMM v4 `00..11` sont observés localement. +- `pre_initialize` : `decoded_success_count=7`, `lifecycle_count=7`. +- `migrate_to_open_book` : orderbook-only (`lifecycle_count=0`, `orderbook_count=6`). +- `simulate_info` : decoded-only. +- `raydium_pool_v4` : audit-only / décision conditionnelle, sans decoder local. diff --git a/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51_MAX_DECODER.md b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51_MAX_DECODER.md new file mode 100644 index 0000000..82c6c95 --- /dev/null +++ b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_51_MAX_DECODER.md @@ -0,0 +1,56 @@ + + +# Validation status — `0.7.51 raydium_amm_v4 max-decoder` + +## Scope + +Delta incrémental après le premier patch `0.7.51 raydium_amm_v4`. + +Objectifs couverts : + +- correction du test `swap_base_in` avec une payload `0x09` ; +- ajout d'un test dédié `swap_base_in_v2` avec une payload `0x10` ; +- suppression de la route métier legacy `raydium_amm_v4.swap` ; +- reconnaissance locale maximale des discriminants AMM v4 officiels `00..11` ; +- conservation des instructions dépréciées comme events decoded-only ou non-trade matérialisables si corpus successful ; +- reclassement orderbook/fee/admin/liquidity/lifecycle pour les non-swaps AMM v4 ; +- reconstruction des observations techniques par transaction avant upsert ; +- extension du SQL de validation AMM v4. + +## Sandbox validation + +Non exécutée dans l'environnement de génération : `cargo`, `rustc` et `rustfmt` ne sont pas disponibles. + +## Validation locale obligatoire + +```bash +cargo fmt +cargo test -p kb_lib +cargo clippy -p kb_lib --all-targets -- -D warnings +``` + +## Replay local attendu + +Après application du delta, relancer le replay dédié `0.7.51` avec : + +```text +skipDexDecode = no +forceDexDecode = yes +deferInstructionObservations = yes +``` + +Puis exécuter : + +```text +validation_sql/SQL_VALIDATION_RAYDIUM_AMM_V4_0_7_51.sql +``` + +Les contrôles bloquants attendus vides sont : + +- `raydium_amm_v4.instruction_audit` résiduel ; +- `upstream_git.instruction_match` localement couvert ; +- `raydium_amm_v4.swap` legacy ; +- decoded AMM v4 sans coverage entry ; +- observations AMM v4 avec `length(discriminator_hex) > 2` ; +- non-swap AMM v4 avec `trade_count > 0` ; +- failed tx matérialisée en trade. diff --git a/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_52_FINAL.md b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_52_FINAL.md new file mode 100644 index 0000000..e0f817f --- /dev/null +++ b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_52_FINAL.md @@ -0,0 +1,69 @@ + + +# Validation status — 0.7.52 Raydium Stable Swap final + +## Scope + +Decoder: `raydium_stable_swap` + +Program id: + +```text +5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h +``` + +## Local commands + +```text +cargo test -p kb_lib +407 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out + +cargo clippy -p kb_lib --all-targets -- -D warnings +ok +``` + +## Final replay snapshot + +```text +replayed=298 +decode_skipped=0 +ledger_upserts=298 +unsafe_ledger_rows=258 +trades=290 +liquidity=16 +lifecycle=4 +tokenAccount=0 +candle_upserts=1160 +instructionObservations=5317 +resetDeleted=1059 +catalog=40 tokens / 59 pools / 59 pairs +``` + +## Stable Swap swap closure + +```text +raydium_stable_swap.swap_base_in stable_swap_instruction_bounds_only failed decoded=27 trades=0 +raydium_stable_swap.swap_base_in stable_swap_vault_balance_delta success decoded=171 trades=171 +raydium_stable_swap.swap_base_out stable_swap_instruction_bounds_only failed decoded=2 trades=0 +raydium_stable_swap.swap_base_out stable_swap_vault_balance_delta success decoded=4 trades=4 +``` + +No successful Stable Swap swap remains without trade or skip reason. + +## Invariants + +| invariant | status | +|---|---| +| residual local `instruction_audit` | empty | +| residual `upstream_git.instruction_match` for covered entries | empty | +| decoded without coverage | empty | +| non-swap materialized as trade | empty | +| failed tx materialized as trade | empty | +| multi-target materialization | empty | +| unexplained successful non-materialized event | empty | +| successful swap via vault deltas | `trade_count = decoded_count` | +| failed swap instruction bounds only | `trade_count = 0` | + +## Decision + +`0.7.52 raydium_stable_swap` is closed for the current local corpus. diff --git a/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_56_FINAL.md b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_56_FINAL.md new file mode 100644 index 0000000..1e4a1a6 --- /dev/null +++ b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_56_FINAL.md @@ -0,0 +1,51 @@ + + +# Validation Status — `0.7.56 meteora_dbc final` + +## Build + +```text +cargo test -p kb_lib -> 446 passed / 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> OK +``` + +## Replay final DBC + +```text +480 replayed +0 decode skipped +480 ledger upserts +454 unsafe ledger rows +264 trades +1 liquidity +122 lifecycle +0 tokenAccount +1056 candle upserts +instructionObservations = 7167 +resetDeleted = 3583 +catalog = 86 tokens / 60 pools / 60 pairs +``` + +## Fee model final DBC + +```text +k_sol_fee_events meteora_dbc = 89 parents +k_sol_fee_event_amounts meteora_dbc = 96 legs +parent scalar without leg = empty +orphan fee amount legs = empty +allowlisted recovery on DBC = empty by design +``` + +## Cross-base fee recovery checks + +| Base | Result | +|---|---| +| `meteora_dbc` | stable, no regression, 89/96 fee parent/legs. | +| `raydium_launchpad` | allowlisted CPI recovery enriched all observed claim/collect fee parents in tested corpus. | +| `raydium_cpmm` | creator fee recovered; fund/protocol fee explicit no-transfer in tested corpus. | +| `pump_swap` | coin creator fee mostly recovered; zero/no-transfer cases explicit. | +| `pump_fees` | donation and sweep buyback recovered when CPI SPL transfers are present. | + +## Closure decision + +`0.7.56 meteora_dbc` is closed. Next tranche: `0.7.57 meteora_dlmm` full decode + full materialization. diff --git a/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_57_FINAL.md b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_57_FINAL.md new file mode 100644 index 0000000..9606f56 --- /dev/null +++ b/olddocs/archivekbobobot/docs/VALIDATION_STATUS_0_7_57_FINAL.md @@ -0,0 +1,73 @@ +# Validation status — 0.7.57 Meteora DLMM final + +## Build + +```text +cargo test -p kb_lib -> 460 passed / 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> OK +``` + +## Replay + +Recommended replay settings used: + +```text +skipDexDecode=no +forceDexDecode=yes +deferInstructionObservations=yes +``` + +Final replay summary: + +```text +769 replayed +0 decode skipped +769 ledger upserts +646 unsafe ledger rows +106 trades +664 liquidity +1107 lifecycle +0 tokenAccount +424 candle upserts +instructionObservations = 8062 +resetDeleted = 9898 +catalog = 169 tokens / 218 pools / 218 pairs +``` + +## Final SQL gates + +| Gate | Result | +|---|---:| +| Upstream fallback for local DLMM coverage | empty | +| Local `instruction_audit` observed | `0` | +| Decoded DLMM without coverage | empty | +| Successful non-materialized without explicit skip/policy | empty | +| Failed transaction business materialization | empty | +| Multi-target materialization | empty | +| Non-swap trade/candle safety | empty | +| Fee parent scalar without amount leg | empty | +| Orphan fee amount legs | empty | +| Reward/fee collision | clean separation | +| Limit/orderbook trade/candle double-count | empty | +| Logical duplicate coverage rows | empty | + +## Final materialization counters + +```text +trade events = 106 +liquidity events = 664 +lifecycle events = 1107 +candles = 424 +``` + +## Important decisions + +- `swap_event` and `swap2_evt` are materialized as lifecycle `swap_log`, not as trades. +- `initialize_preset_parameter_v2` was added from corpus evidence for discriminator `75c73e67068e1fcb`. +- `close_bin_array` has `16` observations but only `14` materializations because `2` transactions failed with `Custom 6015`. +- `initialize_reward` and `initialize_reward_event` remain without amounts because they are configuration/init events, not transfers. +- No observed useful DLMM event remains decoded-only. + +## Closure decision + +`0.7.57 meteora_dlmm` is considered closed for the validated corpus. Future changes require new corpus evidence. diff --git a/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_1FE5_CONTINUATION_V2.md b/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_1FE5_CONTINUATION_V2.md new file mode 100644 index 0000000..cc145f3 --- /dev/null +++ b/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_1FE5_CONTINUATION_V2.md @@ -0,0 +1,193 @@ + + +# Prompt de reprise — khadhroony-bobobot `0.7.47-1FE5` + +Reprise du projet `khadhroony-bobobot`. + +## Archive de départ + +Utiliser comme base de travail : + +```text +kb_lib-v0.7.47-1FE5-full.zip +``` + +Joindre aussi les docs mises à jour : + +```text +README.md +ROADMAP.md +CHANGELOG.md +docs/DEX_DECODER_MATRIX.md +``` + +## Décision de planification + +Ne plus tenter “tous les events de tous les decoders” dans une seule session. L’objectif reste de couvrir tous les decoders disponibles dans Carbon et les sources Git/IDL, mais par tranches DEX/version. + +Ordre cible : + +```text +raydium_cpmm +raydium_clmm +pump_swap +pump_fun +meteora_dbc +meteora_dlmm +meteora_damm_v1 +meteora_damm_v2 +phoenix_v1 +openbook_v2 +orca_whirlpools +launch surfaces +DEX historiques / candidats +``` + +## Sources upstream obligatoires + +Ces sources sont des indices de décodage, pas des preuves de validation locale : + +```text +https://github.com/sevenlabs-hq/carbon/tree/main/decoders +https://github.com/0xfnzero/solana-streamer +https://github.com/0xfnzero/sol-parser-sdk/tree/main/idl +https://github.com/pinax-network/substreams-solana-idls/tree/main/src +https://github.com/hodlwarden/solana-tx-parser/tree/main/src +https://github.com/openbook-dex/openbook-v2 +https://github.com/all-in-one-blockchain/phoenix-onchain-mm +https://docs.vybenetwork.com/docs/available-dexs-amms +``` + +## État validé + +Dernier état validé côté `kb_lib` : + +```text +cargo test -p kb_lib +371 passed +``` + +Clippy doit être relancé à chaque tranche : + +```bash +cargo clippy -p kb_lib --all-targets -- -D warnings +``` + +## 0.7.47 acquis + +- Upstream Git Registry ajouté. +- Demo3 étendu : multi-target, multi-source, pagination, orderbook targets, burn/mint/transfer/wrap/unwrap/stake. +- Demo2 backfill signature fonctionnel. +- Replay local avec ledger. +- OpenBook v2 decoder audit-only. +- Phoenix v1 decoder audit-only. +- Les decoders audit-only ne produisent aucun trade/candle. + +## OpenBook v2 + +Program id : + +```text +opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb +``` + +État : + +```text +audit-only local decoder +upstream_git fallback cleaned +Program data mapped: +- FillLog +- OpenOrdersPositionLog +- TotalOrderFillEvent +- SettleFundsLog +trade_count = 0 +``` + +Ne pas activer de trade/candle tant que maker/taker/base/quote et les lots ne sont pas validés. + +## Phoenix v1 + +Program id : + +```text +PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY +``` + +État : + +```text +audit-only local decoder +log instruction strict 0x0f +events observed: +- Reduce +- Place +- TimeInForce +currentInstructionTag mappings: +- 0x09 CancelUpToWithFreeFunds +- 0x0c WithdrawFunds +- 0x10 PlaceMultiplePostOnlyOrders +trade_count = 0 +``` + +Prochaine action préférée : finir Phoenix v1 avec tous les events disponibles dans les sources Git/IDL, mais rester audit-only jusqu’à validation économique. + +## Contraintes + +- Rust 2024. +- Pas de `mod.rs`. +- Fichiers Rust avec entête `// file: ...`. +- Exposition centralisée via `lib.rs`. +- `#![deny(unreachable_pub)]`, `#![warn(missing_docs)]`. +- Pas de `anyhow`. +- Pas de `thiserror`. +- Pas de `?`, `unwrap`, `expect` dans le code applicatif. +- Utiliser `match`, `if let Err`, `let Err = ... else`. +- Si une requête DB est ajoutée/modifiée, mettre à jour `kb_lib/src/db.rs`, puis `kb_lib/src/lib.rs` si nécessaire. + +## Méthode par DEX/version + +Pour chaque DEX/version : + +1. inspecter Carbon + autres sources Git/IDL ; +2. lister tous les discriminants instructions/events ; +3. compléter `upstream_registry` / matrice si nécessaire ; +4. utiliser Demo3 pour corpus ; +5. backfill Demo2 ; +6. replay forcé ; +7. valider SQL ; +8. ajouter decoder audit-only ou materialized selon preuve ; +9. supprimer les doublons `upstream_git.instruction_match` si decoder spécialisé ; +10. ne jamais produire trade/candle sans montants exploitables et sens économique validé. + +## Requêtes de sécurité audit-only + +```sql +SELECT + de.protocol_name, + de.event_kind, + COUNT(te.id) AS trade_count +FROM k_sol_dex_decoded_events de +LEFT JOIN k_sol_trade_events te + ON te.decoded_event_id = de.id +WHERE de.protocol_name IN ('openbook_v2', 'phoenix_v1') +GROUP BY de.protocol_name, de.event_kind +ORDER BY trade_count DESC; +``` + +Attendu : + +```text +trade_count = 0 +``` + +## Livrable attendu + +Pour chaque tranche : + +- fichiers ajoutés/modifiés seulement ; +- archive zip ; +- commandes de test ; +- requêtes SQL ; +- notes sur ce qui reste non vérifié ; +- ne pas prétendre qu’un event ou program id est vérifié sans corpus local. diff --git a/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_EVENT_COVERAGE_V3.md b/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_EVENT_COVERAGE_V3.md new file mode 100644 index 0000000..bf74e8a --- /dev/null +++ b/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_EVENT_COVERAGE_V3.md @@ -0,0 +1,157 @@ + + +# Prompt de reprise — khadhroony-bobobot `0.7.47-1FE5` / Event coverage + +Reprise du projet `khadhroony-bobobot`. + +## Archive de départ + +Utiliser : + +```text +khadhroony-bobobot-v0.7.47-1FE5-full.zip +``` + +Et les docs : + +```text +README.md +ROADMAP.md +CHANGELOG.md +docs/DEX_DECODER_MATRIX.md +docs/DEX_EVENT_COVERAGE_MATRIX.md +docs/DB_EVENT_MODEL_REVIEW.md +``` + +## Décision de reprise + +Ne pas essayer de “faire tous les events de tous les DEX” dans une seule session. + +La stratégie est maintenant : + +```text +un DEX/version = une tranche +tous les events listés = audit coverage +matérialisation seulement après corpus + SQL + invariants +``` + +## Sources Git/IDL à utiliser systématiquement + +- https://github.com/sevenlabs-hq/carbon/tree/main/decoders +- https://github.com/0xfnzero/solana-streamer +- https://github.com/0xfnzero/sol-parser-sdk/tree/main/idl +- https://github.com/pinax-network/substreams-solana-idls/tree/main/src +- https://github.com/hodlwarden/solana-tx-parser/tree/main/src +- https://github.com/openbook-dex/openbook-v2 +- https://github.com/all-in-one-blockchain/phoenix-onchain-mm +- https://docs.vybenetwork.com/docs/available-dexs-amms + +## Objectif événementiel + +Décoder le maximum d’events, pas seulement les swaps. + +Inclure explicitement : + +```text +swap +pool_create +add_liquidity +remove_liquidity +position_open +position_close +fee +reward +admin/config +mint +burn +transfer +account_create +account_close +wrap_sol +unwrap_sol +order_place +order_cancel +order_fill +consume_events +settle_funds +vault_deposit +vault_withdraw +lock +unlock +launch +migration +stake +unstake +unknown/unmapped audit +``` + +Raison : burn, perte de liquidité, changements admin/config, vault withdraw, migration, mint anormal, close account, etc. peuvent influencer une décision de trading même si ce ne sont pas des trades. + +## Base de données + +La base actuelle suffit pour audit-only via `k_sol_dex_decoded_events`, mais elle n’est pas suffisante pour tout exploiter en requêtes métier. + +À considérer avant ou pendant `0.7.48` : + +```text +k_sol_dex_event_coverage_entries +k_sol_token_transfer_events +k_sol_token_account_events +k_sol_orderbook_events +k_sol_vault_events +k_sol_launch_events +k_sol_liquidity_lock_events +``` + +Priorité minimale : + +```text +1. k_sol_dex_event_coverage_entries +2. k_sol_token_transfer_events +3. k_sol_orderbook_events +``` + +## Ordre des versions + +```text +0.7.48-pre event coverage + DB model checkpoint +0.7.48 raydium_cpmm +0.7.49 raydium_clmm +0.7.50 pump_swap +0.7.51 pump_fun +0.7.52 meteora_dbc +0.7.53 meteora_dlmm +0.7.54 meteora_damm_v1 +0.7.55 meteora_damm_v2 +0.7.56 phoenix_v1 +0.7.57 openbook_v2 +0.7.58 orca_whirlpools +0.7.59 launch surfaces +0.7.60 DEX historiques/candidats +0.7.61 validation consolidée +``` + +## Règles fixes + +- Un event non-trade ne produit jamais trade/candle. +- Une transaction failed reste audit, jamais trade/candle. +- Un discriminator upstream n’est pas une preuve métier. +- Un program id upstream n’est pas vérifié sans corpus local. +- Chaque decoder spécialisé doit remplacer le fallback `upstream_git.instruction_match` pour éviter les doublons. +- Tout event connu mais non observé reste `upstream_git_mapped_unverified`. +- Tout event observé mais non matérialisé reste audit-only ou decoded, pas materialized. + +## Prochaine tâche recommandée + +Commencer par : + +```text +0.7.48-pre — event coverage + DB model checkpoint +``` + +Livrables attendus : + +1. ajouter/documenter une table de couverture event/discriminator ; +2. générer un rapport de couverture par DEX/version ; +3. préparer `raydium_cpmm` avec la liste complète des events depuis Carbon/fnzero/IDL ; +4. ne pas changer encore la matérialisation trade/candle. diff --git a/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_UPSTREAM_REGISTRY.md b/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_UPSTREAM_REGISTRY.md new file mode 100644 index 0000000..962a589 --- /dev/null +++ b/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.47_UPSTREAM_REGISTRY.md @@ -0,0 +1,251 @@ + + +# Prompt de reprise — khadhroony-bobobot `0.7.47` + +Reprise du projet `khadhroony-bobobot`. + +## Contexte + +Le workspace contient principalement : + +- `kb_lib` : logique métier Solana/DEX, clients HTTP/WS, décodage, détection, SQLite, replay, validation, diagnostics, metadata, candles, signaux ; +- `kb_demo_app` : application Tauri V2 de démo/inspection. Elle doit rester une façade UI et ne pas contenir de logique métier DEX profonde. + +La version `0.7.46` est clôturée sur `meteora_damm_v1`. + +## État validé à la fin de `0.7.46` + +- `cargo test -p kb_lib` : vert. +- `cargo clippy -p kb_lib --all-targets -- -D warnings` : vert. +- Demo2 et Demo3 fonctionnent bien pour backfill et discovery. +- Demo3 supporte : + - multi-target ; + - multi-source ; + - pagination `before` / `until` ; + - `max_pages` ; + - `newest_first` / `oldest_first`. +- Le replay local supporte le ledger de décodage/replay et les options `skipDexDecode` / `forceDexDecode`. +- `meteora_damm_v1` couvre les surfaces observées localement : + - `swap` ; + - `claim_fee` ; + - `create_lock_escrow` ; + - `lock_liquidity` ; + - `remove_liquidity` ; + - `add_liquidity` ; + - `create_pool`. +- Les statuts/payloads ne doivent plus utiliser une terminologie spécifique à un dépôt externe particulier. +- Les statuts génériques attendus sont : + - `upstream_git_unverified` ; + - `upstream_git_mapped_unverified` ; + - `upstream_git_local_corpus_observed` ; + - `upstream_git_local_corpus_materialized` ; + - `upstream_git_layout_unverified` si le layout est connu depuis une source Git mais pas encore validé localement. + +## Décision base de données pour `0.7.47` + +La version `0.7.46` est considérée finalisée. Ne pas demander ni proposer de replay forcé de l’ancienne base `0.7.46` pour clôturer cette version, sauf demande explicite. + +Pour `0.7.47`, le développement et la validation doivent se faire de préférence sur une **nouvelle base SQLite dédiée**. Cette base servira à constituer un corpus propre avec Demo3 et Demo2 sur plusieurs paires, pools ou programmes de DEX différents. + +Règles pratiques : + +- l’ancienne base `0.7.46` peut servir de référence historique ou de comparaison, mais elle ne doit pas être migrée ou redécodée automatiquement ; +- si une validation DB est nécessaire en `0.7.47`, elle doit cibler la nouvelle base de travail `0.7.47` ; +- les backfills `0.7.47` doivent être construits à partir de Demo3 discovery puis Demo2 signature/pool backfill ; +- le replay local reste utile, mais seulement après constitution du corpus `0.7.47`, pas comme étape de finalisation de `0.7.46` ; +- les entrées du registre upstream Git restent des indices tant qu’elles ne sont pas observées sur cette nouvelle base ou sur un corpus explicitement indiqué. + +## Objectif de `0.7.47` + +`0.7.47` est dédiée à : + +```text +Upstream Git Registry / DEX discovery preparation +``` + +L’objectif n’est pas de valider directement un DEX unique. L’objectif est de créer un registre générique permettant d’indexer les `program_id`, discriminants d’instructions, discriminants d’events, noms d’instructions, familles de programmes et types de surfaces issus de dépôts Git externes de decoders Solana. + +Ces entrées sont des **indices de découverte**, pas des preuves métier. Elles doivent rester non vérifiées tant qu’elles ne sont pas confirmées par : + +1. Demo3 discovery ; +2. backfill signature/pool via Demo2 ; +3. replay local sur la base de travail `0.7.47` ; +4. requêtes SQL de validation sur cette même base ; +5. invariants métier : pas de faux trade, pas de fausse candle, pas de promotion de `program_id` sans corpus. + +## Noms recommandés + +Modules possibles : + +```text +kb_lib/src/upstream_registry.rs +kb_lib/src/upstream_registry_types.rs +kb_lib/src/upstream_registry_match.rs +kb_lib/src/upstream_registry_generated.rs +``` + +Nom fonctionnel : + +```text +Upstream Git Registry +``` + +Ne pas utiliser de nom de dépôt externe spécifique dans les noms publics, les statuts, les tables ou les payloads métier. + +## Première tranche attendue + +Créer une première version statique du registre dans `kb_lib`, sans modifier la DB si ce n’est pas nécessaire. + +Chaque entrée de registre devrait contenir au minimum : + +```text +source_repo +source_path +decoder_code +program_id +program_family +surface_kind +entry_kind = instruction | event | account | program +entry_name +discriminator_hex +discriminator_len +proof_status +notes +``` + +Les entrées de registre doivent être exposées à `kb_demo_app` via une commande Demo3 ou une commande dédiée, mais la logique reste dans `kb_lib`. + +## Familles à indexer en priorité + +DEX / AMM / CLMM / orderbook : + +```text +meteora_damm_v2 +meteora_dbc +meteora_dlmm +meteora_vault +raydium_amm_v4 +raydium_clmm +raydium_cpmm +raydium_launchpad +raydium_liquidity_locking +raydium_stable_swap +orca_whirlpools +fluxbeam +lifinity_v2 +phoenix_v1 +openbook_v2 +stabble_stable_swap +stabble_weighted_swap +bonkswap +boop +moonshot +heaven +okx_dex +pancake_swap +vertigo +virtuals +wavebreak +onchain_labs_dex_v1 +onchain_labs_dex_v2 +``` + +Agrégateurs / ordres / perps / lending : + +```text +jupiter_swap +jupiter_dca +jupiter_limit_order +jupiter_limit_order_2 +jupiter_perpetuals +jupiter_lend +kamino_lending +kamino_vault +kamino_farms +kamino_limit_order +drift_v2 +marginfi_v2 +dflow_aggregator_v4 +zeta +``` + +Contexte transactionnel non DEX : + +```text +system_program +token_program +token_2022 +associated_token_account +address_lookup_table +memo_program +stake_program +mpl_token_metadata +mpl_core +bubblegum +name_service +marinade_finance +solayer_restaking_program +swig +sharky +circle_message_transmitter_v2 +circle_token_messenger_v2 +``` + +## Règles de validation + +- Une entrée upstream Git reste `upstream_git_unverified` tant qu’elle n’a pas été vue localement. +- Une entrée branchée dans un decoder mais jamais vue localement reste `upstream_git_mapped_unverified`. +- Une entrée vue après Demo3/backfill/replay peut devenir `upstream_git_local_corpus_observed`. +- Une entrée qui alimente correctement une table métier dédiée peut devenir `upstream_git_local_corpus_materialized`. +- Aucun `program_id`, event ou discriminator ne doit être déclaré vérifié uniquement parce qu’il existe dans un dépôt Git externe. +- Aucun event non-trade ne doit produire trade, metric ou candle. + +## Contraintes de code + +- Rust 2024. +- Pas de `mod.rs`. +- Fichiers Rust avec entête `// file: ...`. +- Fichiers `.toml` avec entête `# file: ...`. +- Exposition centralisée via `lib.rs`. +- `#![deny(unreachable_pub)]` et `#![warn(missing_docs)]`. +- Pas de `anyhow`. +- Pas de `thiserror`. +- Pas de `?`, `unwrap`, `expect` dans le code applicatif. +- Utiliser `match`, `if let Err`, `let Err = ... else`. +- Tests verts à chaque étape. +- Si une requête DB est ajoutée/modifiée, mettre à jour les re-exports dans `kb_lib/src/db.rs`, puis `kb_lib/src/lib.rs` si nécessaire. + +## Format de livraison attendu + +Pour chaque tranche : + +1. expliquer brièvement les fichiers touchés ; +2. fournir une archive des fichiers ajoutés/modifiés seulement, avec l’arborescence du projet ; +3. indiquer les commandes de test à lancer ; +4. indiquer les requêtes SQL utiles si validation DB nécessaire ; +5. ne jamais prétendre qu’un `program_id` ou un event est vérifié sans preuve/corpus. + + +dexlab +bags / letsbonk / bonk_fun +believe +moonit +launchbeam +metadao / metaDAO +printr +zora +aldrin +aldrin_v2 +crema +cropper +cropper_legacy +guacswap +invariant +lifinity_v1 +openbook_v1 / serum-style legacy +orca_v1 +orca_v2 +saber +saros +serum_v3 +token_swap diff --git a/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.49_RAYDIUM_CLMM.md b/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.49_RAYDIUM_CLMM.md new file mode 100644 index 0000000..e52b435 --- /dev/null +++ b/olddocs/archivekbobobot/docs/prompts/NEXT_SESSION_PROMPT_0.7.49_RAYDIUM_CLMM.md @@ -0,0 +1,329 @@ + + +# Prompt de reprise — khadhroony-bobobot `0.7.49` / Raydium CLMM event coverage + +Reprise du projet `khadhroony-bobobot` après clôture fonctionnelle de `0.7.48 raydium_cpmm`. + +## Archive de départ + +Utiliser la dernière archive complète du workspace intégrant les deltas validés jusqu'à : + +```text +0.7.48-raydium-cpmm-final +``` + +Docs à fournir aussi : + +```text +README.md +ROADMAP.md +CHANGELOG.md +docs/DEX_DECODER_MATRIX.md +docs/DEX_EVENT_COVERAGE_MATRIX.md +docs/DB_EVENT_MODEL_REVIEW.md +docs/reports/RAYDIUM_CPMM_EVENT_COVERAGE_REPORT.md +validation_sql/SQL_VALIDATION_RAYDIUM_CPMM_0_7_48.sql +``` + +## État validé avant reprise + +`0.7.48` a clôturé la tranche `raydium_cpmm` : + +```text +k_sol_dex_event_coverage_entries synchronisée en snake_case local +k_sol_instruction_observations ajoutée comme table technique d'index instruction/discriminator +Demo3 enrichie avec recherche instruction/discriminator +Solscan instruction= utilisé comme accélérateur de recherche de signatures +raydium_cpmm Program data décodé pour lp_change_event / swap_event +raydium_cpmm deposit / withdraw / lp_change_event matérialisés liquidity +raydium_cpmm initialize / initialize_with_permission matérialisés lifecycle-only +raydium_cpmm collect_*_fee matérialisés fee +raydium_cpmm create_amm_config / create_permission_pda / update_amm_config matérialisés admin/config +raydium_cpmm swap_event conservé audit-only +close_permission_pda et update_pool_status conservés upstream_git_mapped_unverified faute de corpus local +instruction inconnue 40f4bc78a7e9690a conservée raydium_cpmm.instruction_audit +``` + +Validation locale finale observée : + +```text +cargo test -p kb_lib: ok, 386 passed +cargo clippy -p kb_lib --all-targets -- -D warnings: ok +replay local: 1124 replayed, 561 trades, 50 liquidity, 9 lifecycle, 2224 candle upserts +``` + +Couverture finale `raydium_cpmm` : + +```text +lp_change_event 25/25 liquidity, 0 trade +swap_event 529 decoded-only, 0 trade +deposit 11/11 liquidity, 0 trade +withdraw 14/14 liquidity, 0 trade +initialize 5/5 lifecycle, 0 admin, 0 trade +initialize_with_permission 4/4 lifecycle, 0 admin, 0 trade +collect_creator_fee 4/4 fee, 0 trade +collect_fund_fee 7/7 fee, 0 trade +collect_protocol_fee 15/15 fee, 0 trade +create_amm_config 6/6 admin, 0 trade +create_permission_pda 4/4 admin, 0 trade +update_amm_config 13/13 admin, 0 trade +swap_base_input 750 decoded, 482 trades +swap_base_output 25 decoded, 17 trades +close_permission_pda upstream_git_mapped_unverified +update_pool_status upstream_git_mapped_unverified +``` + +Invariants maintenus : + +```text +non-trade event = jamais trade/candle +failed transaction = audit-only +upstream Git/IDL/Solscan = indice, pas preuve métier +program_id upstream non promu sans corpus local +chaque decoder spécialisé remplace le fallback upstream_git.instruction_match +side effects SPL Token / Token-2022 restent transversaux, pas raydium_cpmm.* directs +pas de nouvelle table métier transversale sans preuve multi-DEX +``` + +## Décision de reprise + +Commencer `0.7.49` par `raydium_clmm`, avant Pump/Meteora. + +Ordre courant : + +```text +0.7.49 raydium_clmm +0.7.50 pump_swap +0.7.51 pump_fun +0.7.52 meteora_dbc +0.7.53 meteora_dlmm upstream parity +0.7.54 meteora_damm_v1 upstream parity +0.7.55 meteora_damm_v2 +0.7.56 phoenix_v1 audit-only completion +0.7.57 openbook_v2 audit-only completion +0.7.58 orca_whirlpools +0.7.59+ launch surfaces, candidats/historiques, validation consolidée +``` + +## Sources Git/IDL à utiliser systématiquement + +- https://github.com/sevenlabs-hq/carbon/tree/main/decoders +- https://github.com/0xfnzero/solana-streamer +- https://github.com/0xfnzero/sol-parser-sdk/tree/main/idl +- https://github.com/pinax-network/substreams-solana-idls/tree/main/src +- https://github.com/hodlwarden/solana-tx-parser/tree/main/src +- https://github.com/openbook-dex/openbook-v2 +- https://github.com/all-in-one-blockchain/phoenix-onchain-mm +- https://docs.vybenetwork.com/docs/available-dexs-amms + +Pour `0.7.49 raydium_clmm`, utiliser aussi explicitement : + +```text +https://solscan.io/account/CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK#programIdl +``` + +et les filtres Solscan de type : + +```text +https://solscan.io/account/CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK?instruction=&hide_spam=true&hide_failed=true&show_related=false&sort=desc +``` + +Solscan doit servir à trouver vite des signatures à backfiller, jamais comme preuve métier finale. + +## Objectif `0.7.49` — `raydium_clmm` + +Objectif : reprendre `raydium_clmm` comme deuxième tranche Raydium/version après CPMM. + +À faire : + +1. lire le code local `raydium_clmm` et les matérialisations existantes ; +2. lister toutes les instructions/events CLMM depuis Carbon/fnzero/IDL/Raydium/Solscan Program IDL ; +3. synchroniser/remplir `k_sol_dex_event_coverage_entries` pour `raydium_clmm` ; +4. utiliser `k_sol_instruction_observations` pour inspecter les discriminants réellement observés localement ; +5. ajouter à Demo3 les filtres instruction/discriminant CLMM si un binding/UI manque encore ; +6. chercher des signatures ciblées via Solscan `instruction=` ; +7. backfiller les signatures utiles dans Demo Pipeline 2 ; +8. rejouer localement `forceDexDecode=yes` ; +9. comparer listed/decoded/observed/materialized/trade_count via SQL coverage ; +10. compléter le decoder spécialisé `raydium_clmm` seulement pour les events confirmables ; +11. remplacer/nettoyer le fallback `upstream_git.instruction_match` quand un decoder local spécialisé couvre l'entrée ; +12. garder les events connus mais non observés en `upstream_git_mapped_unverified` ; +13. garder les events observés mais non matérialisés en audit-only/decoded ; +14. ne matérialiser que les non-trades prouvés par corpus et compatibles avec les tables existantes ; +15. ne pas modifier les règles trade/candle sauf bug de faux positif prouvé. + +## Familles à couvrir explicitement + +Ne pas se limiter aux swaps. + +Inclure dans l'audit coverage CLMM : + +```text +swap +pool_create +add_liquidity +remove_liquidity +position_open +position_close +fee +reward +admin/config +mint +burn +transfer +account_create +account_close +wrap_sol +unwrap_sol +order_place +order_cancel +order_fill +consume_events +settle_funds +vault_deposit +vault_withdraw +lock +unlock +launch +migration +stake +unstake +unknown/unmapped audit +``` + +Pour `raydium_clmm`, certaines familles sont probablement non applicables ou seulement observées comme side effects SPL Token/Token-2022. Elles doivent être explicitement justifiées dans la coverage matrix. + +## Points d'attention hérités de CPMM + +- `decoder_code` local doit rester en `snake_case` : `raydium_clmm`, pas `raydium-clmm`. +- Les slugs/chemins upstream peuvent garder les tirets : `raydium-clmm-decoder`. +- Les events side effects SPL Token (`burn`, `transfer`, `transferChecked`, `closeAccount`) ne doivent pas devenir `raydium_clmm.*` sans preuve qu'ils sont des instructions directes du programme CLMM. +- `k_sol_instruction_observations` est technique et peut être enrichie ; ne pas la confondre avec une table métier. +- `initialize_*` / création de pool doit rester lifecycle-only si c'est bien une création, pas admin. +- Les positions CLMM sont potentiellement des tables/catégories existantes ou à auditer : ne pas forcer liquidity simple si l'event représente une position NFT/tick. +- Les rewards/fees CLMM peuvent nécessiter un mapping plus fin que CPMM. + +## Requêtes SQL utiles + +Coverage CLMM : + +```sql +SELECT + entry_name, + entry_kind, + event_family, + expected_db_target, + proof_status, + observed_count, + materialized_count, + trade_count +FROM k_sol_dex_event_coverage_entries +WHERE decoder_code = 'raydium_clmm' +ORDER BY entry_kind, entry_name, discriminator_hex; +``` + +Instruction observations CLMM : + +```sql +SELECT + instruction_name, + discriminator_hex, + COUNT(*) AS observed_count, + COUNT(DISTINCT signature) AS tx_count +FROM k_sol_instruction_observations +WHERE decoder_code = 'raydium_clmm' +GROUP BY instruction_name, discriminator_hex +ORDER BY observed_count DESC; +``` + +Non-trade safety : + +```sql +SELECT + de.event_kind, + COUNT(*) AS decoded_count, + COUNT(le.id) AS liquidity_count, + COUNT(fe.id) AS fee_count, + COUNT(pa.id) AS admin_count, + COUNT(ple.id) AS lifecycle_count, + COUNT(te.id) AS trade_count +FROM k_sol_dex_decoded_events de +LEFT JOIN k_sol_liquidity_events le + ON le.decoded_event_id = de.id +LEFT JOIN k_sol_fee_events fe + ON fe.decoded_event_id = de.id +LEFT JOIN k_sol_pool_admin_events pa + ON pa.decoded_event_id = de.id +LEFT JOIN k_sol_pool_lifecycle_events ple + ON ple.decoded_event_id = de.id +LEFT JOIN k_sol_trade_events te + ON te.decoded_event_id = de.id +WHERE de.protocol_name = 'raydium_clmm' +GROUP BY de.event_kind +ORDER BY de.event_kind; +``` + +Fallback upstream CLMM : + +```sql +SELECT + json_extract(payload_json, '$.upstreamDecoderCode') AS upstream_decoder_code, + json_extract(payload_json, '$.entryName') AS entry_name, + json_extract(payload_json, '$.discriminatorHex') AS discriminator_hex, + COUNT(*) AS fallback_count +FROM k_sol_dex_decoded_events +WHERE protocol_name = 'upstream_git' + AND event_kind = 'upstream_git.instruction_match' + AND json_extract(payload_json, '$.upstreamDecoderCode') = 'raydium_clmm' +GROUP BY upstream_decoder_code, entry_name, discriminator_hex +ORDER BY fallback_count DESC, entry_name; +``` + +Failed transaction safety : + +```sql +SELECT + de.event_kind, + COUNT(*) AS decoded_count, + COUNT(te.id) AS trade_count +FROM k_sol_dex_decoded_events de +JOIN k_sol_chain_transactions tx + ON tx.id = de.transaction_id +LEFT JOIN k_sol_trade_events te + ON te.decoded_event_id = de.id +WHERE de.protocol_name = 'raydium_clmm' + AND tx.err_json IS NOT NULL + AND tx.err_json <> '' +GROUP BY de.event_kind +ORDER BY trade_count DESC, decoded_count DESC; +``` + +## Contraintes de code + +Conserver les règles du workspace : + +```text +Rust 2024 +pas de mod.rs +fichiers Rust avec // file: ... +pas de anyhow +pas de thiserror +pas de ? / unwrap / expect dans kb_lib applicatif +match / if let Err / let Err = ... else +rustdoc sur API publique +re-exports db.rs puis lib.rs si DB modifiée +``` + +## Livrables attendus pour `0.7.49` + +1. delta archive avec uniquement les fichiers ajoutés/modifiés ; +2. mise à jour `README.md`, `ROADMAP.md`, `CHANGELOG.md` si la tranche avance ; +3. rapport de couverture `raydium_clmm` ; +4. SQL de validation ; +5. tests verts : + +```bash +cargo fmt +cargo test -p kb_lib +cargo clippy -p kb_lib --all-targets -- -D warnings +``` diff --git a/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_53_PUMP_SWAP.md b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_53_PUMP_SWAP.md new file mode 100644 index 0000000..40fa589 --- /dev/null +++ b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_53_PUMP_SWAP.md @@ -0,0 +1,150 @@ + + +# Prompt de reprise — `0.7.53 pump_swap` + +Nous reprenons le workspace Rust/Tauri `khadhroony-bobobot` après le commit final `0.7.52 raydium_stable_swap`. + +## Objectif de tranche + +Version cible : `0.7.53` + +Surface cible unique : `pump_swap` + +Program id cible unique : + +```text +pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA +``` + +Règle de phasage validée : **une version = un `program_id`**. + +`raydium_pool_v4.json` est explicitement repoussé vers la fin du phasage. Il ne doit pas bloquer `0.7.53`. + +## Contexte validé avant reprise + +Raydium est clos sur les surfaces suivantes : + +- `raydium_cpmm` — `CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C` ; +- `raydium_clmm` — `CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK` ; +- `raydium_launchpad` — `LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj` ; +- `raydium_amm_v4` — `675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8` ; +- `raydium_stable_swap` — `5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h`. + +`0.7.52 raydium_stable_swap` est clos avec : + +- `cargo test -p kb_lib` : `407 passed`, `0 failed` ; +- `cargo clippy -p kb_lib --all-targets -- -D warnings` : OK ; +- swaps matérialisés uniquement depuis `amountSource=stable_swap_vault_balance_delta` ; +- failed transactions conservées decoded-only ; +- aucun successful swap non expliqué. + +## Sources à utiliser pour `pump_swap` + +Sources obligatoires à vérifier avant de patcher : + +- `kb_lib/src/constants.rs` et `SOLSCAN_ACCOUNT_SOURCES` ; +- sources upstream Git déjà intégrées dans le registre : Carbon, fnzero, Pinax, HODL Warden si disponibles ; +- IDL Solscan du programme `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA` si disponible ; +- corpus local Demo3 + backfill signature/pool ; +- `k_sol_dex_event_coverage_entries` après replay. + +Les sources Git/IDL/Solscan sont des indices. La preuve métier exige corpus local, replay et SQL. + +## Tâches attendues + +1. Inspecter le support local existant de `pump_swap`. +2. Lister toutes les instructions/events/discriminators disponibles depuis les sources upstream/IDL. +3. Comparer avec les events localement couverts. +4. Compléter le decoder `pump_swap` pour couvrir au minimum : + - `buy` ; + - `sell` ; + - fees / creator fees / protocol fees si présents ; + - admin/config si présents ; + - events auxiliaires tels que cashback, volume accumulator ou équivalents si présents dans les sources. +5. Matérialiser en `k_sol_trade_events` et `k_sol_pair_candles` uniquement si les montants exacts et le sens économique sont prouvés. +6. Conserver les failed transactions comme decoded-only avec `failed_transaction`. +7. Matérialiser les non-trade uniquement vers les tables adaptées : liquidity, fee, admin, lifecycle, reward, orderbook ou decoded-only selon le cas. +8. Nettoyer les fallbacks `upstream_git.instruction_match` uniquement quand un decoder local spécialisé couvre vraiment l’entrée. +9. Mettre à jour la coverage DB et la matrice documentaire. +10. Ajouter ou mettre à jour le SQL de validation dédié : `validation_sql/SQL_VALIDATION_PUMP_SWAP_0_7_53.sql`. + +## Invariants obligatoires + +- Aucun non-swap ne doit créer de trade/candle. +- Aucune transaction failed ne doit créer de trade/candle. +- Aucun trade/candle ne doit être créé depuis des bornes d’instruction ou des montants incomplets. +- Aucun router/aggregator ne doit créer un doublon si le DEX effectif matérialise déjà le trade. +- Aucun `program_id` ne doit être inventé. +- Aucun compte non-programme de `SOLSCAN_ACCOUNT_SOURCES` ne doit être promu en decoder autonome. +- `kb_demo_app` ne doit pas contenir de logique métier DEX profonde. + +## Contraintes de code + +Respecter les contraintes du projet : + +- Rust 2024 ; +- aucun fichier `mod.rs` ; +- pas de `pub mod` ; utiliser `mod` + `pub use` ; +- pas de `anyhow`, pas de `thiserror` ; +- pas de `?`, `unwrap`, `expect` dans le code applicatif `kb_lib` ; +- gestion d’erreurs explicite via `match`, `if let Err`, `let Err = ... else` ; +- rustdoc publique ; +- `#![deny(unreachable_pub)]` et `#![warn(missing_docs)]` ; +- tracing obligatoire ; +- tests offline ; +- si une requête DB est ajoutée ou modifiée, mettre à jour les re-exports dans `kb_lib/src/db.rs`, puis dans `kb_lib/src/lib.rs`. + +## Validation attendue + +Commandes locales à exécuter après patch : + +```bash +cargo fmt +cargo test -p kb_lib +cargo clippy -p kb_lib --all-targets -- -D warnings +``` + +Replay attendu sur une base dédiée `0.7.53 pump_swap` : + +```text +skipDexDecode=no +forceDexDecode=yes +deferInstructionObservations=yes +``` + +SQL de clôture attendu : + +- coverage par entrée `pump_swap` ; +- instruction observations ; +- absence d’audit résiduel local non expliqué ; +- absence de fallback upstream pour les entrées couvertes localement ; +- failed tx -> zéro trade ; +- non-swap -> zéro trade ; +- decoded without coverage -> vide ; +- successful non-materialized inexpliqués -> vide ; +- multi-target materialization -> vide ; +- résumé matérialisation par event_kind. + +## Livrables documentaires + +Mettre à jour au minimum : + +- `ROADMAP.md` ; +- `CHANGELOG.md` ; +- `docs/DEX_DECODER_MATRIX.md` ; +- `docs/DEX_EVENT_COVERAGE_MATRIX.md` ; +- `docs/reports/PUMP_SWAP_EVENT_COVERAGE_REPORT.md` ; +- `validation_sql/SQL_VALIDATION_PUMP_SWAP_0_7_53.sql`. + +## Décision attendue en fin de tranche + +`0.7.53 pump_swap` est clôturable uniquement si : + +```text +- tous les events/instructions disponibles ont un statut explicite ; +- les swaps réussis exploitables produisent trades/candles ; +- les failed transactions restent decoded-only ; +- les non-trade sont matérialisés dans les bonnes tables ou restent decoded-only expliqués ; +- la coverage DB ne contient pas de gap local inexpliqué ; +- cargo test et clippy sont OK. +``` diff --git a/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_54_PUMP_FUN.md b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_54_PUMP_FUN.md new file mode 100644 index 0000000..eba49f6 --- /dev/null +++ b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_54_PUMP_FUN.md @@ -0,0 +1,272 @@ + + +# Prompt de reprise — khadhroony-bobobot 0.7.54 — pump_fun + +Tu reprends le workspace Rust/Tauri `khadhroony-bobobot` après clôture documentaire et fonctionnelle de `0.7.53 pump_swap`. + +## 1. Fichiers à utiliser comme base + +Je fournis l’archive la plus récente du workspace, intégrant normalement les deltas de clôture `0.7.53`. + +À considérer comme sources locales de savoir : + +- le code Rust du workspace ; +- les fichiers Markdown (`README.md`, `ROADMAP.md`, `CHANGELOG.md`, `docs/**`) ; +- les SQL de validation dans `validation_sql/**` ; +- le répertoire `idls/**`, ajouté au projet, contenant des IDL JSON téléchargés depuis Solscan ; +- les liens Git/upstream déjà documentés dans les docs ; +- les résultats SQL/logs que je colle dans la conversation. + +Ne pas supposer que les docs sont parfaites : les vérifier contre le code et contre les IDL locales. + +## 2. État validé avant cette version + +La version `0.7.53` a fermé `pump_swap` côté transaction/log decoder : + +- `cargo test -p kb_lib` : `421 passed`; +- `cargo clippy -p kb_lib --all-targets -- -D warnings` : OK ; +- `pump_swap.buy`, `pump_swap.sell`, `pump_swap.buy_exact_quote_in` matérialisent correctement les trades ; +- `buy_exact_quote_in` utilise `pump_swap_anchor_buy_event` quand l’Anchor `BuyEvent` exact est disponible ; +- les `*_event` Anchor PumpSwap sont décodés en audit-only sauf exception métier explicite ; +- `claim_token_incentives_event` est prêt à matérialiser `k_sol_reward_events` si un event réussi apparaît ; +- `pump_swap` ne présente plus de decoded event sans coverage, ni fallback upstream résiduel, ni trade candidate réussi non matérialisé ; +- les surfaces Raydium déjà travaillées (`raydium_amm_v4`, `raydium_clmm`, `raydium_cpmm`) ne doivent pas être rouvertes sauf bug prouvé ; +- les petits gaps Meteora sont volontairement différés. + +Ne pas modifier PumpSwap ou Raydium sauf preuve SQL/code claire d’une régression. + +## 3. Objectif de la version 0.7.54 + +Objectif principal : ouvrir et avancer une tranche `pump_fun`. + +Cette tranche doit traiter la surface launch/mint Pump.fun, qui est logiquement prioritaire avant `pump_fees`. + +Le backlog global montre des entrées `pump_fun` encore en fallback upstream, notamment : + +- `pump_fun.collect_creator_fee` / discriminator `1416567bc61cdb84` ; +- `pump_fun.migrate_bonding_curve_creator` / `577c34bf3426d6e8` ; +- `pump_fun.distribute_creator_fees` / `a572670079cef751` ; +- `pump_fun.admin_set_creator` / `4519ab8e39ef0d04` ; +- `pump_fun.extend_account` / `ea66c2cb96483ee5` ; +- `pump_fun.set_creator` / `fe94ff70cf8eaaa5` ; +- `pump_fun.migrate` / `9beae792ec9ea21e` ; +- `pump_fun.claim_cashback` / `253a237ebe35e4c5` ; +- `pump_fun.sell` / `33e685a4017f83ad` ; +- autres discriminators `pump_fun` observés dans `k_sol_instruction_observations`. + +L’objectif n’est pas seulement de faire disparaître un fallback : il faut couvrir proprement la surface `pump_fun` : + +- registry/coverage ; +- decoder local ou statut local explicitement decoded-only/audit-only ; +- matérialisation métier si les données sont fiables ; +- tests unitaires ; +- SQL de validation ; +- documentation. + +## 4. Périmètre + +### Inclus + +- `pump_fun` launch/mint/bonding-curve surface ; +- instructions/events liés à création/migration/configuration/creator fees/cashback si présents dans IDL ou corpus ; +- intégration coverage ; +- matérialisation vers tables métier seulement si fiable. + +### Hors périmètre sauf nécessité démontrée + +- `pump_swap`, déjà fermé en `0.7.53` ; +- `raydium_*`, sauf régression prouvée ; +- `meteora_*`, volontairement différé ; +- `jupiter_swap`, `dflow_aggregator_v4`, `onchain_labs_dex_v2`, `orca_whirlpools`, backlog futur ; +- `pump_fees`, qui doit venir après `pump_fun`, probablement en `0.7.55`. + +## 5. Méthode obligatoire + +### 5.1 Nouvelle base SQLite + +Créer une nouvelle DB dédiée à `0.7.54`, ne pas travailler sur l’ancienne DB de validation PumpSwap. + +Démarrage attendu : + +- catalog initial propre ou connu ; +- backfills ciblés ; +- replay forcé ; +- validation SQL. + +### 5.2 Backfill de corpus + +Construire un corpus local à partir de : + +1. filtres Solscan.io quand disponibles ; +2. Demo3 discovery quand nécessaire ; +3. batch backfill de groupes de signatures ; +4. program/signature backfill si pertinent ; +5. signatures issues des requêtes SQL `sample_signature`. + +Utiliser d’abord les signatures fortes observées dans le backlog : + +- `pump_fun.collect_creator_fee`; +- `pump_fun.migrate_bonding_curve_creator`; +- `pump_fun.distribute_creator_fees`; +- `pump_fun.admin_set_creator`; +- `pump_fun.extend_account`; +- `pump_fun.set_creator`; +- `pump_fun.migrate`; +- `pump_fun.claim_cashback`; +- puis autres discriminators observés. + +Après chaque groupe de backfill : + +- replay local avec `skipDexDecode=no`; +- utiliser `forceDexDecode=yes` quand le decoder/coverage change ; +- `deferInstructionObservations=yes` ; +- rafraîchir catalog ; +- relancer les SQL de surveillance. + +### 5.3 Sources + +Utiliser en priorité : + +- `idls/**` local ; +- code existant ; +- docs existantes ; +- `upstream_registry_generated.rs` ; +- sources Git déjà référencées dans les docs ; +- Solscan signatures/logs ; +- payloads locaux DB. + +Si une IDL locale contredit une source Git, signaler la divergence et ne pas inventer. + +## 6. Contraintes de code Rust + +Respecter strictement les conventions du projet : + +- Rust 2024 ; +- pas de `?` ; +- pas de `unwrap()` / `expect()` en code applicatif ; +- pas de `anyhow` / `thiserror` ; +- `match` / `if let Err` explicites ; +- async-first ; +- `tracing` obligatoire ; +- pas de `mod.rs` ; +- pas de `pub mod` ; utiliser `mod` + `pub use` ; +- imports limités, types appelés de façon qualifiée quand c’est la convention locale ; +- tests offline ; +- ne pas casser `#![deny(unreachable_pub)]` et `#![warn(missing_docs)]`. + +Si des requêtes DB sont ajoutées ou déplacées, penser aux re-exports : + +- `kb_lib/src/db.rs` ; +- `kb_lib/src/lib.rs`. + +## 7. Matérialisation attendue + +Pour `pump_fun`, ne pas forcer une matérialisation si les montants/acteurs/comptes ne sont pas prouvés. + +Classer explicitement chaque entrée : + +- `k_sol_launch_events` pour les événements de launch/mint/migration ; +- `k_sol_fee_events` si l’instruction représente réellement des frais exploitables ; +- `k_sol_pool_admin_events` si c’est de la configuration/admin/creator ; +- `k_sol_reward_events` uniquement si c’est réellement une récompense/incitation/cashback fiable ; +- `k_sol_dex_decoded_events_only` si audit-only ou données insuffisantes ; +- `k_sol_trade_events` seulement si c’est un swap/trade fiable ; +- `skip*Reason` explicite quand non matérialisable. + +Ne jamais matérialiser une transaction failed comme business event. + +## 8. SQL de validation à utiliser + +Utiliser et adapter : + +- `validation_sql/SQL_VALIDATION_DEX_COVERAGE_GLOBAL_0_7_53.sql`; +- les SQL de validation PumpSwap comme modèle ; +- une nouvelle validation dédiée à `pump_fun`, par exemple : + - `validation_sql/SQL_VALIDATION_PUMP_FUN_0_7_54.sql`. + +Requêtes minimales attendues : + +1. coverage `pump_fun` ; +2. instruction observations `pump_fun` ; +3. decoded events `pump_fun` sans coverage ; +4. fallback upstream `pump_fun` résiduel ; +5. successful non-materialized events sans skip reason ; +6. failed tx materialization safety ; +7. multi-target materialization safety ; +8. materialization summary ; +9. comparaison entre `k_sol_instruction_observations` et `k_sol_dex_event_coverage_entries` ; +10. global watchlist après replay. + +## 9. Invariants de validation + +Après correction, viser : + +- pas de `pump_fun` decoded event local sans coverage ; +- pas de fallback `upstream_git` résiduel pour les entrées `pump_fun` couvertes localement ; +- pas de materialized business event sur failed transaction ; +- pas de multi-target incohérent ; +- tous les events/instructions observés ont : + - un decoder local, + - ou un statut audit-only, + - ou un skip reason explicite, + - ou une justification documentée s’ils restent upstream-only. + +## 10. Documentation à mettre à jour + +À la fin de la tranche, mettre à jour : + +- `CHANGELOG.md` : une ligne ; +- `README.md` : état courant, nouvelle version, validation ; +- `ROADMAP.md` : phasage et clôture/état de `pump_fun`, puis annonce de `pump_fees` en version suivante ; +- `docs/DEX_DECODER_MATRIX.md` ; +- `docs/DEX_EVENT_COVERAGE_MATRIX.md` ; +- éventuellement un rapport : + - `docs/reports/PUMP_FUN_EVENT_COVERAGE_REPORT.md`. + +Ne pas gonfler les docs inutilement : noter les faits validés, les limites, et les prochaines tranches. + +## 11. Format de livraison attendu + +Ne pas fournir une archive complète du workspace sauf demande explicite. + +Fournir un delta zip contenant uniquement les fichiers modifiés/ajoutés. + +Nom recommandé : + +`khadhroony-bobobot-v0.7.54-pump_fun-delta-N-files.zip` + +Chaque réponse de livraison doit inclure : + +- résumé des changements ; +- liste exacte des fichiers modifiés ; +- commandes à lancer : + - `cargo fmt` + - `cargo test -p kb_lib` + - `cargo clippy -p kb_lib --all-targets -- -D warnings` +- replay recommandé ; +- SQL à exécuter ; +- ce qui est attendu dans les résultats. + +## 12. Priorités si plusieurs gaps apparaissent + +Ordre de priorité : + +1. `pump_fun` ; +2. `pump_fees` seulement si strictement nécessaire pour comprendre un flux `pump_fun` ; +3. ne pas traiter Meteora dans cette version ; +4. ne pas rouvrir Raydium sauf régression démontrée ; +5. ne pas ouvrir Jupiter/dFlow/onchain_labs dans cette tranche sauf pour les classer en backlog. + +## 13. Première tâche demandée + +Commencer par analyser l’archive fournie : + +1. identifier les fichiers existants liés à `pump_fun`, `pump_fees`, upstream registry, coverage, materialization ; +2. chercher dans `idls/**` s’il existe une IDL Solscan liée à `pump_fun` ; +3. produire un état des lieux court : + - entrées upstream disponibles ; + - entrées observées dans SQL/logs fournis ; + - fichiers à modifier ; + - hypothèse de classification par entry ; + - SQL initial de backfill/validation ; +4. proposer puis produire le premier delta archive minimal. diff --git a/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_55_PUMP_FEES.md b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_55_PUMP_FEES.md new file mode 100644 index 0000000..6632a37 --- /dev/null +++ b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_55_PUMP_FEES.md @@ -0,0 +1,347 @@ + + +# Prompt de reprise — khadhroony-bobobot 0.7.55 — pump_fees + +Tu reprends le workspace Rust/Tauri `khadhroony-bobobot` après clôture technique de `0.7.54 pump_fun`. + +## 1. Archive et fichiers à fournir + +Utiliser l'archive la plus récente après clôture `0.7.54 pump_fun`. + +À considérer comme sources locales de savoir : + +- code Rust du workspace ; +- `README.md`, `ROADMAP.md`, `CHANGELOG.md` ; +- `docs/DEX_DECODER_MATRIX.md` ; +- `docs/DEX_EVENT_COVERAGE_MATRIX.md` ; +- `docs/reports/PUMP_FUN_EVENT_COVERAGE_REPORT.md` ; +- `validation_sql/SQL_VALIDATION_PUMP_FUN_0_7_54.sql` ; +- `validation_sql/SQL_VALIDATION_PUMP_FUN_MATERIALIZATION_0_7_54.sql` ; +- `idls/**`, en particulier `idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json` ; +- les logs/requêtes SQL collés pendant la session. + +Ne pas supposer que la documentation est parfaite : vérifier contre le code, l'IDL locale et le corpus SQLite. + +## 2. État validé avant cette version + +`0.7.54 pump_fun` est clos. + +Replay final rapporté : + +```text +1679 replayed +0 decode skipped +1679 ledger upserts +145 unsafe ledger rows +89 trades +0 liquidity +10 lifecycle +0 tokenAccount +348 candle upserts +instructionObservations = 13905 +resetDeleted = 1112 +catalog = 52 tokens / 50 pools / 50 pairs +``` + +Checks de fermeture Pump.fun : + +- upstream fallback Pump.fun : vide ; +- decoded Pump.fun sans coverage : vide ; +- successful non-materialized sans skip reason : vide ; +- failed transaction materialization safety : vide ; +- multi-target materialization safety : vide ; +- trade candidates Pump.fun sans matérialisation ni skip : vide ; +- watchlist globale : plus aucun `pump_fun`. + +Décisions Pump.fun à préserver : + +- `buy`, `sell`, `buy_exact_sol_in` sont matérialisés directement quand les montants sont fiables ; +- `buy_v2`, `sell_v2`, `buy_exact_quote_in_v2` ne sont pas matérialisés directement ; +- `trade_event` est la source canonique des montants exécutés v2/exact ; +- aucun double-count entre instruction trade et event Anchor ; +- transactions failed audit-only. + +Ne pas rouvrir `pump_fun`, `pump_swap` ou Raydium sauf bug prouvé par SQL/code. + +## 3. Objectif de `0.7.55 pump_fees` + +Ouvrir et clôturer la surface `pump_fees`. + +Program id cible : + +```text +pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ +``` + +IDL locale : + +```text +idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json +``` + +exemple de code: +https://github.com/sevenlabs-hq/carbon/tree/main/decoders/pump-fees-decoder + +L'IDL locale contient au minimum : + +- `29` instructions ; +- `20` events ; +- `9` accounts ; +- `34` types. + +Règle forte : + +> Tout ce qui peut être décodé doit être décodé. Tout ce qui peut être matérialisé de façon fiable doit être matérialisé. Ce qui ne peut pas être matérialisé doit rester decoded-only/audit-only avec `skip*Reason` explicite. + +Le programme `pump_fees` est a priori un programme de fee/config/accounting. Aucun trade/candle direct n'est attendu sauf preuve transactionnelle très forte d'un swap économique autonome. + +## 4. Backlog initial observé + +La watchlist globale après `0.7.54 pump_fun` montre notamment : + +```text +pump_fees get_fees e7257e55cf5b3f34 173 decoded / 171 tx +pump_fees create_fee_sharing_config c34e564c6f34fbd5 21 decoded / 21 tx +pump_fees update_fee_shares bd0d8863bba4ed23 14 decoded / 14 tx +``` + +Ces trois entrées doivent être les premières sources de corpus/backfill. + +## 5. Périmètre fonctionnel + +### Inclus + +- décodage de toutes les instructions `pump_fees` connues par l'IDL locale ; +- décodage de tous les events Anchor `pump_fees` connus par l'IDL locale ; +- décodage Borsh des arguments et payloads quand les layouts sont définis ; +- classification coverage par famille : fee, reward, admin/config, buyback, social fee, donation fee, fee sharing, account lifecycle ; +- matérialisation vers les tables métier existantes quand les données sont fiables : + - `k_sol_fee_events` ; + - `k_sol_reward_events` si cashback/social/donation/claim représente une récompense exploitable ; + - `k_sol_pool_admin_events` pour config/admin/authority/tier/update ; + - `k_sol_pool_lifecycle_events` si création/initialisation de compte/config est pertinente ; + - `k_sol_dex_decoded_events_only` pour les vues/calculs/audit-only ; +- SQL de validation dédié ; +- documentation finale et rapport. + +### Hors périmètre sauf preuve stricte + +- nouveau trade/candle direct ; +- réouverture Pump.fun/PumpSwap ; +- Raydium/Meteora/Jupiter/dFlow ; +- refactor réseau ou UI non nécessaire. + +## 6. Méthode obligatoire : nouvelle base SQLite + +Créer une nouvelle DB dédiée à `0.7.55 pump_fees`. + +Ne pas réutiliser l'ancienne DB de validation Pump.fun sauf pour lire des signatures de départ. + +Après chaque backfill ou patch decoder : + +```text +skipDexDecode=no +forceDexDecode=yes +deferInstructionObservations=yes +``` + +Puis : + +- refresh catalog ; +- replay local ; +- relancer SQL de validation ; +- noter les compteurs replay. + +## 7. Corpus et backfills + +Construire le corpus local à partir de : + +1. signatures `sample_signature` de la watchlist globale ; +2. filtres Solscan.io par program id + instruction/discriminator quand disponibles ; +3. Demo3 discovery multi-source/multi-target ; +4. batch backfill par groupes de signatures ; +5. program/signature backfill ciblé si nécessaire ; +6. signatures issues des requêtes SQL `instruction_observations`, fallback upstream et decoded-only résiduels. + +Démarrer par : + +- `get_fees` / `e7257e55cf5b3f34` ; +- `create_fee_sharing_config` / `c34e564c6f34fbd5` ; +- `update_fee_shares` / `bd0d8863bba4ed23`. + +Ensuite couvrir les autres instructions/events de l'IDL locale, même non observés, par tests synthétiques lorsque le layout est connu. + +## 8. Instructions IDL locales à inventorier + +Inventorier et classifier au minimum : + +- `claim_social_fee_pda` ; +- `claim_social_fee_pda_v2` ; +- `crank_donation_fee_pda` ; +- `create_donation_fee_pda` ; +- `create_fee_sharing_config` ; +- `create_social_fee_pda` ; +- `extend_fee_config` ; +- `get_fees` ; +- `initialize_buyback` ; +- `initialize_fee_config` ; +- `initialize_fee_program_global` ; +- `reset_fee_sharing_config` ; +- `reset_fee_sharing_config_v2` ; +- `revoke_fee_sharing_authority` ; +- `set_authority` ; +- `set_claim_rate_limit` ; +- `set_disable_flags` ; +- `set_social_claim_authority` ; +- `sweep_buyback` ; +- `transfer_fee_sharing_authority` ; +- `update_admin` ; +- `update_buyback_authority` ; +- `update_buyback_claim_rate_limit` ; +- `update_fee_config` ; +- `update_fee_shares` ; +- `update_fee_shares_v2` ; +- `update_stable_fee_config` ; +- `upsert_fee_tiers` ; +- `upsert_stable_fee_tiers`. + +Events Anchor à inventorier : + +- `CreateFeeSharingConfigEvent` ; +- `DonationFeePdaCranked` ; +- `DonationFeePdaCreated` ; +- `ExtendFeeConfigEvent` ; +- `InitializeFeeConfigEvent` ; +- `InitializeFeeProgramGlobalEvent` ; +- `ResetFeeSharingConfigEvent` ; +- `SetAuthorityEvent` ; +- `SetClaimRateLimitEvent` ; +- `SetDisableFlagsEvent` ; +- `SetSocialClaimAuthorityEvent` ; +- `SocialFeePdaClaimed` ; +- `SocialFeePdaCreated` ; +- `SweepBuybackEvent` ; +- `UpdateAdminEvent` ; +- `UpdateFeeConfigEvent` ; +- `UpdateFeeSharesEvent` ; +- `UpdateStableFeeConfigEvent` ; +- `UpsertFeeTiersEvent` ; +- `UpsertStableFeeTiersEvent`. + +## 9. Contraintes de code Rust + +Respecter strictement les conventions du projet : + +- Rust 2024 ; +- pas de `?` ; +- pas de `unwrap()` / `expect()` en code applicatif ; +- pas de `anyhow` / `thiserror` ; +- `match` / `if let Err` explicites ; +- async-first ; +- `tracing` obligatoire ; +- pas de `mod.rs` ; +- pas de `pub mod` ; utiliser `mod` + `pub use` ; +- imports limités, types appelés de façon qualifiée quand c'est la convention locale ; +- tests offline ; +- ne pas casser `#![deny(unreachable_pub)]` et `#![warn(missing_docs)]`. + +Si des requêtes DB sont ajoutées ou déplacées, penser aux re-exports : + +- `kb_lib/src/db.rs` ; +- `kb_lib/src/lib.rs`. + +## 10. Matérialisation attendue + +Ne pas se contenter de decoded-only si une matérialisation fiable est possible. + +Classification cible : + +- `get_fees` : probablement decoded-only ou fee calculation audit ; ne pas matérialiser comme fee payé sans transfert/montant réalisé ; +- fee sharing config : `k_sol_pool_admin_events` ou lifecycle/config si comptes exploitables ; +- social/donation fee PDA create/claim/crank : `k_sol_fee_events`, `k_sol_reward_events` ou admin/lifecycle selon le sens exact des flux ; +- buyback init/sweep/update : fee/admin/buyback selon comptes et montants ; +- authority/config/tier updates : `k_sol_pool_admin_events` ; +- Anchor events : matérialiser s'ils portent le montant/acteur/compte fiable ; sinon audit-only avec skip reason ; +- transactions failed : decoded-only/audit-only, jamais business matérialisé. + +Aucun `pump_fees` ne doit créer de `k_sol_trade_events` ni de candle sauf preuve irréfutable d'un trade économique autonome et non doublonné. + +## 11. SQL de validation attendu + +Créer : + +```text +validation_sql/SQL_VALIDATION_PUMP_FEES_0_7_55.sql +``` + +Requêtes minimales : + +1. upstream fallback samples `pump_fees` ; +2. local instruction observations `pump_fees` ; +3. coverage `pump_fees` ; +4. decoded events `pump_fees` sans coverage ; +5. residual upstream fallback pour entrées couvertes ; +6. successful non-materialized sans skip reason ; +7. failed transaction materialization safety ; +8. multi-target materialization safety ; +9. materialization summary par table ; +10. instruction observation versus coverage ; +11. contrôle anti-trade/candle direct `pump_fees` ; +12. global watchlist après replay. + +## 12. Invariants de fermeture + +La tranche `0.7.55` ne doit être considérée close que si : + +- aucun fallback `upstream_git` `pump_fees` ne reste pour les entrées couvertes localement ; +- aucun decoded event `pump_fees` local sans coverage ; +- aucune transaction failed n'alimente une table métier ; +- aucun event multi-target incohérent ; +- aucune ligne successful non-materialized sans `skip*Reason` ; +- aucun trade/candle `pump_fees` artificiel ; +- toutes les instructions/events de l'IDL locale sont soit décodés/matérialisés, soit audit-only, soit non observés mais couverts par tests synthétiques ; +- la watchlist globale ne contient plus de `pump_fees` comme backlog dominant. + +## 13. Documentation à mettre à jour en fin de tranche + +Mettre à jour : + +- `CHANGELOG.md` ; +- `README.md` ; +- `ROADMAP.md` ; +- `docs/DEX_DECODER_MATRIX.md` ; +- `docs/DEX_EVENT_COVERAGE_MATRIX.md` ; +- créer `docs/reports/PUMP_FEES_EVENT_COVERAGE_REPORT.md` ; +- créer ou mettre à jour le SQL de validation dédié. + +## 14. Format de livraison attendu + +Fournir un delta zip contenant uniquement les fichiers modifiés/ajoutés. + +Nom recommandé : + +```text +khadhroony-bobobot-v0.7.55-pump_fees-delta-N-files.zip +``` + +Chaque livraison doit inclure : + +- résumé des changements ; +- liste exacte des fichiers modifiés ; +- commandes à lancer : + - `cargo fmt` ; + - `cargo test -p kb_lib` ; + - `cargo clippy -p kb_lib --all-targets -- -D warnings` ; +- replay recommandé ; +- SQL à exécuter ; +- résultats attendus. + +## 15. Première tâche demandée + +1. Inspecter le code et l'IDL `pump_fees` locale. +2. Comparer `upstream_registry_generated.rs`, `idls/pump_fees...json` et le corpus SQL. +3. Créer une base SQLite neuve `0.7.55`. +4. Backfiller les signatures `get_fees`, `create_fee_sharing_config`, `update_fee_shares`. +5. Ajouter le decoder local maximal `pump_fees` : instructions + events + tests synthétiques. +6. Ajouter coverage/materialization/validation SQL. +7. Rejouer et fermer seulement si tous les invariants sont propres. diff --git a/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_56_METEORA_DBC.md b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_56_METEORA_DBC.md new file mode 100644 index 0000000..b3dde8c --- /dev/null +++ b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_56_METEORA_DBC.md @@ -0,0 +1,218 @@ + + +# Prompt de reprise — khadhroony-bobobot 0.7.56 — meteora_dbc + +Tu reprends le workspace Rust/Tauri `khadhroony-bobobot` après clôture technique de `0.7.55 pump_fees`. + +## 1. Archive et fichiers à fournir + +Utiliser l'archive la plus récente après clôture `0.7.55 pump_fees`. + +À considérer comme sources locales de savoir : + +- code Rust du workspace ; +- `README.md`, `ROADMAP.md`, `CHANGELOG.md` ; +- `docs/DEX_DECODER_MATRIX.md` ; +- `docs/DEX_EVENT_COVERAGE_MATRIX.md` ; +- `docs/reports/PUMP_FEES_EVENT_COVERAGE_REPORT.md` ; +- `validation_sql/SQL_VALIDATION_PUMP_FEES_0_7_55.sql` ; +- `idls/**`, en particulier `idls/meteora_dbc.dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN.json` ; +- les logs/requêtes SQL collés pendant la session. + +Ne pas supposer que la documentation est parfaite : vérifier contre le code, l'IDL locale, les sources Git et le corpus SQLite. + +## 2. État validé avant cette version + +`0.7.55 pump_fees` est clos. + +Replay final rapporté : + +```text +127 replayed +0 decode skipped +150 ledger upserts +125 unsafe ledger rows +4 trades +0 liquidity +115 lifecycle +0 tokenAccount +16 candle upserts +instructionObservations = 2234 +resetDeleted = 1644 +catalog = 11 tokens / 10 pools / 10 pairs +``` + +Validation build : + +```text +cargo test -p kb_lib -> 431 passed / 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> OK +``` + +Checks de fermeture Pump Fees : + +- fallback `upstream_git` `pump_fees` : vide ; +- `instruction_name` vide : vide ; +- `event_family = unknown` ou vide pour instruction/event : vide ; +- decoded `pump_fees` sans coverage : vide ; +- successful non-materialized sans skip/policy : vide ; +- failed transaction materialization safety : vide ; +- multi-target materialization safety : vide ; +- anti-trade/candle direct `pump_fees` : vide ; +- watchlist globale : plus aucun `pump_fees`, seulement `jupiter_swap.route_v2` ponctuel. + +Décisions Pump Fees à préserver : + +- `get_fees` est decoded-only ; +- claims social fee vers `k_sol_reward_events` seulement si succès et montant fiable ; +- donation/buyback vers `k_sol_fee_events` seulement si succès et montant fiable ; +- config/authority/tier/update vers `k_sol_pool_admin_events` ; +- create/init/extend vers `k_sol_pool_lifecycle_events` ; +- aucun trade/candle direct ; +- failed tx audit-only ; +- les discriminators Solscan `revoke_fee_sharing_authority_event` et `transfer_fee_sharing_authority_event` restent conservés comme futures surfaces non observées. + +Ne pas rouvrir `pump_fees`, `pump_fun`, `pump_swap` ou Raydium sauf bug prouvé par SQL/code. + +## 3. Objectif de `0.7.56 meteora_dbc` + +Ouvrir et clôturer la surface `meteora_dbc`. + +Program id cible : + +```text +dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN +``` + +IDL locale prioritaire : + +```text +idls/meteora_dbc.dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN.json +``` + +Règle forte : + +> Tout ce qui peut être décodé doit être décodé. Tout ce qui peut être matérialisé de façon fiable doit être matérialisé. Ce qui ne peut pas être matérialisé doit rester decoded-only/audit-only avec `skip*Reason` explicite. + +La surface DBC doit couvrir launch/bonding curve, pool/config lifecycle, swaps exploitables, migration, fees/admin/config, et events Anchor associés. + +## 4. Méthode obligatoire : nouvelle base SQLite + +Créer une nouvelle DB dédiée à `0.7.56 meteora_dbc`. + +Ne pas réutiliser l'ancienne DB de validation Pump Fees sauf pour lire des signatures de départ. + +Après chaque backfill ou patch decoder : + +```text +skipDexDecode=no +forceDexDecode=yes +deferInstructionObservations=yes +``` + +Puis : + +- refresh catalog ; +- replay local ; +- relancer SQL de validation ; +- noter les compteurs replay. + +## 5. Corpus et backfills + +Construire le corpus local à partir de : + +1. signatures `sample_signature` de la watchlist globale et des coverage gaps ; +2. filtres Solscan.io par program id + instruction/discriminator quand disponibles ; +3. Demo3 discovery multi-source/multi-target ; +4. batch backfill par groupes de signatures ; +5. program/signature backfill ciblé si nécessaire ; +6. signatures issues des requêtes SQL `instruction_observations`, fallback upstream et decoded-only résiduels. + +Inclure explicitement les transactions failed dans le corpus d'audit, mais ne jamais les matérialiser métier. + +## 6. Sources à comparer + +Comparer au minimum : + +- `idls/meteora_dbc.dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN.json` ; +- Carbon `meteora-dbc-decoder` ; +- Pinax/Substreams Solana IDLs si disponibles ; +- Solana Streamer / sol-parser-sdk si des layouts Meteora DBC y apparaissent ; +- code local existant `kb_lib/src/dex/*meteora*` ; +- `upstream_registry_generated.rs` ; +- corpus SQLite neuf. + +## 7. Matérialisation attendue + +Ne pas se contenter de decoded-only si une matérialisation fiable est possible. + +Cibles probables : + +- swaps exploitables -> `k_sol_trade_events` + candles si montants, sens, mint base/quote et pool/pair sont fiables ; +- pool/config/create -> `k_sol_pool_lifecycle_events` et catalog/pool/pair si comptes fiables ; +- liquidity/deposit/withdraw -> `k_sol_liquidity_events` si montants et pool fiables ; +- migration -> lifecycle/admin selon sémantique exacte ; +- fees/creator fees/admin/config -> `k_sol_fee_events` ou `k_sol_pool_admin_events` ; +- events sans contexte suffisant -> decoded-only/audit-only avec skip reason. + +Transactions failed : decoded-only/audit-only, jamais business matérialisées. + +## 8. SQL de validation attendu + +Créer : + +```text +validation_sql/SQL_VALIDATION_METEORA_DBC_0_7_56.sql +``` + +Requêtes minimales : + +1. upstream fallback samples `meteora_dbc` ; +2. local instruction observations `meteora_dbc` ; +3. coverage `meteora_dbc` ; +4. decoded events `meteora_dbc` sans coverage ; +5. residual upstream fallback pour entrées couvertes ; +6. successful non-materialized sans skip reason ; +7. failed transaction materialization safety ; +8. multi-target materialization safety ; +9. materialization summary par table, avec colonnes successful/failed ; +10. instruction observation versus coverage ; +11. anti-faux trade/candle pour events non swap ; +12. global watchlist après replay. + +## 9. Invariants de fermeture + +La tranche `0.7.56` ne doit être considérée close que si : + +- aucun fallback `upstream_git` `meteora_dbc` ne reste pour les entrées couvertes localement ; +- aucun decoded event `meteora_dbc` local sans coverage ; +- aucune transaction failed n'alimente une table métier ; +- aucun event multi-target incohérent ; +- aucune ligne successful non-materialized sans `skip*Reason` ; +- aucun faux trade/candle sur event non swap ; +- toutes les instructions/events de l'IDL locale sont soit décodés/matérialisés, soit audit-only, soit non observés mais couverts par tests synthétiques ; +- la watchlist globale ne contient plus de `meteora_dbc` comme backlog dominant. + +## 10. Documentation à mettre à jour en fin de tranche + +Mettre à jour : + +- `CHANGELOG.md` ; +- `README.md` ; +- `ROADMAP.md` ; +- `docs/DEX_DECODER_MATRIX.md` ; +- `docs/DEX_EVENT_COVERAGE_MATRIX.md` ; +- créer `docs/reports/METEORA_DBC_EVENT_COVERAGE_REPORT.md` ; +- créer `validation_sql/SQL_VALIDATION_METEORA_DBC_0_7_56.sql`. + +## 11. Format de livraison attendu + +Fournir un delta zip contenant uniquement les fichiers modifiés/ajoutés. + +Nom recommandé : + +```text +khadhroony-bobobot-v0.7.56-meteora_dbc-delta-pre.xxx.zip +``` + +Inclure dans chaque livraison : résumé des changements, liste exacte des fichiers modifiés, commandes `cargo fmt`, `cargo test -p kb_lib`, `cargo clippy -p kb_lib --all-targets -- -D warnings`, replay recommandé, SQL à exécuter et résultats attendus. diff --git a/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_57_METEORA_DLMM_FULL_DECODE_MATERIALIZATION.md b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_57_METEORA_DLMM_FULL_DECODE_MATERIALIZATION.md new file mode 100644 index 0000000..624b2e0 --- /dev/null +++ b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_57_METEORA_DLMM_FULL_DECODE_MATERIALIZATION.md @@ -0,0 +1,457 @@ + + +# Prompt de reprise — khadhroony-bobobot `0.7.57` — `meteora_dlmm` full decode / full materialization + +Tu reprends le workspace Rust/Tauri `khadhroony-bobobot` après clôture de `0.7.56 meteora_dbc`. + +## 1. Archive et fichiers à fournir + +Utiliser l'archive la plus récente après application des docs `0.7.56 final`. + +Fichiers à lire en priorité : + +- `README.md` ; +- `ROADMAP.md` ; +- `CHANGELOG.md` ; +- `docs/DEX_DECODER_MATRIX.md` ; +- `docs/DEX_EVENT_COVERAGE_MATRIX.md` ; +- `docs/reports/METEORA_DBC_EVENT_COVERAGE_REPORT.md` ; +- `docs/reports/FEE_EVENT_AMOUNTS_MODEL_NOTE_0_7_56.md` ; +- `docs/VALIDATION_STATUS_0_7_56_FINAL.md` ; +- `validation_sql/SQL_VALIDATION_METEORA_DBC_0_7_56.sql` ; +- `validation_sql/SQL_VALIDATION_METEORA_DLMM_0_7_57.sql` ; +- `idls/**`, en particulier `idls/meteora_dlmm.LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo.json` ; +- `kb_lib/src/dex/meteora_dlmm.rs` ; +- `kb_lib/src/non_trade_event_materialization.rs` ; +- `kb_lib/src/db/queries/fee_event_amount.rs`. + +Ne pas supposer que l'ancien support `0.7.45 meteora_dlmm` est suffisant : il était partiel. `0.7.57` doit viser la parité IDL/corpus complète. + +## 2. État validé avant cette version + +`0.7.56 meteora_dbc` est clos. + +Build final : + +```text +cargo test -p kb_lib -> 446 passed / 0 failed +cargo clippy -p kb_lib --all-targets -- -D warnings -> OK +``` + +Replay final DBC : + +```text +480 replayed +0 decode skipped +480 ledger upserts +454 unsafe ledger rows +264 trades +1 liquidity +122 lifecycle +1056 candle upserts +instructionObservations = 7167 +catalog = 86 tokens / 60 pools / 60 pairs +``` + +Socle fee final : + +```text +k_sol_fee_events meteora_dbc = 89 parents +k_sol_fee_event_amounts meteora_dbc = 96 legs +parent scalar without leg = empty +orphan fee amount legs = empty +``` + +Règles fee à préserver : + +- parent fee scalaire -> leg `k_sol_fee_event_amounts` automatique ; +- fee multi-leg/multi-mint -> parent sans agrégation artificielle, legs explicites ; +- pas de montant depuis `maxAmount`, `u64::MAX`, bornes ou limites de claim ; +- recovery CPI SPL générique uniquement si policy/allowlist explicite ; +- aucun futur decoder ne doit hériter de `allowlisted_inner_spl_transfer` par défaut. + +## 3. Objectif de `0.7.57 meteora_dlmm` + +Program id cible : + +```text +LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo +``` + +IDL locale prioritaire : + +```text +idls/meteora_dlmm.LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo.json +``` + +Nom IDL : `lb_clmm`. + +Surface IDL : + +```text +76 instructions +30 events Anchor +12 accounts +``` + +Objectif : **full decode + full materialization**. + +Règle forte : + +> Tout ce qui peut être décodé doit être décodé. Tout ce qui peut être matérialisé de façon fiable doit être matérialisé. Ce qui ne peut pas être matérialisé doit rester decoded-only/audit-only avec `skip*Reason` explicite. les instructions/events/anchors/discriminator non observés aprés backfill sur une base de donnée vierge devront avoir des tests syntetiques. + +## 4. Méthode obligatoire + +Créer une nouvelle DB dédiée à `0.7.57 meteora_dlmm`. + +Après chaque backfill ou patch decoder : + +```text +skipDexDecode=no +forceDexDecode=yes +deferInstructionObservations=yes +``` + +Puis : refresh catalog, replay local, SQL validation, note des compteurs. + +Ne pas rouvrir `meteora_dbc`, Pump ou Raydium sauf bug prouvé par SQL. + +## 5. Sources à comparer + +Comparer au minimum : + +- IDL locale `idls/meteora_dlmm.LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo.json` ; +- Carbon Meteora DLMM decoder ; +- Pinax/Substreams Solana IDLs ; +- Solana Streamer / sol-parser-sdk si DLMM y apparaît ; +- code local historique `kb_lib/src/dex/meteora_dlmm.rs` ; +- coverage existante `k_sol_dex_event_coverage_entries` ; +- corpus SQLite neuf ; +- anciens rapports `0.7.45` et matrices pour comprendre ce qui était déjà validé. + +## 6. Checklist d'instructions IDL à inventorier + +| Instruction | Discriminator hex | +|---|---| +| `add_liquidity` | `b59d59438fb63448` | +| `add_liquidity2` | `e4a24e1c46db7473` | +| `add_liquidity_by_strategy` | `0703967f94283dc8` | +| `add_liquidity_by_strategy2` | `03dd95da6f8d76d5` | +| `add_liquidity_by_strategy_one_side` | `2905eeaf64e106cd` | +| `add_liquidity_by_weight` | `1c8cee63e7a21595` | +| `add_liquidity_by_weight2` | `d13b3f5b6fc899e4` | +| `add_liquidity_one_side` | `5e9b6797465fdca5` | +| `add_liquidity_one_side_precise` | `a1c26754ab47fa9a` | +| `add_liquidity_one_side_precise2` | `2133a3c975627de7` | +| `cancel_limit_order` | `849c841f4328e861` | +| `claim_fee` | `a9204f8988e84689` | +| `claim_fee2` | `70bf65ab1c907fbb` | +| `claim_reward` | `955fb5f25e5a9ea2` | +| `claim_reward2` | `be037f77b2579db7` | +| `close_bin_array` | `44ae5850b5cc13e0` | +| `close_claim_fee_operator_account` | `b8d5581fb3658224` | +| `close_limit_order_if_empty` | `397c249b7ef95dab` | +| `close_operator_account` | `ab09d54a7817031d` | +| `close_position` | `7b86510031446262` | +| `close_position2` | `ae5a2373ba2893e2` | +| `close_position_if_empty` | `3b7cd4765b986e9d` | +| `close_preset_parameter` | `04949164861ab53d` | +| `close_preset_parameter2` | `27195f6b7411731c` | +| `close_token_badge` | `6c92566eb3fe0a68` | +| `create_operator_account` | `dd40f695f099e5a3` | +| `decrease_position_length` | `c2db882019606925` | +| `for_idl_type_generation_do_not_call` | `b46945505f32496c` | +| `fund_reward` | `bc32f9a55d97263f` | +| `go_to_a_bin` | `9248aee028fd54ae` | +| `increase_oracle_length` | `be3d7d57674f9ead` | +| `increase_position_length` | `505375d3420d2195` | +| `increase_position_length2` | `ffd2cc477389e171` | +| `initialize_bin_array` | `235613b94ed44bd3` | +| `initialize_bin_array_bitmap_extension` | `2f9de2b40cf02147` | +| `initialize_customizable_permissionless_lb_pair` | `2e2729876fb7c840` | +| `initialize_customizable_permissionless_lb_pair2` | `f349817e3313f16b` | +| `initialize_lb_pair` | `2d9aedd2dd0fa65c` | +| `initialize_lb_pair2` | `493b2478ed536cc6` | +| `initialize_permission_lb_pair` | `6c66d555fb033515` | +| `initialize_position` | `dbc0ea47bebf6650` | +| `initialize_position2` | `8f13f291d50f6873` | +| `initialize_position_by_operator` | `fbbdbef475fe2394` | +| `initialize_position_pda` | `2e527d92558de499` | +| `initialize_preset_parameter` | `42bc47d3626d0eba` | +| `initialize_reward` | `5f87c0c4f281e644` | +| `initialize_token_badge` | `fd4dcd5f1be059df` | +| `place_limit_order` | `6cb021ba92e501c5` | +| `rebalance_liquidity` | `5c04b0c177b95309` | +| `remove_all_liquidity` | `0a333d2370691855` | +| `remove_liquidity` | `5055d14818ceb16c` | +| `remove_liquidity2` | `e6d7527ff165e392` | +| `remove_liquidity_by_range` | `1a526698f04a691a` | +| `remove_liquidity_by_range2` | `cc02c391359191cd` | +| `set_activation_point` | `5bf90fa51a81fe7d` | +| `set_pair_status` | `43f8e7899a95d9ae` | +| `set_pair_status_permissionless` | `4e3b98d346b72ed0` | +| `set_permissionless_operation_bits` | `543acb8ba351beba` | +| `set_pre_activation_duration` | `a53dc9f4829f1664` | +| `set_pre_activation_swap_address` | `398b2f7bd850df0a` | +| `swap` | `f8c69e91e17587c8` | +| `swap2` | `414b3f4ceb5b5b88` | +| `swap_exact_out` | `fa49652126cf4bb8` | +| `swap_exact_out2` | `2bd7f784893cf351` | +| `swap_with_price_impact` | `38ade6d0ade49ccd` | +| `swap_with_price_impact2` | `4a62c0d6b1334b33` | +| `update_base_fee_parameters` | `4ba8dfa110c3032f` | +| `update_dynamic_fee_parameters` | `5ca12ef6ffbd1616` | +| `update_fees_and_reward2` | `208eb89a6741b858` | +| `update_fees_and_rewards` | `9ae6fa0decd14bdf` | +| `update_position_operator` | `cab8678fb4bf74d9` | +| `update_reward_duration` | `8aaec4a9d5ebfe6b` | +| `update_reward_funder` | `d31c3020d7a02317` | +| `withdraw_ineligible_reward` | `94ce2ac3f7316708` | +| `withdraw_protocol_fee` | `9ec99ebd215da267` | +| `zap_protocol_fee` | `d59bbb2238b65bf0` | + +## 7. Checklist d'events Anchor IDL à inventorier + +| Event | Discriminator hex | +|---|---| +| `AddLiquidity` | `1f5e7d5ae3343dba` | +| `CancelLimitOrderEvt` | `83eac285090ebdd1` | +| `ClaimFee` | `4b7a9a308c4a7ba3` | +| `ClaimFee2` | `e8abf2613a4d232d` | +| `ClaimReward` | `947486cc16ab555f` | +| `ClaimReward2` | `1b8ff421502b6e92` | +| `CloseLimitOrderEvt` | `8e87084c5c3f7653` | +| `CompositionFee` | `80977b6a1166718e` | +| `DecreasePositionLength` | `3476eb55aca90f80` | +| `DynamicFeeParameterUpdate` | `5858b287c2925bf3` | +| `FeeParameterUpdate` | `304cf17590d7f22c` | +| `FundReward` | `f6e43a8291aa4fcc` | +| `GoToABin` | `3b8a4c448a83b043` | +| `IncreaseObservation` | `63f91179a69ccfd7` | +| `IncreasePositionLength` | `9def2acc1e38df2e` | +| `InitializeReward` | `d399583e953cb146` | +| `LbPairCreate` | `b94afc7d1bd7bc6f` | +| `PlaceLimitOrderEvt` | `2b4f1ba9f41ce13f` | +| `PositionClose` | `ffc4106b1cca3580` | +| `PositionCreate` | `908efc549d352579` | +| `Rebalancing` | `006d75b33d5bc7c8` | +| `RemoveLiquidity` | `74f461e8671f983a` | +| `SetPositionPermissionlessOperationBitsEvt` | `c3e593f51d7d30a8` | +| `Swap` | `516ce3becdd00ac4` | +| `Swap2Evt` | `2e7452d7941b544d` | +| `UpdatePositionLockReleasePoint` | `85d642e0400c07bf` | +| `UpdatePositionOperator` | `277330ccf62f4239` | +| `UpdateRewardDuration` | `dff5e099311da3ac` | +| `UpdateRewardFunder` | `e0b2ae4afca555b4` | +| `WithdrawIneligibleReward` | `e7bd419566d79af4` | + +## 8. Matérialisation attendue + +### Swaps + +Cibles : + +```text +swap +swap2 +swap_exact_out +swap_exact_out2 +swap_with_price_impact +swap_with_price_impact2 +Swap +Swap2Evt +``` + +Décision : + +- `k_sol_trade_events` + candles uniquement si montants exécutés, sens, pool, token X/Y et mints sont fiables ; +- les events Anchor swap ne doivent pas double-compter une instruction swap déjà matérialisée ; +- exact-out et price-impact ne doivent pas utiliser des bornes comme montants exécutés ; +- si le contexte n'est pas fiable : `skipTradeReason` + `skipCandleReason`. + +### Liquidity / bins / positions + +Cibles : + +```text +add_liquidity* +remove_liquidity* +remove_all_liquidity +rebalance_liquidity +initialize_position* +close_position* +position create/close/update events +initialize_bin_array* +close_bin_array +``` + +Décision : + +- `k_sol_liquidity_events` quand les montants token X/Y, pool, position et acteur sont fiables ; +- lifecycle pour création/fermeture position/bin/pair ; +- skip reason explicite pour position/bin sans montants exploitables. + +### Pools / catalog + +Cibles : + +```text +initialize_lb_pair +initialize_lb_pair2 +initialize_permission_lb_pair +initialize_customizable_permissionless_lb_pair +initialize_customizable_permissionless_lb_pair2 +LbPairCreate +``` + +Décision : lifecycle/catalog/pool/pair si mints X/Y, pool, config/preset et comptes vault sont fiables. + +### Fees + +Cibles : + +```text +claim_fee +claim_fee2 +withdraw_protocol_fee +zap_protocol_fee +ClaimFee +ClaimFee2 +CompositionFee +``` + +Décision : + +- `k_sol_fee_events` + `k_sol_fee_event_amounts` obligatoires si montant/mint fiable ; +- utiliser parent scalaire + leg automatique pour mono-fee ; +- utiliser multi-leg sans agrégation parent si plusieurs mints/composants ; +- ne pas confondre composition fee inclus dans swap/liquidity avec claim fee matérialisable ; +- déclarer explicitement toute policy de recovery ; ne pas ajouter DLMM à l'allowlist générique sans preuve et tests. + +### Rewards + +Cibles : + +```text +initialize_reward +fund_reward +claim_reward +claim_reward2 +withdraw_ineligible_reward +ClaimReward +ClaimReward2 +FundReward +InitializeReward +WithdrawIneligibleReward +``` + +Décision : `k_sol_reward_events` si montant/mint/reward index fiables ; decoded-only sinon. + +### Admin/config/status/operator/token badge + +Cibles : + +```text +update_base_fee_parameters +update_dynamic_fee_parameters +update_fees_and_rewards +update_fees_and_reward2 +set_pair_status +set_pair_status_permissionless +set_activation_point +set_pre_activation_duration +set_pre_activation_swap_address +set_permissionless_operation_bits +create_operator_account +close_operator_account +close_claim_fee_operator_account +initialize_token_badge +close_token_badge +initialize_preset_parameter +close_preset_parameter +close_preset_parameter2 +``` + +Décision : `k_sol_pool_admin_events` si acteur/cible fiables ; decoded-only avec raison sinon. + +### Limit orders / orderbook-like events + +Cibles : + +```text +place_limit_order +cancel_limit_order +close_limit_order_if_empty +PlaceLimitOrderEvt +CancelLimitOrderEvt +CloseLimitOrderEvt +``` + +Décision : `k_sol_orderbook_events` si sémantique fiable ; pas de trade/candle sans fill exact. + +## 9. SQL de validation attendu + +Créer/mettre à jour : + +```text +validation_sql/SQL_VALIDATION_METEORA_DLMM_0_7_57.sql +``` + +Le fichier doit vérifier au minimum : + +1. fallback upstream DLMM ; +2. instruction observations DLMM ; +3. coverage DLMM ; +4. decoded DLMM sans coverage ; +5. successful non-materialized sans skip reason ; +6. failed tx materialization ; +7. multi-target materialization ; +8. trade/candle sur non-swap ; +9. fee parent/legs ; +10. orphan fee legs ; +11. reward/fee separation ; +12. orderbook/limit-order sans double-count ; +13. watchlist globale. + +## 10. Invariants de fermeture + +`0.7.57 meteora_dlmm` ne peut être clôturé que si : + +- les `76` instructions et `30` events Anchor IDL sont dans la coverage ou explicitement non observés avec tests synthétiques ; +- aucun fallback upstream DLMM ne reste pour les entrées couvertes localement ; +- aucun decoded DLMM local sans coverage ; +- aucune tx failed n'alimente une table métier ; +- aucun event multi-target incohérent ; +- aucune ligne successful non-materialized sans `skip*Reason` ou policy explicite ; +- aucun non-swap ne produit trade/candle ; +- aucun fee parent scalaire sans leg ; +- aucun leg fee orphelin ; +- aucun reward n'est classé fee par défaut ; +- aucun limit/order event ne produit une candle sans fill exact ; +- la watchlist globale ne contient plus de backlog dominant `meteora_dlmm`. + +## 11. Contraintes de code à respecter + +- Rust 2024 ; +- async-first ; +- tracing obligatoire ; +- pas de `?`, pas de `unwrap/expect` en production ; +- pas de `anyhow` / `thiserror` ; +- pas de `mod.rs` ; +- pas de `pub mod` : utiliser `mod` + `pub use` ; +- imports seulement pour les traits ; +- `#![deny(unreachable_pub)]`, `#![warn(missing_docs)]` ; +- tests offline ; +- pas de macro DB/coverage ; +- après modification DB : re-exports `kb_lib/src/db.rs` et `kb_lib/src/lib.rs` ; +- après modification decoder : vérifier `kb_lib/src/dex.rs`, `kb_lib/src/lib.rs`, coverage et tests synthétiques. + +## 12. Format de livraison attendu + +Livrer des deltas successifs : + +```text +khadhroony-bobobot-v0.7.57-meteora_dlmm-delta-pre.xxx.zip +``` + +Chaque réponse doit indiquer : fichiers modifiés, raisons, tests à lancer, SQL à exécuter, résultat attendu, et risques éventuels. diff --git a/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_58_DEMO4_PROGRAM_SURFACE_DISCOVERY.md b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_58_DEMO4_PROGRAM_SURFACE_DISCOVERY.md new file mode 100644 index 0000000..72fd97a --- /dev/null +++ b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_58_DEMO4_PROGRAM_SURFACE_DISCOVERY.md @@ -0,0 +1,18 @@ + + +# OBSOLETE — Prompt déplacé + +Ce prompt n'est plus la cible `0.7.58`. + +Nouvel ordre validé : + +```text +0.7.58 -> sqlite_db_transaction_merger +0.7.59 -> demo4_program_surface_discovery +``` + +Utiliser : + +```text +docs/prompts/PROMPT_0_7_59_demo4_program_surface_discovery.md +``` diff --git a/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_58_SQLITE_DB_TRANSACTION_MERGER_BINARY.md b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_58_SQLITE_DB_TRANSACTION_MERGER_BINARY.md new file mode 100644 index 0000000..c2a7381 --- /dev/null +++ b/olddocs/archivekbobobot/docs/prompts/PROMPT_0_7_58_SQLITE_DB_TRANSACTION_MERGER_BINARY.md @@ -0,0 +1,447 @@ + + +# Prompt — 0.7.58 Binaire de fusion de bases SQLite transactionnelles + validation anti-régression inter-DEX + +## Contexte + +Nous reprenons le workspace Rust `khadhroony-bobobot` après : + +```text +0.7.57 -> meteora_dlmm clos +0.7.57-pre.015..023 -> nettoyage PumpSwap / guard PumpFees après régression cross-surface +``` + +Décision de planification mise à jour : + +```text +0.7.58 -> sqlite_db_transaction_merger +0.7.59 -> demo4_program_surface_discovery +0.7.60 -> meteora_damm_v1 +0.7.61 -> meteora_damm_v2 +``` + +Le binaire de fusion passe avant `demo4`, car il devient un outil de non-régression indispensable pour les futurs décodeurs/materializers. + +## Objectif principal + +Créer un outil binaire de fusion de bases SQLite transactionnelles permettant de construire une base consolidée de corpus, par exemple `final.db`, à partir : + +```text +final.db existante ++ base dédiée pump_swap.db ++ base dédiée pump_fun.db ++ base dédiée pump_fees.db ++ base dédiée raydium_*.db ++ base dédiée meteora_*.db +``` + +Le binaire doit fusionner les transactions/instructions déjà backfillées sans RPC, sans redécoder et sans matérialiser pendant le merge. + +Ensuite, la base consolidée doit être rejouable localement avec : + +```text +metadata=no +skipDexDecode=no +forceDexDecode=yes +deferInstructionObservations=yes +``` + +But : détecter les régressions inter-DEX comme celle observée où un décodage `pump_fees` tronqué interrompait la matérialisation `pump_swap.buy_exact_quote_in` dans la même transaction. + +## Règle de workflow future + +Pour chaque nouveau DEX ou nouvelle surface : + +1. Créer une base vide dédiée au DEX en cours. +2. Backfiller uniquement les signatures/pools nécessaires pour ce DEX. +3. Développer le decoder/materializer sur cette base dédiée. +4. Clore avec les SQL propres du DEX. +5. Fusionner la base dédiée dans `final.db` ou dans une copie `final.next.db`. +6. Rejouer `final.next.db` avec `forceDexDecode=yes`. +7. Lancer les validations globales anti-régression sur Pump/Raydium/Meteora et sur les surfaces closes. +8. Promouvoir `final.next.db` en `final.db` seulement si les gates sont propres. + +Commande conceptuelle : + +```bash +cargo run -p kb_tools --bin kb_db_merge -- --output ./final.next.db --input ./final.db --input ./corpus/pump_swap.db --input ./corpus/pump_fees.db --mode raw-corpus --dry-run +``` + +Puis, après validation dry-run : + +```bash +cargo run -p kb_tools --bin kb_db_merge -- --output ./final.next.db --input ./final.db --input ./corpus/new_dex.db --mode raw-corpus --replace-output +``` + +## Emplacement recommandé + +Créer un package outil séparé : + +```text +kb_tools/ + Cargo.toml + src/bin/kb_db_merge.rs +``` + +Ajouter `kb_tools` dans le workspace principal. + +Alternative acceptable si la structure workspace rend cela plus simple : + +```text +kb_lib/src/bin/kb_db_merge.rs +``` + +Mais privilégier `kb_tools` pour éviter de mélanger outil CLI et librairie métier. + +## Contraintes de code + +Respecter les contraintes projet : + +- Rust 2024 ; +- async-first si accès DB async ; +- tracing obligatoire ; +- pas de `?` dans le code applicatif ; +- pas de `unwrap` / `expect` hors tests ; +- pas de `anyhow` / `thiserror` ; +- pas de `mod.rs` ; +- pas de `pub mod`, utiliser `mod` + `pub use` ; +- imports directs seulement pour les traits ; +- tests offline ; +- types DB sous `kb_lib/src/db/entities/` et `kb_lib/src/db/dtos/`, pas sous `queries/` ; +- si des requêtes DB sont ajoutées/modifiées : mettre à jour les re-exports dans `kb_lib/src/db.rs` puis `kb_lib/src/lib.rs`. + +## Modes CLI + +Modes initiaux : + +```text +raw-corpus +signatures-only +full-copy-safe +``` + +Le mode par défaut doit être : + +```text +raw-corpus +``` + +### `raw-corpus` + +Copier uniquement les données nécessaires à un replay local fiable : + +```text +k_sol_chain_transactions +k_sol_chain_instructions +``` + +Ne pas copier les tables matérialisées par défaut : + +```text +k_sol_dex_decoded_events +k_sol_trade_events +k_sol_liquidity_events +k_sol_pool_lifecycle_events +k_sol_pair_candles +k_sol_fee_events +k_sol_reward_events +k_sol_pool_admin_events +k_sol_orderbook_events +k_sol_token_account_events +k_sol_instruction_observations +k_sol_dex_event_coverage_entries +``` + +Raison : ces tables dépendent de la version de decoder/materializer et doivent être reconstruites par replay local. + +### `signatures-only` + +Créer une table de staging de signatures/slots/source, sans copier les transactions complètes. Ce mode est utile pour audit ou pour préparer des backfills contrôlés. + +### `full-copy-safe` + +Mode optionnel, non prioritaire. + +Copier aussi des lignes décodées/matérialisées uniquement si : + +- le schema version est compatible ; +- la version logique de decoder est identique ; +- toutes les foreign keys peuvent être remappées ; +- le mode est explicitement demandé. + +Ne jamais en faire le mode par défaut. + +## Options CLI minimales + +```text +--output +--input répétable +--mode +--dry-run +--replace-output +--source-label