use crate::storage::error::StorageResult;
use walletkit_db::Connection;
use super::util::{
cache_entry_times, get_cache_entry, get_cache_entry_tx, insert_cache_entry_tx,
map_db_err, prune_expired_entries_tx, replay_nullifier_key,
};
const REPLAY_REQUEST_NBF_SECONDS: u64 = 600;
static REPLAY_REQUEST_TTL_SECONDS: u64 = 60 * 60 * 24 * 365;
pub(super) fn is_nullifier_replay(
conn: &Connection,
nullifier: [u8; 32],
now: u64,
) -> StorageResult<bool> {
let key = replay_nullifier_key(nullifier);
let nbf = now.saturating_sub(REPLAY_REQUEST_NBF_SECONDS);
let result = get_cache_entry(conn, key.as_slice(), now, Some(nbf))?;
Ok(result.is_some())
}
pub(super) fn replay_guard_set(
conn: &Connection,
nullifier: [u8; 32],
now: u64,
) -> StorageResult<()> {
let tx = conn
.transaction_immediate()
.map_err(|err| map_db_err(&err))?;
prune_expired_entries_tx(&tx, now)?;
let key = replay_nullifier_key(nullifier);
let existing = get_cache_entry_tx(&tx, key.as_slice(), now, None)?;
if existing.is_some() {
tx.commit().map_err(|err| map_db_err(&err))?;
return Ok(());
}
let times = cache_entry_times(now, REPLAY_REQUEST_TTL_SECONDS)?;
insert_cache_entry_tx(&tx, key.as_slice(), &[0x1], times)?;
tx.commit().map_err(|err| map_db_err(&err))?;
Ok(())
}