From 6b3a3985bbacaddc204ac02ffa5b49d34e9e4bf2 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Thu, 18 Apr 2024 06:32:46 -0700 Subject: [PATCH 1/5] protos(auction): define rpc service and messages --- proto/penumbra/penumbra/view/v1/view.proto | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/proto/penumbra/penumbra/view/v1/view.proto b/proto/penumbra/penumbra/view/v1/view.proto index f3cf656701..7b24081c13 100644 --- a/proto/penumbra/penumbra/view/v1/view.proto +++ b/proto/penumbra/penumbra/view/v1/view.proto @@ -15,6 +15,8 @@ import "penumbra/core/num/v1/num.proto"; import "penumbra/core/transaction/v1/transaction.proto"; import "penumbra/core/txhash/v1/txhash.proto"; import "penumbra/crypto/tct/v1/tct.proto"; +import "penumbra/core/component/auction/v1alpha1/auction.proto"; +import "google/protobuf/any.proto"; // 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 @@ -140,6 +142,34 @@ service ViewService { // Get unbonding tokens for the given address index, optionally filtered by // whether the tokens are currently claimable. rpc UnbondingTokensByAddressIndex(UnbondingTokensByAddressIndexRequest) returns (stream UnbondingTokensByAddressIndexResponse); + + // Gets the auctions controlled by the user's wallet. + rpc Auctions(AuctionsRequest) returns (stream AuctionsResponse); +} + +message AuctionsRequest { + // If present, filter balances to only include the account specified by the `AddressIndex`. + core.keys.v1.AddressIndex account_filter = 1; + // If present, include inactive auctions as well as active ones. + bool include_inactive = 2; + // If set, query a fullnode for the current state of the auctions. + bool query_latest_state = 3; +} + +message AuctionsResponse { + core.component.auction.v1alpha1.AuctionId id = 1; + // The note recording the auction NFT. + SpendableNoteRecord note_record = 4; + + // The state of the returned auction. + // + // Only present when `query_latest_state` was provided. + google.protobuf.Any auction = 2; + // The state of any DEX positions relevant to the returned auction. + // + // Only present when `query_latest_state` was provided. + // Could be empty, depending on the auction state. + repeated core.component.dex.v1.Position positions = 3; } message AuthorizeAndBuildRequest { From 040a1e02dacdb59d8facdc2c3e390781ac19d20e Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Thu, 18 Apr 2024 06:33:09 -0700 Subject: [PATCH 2/5] regenerate protos --- crates/proto/src/gen/penumbra.view.v1.rs | 137 +++++++++ .../proto/src/gen/penumbra.view.v1.serde.rs | 279 ++++++++++++++++++ .../proto/src/gen/proto_descriptor.bin.no_lfs | Bin 390219 -> 392021 bytes 3 files changed, 416 insertions(+) diff --git a/crates/proto/src/gen/penumbra.view.v1.rs b/crates/proto/src/gen/penumbra.view.v1.rs index 6ee1f98e77..d21151965b 100644 --- a/crates/proto/src/gen/penumbra.view.v1.rs +++ b/crates/proto/src/gen/penumbra.view.v1.rs @@ -1,5 +1,58 @@ #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] +pub struct AuctionsRequest { + /// 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, include inactive auctions as well as active ones. + #[prost(bool, tag = "2")] + pub include_inactive: bool, + /// If set, query a fullnode for the current state of the auctions. + #[prost(bool, tag = "3")] + pub query_latest_state: bool, +} +impl ::prost::Name for AuctionsRequest { + const NAME: &'static str = "AuctionsRequest"; + const PACKAGE: &'static str = "penumbra.view.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.view.v1.{}", Self::NAME) + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AuctionsResponse { + #[prost(message, optional, tag = "1")] + pub id: ::core::option::Option< + super::super::core::component::auction::v1alpha1::AuctionId, + >, + /// The note recording the auction NFT. + #[prost(message, optional, tag = "4")] + pub note_record: ::core::option::Option, + /// The state of the returned auction. + /// + /// Only present when `query_latest_state` was provided. + #[prost(message, optional, tag = "2")] + pub auction: ::core::option::Option<::pbjson_types::Any>, + /// The state of any DEX positions relevant to the returned auction. + /// + /// Only present when `query_latest_state` was provided. + /// Could be empty, depending on the auction state. + #[prost(message, repeated, tag = "3")] + pub positions: ::prost::alloc::vec::Vec< + super::super::core::component::dex::v1::Position, + >, +} +impl ::prost::Name for AuctionsResponse { + const NAME: &'static str = "AuctionsResponse"; + const PACKAGE: &'static str = "penumbra.view.v1"; + fn full_name() -> ::prost::alloc::string::String { + ::prost::alloc::format!("penumbra.view.v1.{}", Self::NAME) + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct AuthorizeAndBuildRequest { /// The transaction plan to authorize and build. #[prost(message, optional, tag = "1")] @@ -2457,6 +2510,32 @@ pub mod view_service_client { ); self.inner.server_streaming(req, path, codec).await } + /// Gets the auctions controlled by the user's wallet. + pub async fn auctions( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response>, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::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/Auctions", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("penumbra.view.v1.ViewService", "Auctions")); + self.inner.server_streaming(req, path, codec).await + } } } /// Generated server implementations. @@ -2805,6 +2884,17 @@ pub mod view_service_server { tonic::Response, tonic::Status, >; + /// Server streaming response type for the Auctions method. + type AuctionsStream: tonic::codegen::tokio_stream::Stream< + Item = std::result::Result, + > + + Send + + 'static; + /// Gets the auctions controlled by the user's wallet. + async fn auctions( + &self, + request: tonic::Request, + ) -> std::result::Result, 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 @@ -4220,6 +4310,53 @@ pub mod view_service_server { }; Box::pin(fut) } + "/penumbra.view.v1.ViewService/Auctions" => { + #[allow(non_camel_case_types)] + struct AuctionsSvc(pub Arc); + impl< + T: ViewService, + > tonic::server::ServerStreamingService + for AuctionsSvc { + type Response = super::AuctionsResponse; + type ResponseStream = T::AuctionsStream; + 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 { + ::auctions(&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 inner = inner.0; + let method = AuctionsSvc(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 { Ok( diff --git a/crates/proto/src/gen/penumbra.view.v1.serde.rs b/crates/proto/src/gen/penumbra.view.v1.serde.rs index 7f4bce737c..1968cf511a 100644 --- a/crates/proto/src/gen/penumbra.view.v1.serde.rs +++ b/crates/proto/src/gen/penumbra.view.v1.serde.rs @@ -847,6 +847,285 @@ impl<'de> serde::Deserialize<'de> for AssetsResponse { deserializer.deserialize_struct("penumbra.view.v1.AssetsResponse", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for AuctionsRequest { + #[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.include_inactive { + len += 1; + } + if self.query_latest_state { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.view.v1.AuctionsRequest", len)?; + if let Some(v) = self.account_filter.as_ref() { + struct_ser.serialize_field("accountFilter", v)?; + } + if self.include_inactive { + struct_ser.serialize_field("includeInactive", &self.include_inactive)?; + } + if self.query_latest_state { + struct_ser.serialize_field("queryLatestState", &self.query_latest_state)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for AuctionsRequest { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "account_filter", + "accountFilter", + "include_inactive", + "includeInactive", + "query_latest_state", + "queryLatestState", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + AccountFilter, + IncludeInactive, + QueryLatestState, + __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), + "includeInactive" | "include_inactive" => Ok(GeneratedField::IncludeInactive), + "queryLatestState" | "query_latest_state" => Ok(GeneratedField::QueryLatestState), + _ => Ok(GeneratedField::__SkipField__), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = AuctionsRequest; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.view.v1.AuctionsRequest") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut account_filter__ = None; + let mut include_inactive__ = None; + let mut query_latest_state__ = 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::IncludeInactive => { + if include_inactive__.is_some() { + return Err(serde::de::Error::duplicate_field("includeInactive")); + } + include_inactive__ = Some(map_.next_value()?); + } + GeneratedField::QueryLatestState => { + if query_latest_state__.is_some() { + return Err(serde::de::Error::duplicate_field("queryLatestState")); + } + query_latest_state__ = Some(map_.next_value()?); + } + GeneratedField::__SkipField__ => { + let _ = map_.next_value::()?; + } + } + } + Ok(AuctionsRequest { + account_filter: account_filter__, + include_inactive: include_inactive__.unwrap_or_default(), + query_latest_state: query_latest_state__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.view.v1.AuctionsRequest", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for AuctionsResponse { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.id.is_some() { + len += 1; + } + if self.note_record.is_some() { + len += 1; + } + if self.auction.is_some() { + len += 1; + } + if !self.positions.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.view.v1.AuctionsResponse", len)?; + if let Some(v) = self.id.as_ref() { + struct_ser.serialize_field("id", v)?; + } + if let Some(v) = self.note_record.as_ref() { + struct_ser.serialize_field("noteRecord", v)?; + } + if let Some(v) = self.auction.as_ref() { + struct_ser.serialize_field("auction", v)?; + } + if !self.positions.is_empty() { + struct_ser.serialize_field("positions", &self.positions)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for AuctionsResponse { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "id", + "note_record", + "noteRecord", + "auction", + "positions", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Id, + NoteRecord, + Auction, + Positions, + __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 { + "id" => Ok(GeneratedField::Id), + "noteRecord" | "note_record" => Ok(GeneratedField::NoteRecord), + "auction" => Ok(GeneratedField::Auction), + "positions" => Ok(GeneratedField::Positions), + _ => Ok(GeneratedField::__SkipField__), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = AuctionsResponse; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.view.v1.AuctionsResponse") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut id__ = None; + let mut note_record__ = None; + let mut auction__ = None; + let mut positions__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::Id => { + if id__.is_some() { + return Err(serde::de::Error::duplicate_field("id")); + } + id__ = map_.next_value()?; + } + GeneratedField::NoteRecord => { + if note_record__.is_some() { + return Err(serde::de::Error::duplicate_field("noteRecord")); + } + note_record__ = map_.next_value()?; + } + GeneratedField::Auction => { + if auction__.is_some() { + return Err(serde::de::Error::duplicate_field("auction")); + } + auction__ = map_.next_value()?; + } + GeneratedField::Positions => { + if positions__.is_some() { + return Err(serde::de::Error::duplicate_field("positions")); + } + positions__ = Some(map_.next_value()?); + } + GeneratedField::__SkipField__ => { + let _ = map_.next_value::()?; + } + } + } + Ok(AuctionsResponse { + id: id__, + note_record: note_record__, + auction: auction__, + positions: positions__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.view.v1.AuctionsResponse", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for AuthorizeAndBuildRequest { #[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 db36c4744d3d353d9eaf770c59d25f37bcd1fc2e..1a1f858a53ccaccb209e049439ae277172fda8a4 100644 GIT binary patch delta 14840 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 delta 13464 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 VH6WNvR95y+gJ0b Date: Thu, 18 Apr 2024 07:14:15 -0700 Subject: [PATCH 3/5] view service scaffold --- crates/view/src/service.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/crates/view/src/service.rs b/crates/view/src/service.rs index 668a318419..2fb8946e26 100644 --- a/crates/view/src/service.rs +++ b/crates/view/src/service.rs @@ -387,6 +387,15 @@ impl ViewService for ViewServer { > + Send, >, >; + type AuctionsStream = + Pin> + Send>>; + + async fn auctions( + &self, + request: tonic::Request, + ) -> Result, tonic::Status> { + todo!() + } async fn broadcast_transaction( &self, From a5f5c7e05a12fc4c066f441f13d8fbf6c8a0f710 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Thu, 18 Apr 2024 07:22:50 -0700 Subject: [PATCH 4/5] unimplemented view service impl --- crates/view/src/service.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/view/src/service.rs b/crates/view/src/service.rs index 2fb8946e26..c43f46ce0c 100644 --- a/crates/view/src/service.rs +++ b/crates/view/src/service.rs @@ -394,7 +394,7 @@ impl ViewService for ViewServer { &self, request: tonic::Request, ) -> Result, tonic::Status> { - todo!() + unimplemented!("auctions") } async fn broadcast_transaction( From 98e43d160ada0998f92ea527c04a21650fc53388 Mon Sep 17 00:00:00 2001 From: Tal Derei Date: Fri, 19 Apr 2024 07:59:05 -0700 Subject: [PATCH 5/5] silence unused var in stub --- crates/view/src/service.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/view/src/service.rs b/crates/view/src/service.rs index c43f46ce0c..5f66711c15 100644 --- a/crates/view/src/service.rs +++ b/crates/view/src/service.rs @@ -392,7 +392,7 @@ impl ViewService for ViewServer { async fn auctions( &self, - request: tonic::Request, + _request: tonic::Request, ) -> Result, tonic::Status> { unimplemented!("auctions") }