commit d73df9df66b518a83356dd2feda96031b563483d
parent 8b476b4294f886ca36fa0afb745f439489808486
Author: Joris Hartog <jorishartog@hotmail.com>
Date: Wed, 19 Aug 2026 21:39:31 +0200
Cover combined economic sweep pressure
Diffstat:
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/PLAN.md b/PLAN.md
@@ -60,7 +60,8 @@ dimensions to adversarial strategies and classifies observed censorship as
unavailable, network-isolation dependent, fee-pressure dependent, or
finalizer-disruption dependent. Fee pressure, gossip latency, peer isolation, and
offline finalizer schedules are now modeled as runner inputs instead of only as
-strategy labels.
+strategy labels. Combined network-isolation plus offline-finalizer pressure is
+covered as a separate matrix regression.
Goal: quantify whether attacks are impossible, only possible under network
isolation, or possible but expensive.
diff --git a/src/domain/adversarial_tests.rs b/src/domain/adversarial_tests.rs
@@ -3628,6 +3628,15 @@ fn economic_sweep_runner_classifies_attack_costs_across_dimensions() {
offline_finalizer_percent: 0,
fee_pressure_burns_per_block: 4,
},
+ EconomicSweepCase {
+ seed: 1_305,
+ burn_percent: 50,
+ lineage_percent: 50,
+ peer_isolation_percent: 50,
+ gossip_latency_blocks: 0,
+ offline_finalizer_percent: 100,
+ fee_pressure_burns_per_block: 0,
+ },
];
let results = run_economic_sweep(&cases, 4);
@@ -3676,6 +3685,21 @@ fn economic_sweep_runner_classifies_attack_costs_across_dimensions() {
assert_eq!(results[4].class, EconomicAttackClass::RequiresFeePressure);
assert!(results[4].metrics.fee_pressure_burns > 0);
assert!(results[4].metrics.fee_pressure_displaced_burns > 0);
+
+ assert_eq!(results[5].strategy, AdversaryStrategy::CombinedStrategy);
+ assert_eq!(
+ results[5].class,
+ EconomicAttackClass::RequiresNetworkIsolation
+ );
+ assert!(results[5].metrics.unseen_third_party_burns > 0);
+ assert_eq!(results[5].metrics.censored_third_party_burns, 0);
+ assert!(results[5].metrics.fallback_opportunities > 0);
+ assert!(results[5].metrics.fallback_blocks > 0);
+ assert!(results[5].metrics.recovery_rate > 0.0);
+ assert_eq!(
+ results[5].metrics.successful_censorship_cost_per_burn(),
+ None
+ );
}
#[test]