use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AttestRequest {
pub program_id: String,
pub input_bytes: Vec<u8>,
#[serde(default)]
pub stdin_items: Vec<Vec<u8>>,
pub claimed_output: Option<Value>,
#[serde(default = "default_verify")]
pub verify_locally: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub external_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub intent_commitment: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub verified_fields: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub field_values: Option<std::collections::HashMap<String, String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub intent_type: Option<String>,
}
fn default_verify() -> bool {
true
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct FieldCommitment {
pub field: String,
pub commitment: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AttestResponse {
pub proof: String,
pub public_values: String,
pub vk_hash: String,
pub verified_output: Value,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub external_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub field_commitments: Option<Vec<FieldCommitment>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub proof_id: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct RegisterResponse {
pub program_id: String,
#[serde(default = "default_version")]
pub version: i32,
pub registered_at: String,
}
fn default_version() -> i32 {
1
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AgentResponse {
#[serde(flatten)]
pub data: Value,
pub program_id: String,
pub elf_hash: String,
}
pub fn serialize_input<T: Serialize>(input: &T) -> Result<Vec<u8>, bincode::Error> {
bincode::serialize(input)
}
pub fn deserialize_output<T: for<'de> Deserialize<'de>>(bytes: &[u8]) -> Result<T, bincode::Error> {
bincode::deserialize(bytes)
}
pub fn bytes_to_json_array(bytes: &[u8]) -> Value {
Value::Array(bytes.iter().map(|b| Value::Number((*b).into())).collect())
}
pub fn json_array_to_bytes(value: &Value) -> Option<Vec<u8>> {
if let Value::Array(arr) = value {
Some(arr.iter().filter_map(|v| v.as_u64().map(|n| n as u8)).collect())
} else {
None
}
}