1use alloc::{collections::BTreeMap, string::String, vec::Vec};
4
5use serde::{Deserialize, Serialize};
6use wasm_bindgen::prelude::*;
7
8pub const FIELD_SIZE: usize = 32;
10
11#[derive(Clone, Debug, Serialize, Deserialize)]
13#[wasm_bindgen]
14pub struct Groth16Proof {
15 #[wasm_bindgen(skip)]
17 pub a: Vec<u8>,
18 #[wasm_bindgen(skip)]
20 pub b: Vec<u8>,
21 #[wasm_bindgen(skip)]
23 pub c: Vec<u8>,
24}
25
26#[wasm_bindgen]
27impl Groth16Proof {
28 #[wasm_bindgen(getter)]
30 pub fn a(&self) -> Vec<u8> {
31 self.a.clone()
32 }
33
34 #[wasm_bindgen(getter)]
36 pub fn b(&self) -> Vec<u8> {
37 self.b.clone()
38 }
39
40 #[wasm_bindgen(getter)]
42 pub fn c(&self) -> Vec<u8> {
43 self.c.clone()
44 }
45
46 #[wasm_bindgen]
48 pub fn to_bytes(&self) -> Vec<u8> {
49 let capacity = self
50 .a
51 .len()
52 .saturating_add(self.b.len())
53 .saturating_add(self.c.len());
54 let mut bytes = Vec::with_capacity(capacity);
55 bytes.extend_from_slice(&self.a);
56 bytes.extend_from_slice(&self.b);
57 bytes.extend_from_slice(&self.c);
58 bytes
59 }
60}
61
62#[derive(Clone, Debug, Default, Serialize, Deserialize)]
64pub struct CircuitInputs {
65 #[serde(flatten)]
68 pub signals: BTreeMap<String, InputValue>,
69}
70
71#[derive(Clone, Debug, Serialize, Deserialize)]
73#[serde(untagged)]
74pub enum InputValue {
75 Single(String),
77 Array(Vec<String>),
79}
80
81impl CircuitInputs {
82 pub fn new() -> Self {
84 Self {
85 signals: BTreeMap::new(),
86 }
87 }
88
89 pub fn set_single(&mut self, name: &str, value: &str) {
91 self.signals
92 .insert(String::from(name), InputValue::Single(String::from(value)));
93 }
94
95 pub fn set_array(&mut self, name: &str, values: Vec<String>) {
97 self.signals
98 .insert(String::from(name), InputValue::Array(values));
99 }
100}