blueprint_tangle_aggregation_svc/
types.rs1use alloy_primitives::U256;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
8pub struct TaskId {
9 pub service_id: u64,
10 pub call_id: u64,
11}
12
13impl TaskId {
14 pub fn new(service_id: u64, call_id: u64) -> Self {
15 Self {
16 service_id,
17 call_id,
18 }
19 }
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
24#[serde(tag = "type", rename_all = "snake_case")]
25pub enum ThresholdConfig {
26 Count { required_signers: u32 },
28 StakeWeighted {
30 threshold_bps: u32,
32 operator_stakes: Vec<OperatorStake>,
34 },
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct OperatorStake {
40 pub operator_index: u32,
42 pub stake: u64,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct SubmitSignatureRequest {
49 pub service_id: u64,
51 pub call_id: u64,
53 pub operator_index: u32,
55 #[serde(with = "hex_bytes")]
57 pub output: Vec<u8>,
58 #[serde(with = "hex_bytes")]
60 pub signature: Vec<u8>,
61 #[serde(with = "hex_bytes")]
63 pub public_key: Vec<u8>,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct SubmitSignatureResponse {
69 pub accepted: bool,
71 pub signatures_collected: usize,
73 pub threshold_required: usize,
75 pub threshold_met: bool,
77 #[serde(skip_serializing_if = "Option::is_none")]
79 pub error: Option<String>,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct GetStatusRequest {
85 pub service_id: u64,
86 pub call_id: u64,
87}
88
89#[derive(Debug, Clone, Serialize, Deserialize)]
91pub struct GetStatusResponse {
92 pub exists: bool,
94 pub signatures_collected: usize,
96 pub threshold_required: usize,
98 pub threshold_met: bool,
100 pub signer_bitmap: U256,
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub signed_stake_bps: Option<u32>,
105 pub submitted: bool,
107 #[serde(skip_serializing_if = "Option::is_none")]
109 pub is_expired: Option<bool>,
110 #[serde(skip_serializing_if = "Option::is_none")]
112 pub time_remaining_secs: Option<u64>,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct InitTaskRequest {
118 pub service_id: u64,
119 pub call_id: u64,
120 pub operator_count: u32,
122 pub threshold: ThresholdConfig,
124 #[serde(with = "hex_bytes")]
126 pub output: Vec<u8>,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize)]
131pub struct InitTaskResponse {
132 pub success: bool,
133 #[serde(skip_serializing_if = "Option::is_none")]
134 pub error: Option<String>,
135}
136
137#[derive(Debug, Clone, Serialize, Deserialize)]
139pub struct AggregatedResultResponse {
140 pub service_id: u64,
141 pub call_id: u64,
142 #[serde(with = "hex_bytes")]
143 pub output: Vec<u8>,
144 pub signer_bitmap: U256,
145 pub non_signer_indices: Vec<u32>,
147 #[serde(with = "hex_bytes")]
149 pub aggregated_signature: Vec<u8>,
150 #[serde(with = "hex_bytes")]
152 pub aggregated_pubkey: Vec<u8>,
153}
154
155mod hex_bytes {
157 use serde::{Deserialize, Deserializer, Serializer};
158
159 pub fn serialize<S>(bytes: &[u8], serializer: S) -> Result<S::Ok, S::Error>
160 where
161 S: Serializer,
162 {
163 serializer.serialize_str(&format!("0x{}", hex::encode(bytes)))
164 }
165
166 pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
167 where
168 D: Deserializer<'de>,
169 {
170 let s = String::deserialize(deserializer)?;
171 let s = s.strip_prefix("0x").unwrap_or(&s);
172 hex::decode(s).map_err(serde::de::Error::custom)
173 }
174}