From 359b863a54d30b6fc15f7eb2266a6beaf0a30800 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Fri, 5 Apr 2024 13:04:46 +0200 Subject: [PATCH 1/2] stellar-rpc-client: Use objects as parameters in every call (#125) --- cmd/crates/stellar-rpc-client/src/lib.rs | 36 ++++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/cmd/crates/stellar-rpc-client/src/lib.rs b/cmd/crates/stellar-rpc-client/src/lib.rs index 2e0be210..ee1d93d0 100644 --- a/cmd/crates/stellar-rpc-client/src/lib.rs +++ b/cmd/crates/stellar-rpc-client/src/lib.rs @@ -1,7 +1,7 @@ use http::{uri::Authority, Uri}; use itertools::Itertools; use jsonrpsee_core::params::ObjectParams; -use jsonrpsee_core::{self, client::ClientT, rpc_params}; +use jsonrpsee_core::{self, client::ClientT}; use jsonrpsee_http_client::{HeaderMap, HttpClient, HttpClientBuilder}; use serde_aux::prelude::{ deserialize_default_from_null, deserialize_number_from_string, @@ -637,7 +637,10 @@ impl Client { /// # Errors pub async fn get_network(&self) -> Result { tracing::trace!("Getting network"); - Ok(self.client()?.request("getNetwork", rpc_params![]).await?) + Ok(self + .client()? + .request("getNetwork", ObjectParams::new()) + .await?) } /// @@ -646,7 +649,7 @@ impl Client { tracing::trace!("Getting latest ledger"); Ok(self .client()? - .request("getLatestLedger", rpc_params![]) + .request("getLatestLedger", ObjectParams::new()) .await?) } @@ -691,16 +694,15 @@ soroban config identity fund {address} --helper-url "# ) -> Result { let client = self.client()?; tracing::trace!("Sending:\n{tx:#?}"); + let mut oparams = ObjectParams::new(); + oparams.insert("transaction", tx.to_xdr_base64(Limits::none())?)?; let SendTransactionResponse { hash, error_result_xdr, status, .. } = client - .request( - "sendTransaction", - rpc_params![tx.to_xdr_base64(Limits::none())?], - ) + .request("sendTransaction", oparams) .await .map_err(|err| { Error::TransactionSubmissionFailed(format!("No status yet:\n {err:#?}")) @@ -761,11 +763,11 @@ soroban config identity fund {address} --helper-url "# ) -> Result { tracing::trace!("Simulating:\n{tx:#?}"); let base64_tx = tx.to_xdr_base64(Limits::none())?; - let mut builder = ObjectParams::new(); - builder.insert("transaction", base64_tx)?; + let mut oparams = ObjectParams::new(); + oparams.insert("transaction", base64_tx)?; let response: SimulateTransactionResponse = self .client()? - .request("simulateTransaction", builder) + .request("simulateTransaction", oparams) .await?; tracing::trace!("Simulation response:\n {response:#?}"); match response.error { @@ -835,10 +837,9 @@ soroban config identity fund {address} --helper-url "# /// /// # Errors pub async fn get_transaction(&self, tx_id: &str) -> Result { - Ok(self - .client()? - .request("getTransaction", rpc_params![tx_id]) - .await?) + let mut oparams = ObjectParams::new(); + oparams.insert("hash", tx_id)?; + Ok(self.client()?.request("getTransaction", oparams).await?) } /// @@ -855,10 +856,9 @@ soroban config identity fund {address} --helper-url "# } base64_keys.push(k.to_xdr_base64(Limits::none())?); } - Ok(self - .client()? - .request("getLedgerEntries", rpc_params![base64_keys]) - .await?) + let mut oparams = ObjectParams::new(); + oparams.insert("keys", base64_keys)?; + Ok(self.client()?.request("getLedgerEntries", oparams).await?) } /// From e887b940c3a8b1ba8f489c0e4cced0c16f82e86b Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Fri, 5 Apr 2024 13:11:24 +0200 Subject: [PATCH 2/2] =?UTF-8?q?stellar-rpc-client:=20Add=20support=20for?= =?UTF-8?q?=20new=20simulateTransaction=20stateChan=E2=80=A6=20(#123)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/crates/stellar-rpc-client/src/lib.rs | 35 ++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/cmd/crates/stellar-rpc-client/src/lib.rs b/cmd/crates/stellar-rpc-client/src/lib.rs index ee1d93d0..ca861e1b 100644 --- a/cmd/crates/stellar-rpc-client/src/lib.rs +++ b/cmd/crates/stellar-rpc-client/src/lib.rs @@ -279,6 +279,21 @@ pub struct SimulateHostFunctionResult { pub xdr: xdr::ScVal, } +#[derive(serde::Deserialize, serde::Serialize, Debug, Clone, PartialEq)] +#[serde(tag = "type")] +pub enum LedgerEntryChange { + #[serde(rename = "created")] + Created { key: String, after: String }, + #[serde(rename = "deleted")] + Deleted { key: String, before: String }, + #[serde(rename = "updated")] + Updated { + key: String, + before: String, + after: String, + }, +} + #[derive(serde::Deserialize, serde::Serialize, Debug, Default, Clone)] pub struct SimulateTransactionResponse { #[serde( @@ -305,6 +320,12 @@ pub struct SimulateTransactionResponse { default )] pub restore_preamble: Option, + #[serde( + rename = "stateChanges", + skip_serializing_if = "Option::is_none", + default + )] + pub state_changes: Option>, #[serde(rename = "latestLedger")] pub latest_ledger: u32, #[serde(skip_serializing_if = "Option::is_none", default)] @@ -1070,10 +1091,20 @@ mod tests { "minResourceFee": "100000000", "cost": { "cpuInsns": "1000", "memBytes": "1000" }, "transactionData": "", - "latestLedger": 1234 - }"#; + "latestLedger": 1234, + "stateChanges": [{ + "type": "created", + "key": "AAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWg==", + "before": null, + "after": "AAAAZAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" + }] + }"#; let resp: SimulateTransactionResponse = serde_json::from_str(s).unwrap(); + assert_eq!( + resp.state_changes.unwrap()[0], + LedgerEntryChange::Created { key: "AAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWg==".to_string(), after: "AAAAZAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=".to_string() }, + ); assert_eq!(resp.min_resource_fee, 100_000_000); }