unc_jsonrpc_client/methods/
tx.rs

1//! Queries the status of a transaction.
2//!
3//! ## Example
4//! Returns the final transaction result for
5//! <https://explorer.unc.org/transactions/B9aypWiMuiWR5kqzewL9eC96uZWA3qCMhLe67eBMWacq>
6//!
7//! ```no_run
8//! use unc_jsonrpc_client::{methods, JsonRpcClient};
9//!
10//! # #[tokio::main]
11//! # async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
12//! let client = JsonRpcClient::connect("https://archival-rpc.mainnet.unc.org");
13//! let tx_hash = "B9aypWiMuiWR5kqzewL9eC96uZWA3qCMhLe67eBMWacq".parse()?;
14//!
15//! let request = methods::tx::RpcTransactionStatusRequest {
16//!     transaction_info: methods::tx::TransactionInfo::TransactionId {
17//!         tx_hash,
18//!         sender_account_id: "itranscend.unc".parse()?,
19//!    }
20//! };
21//!
22//! let response = client.call(request).await?;
23//!
24//! assert_eq!(tx_hash, response.transaction.hash);
25//! # Ok(())
26//! # }
27//! ```
28use super::*;
29
30pub use unc_jsonrpc_primitives::types::transactions::RpcTransactionError;
31pub use unc_jsonrpc_primitives::types::transactions::TransactionInfo;
32
33pub type RpcTransactionStatusResponse = unc_primitives::views::FinalExecutionOutcomeView;
34
35#[derive(Debug)]
36pub struct RpcTransactionStatusRequest {
37    pub transaction_info: TransactionInfo,
38}
39
40impl From<RpcTransactionStatusRequest>
41    for unc_jsonrpc_primitives::types::transactions::RpcTransactionStatusRequest
42{
43    fn from(this: RpcTransactionStatusRequest) -> Self {
44        Self {
45            transaction_info: this.transaction_info,
46            wait_until: unc_primitives::views::TxExecutionStatus::None,
47        }
48    }
49}
50
51impl RpcMethod for RpcTransactionStatusRequest {
52    type Response = RpcTransactionStatusResponse;
53    type Error = RpcTransactionError;
54
55    fn method_name(&self) -> &str {
56        "tx"
57    }
58
59    fn params(&self) -> Result<serde_json::Value, io::Error> {
60        Ok(match &self.transaction_info {
61            TransactionInfo::Transaction(signed_transaction) => {
62                match signed_transaction {
63                    unc_jsonrpc_primitives::types::transactions::SignedTransaction::SignedTransaction(tx) => {
64                        json!([common::serialize_signed_transaction(tx)?])
65                    }
66                }
67            }
68            TransactionInfo::TransactionId { tx_hash,sender_account_id, ..} => {
69                json!([tx_hash, sender_account_id])
70            }
71        })
72    }
73}
74
75impl private::Sealed for RpcTransactionStatusRequest {}