use std::sync::Arc;
use std::time::Duration;
use crate::api::AppState;
pub async fn run_anchor_loop(state: Arc<AppState>, interval: Duration) {
loop {
tokio::time::sleep(interval).await;
if let Err(e) = anchor_once(&state).await {
tracing::warn!(?e, "OTS anchor cycle failed");
}
}
}
async fn anchor_once(state: &Arc<AppState>) -> anyhow::Result<()> {
let (tree_size, root) = {
let merkle = state.merkle.lock();
(merkle.len(), merkle.root())
};
tracing::info!(tree_size, root = %hex::encode(root), "anchoring tree head");
let placeholder_proof = build_placeholder_proof(tree_size, &root);
state
.db
.store_ots_proof(tree_size, &root, &placeholder_proof, None)?;
Ok(())
}
fn build_placeholder_proof(tree_size: u64, root: &[u8; 32]) -> Vec<u8> {
let mut proof = Vec::new();
proof.extend_from_slice(b"OTS-PLACEHOLDER/v1\n");
proof.extend_from_slice(&tree_size.to_be_bytes());
proof.extend_from_slice(root);
proof
}