From 2feaaf092380ae2951735e1fd0e44de9d5a0ef92 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Mon, 27 Jan 2025 21:57:56 -0800 Subject: [PATCH] view service: add LatestSwaps rpc and proto defintions --- crates/proto/src/gen/penumbra.view.v1.rs | 145 ++++++++ .../proto/src/gen/penumbra.view.v1.serde.rs | 325 ++++++++++++++++++ .../proto/src/gen/proto_descriptor.bin.no_lfs | Bin 624793 -> 643798 bytes proto/penumbra/penumbra/view/v1/view.proto | 28 ++ 4 files changed, 498 insertions(+) diff --git a/crates/proto/src/gen/penumbra.view.v1.rs b/crates/proto/src/gen/penumbra.view.v1.rs index 23f30633a9..131b4cd346 100644 --- a/crates/proto/src/gen/penumbra.view.v1.rs +++ b/crates/proto/src/gen/penumbra.view.v1.rs @@ -1915,6 +1915,66 @@ impl ::prost::Name for UnbondingTokensByAddressIndexResponse { "/penumbra.view.v1.UnbondingTokensByAddressIndexResponse".into() } } +/// Requests the latest swaps controlled by the user's wallet. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct LatestSwapsRequest { + /// If present, filter balances to only include the account specified by the `AddressIndex`. + #[prost(message, optional, tag = "1")] + pub account_filter: ::core::option::Option< + super::super::core::keys::v1::AddressIndex, + >, + /// If present, filter balances to only include trading activity on the specified pair. + #[prost(message, optional, tag = "2")] + pub pair: ::core::option::Option< + super::super::core::component::dex::v1::DirectedTradingPair, + >, + /// If present, limit the responses to activity that occured after this block height. + #[prost(uint64, tag = "3")] + pub after_height: u64, + /// Limit the response to the last entries within `response_limit`. + #[prost(uint64, tag = "4")] + pub response_limit: u64, +} +impl ::prost::Name for LatestSwapsRequest { + const NAME: &'static str = "LatestSwapsRequest"; + const PACKAGE: &'static str = "penumbra.view.v1"; + fn full_name() -> ::prost::alloc::string::String { + "penumbra.view.v1.LatestSwapsRequest".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/penumbra.view.v1.LatestSwapsRequest".into() + } +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct LatestSwapsResponse { + /// The trading pair involved in this swap. + #[prost(message, optional, tag = "1")] + pub pair: ::core::option::Option< + super::super::core::component::dex::v1::DirectedTradingPair, + >, + /// The input value for the swap. + #[prost(message, optional, tag = "2")] + pub input: ::core::option::Option, + /// The output value received from the swap. + #[prost(message, optional, tag = "3")] + pub output: ::core::option::Option, + /// The block height at which this swap occurred. + #[prost(uint64, tag = "4")] + pub block_height: u64, + /// The hash of the transaction that was broadcast. + #[prost(message, optional, tag = "5")] + pub id: ::core::option::Option, +} +impl ::prost::Name for LatestSwapsResponse { + const NAME: &'static str = "LatestSwapsResponse"; + const PACKAGE: &'static str = "penumbra.view.v1"; + fn full_name() -> ::prost::alloc::string::String { + "penumbra.view.v1.LatestSwapsResponse".into() + } + fn type_url() -> ::prost::alloc::string::String { + "/penumbra.view.v1.LatestSwapsResponse".into() + } +} /// Generated client implementations. #[cfg(feature = "rpc")] pub mod view_service_client { @@ -2854,6 +2914,31 @@ pub mod view_service_client { .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "Auctions")); self.inner.server_streaming(req, path, codec).await } + /// Gets the latest swaps controlled by the user's wallet. + pub async fn latest_swaps( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response>, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::unknown( + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/penumbra.view.v1.ViewService/LatestSwaps", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "LatestSwaps")); + self.inner.server_streaming(req, path, codec).await + } } } /// Generated server implementations. @@ -3227,6 +3312,20 @@ pub mod view_service_server { &self, request: tonic::Request, ) -> std::result::Result, tonic::Status>; + /// Server streaming response type for the LatestSwaps method. + type LatestSwapsStream: tonic::codegen::tokio_stream::Stream< + Item = std::result::Result, + > + + std::marker::Send + + 'static; + /// Gets the latest swaps controlled by the user's wallet. + async fn latest_swaps( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; } /// The view RPC is used by a view client, who wants to do some /// transaction-related actions, to request data from a view service, which is @@ -4703,6 +4802,52 @@ pub mod view_service_server { }; Box::pin(fut) } + "/penumbra.view.v1.ViewService/LatestSwaps" => { + #[allow(non_camel_case_types)] + struct LatestSwapsSvc(pub Arc); + impl< + T: ViewService, + > tonic::server::ServerStreamingService + for LatestSwapsSvc { + type Response = super::LatestSwapsResponse; + type ResponseStream = T::LatestSwapsStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::latest_swaps(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = LatestSwapsSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } _ => { Box::pin(async move { let mut response = http::Response::new(empty_body()); diff --git a/crates/proto/src/gen/penumbra.view.v1.serde.rs b/crates/proto/src/gen/penumbra.view.v1.serde.rs index 487270c0d6..01e5c88aa6 100644 --- a/crates/proto/src/gen/penumbra.view.v1.serde.rs +++ b/crates/proto/src/gen/penumbra.view.v1.serde.rs @@ -3289,6 +3289,331 @@ impl<'de> serde::Deserialize<'de> for IndexByAddressResponse { deserializer.deserialize_struct("penumbra.view.v1.IndexByAddressResponse", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for LatestSwapsRequest { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.account_filter.is_some() { + len += 1; + } + if self.pair.is_some() { + len += 1; + } + if self.after_height != 0 { + len += 1; + } + if self.response_limit != 0 { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.view.v1.LatestSwapsRequest", len)?; + if let Some(v) = self.account_filter.as_ref() { + struct_ser.serialize_field("accountFilter", v)?; + } + if let Some(v) = self.pair.as_ref() { + struct_ser.serialize_field("pair", v)?; + } + if self.after_height != 0 { + #[allow(clippy::needless_borrow)] + #[allow(clippy::needless_borrows_for_generic_args)] + struct_ser.serialize_field("afterHeight", ToString::to_string(&self.after_height).as_str())?; + } + if self.response_limit != 0 { + #[allow(clippy::needless_borrow)] + #[allow(clippy::needless_borrows_for_generic_args)] + struct_ser.serialize_field("responseLimit", ToString::to_string(&self.response_limit).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for LatestSwapsRequest { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "account_filter", + "accountFilter", + "pair", + "after_height", + "afterHeight", + "response_limit", + "responseLimit", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + AccountFilter, + Pair, + AfterHeight, + ResponseLimit, + __SkipField__, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "accountFilter" | "account_filter" => Ok(GeneratedField::AccountFilter), + "pair" => Ok(GeneratedField::Pair), + "afterHeight" | "after_height" => Ok(GeneratedField::AfterHeight), + "responseLimit" | "response_limit" => Ok(GeneratedField::ResponseLimit), + _ => Ok(GeneratedField::__SkipField__), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = LatestSwapsRequest; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.view.v1.LatestSwapsRequest") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut account_filter__ = None; + let mut pair__ = None; + let mut after_height__ = None; + let mut response_limit__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::AccountFilter => { + if account_filter__.is_some() { + return Err(serde::de::Error::duplicate_field("accountFilter")); + } + account_filter__ = map_.next_value()?; + } + GeneratedField::Pair => { + if pair__.is_some() { + return Err(serde::de::Error::duplicate_field("pair")); + } + pair__ = map_.next_value()?; + } + GeneratedField::AfterHeight => { + if after_height__.is_some() { + return Err(serde::de::Error::duplicate_field("afterHeight")); + } + after_height__ = + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::ResponseLimit => { + if response_limit__.is_some() { + return Err(serde::de::Error::duplicate_field("responseLimit")); + } + response_limit__ = + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::__SkipField__ => { + let _ = map_.next_value::()?; + } + } + } + Ok(LatestSwapsRequest { + account_filter: account_filter__, + pair: pair__, + after_height: after_height__.unwrap_or_default(), + response_limit: response_limit__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.view.v1.LatestSwapsRequest", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for LatestSwapsResponse { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.pair.is_some() { + len += 1; + } + if self.input.is_some() { + len += 1; + } + if self.output.is_some() { + len += 1; + } + if self.block_height != 0 { + len += 1; + } + if self.id.is_some() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.view.v1.LatestSwapsResponse", len)?; + if let Some(v) = self.pair.as_ref() { + struct_ser.serialize_field("pair", v)?; + } + if let Some(v) = self.input.as_ref() { + struct_ser.serialize_field("input", v)?; + } + if let Some(v) = self.output.as_ref() { + struct_ser.serialize_field("output", v)?; + } + if self.block_height != 0 { + #[allow(clippy::needless_borrow)] + #[allow(clippy::needless_borrows_for_generic_args)] + struct_ser.serialize_field("blockHeight", ToString::to_string(&self.block_height).as_str())?; + } + if let Some(v) = self.id.as_ref() { + struct_ser.serialize_field("id", v)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for LatestSwapsResponse { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "pair", + "input", + "output", + "block_height", + "blockHeight", + "id", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Pair, + Input, + Output, + BlockHeight, + Id, + __SkipField__, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "pair" => Ok(GeneratedField::Pair), + "input" => Ok(GeneratedField::Input), + "output" => Ok(GeneratedField::Output), + "blockHeight" | "block_height" => Ok(GeneratedField::BlockHeight), + "id" => Ok(GeneratedField::Id), + _ => Ok(GeneratedField::__SkipField__), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = LatestSwapsResponse; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.view.v1.LatestSwapsResponse") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut pair__ = None; + let mut input__ = None; + let mut output__ = None; + let mut block_height__ = None; + let mut id__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Pair => { + if pair__.is_some() { + return Err(serde::de::Error::duplicate_field("pair")); + } + pair__ = map_.next_value()?; + } + GeneratedField::Input => { + if input__.is_some() { + return Err(serde::de::Error::duplicate_field("input")); + } + input__ = map_.next_value()?; + } + GeneratedField::Output => { + if output__.is_some() { + return Err(serde::de::Error::duplicate_field("output")); + } + output__ = map_.next_value()?; + } + GeneratedField::BlockHeight => { + if block_height__.is_some() { + return Err(serde::de::Error::duplicate_field("blockHeight")); + } + block_height__ = + Some(map_.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + GeneratedField::Id => { + if id__.is_some() { + return Err(serde::de::Error::duplicate_field("id")); + } + id__ = map_.next_value()?; + } + GeneratedField::__SkipField__ => { + let _ = map_.next_value::()?; + } + } + } + Ok(LatestSwapsResponse { + pair: pair__, + input: input__, + output: output__, + block_height: block_height__.unwrap_or_default(), + id: id__, + }) + } + } + deserializer.deserialize_struct("penumbra.view.v1.LatestSwapsResponse", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for NoteByCommitmentRequest { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result diff --git a/crates/proto/src/gen/proto_descriptor.bin.no_lfs b/crates/proto/src/gen/proto_descriptor.bin.no_lfs index 5d6e1746afd3f6cc5a13ed634fd27beedf8530dd..f613403ab9be6e66c341fd681cd9f41366432053 100644 GIT binary patch delta 47816 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 delta 29732 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 z