From 8e45067172704cc8ba5cd0a1058ead135cbd930b Mon Sep 17 00:00:00 2001 From: Tyera Date: Fri, 6 Jan 2023 23:04:34 -0700 Subject: [PATCH] Add rust client support for getRecentPrioritizationFees (#29558) --- rpc-client-api/src/request.rs | 2 ++ rpc-client/src/mock_sender.rs | 8 +++-- rpc-client/src/nonblocking/rpc_client.rs | 43 ++++++++++++++++++++++++ rpc-client/src/rpc_client.rs | 35 +++++++++++++++++++ 4 files changed, 86 insertions(+), 2 deletions(-) diff --git a/rpc-client-api/src/request.rs b/rpc-client-api/src/request.rs index 8980c7d1c50308..e9c6ef9b388cae 100644 --- a/rpc-client-api/src/request.rs +++ b/rpc-client-api/src/request.rs @@ -79,6 +79,7 @@ pub enum RpcRequest { )] GetRecentBlockhash, GetRecentPerformanceSamples, + GetRecentPrioritizationFees, GetHighestSnapshotSlot, #[deprecated( since = "1.9.0", @@ -158,6 +159,7 @@ impl fmt::Display for RpcRequest { RpcRequest::GetProgramAccounts => "getProgramAccounts", RpcRequest::GetRecentBlockhash => "getRecentBlockhash", RpcRequest::GetRecentPerformanceSamples => "getRecentPerformanceSamples", + RpcRequest::GetRecentPrioritizationFees => "getRecentPrioritizationFees", RpcRequest::GetHighestSnapshotSlot => "getHighestSnapshotSlot", RpcRequest::GetSnapshotSlot => "getSnapshotSlot", RpcRequest::GetSignaturesForAddress => "getSignaturesForAddress", diff --git a/rpc-client/src/mock_sender.rs b/rpc-client/src/mock_sender.rs index 63198e735944a7..51fee5d092d2de 100644 --- a/rpc-client/src/mock_sender.rs +++ b/rpc-client/src/mock_sender.rs @@ -13,8 +13,8 @@ use { Response, RpcAccountBalance, RpcBlockProduction, RpcBlockProductionRange, RpcBlockhash, RpcConfirmedTransactionStatusWithSignature, RpcContactInfo, RpcFees, RpcIdentity, RpcInflationGovernor, RpcInflationRate, RpcInflationReward, RpcKeyedAccount, - RpcPerfSample, RpcResponseContext, RpcSimulateTransactionResult, RpcSnapshotSlotInfo, - RpcStakeActivation, RpcSupply, RpcVersionInfo, RpcVoteAccountInfo, + RpcPerfSample, RpcPrioritizationFee, RpcResponseContext, RpcSimulateTransactionResult, + RpcSnapshotSlotInfo, RpcStakeActivation, RpcSupply, RpcVersionInfo, RpcVoteAccountInfo, RpcVoteAccountStatus, StakeActivationState, }, }, @@ -419,6 +419,10 @@ impl RpcSender for MockSender { num_slots: 123, sample_period_secs: 60, }])?, + "getRecentPrioritizationFees" => serde_json::to_value(vec![RpcPrioritizationFee { + slot: 123_456_789, + prioritization_fee: 10_000, + }])?, "getIdentity" => serde_json::to_value(RpcIdentity { identity: PUBKEY.to_string(), })?, diff --git a/rpc-client/src/nonblocking/rpc_client.rs b/rpc-client/src/nonblocking/rpc_client.rs index d45cd789452921..1eeb3ab4a00ac4 100644 --- a/rpc-client/src/nonblocking/rpc_client.rs +++ b/rpc-client/src/nonblocking/rpc_client.rs @@ -3535,6 +3535,49 @@ impl RpcClient { .await } + /// Returns a list of minimum prioritization fees from recent blocks. + /// Takes an optional vector of addresses; if any addresses are provided, the response will + /// reflect the minimum prioritization fee to land a transaction locking all of the provided + /// accounts as writable. + /// + /// Currently, a node's prioritization-fee cache stores data from up to 150 blocks. + /// + /// # RPC Reference + /// + /// This method corresponds directly to the [`getRecentPrioritizationFees`] RPC method. + /// + /// [`getRecentPrioritizationFees`]: https://docs.solana.com/developing/clients/jsonrpc-api#getrecentprioritizationfees + /// + /// # Examples + /// + /// ``` + /// # use solana_rpc_client_api::client_error::Error; + /// # use solana_rpc_client::nonblocking::rpc_client::RpcClient; + /// # use solana_sdk::signature::{Keypair, Signer}; + /// # futures::executor::block_on(async { + /// # let rpc_client = RpcClient::new_mock("succeeds".to_string()); + /// # let alice = Keypair::new(); + /// # let bob = Keypair::new(); + /// let addresses = vec![alice.pubkey(), bob.pubkey()]; + /// let prioritization_fees = rpc_client.get_recent_prioritization_fees( + /// &addresses, + /// ).await?; + /// # Ok::<(), Error>(()) + /// # })?; + /// # Ok::<(), Error>(()) + /// ``` + pub async fn get_recent_prioritization_fees( + &self, + addresses: &[Pubkey], + ) -> ClientResult> { + let addresses: Vec<_> = addresses + .iter() + .map(|address| address.to_string()) + .collect(); + self.send(RpcRequest::GetRecentPrioritizationFees, json!([addresses])) + .await + } + /// Returns the identity pubkey for the current node. /// /// # RPC Reference diff --git a/rpc-client/src/rpc_client.rs b/rpc-client/src/rpc_client.rs index 528fdf2d71033f..081818d0910581 100644 --- a/rpc-client/src/rpc_client.rs +++ b/rpc-client/src/rpc_client.rs @@ -2916,6 +2916,41 @@ impl RpcClient { self.invoke((self.rpc_client.as_ref()).get_recent_performance_samples(limit)) } + /// Returns a list of minimum prioritization fees from recent blocks. + /// Takes an optional vector of addresses; if any addresses are provided, the response will + /// reflect the minimum prioritization fee to land a transaction locking all of the provided + /// accounts as writable. + /// + /// Currently, a node's prioritization-fee cache stores data from up to 150 blocks. + /// + /// # RPC Reference + /// + /// This method corresponds directly to the [`getRecentPrioritizationFees`] RPC method. + /// + /// [`getRecentPrioritizationFees`]: https://docs.solana.com/developing/clients/jsonrpc-api#getrecentprioritizationfees + /// + /// # Examples + /// + /// ``` + /// # use solana_rpc_client_api::client_error::Error; + /// # use solana_rpc_client::rpc_client::RpcClient; + /// # use solana_sdk::signature::{Keypair, Signer}; + /// # let rpc_client = RpcClient::new_mock("succeeds".to_string()); + /// # let alice = Keypair::new(); + /// # let bob = Keypair::new(); + /// let addresses = vec![alice.pubkey(), bob.pubkey()]; + /// let prioritization_fees = rpc_client.get_recent_prioritization_fees( + /// &addresses, + /// )?; + /// # Ok::<(), Error>(()) + /// ``` + pub fn get_recent_prioritization_fees( + &self, + addresses: &[Pubkey], + ) -> ClientResult> { + self.invoke((self.rpc_client.as_ref()).get_recent_prioritization_fees(addresses)) + } + /// Returns the identity pubkey for the current node. /// /// # RPC Reference