From 7be8af5f409f0ac381a17c415040a8f884a82acf Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Thu, 20 Oct 2022 19:41:28 -0600 Subject: [PATCH] Fix RpcClient MemCmp filter version mapping (#28499) * Add VersionReq struct to handle multiple version checks * Use VersionReq to fix MemCmp filter breakage * Simplify if case --- rpc-client-api/src/filter.rs | 7 ++++++- rpc-client-api/src/lib.rs | 1 + rpc-client-api/src/version_req.rs | 20 ++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 rpc-client-api/src/version_req.rs diff --git a/rpc-client-api/src/filter.rs b/rpc-client-api/src/filter.rs index 3655e2db43..29c85d2c4e 100644 --- a/rpc-client-api/src/filter.rs +++ b/rpc-client-api/src/filter.rs @@ -1,5 +1,6 @@ #![allow(deprecated)] use { + crate::version_req::VersionReq, solana_sdk::account::{AccountSharedData, ReadableAccount}, spl_token_2022::{generic_token_account::GenericTokenAccount, state::Account}, std::borrow::Cow, @@ -263,7 +264,11 @@ pub fn maybe_map_filters( node_version: Option, filters: &mut [RpcFilterType], ) -> Result<(), String> { - if node_version.is_none() || node_version.unwrap() < semver::Version::new(1, 11, 2) { + let version_reqs = VersionReq::from_strs(&["<1.11.2", "~1.13"])?; + let needs_mapping = node_version + .map(|version| version_reqs.matches_any(&version)) + .unwrap_or(true); + if needs_mapping { for filter in filters.iter_mut() { if let RpcFilterType::Memcmp(memcmp) = filter { match &memcmp.bytes { diff --git a/rpc-client-api/src/lib.rs b/rpc-client-api/src/lib.rs index 6db2639455..9be15cbab4 100644 --- a/rpc-client-api/src/lib.rs +++ b/rpc-client-api/src/lib.rs @@ -8,6 +8,7 @@ pub mod error_object; pub mod filter; pub mod request; pub mod response; +pub mod version_req; #[macro_use] extern crate serde_derive; diff --git a/rpc-client-api/src/version_req.rs b/rpc-client-api/src/version_req.rs new file mode 100644 index 0000000000..515f85b359 --- /dev/null +++ b/rpc-client-api/src/version_req.rs @@ -0,0 +1,20 @@ +pub(crate) struct VersionReq(Vec); + +impl VersionReq { + pub(crate) fn from_strs(versions: &[T]) -> Result + where + T: AsRef + std::fmt::Debug, + { + let mut version_reqs = vec![]; + for version in versions { + let version_req = semver::VersionReq::parse(version.as_ref()) + .map_err(|err| format!("Could not parse version {:?}: {:?}", version, err))?; + version_reqs.push(version_req); + } + Ok(Self(version_reqs)) + } + + pub(crate) fn matches_any(&self, version: &semver::Version) -> bool { + self.0.iter().any(|r| r.matches(version)) + } +}