This commit is contained in:
2026-05-27 18:45:16 +02:00
parent d9558a5c16
commit 96b6209482
18 changed files with 996 additions and 23 deletions

View File

@@ -155,6 +155,24 @@
<input id="demoPipeline2ReplayMetadataLimitInput" type="number" min="1" step="1" class="form-control" value="250" />
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="checkbox" id="demoPipeline2ReplaySkipCertifiedDexDecodeCheckbox" checked />
<label class="form-check-label" for="demoPipeline2ReplaySkipCertifiedDexDecodeCheckbox">
Skip certified DEX decode ledger rows
</label>
</div>
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="demoPipeline2ReplayForceDexDecodeCheckbox" />
<label class="form-check-label" for="demoPipeline2ReplayForceDexDecodeCheckbox">
Force DEX decode replay
</label>
</div>
<p class="small text-body-secondary mb-3">
Le skip ne concerne que létape de décodage DEX certifiée par le ledger. Le reste du replay continue pour reconstruire les tables dérivées.
</p>
<div class="d-flex gap-2">
<button id="demoPipeline2ReplayLocalPipelineButton" type="button" class="btn btn-outline-primary">
Replay local pipeline

View File

@@ -57,10 +57,17 @@ interface LocalPipelineReplayResult {
pairCandleErrorCount: number;
analyticSignalErrorCount: number;
decodedEventCount: number;
decodeSkippedCount: number;
decodeSkippedEventCount: number;
decodeLedgerUpsertCount: number;
decodeLedgerUnsafeCount: number;
detectionCount: number;
tradeEventCount: number;
liquidityEventCount: number;
poolLifecycleEventCount: number;
feeEventCount: number;
rewardEventCount: number;
poolAdminEventCount: number;
pairCandleUpsertCount: number;
analyticSignalUpsertCount: number;
transactionClassificationCount: number;
@@ -365,6 +372,8 @@ document.addEventListener("DOMContentLoaded", async () => {
const replayLimitInput = document.querySelector<HTMLInputElement>("#demoPipeline2ReplayLimitInput");
const replayMetadataCheckbox = document.querySelector<HTMLInputElement>("#demoPipeline2ReplayMetadataCheckbox");
const replayMetadataLimitInput = document.querySelector<HTMLInputElement>("#demoPipeline2ReplayMetadataLimitInput");
const replaySkipCertifiedDexDecodeCheckbox = document.querySelector<HTMLInputElement>("#demoPipeline2ReplaySkipCertifiedDexDecodeCheckbox");
const replayForceDexDecodeCheckbox = document.querySelector<HTMLInputElement>("#demoPipeline2ReplayForceDexDecodeCheckbox");
const replayLocalPipelineButton = document.querySelector<HTMLButtonElement>("#demoPipeline2ReplayLocalPipelineButton");
const diagnoseLocalPipelineButton = document.querySelector<HTMLButtonElement>("#demoPipeline2DiagnoseLocalPipelineButton");
const validateLocalPipelineButton = document.querySelector<HTMLButtonElement>("#demoPipeline2ValidateLocalPipelineButton");
@@ -414,6 +423,8 @@ document.addEventListener("DOMContentLoaded", async () => {
!replayLimitInput ||
!replayMetadataCheckbox ||
!replayMetadataLimitInput ||
!replaySkipCertifiedDexDecodeCheckbox ||
!replayForceDexDecodeCheckbox ||
!replayLocalPipelineButton ||
!diagnoseLocalPipelineButton ||
!validateLocalPipelineButton ||
@@ -649,7 +660,7 @@ document.addEventListener("DOMContentLoaded", async () => {
appendLogLine(
logTextarea,
`[ui] launching local pipeline replay limit='${replayLimit ?? "none"}' metadata='${replayMetadataCheckbox.checked ? "yes" : "no"}'`,
`[ui] launching local pipeline replay limit='${replayLimit ?? "none"}' metadata='${replayMetadataCheckbox.checked ? "yes" : "no"}' skipDexDecode='${replaySkipCertifiedDexDecodeCheckbox.checked ? "yes" : "no"}' forceDexDecode='${replayForceDexDecodeCheckbox.checked ? "yes" : "no"}'`,
);
try {
@@ -659,6 +670,8 @@ document.addEventListener("DOMContentLoaded", async () => {
limit: replayLimit,
refreshMissingTokenMetadata: replayMetadataCheckbox.checked,
tokenMetadataLimit,
skipCertifiedDexDecode: replaySkipCertifiedDexDecodeCheckbox.checked,
forceDecodeReplay: replayForceDexDecodeCheckbox.checked,
},
);
@@ -666,7 +679,7 @@ document.addEventListener("DOMContentLoaded", async () => {
appendLogLine(
logTextarea,
`[ui] local pipeline replay completed: ${result.replayedTransactionCount.toString()} replayed, ${result.tradeEventCount.toString()} trades, ${result.liquidityEventCount.toString()} liquidity, ${result.poolLifecycleEventCount.toString()} lifecycle, ${result.pairCandleUpsertCount.toString()} candle upserts, resetDeleted='${result.resetMarketMaterializationDeletedCount.toString()}'`,
`[ui] local pipeline replay completed: ${result.replayedTransactionCount.toString()} replayed, ${result.decodeSkippedCount.toString()} decode skipped, ${result.decodeLedgerUpsertCount.toString()} ledger upserts, ${result.decodeLedgerUnsafeCount.toString()} unsafe ledger rows, ${result.tradeEventCount.toString()} trades, ${result.liquidityEventCount.toString()} liquidity, ${result.poolLifecycleEventCount.toString()} lifecycle, ${result.pairCandleUpsertCount.toString()} candle upserts, resetDeleted='${result.resetMarketMaterializationDeletedCount.toString()}'`,
);
await refreshCatalog();

View File

@@ -1,7 +1,7 @@
{
"name": "kb-demo-app",
"private": true,
"version": "0.7.43",
"version": "0.7.44",
"type": "module",
"scripts": {
"dev": "vite",

View File

@@ -1748,12 +1748,16 @@ pub(crate) async fn demo_pipeline2_replay_local_pipeline(
limit: std::option::Option<i64>,
refresh_missing_token_metadata: bool,
token_metadata_limit: std::option::Option<i64>,
skip_certified_dex_decode: bool,
force_decode_replay: bool,
) -> Result<kb_lib::LocalPipelineReplayResult, std::string::String> {
let config = kb_lib::LocalPipelineReplayConfig {
limit,
refresh_missing_token_metadata,
token_metadata_limit,
reset_market_materialization_before_replay: true,
skip_certified_dex_decode,
force_decode_replay,
};
let database = state.database.clone();
let service = if refresh_missing_token_metadata {

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "kb-demo-app",
"version": "0.7.43",
"version": "0.7.44",
"identifier": "com.sasedev.kb-demo-app",
"build": {
"beforeDevCommand": "npm run dev",