1use iota_sdk_types::{ObjectId, TransactionDigest, TransactionEffectsDigest, Version};
6use move_core_types::annotated_value::MoveStructLayout;
7use serde::{Deserialize, Serialize};
8
9use crate::{
10 committee::EpochId,
11 crypto::{AuthoritySignInfo, AuthorityStrongQuorumSignInfo},
12 effects::{
13 SignedTransactionEffects, TransactionEffects, TransactionEffectsExtForTesting,
14 TransactionEvents, VerifiedSignedTransactionEffects,
15 },
16 error::IotaError,
17 messages_consensus::SignedAuthorityCapabilitiesV1,
18 object::Object,
19 transaction::{CertifiedTransaction, SenderSignedData, SignedTransaction},
20};
21
22#[derive(Clone, Debug, Default, Serialize, Deserialize)]
24pub struct ValidatorHealthRequest {}
25
26#[derive(Clone, Debug, Default, Serialize, Deserialize)]
28pub struct ValidatorHealthResponse {
29 pub num_inflight_execution_transactions: u64,
31 pub num_inflight_consensus_transactions: u64,
33 pub last_locally_built_checkpoint: u64,
35}
36
37#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize)]
38pub enum ObjectInfoRequestKind {
39 LatestObjectInfo,
41 PastObjectInfoDebug(Version),
46}
47
48#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize)]
51pub enum LayoutGenerationOption {
52 Generate,
53 None,
54}
55
56#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize)]
59pub struct ObjectInfoRequest {
60 pub object_id: ObjectId,
62 pub generate_layout: LayoutGenerationOption,
64 pub request_kind: ObjectInfoRequestKind,
66}
67
68impl ObjectInfoRequest {
69 pub fn past_object_info_debug_request(
70 object_id: ObjectId,
71 version: Version,
72 generate_layout: LayoutGenerationOption,
73 ) -> Self {
74 ObjectInfoRequest {
75 object_id,
76 generate_layout,
77 request_kind: ObjectInfoRequestKind::PastObjectInfoDebug(version),
78 }
79 }
80
81 pub fn latest_object_info_request(
82 object_id: ObjectId,
83 generate_layout: LayoutGenerationOption,
84 ) -> Self {
85 ObjectInfoRequest {
86 object_id,
87 generate_layout,
88 request_kind: ObjectInfoRequestKind::LatestObjectInfo,
89 }
90 }
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
95pub struct ObjectInfoResponse {
96 pub object: Object,
98 pub layout: Option<MoveStructLayout>,
102 pub lock_for_debugging: Option<SignedTransaction>,
107}
108
109#[derive(Debug, Clone)]
112pub struct VerifiedObjectInfoResponse {
113 pub object: Object,
115}
116
117#[derive(Clone, Debug, Serialize, Deserialize)]
118pub struct TransactionInfoRequest {
119 pub transaction_digest: TransactionDigest,
120}
121
122#[expect(clippy::large_enum_variant)]
123#[derive(Clone, Debug, Serialize, Deserialize)]
124pub enum TransactionStatus {
125 Signed(AuthoritySignInfo),
127 Executed(
133 Option<AuthorityStrongQuorumSignInfo>,
134 SignedTransactionEffects,
135 TransactionEvents,
136 ),
137}
138
139impl TransactionStatus {
140 pub fn into_signed_for_testing(self) -> AuthoritySignInfo {
141 match self {
142 Self::Signed(s) => s,
143 _ => unreachable!("Incorrect response type"),
144 }
145 }
146
147 pub fn into_effects_for_testing(self) -> SignedTransactionEffects {
148 match self {
149 Self::Executed(_, e, _) => e,
150 _ => unreachable!("Incorrect response type"),
151 }
152 }
153}
154
155impl PartialEq for TransactionStatus {
156 fn eq(&self, other: &Self) -> bool {
157 match self {
158 Self::Signed(s1) => match other {
159 Self::Signed(s2) => s1.epoch == s2.epoch,
160 _ => false,
161 },
162 Self::Executed(c1, e1, ev1) => match other {
163 Self::Executed(c2, e2, ev2) => {
164 c1.as_ref().map(|a| a.epoch) == c2.as_ref().map(|a| a.epoch)
165 && e1.epoch() == e2.epoch()
166 && e1.digest() == e2.digest()
167 && ev1.digest() == ev2.digest()
168 }
169 _ => false,
170 },
171 }
172 }
173}
174
175#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
176pub struct HandleTransactionResponse {
177 pub status: TransactionStatus,
178}
179
180#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
181pub struct TransactionInfoResponse {
182 pub transaction: SenderSignedData,
183 pub status: TransactionStatus,
184}
185
186#[derive(Clone, Debug, Serialize, Deserialize)]
187pub struct SubmitCertificateResponse {
188 pub executed: Option<HandleCertificateResponseV1>,
191}
192
193#[derive(Clone, Debug)]
194pub struct VerifiedHandleCertificateResponse {
195 pub signed_effects: VerifiedSignedTransactionEffects,
196 pub events: TransactionEvents,
197}
198
199#[derive(Serialize, Deserialize, Clone, Debug)]
200pub struct SystemStateRequest {
201 pub _unused: bool,
203}
204
205#[derive(Clone, Debug, Serialize, Deserialize)]
214pub struct HandleCertificateResponseV1 {
215 pub signed_effects: SignedTransactionEffects,
216 pub events: Option<TransactionEvents>,
217
218 pub input_objects: Option<Vec<Object>>,
224
225 pub output_objects: Option<Vec<Object>>,
229 pub auxiliary_data: Option<Vec<u8>>,
230}
231
232#[derive(Clone, Debug, Serialize, Deserialize)]
233pub struct HandleCertificateRequestV1 {
234 pub certificate: CertifiedTransaction,
235
236 pub include_events: bool,
237 pub include_input_objects: bool,
238 pub include_output_objects: bool,
239 pub include_auxiliary_data: bool,
240}
241
242impl HandleCertificateRequestV1 {
243 pub fn new(certificate: CertifiedTransaction) -> Self {
244 Self {
245 certificate,
246 include_events: false,
247 include_input_objects: false,
248 include_output_objects: false,
249 include_auxiliary_data: false,
250 }
251 }
252
253 pub fn with_events(mut self) -> Self {
254 self.include_events = true;
255 self
256 }
257
258 pub fn with_input_objects(mut self) -> Self {
259 self.include_input_objects = true;
260 self
261 }
262
263 pub fn with_output_objects(mut self) -> Self {
264 self.include_output_objects = true;
265 self
266 }
267
268 pub fn with_auxiliary_data(mut self) -> Self {
269 self.include_auxiliary_data = true;
270 self
271 }
272}
273
274#[derive(Clone, Debug, Serialize, Deserialize)]
281pub struct HandleSoftBundleCertificatesResponseV1 {
282 pub responses: Vec<HandleCertificateResponseV1>,
283}
284
285#[derive(Clone, Debug, Serialize, Deserialize)]
287pub struct HandleSoftBundleCertificatesRequestV1 {
288 pub certificates: Vec<CertifiedTransaction>,
289
290 pub wait_for_effects: bool,
291 pub include_events: bool,
292 pub include_input_objects: bool,
293 pub include_output_objects: bool,
294 pub include_auxiliary_data: bool,
295}
296
297#[derive(Clone, Debug, Serialize, Deserialize)]
298pub struct HandleCapabilityNotificationRequestV1 {
299 pub message: SignedAuthorityCapabilitiesV1,
300}
301
302#[derive(Clone, Debug, Serialize, Deserialize)]
303pub struct HandleCapabilityNotificationResponseV1 {
304 pub _unused: bool,
306}
307
308#[derive(Clone, Debug, Serialize, Deserialize)]
312pub struct ExecutedData {
313 pub effects: TransactionEffects,
314 pub events: Option<TransactionEvents>,
315 pub input_objects: Vec<Object>,
316 pub output_objects: Vec<Object>,
317}
318
319impl Default for ExecutedData {
320 fn default() -> Self {
321 Self {
322 effects: TransactionEffects::new_empty_v1_for_testing(TransactionDigest::default()),
323 events: None,
324 input_objects: Vec::new(),
325 output_objects: Vec::new(),
326 }
327 }
328}
329
330#[derive(Clone, Debug, Serialize, Deserialize)]
333pub struct GetTxStatusRequest {
334 pub queries: Vec<TxStatusQuery>,
335}
336
337#[derive(Clone, Debug, Serialize, Deserialize)]
339pub struct TxStatusQuery {
340 pub transaction_digest: TransactionDigest,
341 pub include_details: bool,
344}
345
346#[derive(Clone, Debug, Serialize, Deserialize)]
349pub enum TxStatusUpdate {
350 Submitted,
352 Executed {
354 effects_digest: TransactionEffectsDigest,
355 details: Option<Box<ExecutedData>>,
356 },
357 Rejected { error: IotaError },
359 Expired { epoch: EpochId },
361}