Skip to content

Commit

Permalink
Fix RpcClient MemCmp filter version mapping (solana-labs#28499)
Browse files Browse the repository at this point in the history
* Add VersionReq struct to handle multiple version checks

* Use VersionReq to fix MemCmp filter breakage

* Simplify if case
  • Loading branch information
CriesofCarrots authored and gnapoli23 committed Dec 16, 2022
1 parent 14c4f80 commit bda16fa
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 1 deletion.
7 changes: 6 additions & 1 deletion rpc-client-api/src/filter.rs
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -263,7 +264,11 @@ pub fn maybe_map_filters(
node_version: Option<semver::Version>,
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 {
Expand Down
1 change: 1 addition & 0 deletions rpc-client-api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
20 changes: 20 additions & 0 deletions rpc-client-api/src/version_req.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
pub(crate) struct VersionReq(Vec<semver::VersionReq>);

impl VersionReq {
pub(crate) fn from_strs<T>(versions: &[T]) -> Result<Self, String>
where
T: AsRef<str> + 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))
}
}

0 comments on commit bda16fa

Please sign in to comment.