55 lines
1.5 KiB
Rust
55 lines
1.5 KiB
Rust
|
|
use crate::decode;
|
||
|
|
use crate::records::memory::mempool::get_pending_payments_for_contract;
|
||
|
|
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 {
|
||
|
|
// Combine confirmed on-chain payments with pending mempool loan
|
||
|
|
// payments so contract checks see the most current total.
|
||
|
|
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,
|
||
|
|
};
|
||
|
|
|
||
|
|
let chain_total = match payments {
|
||
|
|
Some(p) => p.iter().sum(),
|
||
|
|
None => 0,
|
||
|
|
};
|
||
|
|
|
||
|
|
let pending_total = get_pending_payments_for_contract(contract_id)
|
||
|
|
.await
|
||
|
|
.unwrap_or(0);
|
||
|
|
|
||
|
|
chain_total + pending_total
|
||
|
|
}
|