diff --git a/app/igneum-app/src/prover.rs b/app/igneum-app/src/prover.rs index 148993bb3..91f1077ab 100644 --- a/app/igneum-app/src/prover.rs +++ b/app/igneum-app/src/prover.rs @@ -197,6 +197,10 @@ fn run_tool(t: &Tools, exe: &Path, args: &[String], env: &[(&str, &str)], limit: } } +fn payout_address(shared: &Shared) -> String { + shared.settings.lock().unwrap().address.clone() +} + fn set(shared: &Shared, f: F) { let mut st = shared.state.lock().unwrap(); f(&mut st.proving); @@ -298,9 +302,14 @@ fn loop_forever(shared: Arc, bin_dir: PathBuf) { continue; } }; - // paid shards among what we submitted + // paid shards among what we submitted: asked per segment (a slow proof outlives the work list's window) for (n, h, s, wei) in submitted.clone() { - if work.iter().any(|w| w.hash == h && w.shard == s && w.paid) { + let paid = evm_rpc(&shared, "igneum_getProofRecords", json!([format!("{n:#x}")]), Duration::from_secs(10)) + .ok() + .and_then(|r| r["paid"].as_array().and_then(|p| p.get(s as usize)).cloned()) + .map(|p| !p.is_null() && p["payout"].as_str().map(|a| a.eq_ignore_ascii_case(&payout_address(&shared))).unwrap_or(false)) + .unwrap_or(false); + if paid { submitted.retain(|x| !(x.1 == h && x.2 == s)); shared.event("proving", &format!("block {n} shard {s} paid {} IGN", wei as f64 / 1e18)); set(&shared, |p| {