use soroban_sdk::{contracttype, Address, BytesN, Symbol, Vec};
use super::types::{Groth16Proof, Scalar};
#[contracttype]
#[derive(Clone, Debug)]
pub struct HiddenState {
pub commitment: BytesN<32>,
pub owner: Address,
}
#[contracttype]
#[derive(Clone, Debug)]
pub struct ProofSubmission {
pub proof: Groth16Proof,
pub public_inputs: Vec<Scalar>,
pub submitted_at: u64,
pub deadline: u64,
pub verified: bool,
}
#[contracttype]
#[derive(Clone, Debug)]
pub struct VerifiedMarker {
pub verified_at: u64,
pub proof_type: Symbol,
}
#[contracttype]
#[derive(Clone, Debug)]
pub struct CommitReveal {
pub commitment: BytesN<32>,
pub reveal_deadline: u64,
pub revealed: bool,
}
pub const HIDDEN_STATE_TYPE: &str = "zk_hidden";
pub const PROOF_SUBMISSION_TYPE: &str = "zk_proof";
pub const VERIFIED_MARKER_TYPE: &str = "zk_veri";
pub const COMMIT_REVEAL_TYPE: &str = "zk_cr";
#[cfg(test)]
mod tests {
use super::*;
use soroban_sdk::{symbol_short, testutils::Address as _, vec, BytesN, Env};
#[test]
fn test_hidden_state_creation() {
let env = Env::default();
let state = HiddenState {
commitment: BytesN::from_array(&env, &[0xABu8; 32]),
owner: Address::generate(&env),
};
assert_eq!(state.commitment.len(), 32);
}
#[test]
fn test_proof_submission_creation() {
let env = Env::default();
let g1 = super::super::types::G1Point {
bytes: BytesN::from_array(&env, &[0u8; 64]),
};
let g2 = super::super::types::G2Point {
bytes: BytesN::from_array(&env, &[0u8; 128]),
};
let proof = Groth16Proof {
a: g1.clone(),
b: g2,
c: g1,
};
let submission = ProofSubmission {
proof,
public_inputs: vec![&env],
submitted_at: 100,
deadline: 200,
verified: false,
};
assert!(!submission.verified);
assert_eq!(submission.submitted_at, 100);
}
#[test]
fn test_verified_marker() {
let _env = Env::default();
let marker = VerifiedMarker {
verified_at: 150,
proof_type: symbol_short!("movement"),
};
assert_eq!(marker.verified_at, 150);
}
#[test]
fn test_commit_reveal() {
let env = Env::default();
let cr = CommitReveal {
commitment: BytesN::from_array(&env, &[0xCDu8; 32]),
reveal_deadline: 500,
revealed: false,
};
assert!(!cr.revealed);
assert_eq!(cr.reveal_deadline, 500);
}
}