near_jsonrpc_client/methods/experimental/
tx_status.rs

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