Contractless/src/verifications/async_funcs/total_payments.rs

49 lines
1.4 KiB
Rust
Raw Normal View History

2026-05-24 17:56:57 +00:00
use crate::decode;
use crate::sled::Db;
// Contract payment totals are stored as a packed list of u64 values
// under the loan contract key.
fn deserialize_value(bytes: &[u8]) -> Option<Vec<u64>> {
let mut vec = vec![];
let mut offset = 0;
while offset + 8 <= bytes.len() {
vec.push(u64::from_le_bytes([
bytes[offset],
bytes[offset + 1],
bytes[offset + 2],
bytes[offset + 3],
bytes[offset + 4],
bytes[offset + 5],
bytes[offset + 6],
bytes[offset + 7],
]));
offset += 8;
}
if offset == bytes.len() {
Some(vec)
} else {
None
}
}
pub async fn get_total_payments(db: &Db, contract_id: &str) -> u64 {
2026-06-11 08:03:09 +00:00
// Consensus loan state only includes payments already saved in blocks.
// Pending mempool payments are intentionally excluded so block validation
// cannot depend on each node's local unconfirmed transaction set.
2026-05-24 17:56:57 +00:00
let tree = db.open_tree("contract_payments").unwrap();
let contract_key = match decode(contract_id) {
Ok(bytes) => bytes,
Err(_) => return 0,
};
let payments: Option<Vec<u64>> = match tree.get(contract_key) {
Ok(Some(p)) => deserialize_value(&p),
_ => None,
};
2026-06-11 08:03:09 +00:00
match payments {
2026-05-24 17:56:57 +00:00
Some(p) => p.iter().sum(),
None => 0,
2026-06-11 08:03:09 +00:00
}
2026-05-24 17:56:57 +00:00
}