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> { 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 { // 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. let tree = db.open_tree("contract_payments").unwrap(); let contract_key = match decode(contract_id) { Ok(bytes) => bytes, Err(_) => return 0, }; let payments: Option> = match tree.get(contract_key) { Ok(Some(p)) => deserialize_value(&p), _ => None, }; match payments { Some(p) => p.iter().sum(), None => 0, } }