From b11118734a618568a24f70f8ab762c03afdb97a3 Mon Sep 17 00:00:00 2001 From: Ben Marx Date: Fri, 28 Nov 2025 16:52:56 -0800 Subject: [PATCH 1/4] feat(validator-debt): add overrides option to validator debt payment (#2316) --- crates/validator-debt/src/transaction.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/crates/validator-debt/src/transaction.rs b/crates/validator-debt/src/transaction.rs index fd95524b..e170f361 100644 --- a/crates/validator-debt/src/transaction.rs +++ b/crates/validator-debt/src/transaction.rs @@ -1,3 +1,5 @@ +use std::fs::File; + use anyhow::{Result, anyhow, bail}; use doublezero_program_tools::{instruction::try_build_instruction, zero_copy}; use doublezero_revenue_distribution::{ @@ -256,8 +258,30 @@ impl Transaction { let mut debt_collection_result: Vec = Vec::with_capacity(debt.debts.len()); + let mut overrides = Vec::new(); + + if let Ok(file) = File::open("overrides.csv") { + let mut rdr = csv::Reader::from_reader(file); + overrides.extend( + rdr.records() + .filter_map(|result| result.ok()) + .filter_map(|record| { + let pubkey = record.get(0)?; + let epoch = record.get(1)?.parse::().ok()?; + Some((pubkey.to_string(), epoch)) + }), + ); + } + let debt_clone = debt.clone(); for d in debt.debts { + let node_id_str = d.node_id.to_string(); + if overrides + .iter() + .any(|(key, epoch)| key == &node_id_str && *epoch == dz_epoch) + { + continue; + } let debt_proof = debt_clone.find_debt_proof(&d.node_id).unwrap(); let (_, proof) = debt_proof; let instruction = try_build_instruction( From 4f286398a3f4ce165c4970cd51b56599ed17395e Mon Sep 17 00:00:00 2001 From: Ben Marx Date: Mon, 1 Dec 2025 09:38:27 -0800 Subject: [PATCH 2/4] feat(validator-debt): add overrides option to validator debt payment (#2316) --- crates/validator-debt/src/transaction.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/validator-debt/src/transaction.rs b/crates/validator-debt/src/transaction.rs index e170f361..5c07d128 100644 --- a/crates/validator-debt/src/transaction.rs +++ b/crates/validator-debt/src/transaction.rs @@ -260,7 +260,9 @@ impl Transaction { let mut overrides = Vec::new(); - if let Ok(file) = File::open("overrides.csv") { + // TODO: This is a temporary fix to exclude a couple of validators + // the longer term fix will be using data on-chain as it's more transparent, less error-prone + if let Ok(file) = File::open("/opt/doublezero-offchain-scheduler/overrides.csv") { let mut rdr = csv::Reader::from_reader(file); overrides.extend( rdr.records() From 8a933f6f83e8521aae71eb8db183f65ba5b967e2 Mon Sep 17 00:00:00 2001 From: Ben Marx Date: Mon, 1 Dec 2025 09:47:36 -0800 Subject: [PATCH 3/4] feat(validator-debt): update changelog (#2316) --- crates/validator-debt/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/validator-debt/CHANGELOG.md b/crates/validator-debt/CHANGELOG.md index 7eb0191c..769ec659 100644 --- a/crates/validator-debt/CHANGELOG.md +++ b/crates/validator-debt/CHANGELOG.md @@ -6,7 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] - +- feat(validator-debt): add overrides flat file to exclude validators from debt collection ([216](https://github.com/doublezerofoundation/doublezero-offchain/pull/216)) - add `debt_record_key` method ([#201](https://github.com/doublezerofoundation/doublezero-offchain/pull/201)) - feat(validator-debt): use s3 bucket to fetch validator keys ([#196](https://github.com/doublezerofoundation/doublezero-offchain/pull/196)) From 302c70b6cea05d915041837c363a5c71a66c3c78 Mon Sep 17 00:00:00 2001 From: Ben Marx Date: Mon, 1 Dec 2025 09:53:15 -0800 Subject: [PATCH 4/4] feat(validator-debt): add logline for skipped validators (#2316) --- crates/validator-debt/src/transaction.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/validator-debt/src/transaction.rs b/crates/validator-debt/src/transaction.rs index 5c07d128..798cba7f 100644 --- a/crates/validator-debt/src/transaction.rs +++ b/crates/validator-debt/src/transaction.rs @@ -282,6 +282,9 @@ impl Transaction { .iter() .any(|(key, epoch)| key == &node_id_str && *epoch == dz_epoch) { + println!( + "Validator {node_id_str} for epoch #{dz_epoch} excluded from debt collection" + ); continue; } let debt_proof = debt_clone.find_debt_proof(&d.node_id).unwrap();