wasm_client_solana 0.11.2

A wasm compatible solana rpc and pubsub client
Documentation
use serde::Deserialize;
use serde::Serializer;
use serde_tuple::Serialize_tuple;
use solana_pubkey::Pubkey;

use crate::impl_http_method;
use crate::rpc_response::RpcPrioritizationFee;

fn serialize_pubkey_strings<S: Serializer>(
	accounts: &Option<Vec<Pubkey>>,
	serializer: S,
) -> Result<S::Ok, S::Error> {
	match accounts {
		Some(pubkeys) => serializer.collect_seq(pubkeys.iter().map(Pubkey::to_string)),
		None => serializer.serialize_none(),
	}
}

#[derive(Debug, Serialize_tuple)]
pub struct GetRecentPrioritizationFeesRequest {
	#[serde(serialize_with = "serialize_pubkey_strings")]
	accounts: Option<Vec<Pubkey>>,
}

impl_http_method!(
	GetRecentPrioritizationFeesRequest,
	"getRecentPrioritizationFees"
);

impl Default for GetRecentPrioritizationFeesRequest {
	fn default() -> Self {
		Self::new()
	}
}

impl GetRecentPrioritizationFeesRequest {
	pub fn new() -> Self {
		GetRecentPrioritizationFeesRequest { accounts: None }
	}

	pub fn new_with_accounts(accounts: Vec<Pubkey>) -> Self {
		GetRecentPrioritizationFeesRequest {
			accounts: Some(accounts),
		}
	}
}

#[derive(Debug, Deserialize, PartialEq, Eq)]
pub struct GetRecentPrioritizationFeesResponse(Vec<RpcPrioritizationFee>);

impl From<GetRecentPrioritizationFeesResponse> for Vec<RpcPrioritizationFee> {
	fn from(value: GetRecentPrioritizationFeesResponse) -> Self {
		value.0
	}
}

#[cfg(test)]
mod tests {
	use assert2::check;
	use solana_pubkey::pubkey;

	use super::*;
	use crate::ClientRequest;
	use crate::ClientResponse;
	use crate::methods::HttpMethod;

	#[test]
	fn request() {
		let request = ClientRequest::builder()
			.method(GetRecentPrioritizationFeesRequest::NAME)
			.id(1)
			.params(GetRecentPrioritizationFeesRequest::new_with_accounts(vec![
				pubkey!("CxELquR1gPP8wHe33gZ4QxqGB3sZ9RSwsJ2KshVewkFY"),
			]))
			.build();

		insta::assert_compact_json_snapshot!(request, @r###"
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getRecentPrioritizationFees",
    "params": [
      [
        "CxELquR1gPP8wHe33gZ4QxqGB3sZ9RSwsJ2KshVewkFY"
      ]
    ]
  }
  "###);
	}

	#[test]
	fn response() {
		let raw_json = r#"{"jsonrpc":"2.0","result":[{"slot":348125,"prioritizationFee":0},{"slot":348126,"prioritizationFee":1000},{"slot":348127,"prioritizationFee":500},{"slot":348128,"prioritizationFee":0},{"slot":348129,"prioritizationFee":1234}],"id":1}"#;

		let response: ClientResponse<GetRecentPrioritizationFeesResponse> =
			serde_json::from_str(raw_json).unwrap();

		check!(response.id == 1);
		check!(response.jsonrpc == "2.0");
		check!(
			response.result.0
				== vec![
					RpcPrioritizationFee {
						slot: 348_125,
						prioritization_fee: 0,
					},
					RpcPrioritizationFee {
						slot: 348_126,
						prioritization_fee: 1000
					},
					RpcPrioritizationFee {
						slot: 348_127,
						prioritization_fee: 500
					},
					RpcPrioritizationFee {
						slot: 348_128,
						prioritization_fee: 0
					},
					RpcPrioritizationFee {
						slot: 348_129,
						prioritization_fee: 1234
					}
				]
		);
	}
}