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