use crate::client::SorobanRpcClient;
use crate::error::RpcError;
use sdkt_xdr::{encode_ledger_key, extract_wasm_hash, LedgerKeyParams};
use serde::Serialize;
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct ContractInspection {
pub contract_id: String,
pub wasm_hash: String,
pub wasm_size: Option<usize>,
pub storage_summary: StorageSummary,
pub ttl_info: Option<TtlInfoSummary>,
pub storage_keys: Vec<StorageKeyInfo>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Default)]
pub struct TtlInfoSummary {
pub minimum_ttl: u32,
pub maximum_ttl: u32,
pub average_ttl: u32,
pub expiring_entries_count: usize,
pub estimated_rent_cost: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Default)]
pub struct StorageSummary {
pub instance_entries: usize,
pub persistent_entries: usize,
pub temporary_entries: usize,
}
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct StorageKeyInfo {
pub key: String,
pub key_type: String,
pub permissions: String,
}
pub async fn inspect_contract(
client: &SorobanRpcClient,
contract_id: &str,
) -> Result<ContractInspection, RpcError> {
let encoded_key = encode_ledger_key(&LedgerKeyParams::ContractData(contract_id.to_string()))
.map_err(|e| RpcError::Rpc(format!("Failed to encode ledger key: {}", e)))?;
let response = client
.get_contract_storage(contract_id, &[encoded_key])
.await?;
if response.entries.is_empty() {
return Err(RpcError::ContractNotFound);
}
let first_entry = &response.entries[0];
let wasm_hash = extract_wasm_hash(&first_entry.xdr)
.map_err(|e| RpcError::Rpc(format!("Failed to extract WASM hash: {}", e)))?;
Ok(ContractInspection {
contract_id: contract_id.to_string(),
wasm_hash,
wasm_size: None,
storage_summary: StorageSummary::default(),
ttl_info: None,
storage_keys: Vec::new(),
})
}
#[cfg(test)]
mod tests {
#[test]
fn test_inspect_wasm_hash() {
}
#[test]
fn test_contract_not_found() {
}
}