From 534280335c713de6db2e0f74ad0f63e593193e54 Mon Sep 17 00:00:00 2001 From: chrispalaskas Date: Fri, 19 Jun 2026 13:37:10 -0400 Subject: [PATCH] fix(toolkit): emit successful txs from batch-single-tx on partial failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit batch-single-tx discarded every successfully-built tx whenever a single transfer failed, returning PartialFailure before serializing anything to --dest-file. Downstream load appliers (tx_load_applier.py) saw the non-zero exit, deleted the batch, and skipped submission entirely — so a batch of 250 transfers with even one failure sent zero transactions. Now emit all txs that built successfully and only error when the entire batch fails (AllFailed), which the wrapper already handles as "produced no transactions". Co-Authored-By: Claude Opus 4.8 (1M context) --- .../builders/common/batch_single_tx.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/util/toolkit/src/tx_generator/builder/builders/common/batch_single_tx.rs b/util/toolkit/src/tx_generator/builder/builders/common/batch_single_tx.rs index a7d6cd281..6fca1739e 100644 --- a/util/toolkit/src/tx_generator/builder/builders/common/batch_single_tx.rs +++ b/util/toolkit/src/tx_generator/builder/builders/common/batch_single_tx.rs @@ -249,8 +249,21 @@ impl> BuildTxs for BatchSingleTxBuilder { progress.finish(format!("batch-single-tx: {} succeeded, {} failed", succeeded, failed)); + // Emit every tx we managed to build, even on partial failure. Discarding the + // successful txs because a few transfers failed wastes the whole batch and starves + // downstream load appliers. Only treat a batch with zero successes as an error. if failed > 0 { - return Err(BatchSingleTxError::PartialFailure { succeeded, failed }); + if succeeded == 0 { + return Err(BatchSingleTxError::AllFailed { failed }); + } + tracing::warn!( + succeeded = succeeded, + failed = failed, + "Partial batch: {} of {} transfers failed; emitting {} successful txs", + failed, + succeeded + failed, + succeeded + ); } Ok(SerializedTxBatches { batches: vec![txs] }) @@ -259,6 +272,6 @@ impl> BuildTxs for BatchSingleTxBuilder { #[derive(Debug, thiserror::Error)] pub enum BatchSingleTxError { - #[error("{failed} of {} transfers failed", succeeded + failed)] - PartialFailure { succeeded: usize, failed: usize }, + #[error("all {failed} transfers failed")] + AllFailed { failed: usize }, }