1use crate::client::{
2 PageDirection,
3 PaginatedResult,
4 PaginationRequest,
5 schema::{
6 Address,
7 AssetId,
8 ConnectionArgsFields,
9 ConversionError,
10 HexString,
11 PageInfo,
12 Tai64Timestamp,
13 TransactionId,
14 TxPointer,
15 U16,
16 U32,
17 U64,
18 UtxoId,
19 coins::ExcludeInput,
20 schema,
21 tx::{
22 transparent_receipt::Receipt,
23 transparent_tx::Output,
24 },
25 },
26 types::TransactionResponse,
27};
28use fuel_core_types::{
29 fuel_tx,
30 fuel_types::{
31 Bytes32,
32 canonical::Deserialize,
33 },
34 fuel_vm,
35 services::executor::{
36 TransactionExecutionResult,
37 TransactionExecutionStatus,
38 },
39};
40use std::{
41 convert::{
42 TryFrom,
43 TryInto,
44 },
45 sync::Arc,
46};
47
48pub mod transparent_receipt;
49pub mod transparent_tx;
50
51#[derive(cynic::QueryVariables, Debug, Clone)]
52pub struct TxIdArgs {
53 pub id: TransactionId,
54}
55
56#[derive(cynic::QueryFragment, Clone, Debug)]
58#[cynic(
59 schema_path = "./assets/schema.sdl",
60 graphql_type = "Query",
61 variables = "TxIdArgs"
62)]
63pub struct TransactionQuery {
64 #[arguments(id: $id)]
65 pub transaction: Option<OpaqueTransactionWithStatus>,
66}
67
68#[derive(cynic::QueryFragment, Clone, Debug)]
70#[cynic(
71 schema_path = "./assets/schema.sdl",
72 graphql_type = "Query",
73 variables = "TxIdArgs"
74)]
75pub struct TransactionStatusQuery {
76 #[arguments(id: $id)]
77 pub transaction: Option<OpaqueTransactionStatus>,
78}
79
80#[derive(cynic::QueryFragment, Clone, Debug)]
81#[cynic(
82 schema_path = "./assets/schema.sdl",
83 graphql_type = "Query",
84 variables = "ConnectionArgs"
85)]
86pub struct TransactionsQuery {
87 #[arguments(after: $after, before: $before, first: $first, last: $last)]
88 pub transactions: TransactionConnection,
89}
90
91#[derive(cynic::QueryFragment, Clone, Debug)]
92#[cynic(schema_path = "./assets/schema.sdl")]
93pub struct TransactionConnection {
94 pub edges: Vec<TransactionEdge>,
95 pub page_info: PageInfo,
96}
97
98impl TryFrom<TransactionConnection> for PaginatedResult<TransactionResponse, String> {
99 type Error = ConversionError;
100
101 fn try_from(conn: TransactionConnection) -> Result<Self, Self::Error> {
102 let results: Result<Vec<TransactionResponse>, Self::Error> =
103 conn.edges.into_iter().map(|e| e.node.try_into()).collect();
104
105 Ok(PaginatedResult {
106 cursor: conn.page_info.end_cursor,
107 has_next_page: conn.page_info.has_next_page,
108 has_previous_page: conn.page_info.has_previous_page,
109 results: results?,
110 })
111 }
112}
113
114#[derive(cynic::QueryFragment, Clone, Debug)]
115#[cynic(schema_path = "./assets/schema.sdl")]
116pub struct TransactionEdge {
117 pub cursor: String,
118 pub node: OpaqueTransactionWithStatus,
119}
120
121#[derive(cynic::QueryFragment, Clone, Debug)]
122#[cynic(graphql_type = "Transaction", schema_path = "./assets/schema.sdl")]
123pub struct OpaqueTransaction {
124 pub raw_payload: HexString,
125}
126
127#[derive(cynic::QueryFragment, Clone, Debug)]
128#[cynic(graphql_type = "Transaction", schema_path = "./assets/schema.sdl")]
129pub struct OpaqueTransactionWithStatus {
130 pub raw_payload: HexString,
131 pub status: Option<TransactionStatus>,
132}
133
134#[derive(cynic::QueryFragment, Clone, Debug)]
135#[cynic(graphql_type = "Transaction", schema_path = "./assets/schema.sdl")]
136pub struct OpaqueTransactionStatus {
137 pub status: Option<TransactionStatus>,
138}
139
140impl TryFrom<OpaqueTransaction> for fuel_tx::Transaction {
141 type Error = ConversionError;
142
143 fn try_from(value: OpaqueTransaction) -> Result<Self, Self::Error> {
144 let bytes = value.raw_payload.0.0;
145 fuel_tx::Transaction::from_bytes(bytes.as_slice())
146 .map_err(ConversionError::TransactionFromBytesError)
147 }
148}
149
150#[derive(cynic::QueryFragment, Clone, Debug)]
151#[cynic(schema_path = "./assets/schema.sdl", graphql_type = "Transaction")]
152pub struct TransactionIdFragment {
153 pub id: TransactionId,
154}
155
156#[derive(cynic::Enum, Copy, Clone, Debug)]
157#[cynic(schema_path = "./assets/schema.sdl")]
158pub enum ReturnType {
159 Return,
160 ReturnData,
161 Revert,
162}
163
164#[derive(cynic::QueryFragment, Clone, Debug)]
165#[cynic(graphql_type = "ProgramState", schema_path = "./assets/schema.sdl")]
166pub struct ProgramState {
167 pub return_type: ReturnType,
168 pub data: HexString,
169}
170
171impl TryFrom<ProgramState> for fuel_vm::ProgramState {
172 type Error = ConversionError;
173
174 fn try_from(state: ProgramState) -> Result<Self, Self::Error> {
175 Ok(match state.return_type {
176 ReturnType::Return => fuel_vm::ProgramState::Return({
177 let b = state.data.0.0;
178 let b: [u8; 8] =
179 b.try_into().map_err(|_| ConversionError::BytesLength)?;
180 u64::from_be_bytes(b)
181 }),
182 ReturnType::ReturnData => fuel_vm::ProgramState::ReturnData({
183 Bytes32::try_from(state.data.0.0.as_slice())?
184 }),
185 ReturnType::Revert => fuel_vm::ProgramState::Revert({
186 let b = state.data.0.0;
187 let b: [u8; 8] =
188 b.try_into().map_err(|_| ConversionError::BytesLength)?;
189 u64::from_be_bytes(b)
190 }),
191 })
192 }
193}
194
195#[allow(clippy::enum_variant_names)]
196#[derive(cynic::InlineFragments, Clone, Debug)]
197#[cynic(schema_path = "./assets/schema.sdl")]
198pub enum TransactionStatus {
199 SubmittedStatus(SubmittedStatus),
200 SuccessStatus(SuccessStatus),
201 PreconfirmationSuccessStatus(PreconfirmationSuccessStatus),
202 SqueezedOutStatus(SqueezedOutStatus),
203 FailureStatus(FailureStatus),
204 PreconfirmationFailureStatus(PreconfirmationFailureStatus),
205 #[cynic(fallback)]
206 Unknown,
207}
208
209#[allow(clippy::enum_variant_names)]
210#[derive(cynic::InlineFragments, Clone, Debug)]
211#[cynic(
212 schema_path = "./assets/schema.sdl",
213 graphql_type = "TransactionStatus"
214)]
215pub enum StatusWithTransaction {
216 SubmittedStatus(SubmittedStatus),
217 SuccessStatus(SuccessStatusWithTransaction),
218 PreconfirmationSuccessStatus(PreconfirmationSuccessStatusWithTransaction),
219 SqueezedOutStatus(SqueezedOutStatus),
220 FailureStatus(FailureStatusWithTransaction),
221 PreconfirmationFailureStatus(PreconfirmationFailureStatusWithTransaction),
222 #[cynic(fallback)]
223 Unknown,
224}
225
226#[derive(cynic::QueryFragment, Clone, Debug)]
227#[cynic(schema_path = "./assets/schema.sdl")]
228pub struct SubmittedStatus {
229 pub time: Tai64Timestamp,
230}
231
232#[derive(cynic::QueryFragment, Clone, Debug)]
233#[cynic(schema_path = "./assets/schema.sdl")]
234pub struct SuccessStatus {
235 pub block_height: U32,
236 pub time: Tai64Timestamp,
237 pub program_state: Option<ProgramState>,
238 pub receipts: Vec<Receipt>,
239 pub total_gas: U64,
240 pub total_fee: U64,
241}
242
243#[derive(cynic::QueryFragment, Clone, Debug)]
244#[cynic(schema_path = "./assets/schema.sdl", graphql_type = "SuccessStatus")]
245pub struct SuccessStatusWithTransaction {
246 pub transaction: OpaqueTransaction,
247 pub block_height: U32,
248 pub time: Tai64Timestamp,
249 pub program_state: Option<ProgramState>,
250 pub receipts: Vec<Receipt>,
251 pub total_gas: U64,
252 pub total_fee: U64,
253}
254
255#[derive(cynic::QueryFragment, Clone, Debug)]
256#[cynic(schema_path = "./assets/schema.sdl")]
257pub struct ResolvedOutput {
258 pub utxo_id: UtxoId,
259 pub output: Output,
260}
261
262#[derive(cynic::QueryFragment, Clone, Debug)]
263#[cynic(schema_path = "./assets/schema.sdl")]
264pub struct PreconfirmationSuccessStatus {
265 pub tx_pointer: TxPointer,
266 pub transaction_id: TransactionId,
267 pub total_fee: U64,
268 pub total_gas: U64,
269 pub receipts: Option<Vec<Receipt>>,
270 pub resolved_outputs: Option<Vec<ResolvedOutput>>,
271}
272
273#[derive(cynic::QueryFragment, Clone, Debug)]
274#[cynic(
275 schema_path = "./assets/schema.sdl",
276 graphql_type = "PreconfirmationSuccessStatus"
277)]
278pub struct PreconfirmationSuccessStatusWithTransaction {
279 pub tx_pointer: TxPointer,
280 pub transaction_id: TransactionId,
281 pub total_fee: U64,
282 pub total_gas: U64,
283 pub transaction: Option<OpaqueTransaction>,
284 pub receipts: Option<Vec<Receipt>>,
285 pub resolved_outputs: Option<Vec<ResolvedOutput>>,
286}
287
288#[derive(cynic::QueryFragment, Clone, Debug)]
289#[cynic(schema_path = "./assets/schema.sdl")]
290pub struct FailureStatus {
291 pub block_height: U32,
292 pub time: Tai64Timestamp,
293 pub reason: String,
294 pub program_state: Option<ProgramState>,
295 pub receipts: Vec<Receipt>,
296 pub total_gas: U64,
297 pub total_fee: U64,
298}
299
300#[derive(cynic::QueryFragment, Clone, Debug)]
301#[cynic(schema_path = "./assets/schema.sdl", graphql_type = "FailureStatus")]
302pub struct FailureStatusWithTransaction {
303 pub transaction: OpaqueTransaction,
304 pub block_height: U32,
305 pub time: Tai64Timestamp,
306 pub reason: String,
307 pub program_state: Option<ProgramState>,
308 pub receipts: Vec<Receipt>,
309 pub total_gas: U64,
310 pub total_fee: U64,
311}
312
313#[derive(cynic::QueryFragment, Clone, Debug)]
314#[cynic(schema_path = "./assets/schema.sdl")]
315pub struct PreconfirmationFailureStatus {
316 pub tx_pointer: TxPointer,
317 pub transaction_id: TransactionId,
318 pub total_fee: U64,
319 pub total_gas: U64,
320 pub receipts: Option<Vec<Receipt>>,
321 pub resolved_outputs: Option<Vec<ResolvedOutput>>,
322 pub reason: String,
323}
324
325#[derive(cynic::QueryFragment, Clone, Debug)]
326#[cynic(
327 schema_path = "./assets/schema.sdl",
328 graphql_type = "PreconfirmationFailureStatus"
329)]
330pub struct PreconfirmationFailureStatusWithTransaction {
331 pub tx_pointer: TxPointer,
332 pub transaction_id: TransactionId,
333 pub total_fee: U64,
334 pub total_gas: U64,
335 pub transaction: Option<OpaqueTransaction>,
336 pub receipts: Option<Vec<Receipt>>,
337 pub resolved_outputs: Option<Vec<ResolvedOutput>>,
338 pub reason: String,
339}
340
341#[derive(cynic::QueryFragment, Clone, Debug)]
342#[cynic(schema_path = "./assets/schema.sdl")]
343pub struct SqueezedOutStatus {
344 pub reason: String,
345}
346
347#[allow(clippy::enum_variant_names)]
348#[derive(cynic::InlineFragments, Clone, Debug)]
349#[cynic(schema_path = "./assets/schema.sdl")]
350pub enum DryRunTransactionStatus {
351 SuccessStatus(DryRunSuccessStatus),
352 FailureStatus(DryRunFailureStatus),
353 #[cynic(fallback)]
354 Unknown,
355}
356
357impl TryFrom<DryRunTransactionStatus> for TransactionExecutionResult {
358 type Error = ConversionError;
359
360 fn try_from(status: DryRunTransactionStatus) -> Result<Self, Self::Error> {
361 Ok(match status {
362 DryRunTransactionStatus::SuccessStatus(s) => {
363 let receipts = s
364 .receipts
365 .into_iter()
366 .map(|receipt| receipt.try_into())
367 .collect::<Result<Vec<fuel_tx::Receipt>, _>>()?;
368 TransactionExecutionResult::Success {
369 result: s.program_state.map(TryInto::try_into).transpose()?,
370 receipts: Arc::new(receipts),
371 total_gas: s.total_gas.0,
372 total_fee: s.total_fee.0,
373 }
374 }
375 DryRunTransactionStatus::FailureStatus(s) => {
376 let receipts = s
377 .receipts
378 .into_iter()
379 .map(|receipt| receipt.try_into())
380 .collect::<Result<Vec<fuel_tx::Receipt>, _>>()?;
381 TransactionExecutionResult::Failed {
382 result: s.program_state.map(TryInto::try_into).transpose()?,
383 receipts: Arc::new(receipts),
384 total_gas: s.total_gas.0,
385 total_fee: s.total_fee.0,
386 }
387 }
388 DryRunTransactionStatus::Unknown => {
389 return Err(Self::Error::UnknownVariant("DryRunTxStatus"))
390 }
391 })
392 }
393}
394
395#[derive(cynic::QueryFragment, Clone, Debug)]
396#[cynic(schema_path = "./assets/schema.sdl")]
397pub struct DryRunSuccessStatus {
398 pub program_state: Option<ProgramState>,
399 pub receipts: Vec<Receipt>,
400 pub total_gas: U64,
401 pub total_fee: U64,
402}
403
404#[derive(cynic::QueryFragment, Clone, Debug)]
405#[cynic(schema_path = "./assets/schema.sdl")]
406pub struct DryRunFailureStatus {
407 pub program_state: Option<ProgramState>,
408 pub receipts: Vec<Receipt>,
409 pub total_gas: U64,
410 pub total_fee: U64,
411}
412
413#[derive(cynic::QueryFragment, Clone, Debug)]
414#[cynic(schema_path = "./assets/schema.sdl")]
415pub struct DryRunTransactionExecutionStatus {
416 pub id: TransactionId,
417 pub status: DryRunTransactionStatus,
418}
419
420impl TryFrom<DryRunTransactionExecutionStatus> for TransactionExecutionStatus {
421 type Error = ConversionError;
422
423 fn try_from(schema: DryRunTransactionExecutionStatus) -> Result<Self, Self::Error> {
424 let id = schema.id.into();
425 let status = schema.status.try_into()?;
426
427 Ok(TransactionExecutionStatus { id, result: status })
428 }
429}
430
431#[derive(cynic::QueryVariables, Debug, Clone)]
432pub struct TransactionsByOwnerConnectionArgs {
433 pub owner: Address,
435 pub after: Option<String>,
437 pub before: Option<String>,
439 pub first: Option<i32>,
441 pub last: Option<i32>,
444}
445
446impl From<(Address, PaginationRequest<String>)> for TransactionsByOwnerConnectionArgs {
447 fn from(r: (Address, PaginationRequest<String>)) -> Self {
448 match r.1.direction {
449 PageDirection::Forward => TransactionsByOwnerConnectionArgs {
450 owner: r.0,
451 after: r.1.cursor,
452 before: None,
453 first: Some(r.1.results),
454 last: None,
455 },
456 PageDirection::Backward => TransactionsByOwnerConnectionArgs {
457 owner: r.0,
458 after: None,
459 before: r.1.cursor,
460 first: None,
461 last: Some(r.1.results),
462 },
463 }
464 }
465}
466
467#[derive(cynic::QueryFragment, Clone, Debug)]
468#[cynic(
469 schema_path = "./assets/schema.sdl",
470 graphql_type = "Query",
471 variables = "TransactionsByOwnerConnectionArgs"
472)]
473pub struct TransactionsByOwnerQuery {
474 #[arguments(owner: $owner, after: $after, before: $before, first: $first, last: $last)]
475 pub transactions_by_owner: TransactionConnection,
476}
477
478#[derive(cynic::QueryVariables, Debug, Clone)]
479pub struct StatusChangeSubscriptionArgs {
480 pub id: TransactionId,
481 #[cynic(skip_serializing_if = "Option::is_none")]
482 pub include_preconfirmation: Option<bool>,
483}
484
485#[derive(cynic::QueryFragment, Clone, Debug)]
486#[cynic(
487 schema_path = "./assets/schema.sdl",
488 graphql_type = "Subscription",
489 variables = "StatusChangeSubscriptionArgs"
490)]
491pub struct StatusChangeSubscription {
492 #[arguments(id: $id, includePreconfirmation: $include_preconfirmation)]
493 pub status_change: TransactionStatus,
494}
495
496#[derive(cynic::QueryVariables, Clone)]
499pub struct TxArg {
500 pub tx: HexString,
501}
502
503#[derive(cynic::QueryVariables, Clone)]
504pub struct TxWithEstimatedPredicatesArg {
505 pub tx: HexString,
506 #[cynic(skip_serializing_if = "Option::is_none")]
507 pub estimate_predicates: Option<bool>,
508}
509
510#[derive(cynic::QueryVariables, Clone)]
511pub struct SubmitAndAwaitStatusArg {
512 pub tx: HexString,
513 #[cynic(skip_serializing_if = "Option::is_none")]
514 pub estimate_predicates: Option<bool>,
515 #[cynic(skip_serializing_if = "Option::is_none")]
516 pub include_preconfirmation: Option<bool>,
517}
518
519#[derive(cynic::QueryFragment, Clone, Debug)]
520#[cynic(
521 schema_path = "./assets/schema.sdl",
522 graphql_type = "Query",
523 variables = "TxArg"
524)]
525pub struct EstimatePredicates {
526 #[arguments(tx: $tx)]
527 pub estimate_predicates: OpaqueTransaction,
528}
529
530#[derive(cynic::InputObject, Clone, Debug)]
531#[cynic(schema_path = "./assets/schema.sdl")]
532pub struct Predicate {
533 pub predicate_address: Address,
534 pub predicate: HexString,
535 pub predicate_data: HexString,
536}
537
538#[derive(cynic::InputObject, Clone, Debug)]
539#[cynic(schema_path = "./assets/schema.sdl")]
540pub struct Account {
541 #[cynic(skip_serializing_if = "Option::is_none")]
542 pub address: Option<Address>,
543 #[cynic(skip_serializing_if = "Option::is_none")]
544 pub predicate: Option<Predicate>,
545}
546
547#[derive(cynic::InputObject, Clone, Debug)]
548#[cynic(schema_path = "./assets/schema.sdl")]
549pub struct ChangePolicy {
550 #[cynic(skip_serializing_if = "Option::is_none")]
551 pub change: Option<Address>,
552 #[cynic(skip_serializing_if = "Option::is_none")]
553 pub destroy: Option<Destroy>,
554}
555
556#[derive(cynic::Enum, Clone, Debug)]
557#[cynic(schema_path = "./assets/schema.sdl")]
558pub enum Destroy {
559 Destroy,
560}
561
562#[derive(cynic::InputObject, Clone, Debug)]
563#[cynic(schema_path = "./assets/schema.sdl")]
564pub struct RequiredBalance {
565 pub asset_id: AssetId,
566 pub amount: U64,
567 pub account: Account,
568 pub change_policy: ChangePolicy,
569}
570
571#[derive(cynic::QueryVariables, Clone)]
572pub struct AssembleTxArg {
573 pub tx: HexString,
574 pub block_horizon: U32,
575 pub required_balances: Vec<RequiredBalance>,
576 pub fee_address_index: U16,
577 pub exclude_input: Option<ExcludeInput>,
578 pub estimate_predicates: bool,
579 pub reserve_gas: Option<U64>,
580}
581
582#[derive(cynic::QueryFragment, Clone, Debug)]
583#[cynic(
584 schema_path = "./assets/schema.sdl",
585 graphql_type = "Query",
586 variables = "AssembleTxArg"
587)]
588pub struct AssembleTx {
589 #[arguments(
590 tx: $tx,
591 blockHorizon: $block_horizon,
592 requiredBalances: $required_balances,
593 feeAddressIndex: $fee_address_index,
594 excludeInput: $exclude_input,
595 estimatePredicates: $estimate_predicates,
596 reserveGas: $reserve_gas,
597 )]
598 pub assemble_tx: AssembleTransactionResult,
599}
600
601#[derive(cynic::QueryFragment, Clone, Debug)]
602#[cynic(schema_path = "./assets/schema.sdl")]
603pub struct AssembleTransactionResult {
604 pub transaction: OpaqueTransaction,
605 pub status: DryRunTransactionStatus,
606 pub gas_price: U64,
607}
608
609#[derive(cynic::QueryVariables, Clone)]
610pub struct DryRunArg {
611 pub txs: Vec<HexString>,
612 pub utxo_validation: Option<bool>,
613 pub gas_price: Option<U64>,
614 pub block_height: Option<U32>,
615}
616
617#[derive(cynic::QueryFragment, Clone, Debug)]
618#[cynic(
619 schema_path = "./assets/schema.sdl",
620 graphql_type = "Mutation",
621 variables = "DryRunArg"
622)]
623pub struct DryRun {
624 #[arguments(txs: $txs, utxoValidation: $utxo_validation, gasPrice: $gas_price, blockHeight: $block_height
625 )]
626 pub dry_run: Vec<DryRunTransactionExecutionStatus>,
627}
628
629#[derive(cynic::QueryFragment, Clone, Debug)]
630#[cynic(schema_path = "./assets/schema.sdl")]
631pub struct DryRunStorageReads {
632 pub tx_statuses: Vec<DryRunTransactionExecutionStatus>,
633 pub storage_reads: Vec<super::storage_read_replay::StorageReadReplayEvent>,
634}
635
636#[derive(cynic::QueryFragment, Clone, Debug)]
637#[cynic(
638 schema_path = "./assets/schema.sdl",
639 graphql_type = "Query",
640 variables = "DryRunArg"
641)]
642pub struct DryRunRecordStorageReads {
643 #[arguments(txs: $txs, utxoValidation: $utxo_validation, gasPrice: $gas_price, blockHeight: $block_height
644 )]
645 pub dry_run_record_storage_reads: DryRunStorageReads,
646}
647
648#[derive(cynic::QueryFragment, Clone, Debug)]
649#[cynic(
650 schema_path = "./assets/schema.sdl",
651 graphql_type = "Mutation",
652 variables = "TxWithEstimatedPredicatesArg"
653)]
654pub struct Submit {
655 #[arguments(tx: $tx, estimatePredicates: $estimate_predicates)]
656 pub submit: TransactionIdFragment,
657}
658
659#[derive(cynic::QueryFragment, Clone, Debug)]
660#[cynic(
661 schema_path = "./assets/schema.sdl",
662 graphql_type = "Subscription",
663 variables = "TxWithEstimatedPredicatesArg"
664)]
665pub struct SubmitAndAwaitSubscription {
666 #[arguments(tx: $tx, estimatePredicates: $estimate_predicates)]
667 pub submit_and_await: TransactionStatus,
668}
669
670#[derive(cynic::QueryFragment, Clone, Debug)]
671#[cynic(
672 schema_path = "./assets/schema.sdl",
673 graphql_type = "Subscription",
674 variables = "TxWithEstimatedPredicatesArg"
675)]
676pub struct SubmitAndAwaitSubscriptionWithTransaction {
677 #[arguments(tx: $tx, estimatePredicates: $estimate_predicates)]
678 pub submit_and_await: StatusWithTransaction,
679}
680
681#[derive(cynic::QueryFragment, Clone, Debug)]
682#[cynic(
683 schema_path = "./assets/schema.sdl",
684 graphql_type = "Subscription",
685 variables = "SubmitAndAwaitStatusArg"
686)]
687pub struct SubmitAndAwaitStatusSubscription {
688 #[arguments(tx: $tx, estimatePredicates: $estimate_predicates, includePreconfirmation: $include_preconfirmation
689 )]
690 pub submit_and_await_status: TransactionStatus,
691}
692
693#[derive(cynic::QueryFragment, Clone, Debug)]
694#[cynic(schema_path = "./assets/schema.sdl", graphql_type = "Query")]
695pub struct AllReceipts {
696 pub all_receipts: Vec<Receipt>,
697}
698
699#[derive(cynic::QueryFragment, Clone, Debug)]
700#[cynic(schema_path = "./assets/schema.sdl", graphql_type = "Subscription")]
701pub struct PreconfirmationsSubscription {
702 #[cynic(rename = "alpha__preconfirmations")]
703 pub preconfirmations: TransactionStatus,
704}
705
706#[cfg(test)]
707pub mod tests {
708 use super::*;
709 use crate::client::schema::Bytes;
710 use fuel_core_types::fuel_types::canonical::Serialize;
711
712 #[cfg(not(feature = "test-helpers"))]
713 #[test]
714 fn transparent_transaction_by_id_query_gql_output() {
715 use cynic::QueryBuilder;
716 let operation = transparent_tx::TransactionQuery::build(TxIdArgs {
717 id: TransactionId::default(),
718 });
719 insta::assert_snapshot!(operation.query)
720 }
721
722 #[cfg(not(feature = "test-helpers"))]
723 #[test]
724 fn opaque_transaction_by_id_query_gql_output() {
725 use cynic::QueryBuilder;
726 let operation = TransactionQuery::build(TxIdArgs {
727 id: TransactionId::default(),
728 });
729 insta::assert_snapshot!(operation.query)
730 }
731
732 #[cfg(not(feature = "test-helpers"))]
733 #[test]
734 fn transactions_connection_query_gql_output() {
735 use cynic::QueryBuilder;
736
737 let args = crate::client::schema::ConnectionArgs {
738 after: None,
739 before: None,
740 first: None,
741 last: None,
742 };
743 let operation = TransactionsQuery::build(args);
744 insta::assert_snapshot!(operation.query)
745 }
746
747 #[cfg(not(feature = "test-helpers"))]
748 #[test]
749 fn transactions_by_owner_gql_output() {
750 use cynic::QueryBuilder;
751 let operation =
752 TransactionsByOwnerQuery::build(TransactionsByOwnerConnectionArgs {
753 owner: Default::default(),
754 after: None,
755 before: None,
756 first: None,
757 last: None,
758 });
759 insta::assert_snapshot!(operation.query)
760 }
761
762 #[test]
763 fn dry_run_tx_gql_output() {
764 use cynic::MutationBuilder;
765 let tx = fuel_tx::Transaction::default_test_tx();
766 let query = DryRun::build(DryRunArg {
767 txs: vec![HexString(Bytes(tx.to_bytes()))],
768 utxo_validation: Some(true),
769 gas_price: Some(123u64.into()),
770 block_height: Some(456u32.into()),
771 });
772 insta::assert_snapshot!(query.query)
773 }
774
775 #[test]
776 fn submit_tx_gql_output() {
777 use cynic::MutationBuilder;
778 let tx = fuel_tx::Transaction::default_test_tx();
779 let query = Submit::build(TxWithEstimatedPredicatesArg {
780 tx: HexString(Bytes(tx.to_bytes())),
781 estimate_predicates: Some(true),
782 });
783 insta::assert_snapshot!(query.query)
784 }
785}