From 3bef4f9d683ee2a8f49cb46142fa5fa174c624de Mon Sep 17 00:00:00 2001 From: redshiftzero Date: Wed, 15 Nov 2023 18:15:05 -0500 Subject: [PATCH] add view struct for memos with `AddressView` for sender --- .../src/command/view/transaction_hashes.rs | 2 +- crates/bin/pcli/src/command/view/tx.rs | 2 +- crates/core/transaction/src/lib.rs | 2 +- crates/core/transaction/src/transaction.rs | 16 +- crates/core/transaction/src/view.rs | 40 +- .../src/view/transaction_perspective.rs | 9 +- .../gen/penumbra.core.transaction.v1alpha1.rs | 12 +- ...enumbra.core.transaction.v1alpha1.serde.rs | 109 ++++ .../proto/src/gen/proto_descriptor.bin.no_lfs | Bin 356141 -> 342426 bytes crates/view/src/service.rs | 6 + crates/wasm/src/tx.rs | 4 + .../transaction/v1alpha1/transaction.pb.go | 507 ++++++++++-------- .../transaction/v1alpha1/transaction.proto | 7 +- 13 files changed, 488 insertions(+), 228 deletions(-) diff --git a/crates/bin/pcli/src/command/view/transaction_hashes.rs b/crates/bin/pcli/src/command/view/transaction_hashes.rs index c72e273767..3ed66b5507 100644 --- a/crates/bin/pcli/src/command/view/transaction_hashes.rs +++ b/crates/bin/pcli/src/command/view/transaction_hashes.rs @@ -32,7 +32,7 @@ impl TransactionHashesCmd { for tx_info in txs { let (return_address, memo) = match tx_info.view.body_view.memo_view { Some(MemoView::Visible { plaintext, .. }) => ( - plaintext.return_address.display_short_form(), + plaintext.return_address.address().display_short_form(), plaintext.text, ), _ => (String::new(), String::new()), diff --git a/crates/bin/pcli/src/command/view/tx.rs b/crates/bin/pcli/src/command/view/tx.rs index d67adb6081..3d785e062c 100644 --- a/crates/bin/pcli/src/command/view/tx.rs +++ b/crates/bin/pcli/src/command/view/tx.rs @@ -432,7 +432,7 @@ impl TxCmd { } => { metadata_table.add_row(vec![ "Transaction Memo Sender", - &plaintext.return_address.to_string(), + &plaintext.return_address.address().to_string(), ]); metadata_table.add_row(vec!["Transaction Memo Text", &plaintext.text]); } diff --git a/crates/core/transaction/src/lib.rs b/crates/core/transaction/src/lib.rs index 45889e0da5..c9e49ce4ec 100644 --- a/crates/core/transaction/src/lib.rs +++ b/crates/core/transaction/src/lib.rs @@ -38,7 +38,7 @@ pub use error::Error; pub use id::Id; pub use is_action::IsAction; pub use transaction::{Transaction, TransactionBody, TransactionParameters}; -pub use view::{ActionView, MemoView, TransactionPerspective, TransactionView}; +pub use view::{ActionView, MemoPlaintextView, MemoView, TransactionPerspective, TransactionView}; pub use witness_data::WitnessData; /// A compatibility wrapper for trait implementations that are temporarily duplicated diff --git a/crates/core/transaction/src/transaction.rs b/crates/core/transaction/src/transaction.rs index 4bd5750194..a0d62e6715 100644 --- a/crates/core/transaction/src/transaction.rs +++ b/crates/core/transaction/src/transaction.rs @@ -32,7 +32,7 @@ use serde::{Deserialize, Serialize}; use crate::{ memo::{MemoCiphertext, MemoPlaintext}, view::{action_view::OutputView, MemoView, TransactionBodyView}, - Action, ActionView, Id, IsAction, TransactionPerspective, TransactionView, + Action, ActionView, Id, IsAction, MemoPlaintextView, TransactionPerspective, TransactionView, }; #[derive(Clone, Debug, Default)] @@ -252,10 +252,16 @@ impl Transaction { let memo_view = match memo_ciphertext { Some(ciphertext) => match memo_plaintext { - Some(plaintext) => Some(MemoView::Visible { - plaintext, - ciphertext, - }), + Some(plaintext) => { + let plaintext_view: MemoPlaintextView = MemoPlaintextView { + return_address: txp.view_address(plaintext.return_address), + text: plaintext.text, + }; + Some(MemoView::Visible { + plaintext: plaintext_view, + ciphertext, + }) + } None => Some(MemoView::Opaque { ciphertext }), }, None => None, diff --git a/crates/core/transaction/src/view.rs b/crates/core/transaction/src/view.rs index b60c2f9d31..69ade37f46 100644 --- a/crates/core/transaction/src/view.rs +++ b/crates/core/transaction/src/view.rs @@ -1,6 +1,7 @@ use anyhow::Context; use decaf377_rdsa::{Binding, Signature}; use penumbra_fee::Fee; +use penumbra_keys::AddressView; use penumbra_proto::{core::transaction::v1alpha1 as pbt, DomainType, TypeUrl}; use serde::{Deserialize, Serialize}; @@ -13,7 +14,7 @@ use penumbra_tct as tct; pub use transaction_perspective::TransactionPerspective; use crate::{ - memo::{MemoCiphertext, MemoPlaintext}, + memo::MemoCiphertext, transaction::{DetectionData, TransactionParameters}, Action, Transaction, TransactionBody, }; @@ -44,7 +45,7 @@ pub struct TransactionBodyView { #[allow(clippy::large_enum_variant)] pub enum MemoView { Visible { - plaintext: MemoPlaintext, + plaintext: MemoPlaintextView, ciphertext: MemoCiphertext, }, Opaque { @@ -52,6 +53,13 @@ pub enum MemoView { }, } +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(try_from = "pbt::MemoPlaintextView", into = "pbt::MemoPlaintextView")] +pub struct MemoPlaintextView { + pub return_address: AddressView, + pub text: String, +} + impl TransactionView { pub fn transaction(&self) -> Transaction { let mut actions = Vec::new(); @@ -274,3 +282,31 @@ impl TryFrom for MemoView { } } } + +impl From for pbt::MemoPlaintextView { + fn from(v: MemoPlaintextView) -> Self { + Self { + return_address: Some(v.return_address.into()), + text: v.text, + } + } +} + +impl TryFrom for MemoPlaintextView { + type Error = anyhow::Error; + + fn try_from(v: pbt::MemoPlaintextView) -> Result { + let sender: AddressView = v + .return_address + .ok_or_else(|| anyhow::anyhow!("memo plan missing memo plaintext"))? + .try_into() + .context("return address malformed")?; + + let text: String = v.text; + + Ok(Self { + return_address: sender, + text, + }) + } +} diff --git a/crates/core/transaction/src/view/transaction_perspective.rs b/crates/core/transaction/src/view/transaction_perspective.rs index d1112b5cb5..d1fe0c5d8e 100644 --- a/crates/core/transaction/src/view/transaction_perspective.rs +++ b/crates/core/transaction/src/view/transaction_perspective.rs @@ -1,6 +1,6 @@ use anyhow::anyhow; use penumbra_asset::asset; -use penumbra_keys::{AddressView, PayloadKey}; +use penumbra_keys::{Address, AddressView, PayloadKey}; use penumbra_proto::core::transaction::v1alpha1::{ self as pb, NullifierWithNote, PayloadKeyWithCommitment, }; @@ -66,6 +66,13 @@ impl TransactionPerspective { rseed: note.rseed(), } } + + pub fn view_address(&self, address: Address) -> AddressView { + match self.address_views.iter().find(|av| av.address() == address) { + Some(av) => av.clone(), + None => AddressView::Opaque { address }, + } + } } impl TransactionPerspective {} diff --git a/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.rs b/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.rs index f7d72ed33a..40029b4a66 100644 --- a/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.rs @@ -524,6 +524,16 @@ pub struct MemoPlaintext { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] +pub struct MemoPlaintextView { + #[prost(message, optional, tag = "1")] + pub return_address: ::core::option::Option< + super::super::keys::v1alpha1::AddressView, + >, + #[prost(string, tag = "2")] + pub text: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct MemoView { #[prost(oneof = "memo_view::MemoView", tags = "1, 2")] pub memo_view: ::core::option::Option, @@ -536,7 +546,7 @@ pub mod memo_view { #[prost(message, optional, tag = "1")] pub ciphertext: ::core::option::Option, #[prost(message, optional, tag = "2")] - pub plaintext: ::core::option::Option, + pub plaintext: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.serde.rs index 732fc984bb..d30027051f 100644 --- a/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.core.transaction.v1alpha1.serde.rs @@ -1899,6 +1899,115 @@ impl<'de> serde::Deserialize<'de> for MemoPlaintext { deserializer.deserialize_struct("penumbra.core.transaction.v1alpha1.MemoPlaintext", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for MemoPlaintextView { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.return_address.is_some() { + len += 1; + } + if !self.text.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.core.transaction.v1alpha1.MemoPlaintextView", len)?; + if let Some(v) = self.return_address.as_ref() { + struct_ser.serialize_field("returnAddress", v)?; + } + if !self.text.is_empty() { + struct_ser.serialize_field("text", &self.text)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for MemoPlaintextView { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "return_address", + "returnAddress", + "text", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + ReturnAddress, + Text, + } + 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 { + "returnAddress" | "return_address" => Ok(GeneratedField::ReturnAddress), + "text" => Ok(GeneratedField::Text), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = MemoPlaintextView; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.core.transaction.v1alpha1.MemoPlaintextView") + } + + fn visit_map(self, mut map_: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut return_address__ = None; + let mut text__ = None; + while let Some(k) = map_.next_key()? { + match k { + GeneratedField::ReturnAddress => { + if return_address__.is_some() { + return Err(serde::de::Error::duplicate_field("returnAddress")); + } + return_address__ = map_.next_value()?; + } + GeneratedField::Text => { + if text__.is_some() { + return Err(serde::de::Error::duplicate_field("text")); + } + text__ = Some(map_.next_value()?); + } + } + } + Ok(MemoPlaintextView { + return_address: return_address__, + text: text__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.core.transaction.v1alpha1.MemoPlaintextView", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for MemoPlan { #[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 84eac75007cf6fc543f7c2071276feb505d58b73..33ac808644ac9892fddc5579b2ecdd7926e7ffcd 100644 GIT binary patch delta 15378 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 P4z3bIT9-X9n)m-VIyHA= delta 29050 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 PF?Iz|_r|30#*6 { let address = swap_plaintext.claim_address; diff --git a/crates/wasm/src/tx.rs b/crates/wasm/src/tx.rs index 67dd70e606..84c59a33b8 100644 --- a/crates/wasm/src/tx.rs +++ b/crates/wasm/src/tx.rs @@ -274,6 +274,10 @@ pub async fn transaction_info_inner( let address = note.address(); address_views.insert(address, fvk.view_address(address)); asset_ids.insert(note.asset_id()); + + // Also add an AddressView for the sender address in the memo. + let memo = tx.decrypt_memo(&fvk)?; + address_views.insert(memo.return_address, fvk.view_address(address)); } ActionView::Swap(SwapView::Visible { swap_plaintext, .. }) => { let address = swap_plaintext.claim_address; diff --git a/proto/go/gen/penumbra/core/transaction/v1alpha1/transaction.pb.go b/proto/go/gen/penumbra/core/transaction/v1alpha1/transaction.pb.go index 561d65fd7c..a2acf06a9a 100644 --- a/proto/go/gen/penumbra/core/transaction/v1alpha1/transaction.pb.go +++ b/proto/go/gen/penumbra/core/transaction/v1alpha1/transaction.pb.go @@ -2310,6 +2310,61 @@ func (x *MemoPlaintext) GetText() string { return "" } +type MemoPlaintextView struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ReturnAddress *v1alpha18.AddressView `protobuf:"bytes,1,opt,name=return_address,json=returnAddress,proto3" json:"return_address,omitempty"` + Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` +} + +func (x *MemoPlaintextView) Reset() { + *x = MemoPlaintextView{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MemoPlaintextView) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MemoPlaintextView) ProtoMessage() {} + +func (x *MemoPlaintextView) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MemoPlaintextView.ProtoReflect.Descriptor instead. +func (*MemoPlaintextView) Descriptor() ([]byte, []int) { + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{21} +} + +func (x *MemoPlaintextView) GetReturnAddress() *v1alpha18.AddressView { + if x != nil { + return x.ReturnAddress + } + return nil +} + +func (x *MemoPlaintextView) GetText() string { + if x != nil { + return x.Text + } + return "" +} + type MemoView struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2325,7 +2380,7 @@ type MemoView struct { func (x *MemoView) Reset() { *x = MemoView{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2338,7 +2393,7 @@ func (x *MemoView) String() string { func (*MemoView) ProtoMessage() {} func (x *MemoView) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2351,7 +2406,7 @@ func (x *MemoView) ProtoReflect() protoreflect.Message { // Deprecated: Use MemoView.ProtoReflect.Descriptor instead. func (*MemoView) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{21} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{22} } func (m *MemoView) GetMemoView() isMemoView_MemoView { @@ -2396,14 +2451,14 @@ type MemoView_Visible struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ciphertext *MemoCiphertext `protobuf:"bytes,1,opt,name=ciphertext,proto3" json:"ciphertext,omitempty"` - Plaintext *MemoPlaintext `protobuf:"bytes,2,opt,name=plaintext,proto3" json:"plaintext,omitempty"` + Ciphertext *MemoCiphertext `protobuf:"bytes,1,opt,name=ciphertext,proto3" json:"ciphertext,omitempty"` + Plaintext *MemoPlaintextView `protobuf:"bytes,2,opt,name=plaintext,proto3" json:"plaintext,omitempty"` } func (x *MemoView_Visible) Reset() { *x = MemoView_Visible{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2416,7 +2471,7 @@ func (x *MemoView_Visible) String() string { func (*MemoView_Visible) ProtoMessage() {} func (x *MemoView_Visible) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2429,7 +2484,7 @@ func (x *MemoView_Visible) ProtoReflect() protoreflect.Message { // Deprecated: Use MemoView_Visible.ProtoReflect.Descriptor instead. func (*MemoView_Visible) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{21, 0} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{22, 0} } func (x *MemoView_Visible) GetCiphertext() *MemoCiphertext { @@ -2439,7 +2494,7 @@ func (x *MemoView_Visible) GetCiphertext() *MemoCiphertext { return nil } -func (x *MemoView_Visible) GetPlaintext() *MemoPlaintext { +func (x *MemoView_Visible) GetPlaintext() *MemoPlaintextView { if x != nil { return x.Plaintext } @@ -2457,7 +2512,7 @@ type MemoView_Opaque struct { func (x *MemoView_Opaque) Reset() { *x = MemoView_Opaque{} if protoimpl.UnsafeEnabled { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2470,7 +2525,7 @@ func (x *MemoView_Opaque) String() string { func (*MemoView_Opaque) ProtoMessage() {} func (x *MemoView_Opaque) ProtoReflect() protoreflect.Message { - mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23] + mi := &file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2483,7 +2538,7 @@ func (x *MemoView_Opaque) ProtoReflect() protoreflect.Message { // Deprecated: Use MemoView_Opaque.ProtoReflect.Descriptor instead. func (*MemoView_Opaque) Descriptor() ([]byte, []int) { - return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{21, 1} + return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP(), []int{22, 1} } func (x *MemoView_Opaque) GetCiphertext() *MemoCiphertext { @@ -3173,57 +3228,65 @@ var file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDesc = []byte{ 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0xc7, 0x03, 0x0a, 0x08, 0x4d, 0x65, - 0x6d, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x12, 0x50, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, - 0x6f, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, - 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x4d, 0x0a, 0x06, 0x6f, 0x70, 0x61, 0x71, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, - 0x6d, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x48, 0x00, 0x52, - 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x1a, 0xae, 0x01, 0x0a, 0x07, 0x56, 0x69, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x12, 0x52, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x78, 0x0a, 0x11, 0x4d, 0x65, 0x6d, + 0x6f, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x69, 0x65, 0x77, 0x12, 0x4f, + 0x0a, 0x0e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x69, 0x65, 0x77, + 0x52, 0x0d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x65, 0x78, 0x74, 0x22, 0xcb, 0x03, 0x0a, 0x08, 0x4d, 0x65, 0x6d, 0x6f, 0x56, 0x69, 0x65, 0x77, + 0x12, 0x50, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x56, 0x69, 0x65, 0x77, 0x2e, + 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x12, 0x4d, 0x0a, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x56, 0x69, 0x65, 0x77, + 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, 0x61, 0x71, 0x75, + 0x65, 0x1a, 0xb2, 0x01, 0x0a, 0x07, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x52, 0x0a, + 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x69, 0x70, 0x68, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x74, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x74, 0x12, 0x53, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, + 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x56, 0x69, 0x65, 0x77, 0x52, 0x09, 0x70, 0x6c, 0x61, + 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x5c, 0x0a, 0x06, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, + 0x12, 0x52, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x69, + 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x5f, 0x76, 0x69, 0x65, + 0x77, 0x42, 0xcc, 0x02, 0x0a, 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, - 0x6f, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x52, 0x0a, 0x63, 0x69, 0x70, - 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x12, 0x4f, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x4d, 0x65, 0x6d, 0x6f, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x09, 0x70, - 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x5c, 0x0a, 0x06, 0x4f, 0x70, 0x61, 0x71, - 0x75, 0x65, 0x12, 0x52, 0x0a, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, - 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, - 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x5f, 0x76, - 0x69, 0x65, 0x77, 0x42, 0xcc, 0x02, 0x0a, 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x10, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x65, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, - 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, - 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x54, 0xaa, - 0x02, 0x22, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x22, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, - 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x2e, 0x50, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, - 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x25, 0x50, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x10, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x65, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, + 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x43, 0x54, 0xaa, 0x02, 0x22, + 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0xca, 0x02, 0x22, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x43, 0x6f, + 0x72, 0x65, 0x5c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x56, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x2e, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x25, 0x50, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3238,7 +3301,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescGZIP() []b return file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDescData } -var file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes = make([]protoimpl.MessageInfo, 24) +var file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes = make([]protoimpl.MessageInfo, 25) var file_penumbra_core_transaction_v1alpha1_transaction_proto_goTypes = []interface{}{ (*Transaction)(nil), // 0: penumbra.core.transaction.v1alpha1.Transaction (*Id)(nil), // 1: penumbra.core.transaction.v1alpha1.Id @@ -3261,172 +3324,174 @@ var file_penumbra_core_transaction_v1alpha1_transaction_proto_goTypes = []interf (*MemoPlan)(nil), // 18: penumbra.core.transaction.v1alpha1.MemoPlan (*MemoCiphertext)(nil), // 19: penumbra.core.transaction.v1alpha1.MemoCiphertext (*MemoPlaintext)(nil), // 20: penumbra.core.transaction.v1alpha1.MemoPlaintext - (*MemoView)(nil), // 21: penumbra.core.transaction.v1alpha1.MemoView - (*MemoView_Visible)(nil), // 22: penumbra.core.transaction.v1alpha1.MemoView.Visible - (*MemoView_Opaque)(nil), // 23: penumbra.core.transaction.v1alpha1.MemoView.Opaque - (*v1alpha1.MerkleRoot)(nil), // 24: penumbra.crypto.tct.v1alpha1.MerkleRoot - (*v1alpha11.Fee)(nil), // 25: penumbra.core.component.fee.v1alpha1.Fee - (*v1alpha12.Clue)(nil), // 26: penumbra.crypto.decaf377_fmd.v1alpha1.Clue - (*v1alpha13.Spend)(nil), // 27: penumbra.core.component.shielded_pool.v1alpha1.Spend - (*v1alpha13.Output)(nil), // 28: penumbra.core.component.shielded_pool.v1alpha1.Output - (*v1alpha14.Swap)(nil), // 29: penumbra.core.component.dex.v1alpha1.Swap - (*v1alpha14.SwapClaim)(nil), // 30: penumbra.core.component.dex.v1alpha1.SwapClaim - (*v1alpha15.ValidatorDefinition)(nil), // 31: penumbra.core.component.stake.v1alpha1.ValidatorDefinition - (*v1alpha16.IbcRelay)(nil), // 32: penumbra.core.component.ibc.v1alpha1.IbcRelay - (*v1alpha17.ProposalSubmit)(nil), // 33: penumbra.core.component.governance.v1alpha1.ProposalSubmit - (*v1alpha17.ProposalWithdraw)(nil), // 34: penumbra.core.component.governance.v1alpha1.ProposalWithdraw - (*v1alpha17.ValidatorVote)(nil), // 35: penumbra.core.component.governance.v1alpha1.ValidatorVote - (*v1alpha17.DelegatorVote)(nil), // 36: penumbra.core.component.governance.v1alpha1.DelegatorVote - (*v1alpha17.ProposalDepositClaim)(nil), // 37: penumbra.core.component.governance.v1alpha1.ProposalDepositClaim - (*v1alpha14.PositionOpen)(nil), // 38: penumbra.core.component.dex.v1alpha1.PositionOpen - (*v1alpha14.PositionClose)(nil), // 39: penumbra.core.component.dex.v1alpha1.PositionClose - (*v1alpha14.PositionWithdraw)(nil), // 40: penumbra.core.component.dex.v1alpha1.PositionWithdraw - (*v1alpha14.PositionRewardClaim)(nil), // 41: penumbra.core.component.dex.v1alpha1.PositionRewardClaim - (*v1alpha15.Delegate)(nil), // 42: penumbra.core.component.stake.v1alpha1.Delegate - (*v1alpha15.Undelegate)(nil), // 43: penumbra.core.component.stake.v1alpha1.Undelegate - (*v1alpha15.UndelegateClaim)(nil), // 44: penumbra.core.component.stake.v1alpha1.UndelegateClaim - (*v1alpha17.DaoSpend)(nil), // 45: penumbra.core.component.governance.v1alpha1.DaoSpend - (*v1alpha17.DaoOutput)(nil), // 46: penumbra.core.component.governance.v1alpha1.DaoOutput - (*v1alpha17.DaoDeposit)(nil), // 47: penumbra.core.component.governance.v1alpha1.DaoDeposit - (*v1alpha16.Ics20Withdrawal)(nil), // 48: penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal - (*v1alpha13.Note)(nil), // 49: penumbra.core.component.shielded_pool.v1alpha1.Note - (*v1alpha18.AddressView)(nil), // 50: penumbra.core.keys.v1alpha1.AddressView - (*v1alpha19.DenomMetadata)(nil), // 51: penumbra.core.asset.v1alpha1.DenomMetadata - (*v1alpha18.PayloadKey)(nil), // 52: penumbra.core.keys.v1alpha1.PayloadKey - (*v1alpha1.StateCommitment)(nil), // 53: penumbra.crypto.tct.v1alpha1.StateCommitment - (*v1alpha110.Nullifier)(nil), // 54: penumbra.core.component.sct.v1alpha1.Nullifier - (*v1alpha13.SpendView)(nil), // 55: penumbra.core.component.shielded_pool.v1alpha1.SpendView - (*v1alpha13.OutputView)(nil), // 56: penumbra.core.component.shielded_pool.v1alpha1.OutputView - (*v1alpha14.SwapView)(nil), // 57: penumbra.core.component.dex.v1alpha1.SwapView - (*v1alpha14.SwapClaimView)(nil), // 58: penumbra.core.component.dex.v1alpha1.SwapClaimView - (*v1alpha17.DelegatorVoteView)(nil), // 59: penumbra.core.component.governance.v1alpha1.DelegatorVoteView - (*v1alpha111.EffectHash)(nil), // 60: penumbra.core.component.chain.v1alpha1.EffectHash - (*v1alpha112.SpendAuthSignature)(nil), // 61: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature - (*v1alpha1.StateCommitmentProof)(nil), // 62: penumbra.crypto.tct.v1alpha1.StateCommitmentProof - (*v1alpha13.SpendPlan)(nil), // 63: penumbra.core.component.shielded_pool.v1alpha1.SpendPlan - (*v1alpha13.OutputPlan)(nil), // 64: penumbra.core.component.shielded_pool.v1alpha1.OutputPlan - (*v1alpha14.SwapPlan)(nil), // 65: penumbra.core.component.dex.v1alpha1.SwapPlan - (*v1alpha14.SwapClaimPlan)(nil), // 66: penumbra.core.component.dex.v1alpha1.SwapClaimPlan - (*v1alpha17.DelegatorVotePlan)(nil), // 67: penumbra.core.component.governance.v1alpha1.DelegatorVotePlan - (*v1alpha14.PositionWithdrawPlan)(nil), // 68: penumbra.core.component.dex.v1alpha1.PositionWithdrawPlan - (*v1alpha14.PositionRewardClaimPlan)(nil), // 69: penumbra.core.component.dex.v1alpha1.PositionRewardClaimPlan - (*v1alpha15.UndelegateClaimPlan)(nil), // 70: penumbra.core.component.stake.v1alpha1.UndelegateClaimPlan - (*v1alpha18.Address)(nil), // 71: penumbra.core.keys.v1alpha1.Address + (*MemoPlaintextView)(nil), // 21: penumbra.core.transaction.v1alpha1.MemoPlaintextView + (*MemoView)(nil), // 22: penumbra.core.transaction.v1alpha1.MemoView + (*MemoView_Visible)(nil), // 23: penumbra.core.transaction.v1alpha1.MemoView.Visible + (*MemoView_Opaque)(nil), // 24: penumbra.core.transaction.v1alpha1.MemoView.Opaque + (*v1alpha1.MerkleRoot)(nil), // 25: penumbra.crypto.tct.v1alpha1.MerkleRoot + (*v1alpha11.Fee)(nil), // 26: penumbra.core.component.fee.v1alpha1.Fee + (*v1alpha12.Clue)(nil), // 27: penumbra.crypto.decaf377_fmd.v1alpha1.Clue + (*v1alpha13.Spend)(nil), // 28: penumbra.core.component.shielded_pool.v1alpha1.Spend + (*v1alpha13.Output)(nil), // 29: penumbra.core.component.shielded_pool.v1alpha1.Output + (*v1alpha14.Swap)(nil), // 30: penumbra.core.component.dex.v1alpha1.Swap + (*v1alpha14.SwapClaim)(nil), // 31: penumbra.core.component.dex.v1alpha1.SwapClaim + (*v1alpha15.ValidatorDefinition)(nil), // 32: penumbra.core.component.stake.v1alpha1.ValidatorDefinition + (*v1alpha16.IbcRelay)(nil), // 33: penumbra.core.component.ibc.v1alpha1.IbcRelay + (*v1alpha17.ProposalSubmit)(nil), // 34: penumbra.core.component.governance.v1alpha1.ProposalSubmit + (*v1alpha17.ProposalWithdraw)(nil), // 35: penumbra.core.component.governance.v1alpha1.ProposalWithdraw + (*v1alpha17.ValidatorVote)(nil), // 36: penumbra.core.component.governance.v1alpha1.ValidatorVote + (*v1alpha17.DelegatorVote)(nil), // 37: penumbra.core.component.governance.v1alpha1.DelegatorVote + (*v1alpha17.ProposalDepositClaim)(nil), // 38: penumbra.core.component.governance.v1alpha1.ProposalDepositClaim + (*v1alpha14.PositionOpen)(nil), // 39: penumbra.core.component.dex.v1alpha1.PositionOpen + (*v1alpha14.PositionClose)(nil), // 40: penumbra.core.component.dex.v1alpha1.PositionClose + (*v1alpha14.PositionWithdraw)(nil), // 41: penumbra.core.component.dex.v1alpha1.PositionWithdraw + (*v1alpha14.PositionRewardClaim)(nil), // 42: penumbra.core.component.dex.v1alpha1.PositionRewardClaim + (*v1alpha15.Delegate)(nil), // 43: penumbra.core.component.stake.v1alpha1.Delegate + (*v1alpha15.Undelegate)(nil), // 44: penumbra.core.component.stake.v1alpha1.Undelegate + (*v1alpha15.UndelegateClaim)(nil), // 45: penumbra.core.component.stake.v1alpha1.UndelegateClaim + (*v1alpha17.DaoSpend)(nil), // 46: penumbra.core.component.governance.v1alpha1.DaoSpend + (*v1alpha17.DaoOutput)(nil), // 47: penumbra.core.component.governance.v1alpha1.DaoOutput + (*v1alpha17.DaoDeposit)(nil), // 48: penumbra.core.component.governance.v1alpha1.DaoDeposit + (*v1alpha16.Ics20Withdrawal)(nil), // 49: penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal + (*v1alpha13.Note)(nil), // 50: penumbra.core.component.shielded_pool.v1alpha1.Note + (*v1alpha18.AddressView)(nil), // 51: penumbra.core.keys.v1alpha1.AddressView + (*v1alpha19.DenomMetadata)(nil), // 52: penumbra.core.asset.v1alpha1.DenomMetadata + (*v1alpha18.PayloadKey)(nil), // 53: penumbra.core.keys.v1alpha1.PayloadKey + (*v1alpha1.StateCommitment)(nil), // 54: penumbra.crypto.tct.v1alpha1.StateCommitment + (*v1alpha110.Nullifier)(nil), // 55: penumbra.core.component.sct.v1alpha1.Nullifier + (*v1alpha13.SpendView)(nil), // 56: penumbra.core.component.shielded_pool.v1alpha1.SpendView + (*v1alpha13.OutputView)(nil), // 57: penumbra.core.component.shielded_pool.v1alpha1.OutputView + (*v1alpha14.SwapView)(nil), // 58: penumbra.core.component.dex.v1alpha1.SwapView + (*v1alpha14.SwapClaimView)(nil), // 59: penumbra.core.component.dex.v1alpha1.SwapClaimView + (*v1alpha17.DelegatorVoteView)(nil), // 60: penumbra.core.component.governance.v1alpha1.DelegatorVoteView + (*v1alpha111.EffectHash)(nil), // 61: penumbra.core.component.chain.v1alpha1.EffectHash + (*v1alpha112.SpendAuthSignature)(nil), // 62: penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature + (*v1alpha1.StateCommitmentProof)(nil), // 63: penumbra.crypto.tct.v1alpha1.StateCommitmentProof + (*v1alpha13.SpendPlan)(nil), // 64: penumbra.core.component.shielded_pool.v1alpha1.SpendPlan + (*v1alpha13.OutputPlan)(nil), // 65: penumbra.core.component.shielded_pool.v1alpha1.OutputPlan + (*v1alpha14.SwapPlan)(nil), // 66: penumbra.core.component.dex.v1alpha1.SwapPlan + (*v1alpha14.SwapClaimPlan)(nil), // 67: penumbra.core.component.dex.v1alpha1.SwapClaimPlan + (*v1alpha17.DelegatorVotePlan)(nil), // 68: penumbra.core.component.governance.v1alpha1.DelegatorVotePlan + (*v1alpha14.PositionWithdrawPlan)(nil), // 69: penumbra.core.component.dex.v1alpha1.PositionWithdrawPlan + (*v1alpha14.PositionRewardClaimPlan)(nil), // 70: penumbra.core.component.dex.v1alpha1.PositionRewardClaimPlan + (*v1alpha15.UndelegateClaimPlan)(nil), // 71: penumbra.core.component.stake.v1alpha1.UndelegateClaimPlan + (*v1alpha18.Address)(nil), // 72: penumbra.core.keys.v1alpha1.Address } var file_penumbra_core_transaction_v1alpha1_transaction_proto_depIdxs = []int32{ 2, // 0: penumbra.core.transaction.v1alpha1.Transaction.body:type_name -> penumbra.core.transaction.v1alpha1.TransactionBody - 24, // 1: penumbra.core.transaction.v1alpha1.Transaction.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot + 25, // 1: penumbra.core.transaction.v1alpha1.Transaction.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot 6, // 2: penumbra.core.transaction.v1alpha1.TransactionBody.actions:type_name -> penumbra.core.transaction.v1alpha1.Action 4, // 3: penumbra.core.transaction.v1alpha1.TransactionBody.transaction_parameters:type_name -> penumbra.core.transaction.v1alpha1.TransactionParameters - 25, // 4: penumbra.core.transaction.v1alpha1.TransactionBody.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee + 26, // 4: penumbra.core.transaction.v1alpha1.TransactionBody.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee 5, // 5: penumbra.core.transaction.v1alpha1.TransactionBody.detection_data:type_name -> penumbra.core.transaction.v1alpha1.DetectionData 3, // 6: penumbra.core.transaction.v1alpha1.TransactionBody.memo_data:type_name -> penumbra.core.transaction.v1alpha1.MemoData - 26, // 7: penumbra.core.transaction.v1alpha1.DetectionData.fmd_clues:type_name -> penumbra.crypto.decaf377_fmd.v1alpha1.Clue - 27, // 8: penumbra.core.transaction.v1alpha1.Action.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Spend - 28, // 9: penumbra.core.transaction.v1alpha1.Action.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Output - 29, // 10: penumbra.core.transaction.v1alpha1.Action.swap:type_name -> penumbra.core.component.dex.v1alpha1.Swap - 30, // 11: penumbra.core.transaction.v1alpha1.Action.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaim - 31, // 12: penumbra.core.transaction.v1alpha1.Action.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition - 32, // 13: penumbra.core.transaction.v1alpha1.Action.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay - 33, // 14: penumbra.core.transaction.v1alpha1.Action.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit - 34, // 15: penumbra.core.transaction.v1alpha1.Action.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw - 35, // 16: penumbra.core.transaction.v1alpha1.Action.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote - 36, // 17: penumbra.core.transaction.v1alpha1.Action.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVote - 37, // 18: penumbra.core.transaction.v1alpha1.Action.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim - 38, // 19: penumbra.core.transaction.v1alpha1.Action.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen - 39, // 20: penumbra.core.transaction.v1alpha1.Action.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose - 40, // 21: penumbra.core.transaction.v1alpha1.Action.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdraw - 41, // 22: penumbra.core.transaction.v1alpha1.Action.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaim - 42, // 23: penumbra.core.transaction.v1alpha1.Action.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate - 43, // 24: penumbra.core.transaction.v1alpha1.Action.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate - 44, // 25: penumbra.core.transaction.v1alpha1.Action.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaim - 45, // 26: penumbra.core.transaction.v1alpha1.Action.dao_spend:type_name -> penumbra.core.component.governance.v1alpha1.DaoSpend - 46, // 27: penumbra.core.transaction.v1alpha1.Action.dao_output:type_name -> penumbra.core.component.governance.v1alpha1.DaoOutput - 47, // 28: penumbra.core.transaction.v1alpha1.Action.dao_deposit:type_name -> penumbra.core.component.governance.v1alpha1.DaoDeposit - 48, // 29: penumbra.core.transaction.v1alpha1.Action.ics20_withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal + 27, // 7: penumbra.core.transaction.v1alpha1.DetectionData.fmd_clues:type_name -> penumbra.crypto.decaf377_fmd.v1alpha1.Clue + 28, // 8: penumbra.core.transaction.v1alpha1.Action.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Spend + 29, // 9: penumbra.core.transaction.v1alpha1.Action.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Output + 30, // 10: penumbra.core.transaction.v1alpha1.Action.swap:type_name -> penumbra.core.component.dex.v1alpha1.Swap + 31, // 11: penumbra.core.transaction.v1alpha1.Action.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaim + 32, // 12: penumbra.core.transaction.v1alpha1.Action.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition + 33, // 13: penumbra.core.transaction.v1alpha1.Action.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay + 34, // 14: penumbra.core.transaction.v1alpha1.Action.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit + 35, // 15: penumbra.core.transaction.v1alpha1.Action.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw + 36, // 16: penumbra.core.transaction.v1alpha1.Action.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote + 37, // 17: penumbra.core.transaction.v1alpha1.Action.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVote + 38, // 18: penumbra.core.transaction.v1alpha1.Action.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim + 39, // 19: penumbra.core.transaction.v1alpha1.Action.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen + 40, // 20: penumbra.core.transaction.v1alpha1.Action.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose + 41, // 21: penumbra.core.transaction.v1alpha1.Action.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdraw + 42, // 22: penumbra.core.transaction.v1alpha1.Action.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaim + 43, // 23: penumbra.core.transaction.v1alpha1.Action.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate + 44, // 24: penumbra.core.transaction.v1alpha1.Action.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate + 45, // 25: penumbra.core.transaction.v1alpha1.Action.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaim + 46, // 26: penumbra.core.transaction.v1alpha1.Action.dao_spend:type_name -> penumbra.core.component.governance.v1alpha1.DaoSpend + 47, // 27: penumbra.core.transaction.v1alpha1.Action.dao_output:type_name -> penumbra.core.component.governance.v1alpha1.DaoOutput + 48, // 28: penumbra.core.transaction.v1alpha1.Action.dao_deposit:type_name -> penumbra.core.component.governance.v1alpha1.DaoDeposit + 49, // 29: penumbra.core.transaction.v1alpha1.Action.ics20_withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal 8, // 30: penumbra.core.transaction.v1alpha1.TransactionPerspective.payload_keys:type_name -> penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment 9, // 31: penumbra.core.transaction.v1alpha1.TransactionPerspective.spend_nullifiers:type_name -> penumbra.core.transaction.v1alpha1.NullifierWithNote - 49, // 32: penumbra.core.transaction.v1alpha1.TransactionPerspective.advice_notes:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note - 50, // 33: penumbra.core.transaction.v1alpha1.TransactionPerspective.address_views:type_name -> penumbra.core.keys.v1alpha1.AddressView - 51, // 34: penumbra.core.transaction.v1alpha1.TransactionPerspective.denoms:type_name -> penumbra.core.asset.v1alpha1.DenomMetadata + 50, // 32: penumbra.core.transaction.v1alpha1.TransactionPerspective.advice_notes:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note + 51, // 33: penumbra.core.transaction.v1alpha1.TransactionPerspective.address_views:type_name -> penumbra.core.keys.v1alpha1.AddressView + 52, // 34: penumbra.core.transaction.v1alpha1.TransactionPerspective.denoms:type_name -> penumbra.core.asset.v1alpha1.DenomMetadata 1, // 35: penumbra.core.transaction.v1alpha1.TransactionPerspective.transaction_id:type_name -> penumbra.core.transaction.v1alpha1.Id - 52, // 36: penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment.payload_key:type_name -> penumbra.core.keys.v1alpha1.PayloadKey - 53, // 37: penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment.commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment - 54, // 38: penumbra.core.transaction.v1alpha1.NullifierWithNote.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier - 49, // 39: penumbra.core.transaction.v1alpha1.NullifierWithNote.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note + 53, // 36: penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment.payload_key:type_name -> penumbra.core.keys.v1alpha1.PayloadKey + 54, // 37: penumbra.core.transaction.v1alpha1.PayloadKeyWithCommitment.commitment:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitment + 55, // 38: penumbra.core.transaction.v1alpha1.NullifierWithNote.nullifier:type_name -> penumbra.core.component.sct.v1alpha1.Nullifier + 50, // 39: penumbra.core.transaction.v1alpha1.NullifierWithNote.note:type_name -> penumbra.core.component.shielded_pool.v1alpha1.Note 11, // 40: penumbra.core.transaction.v1alpha1.TransactionView.body_view:type_name -> penumbra.core.transaction.v1alpha1.TransactionBodyView - 24, // 41: penumbra.core.transaction.v1alpha1.TransactionView.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot + 25, // 41: penumbra.core.transaction.v1alpha1.TransactionView.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot 12, // 42: penumbra.core.transaction.v1alpha1.TransactionBodyView.action_views:type_name -> penumbra.core.transaction.v1alpha1.ActionView 4, // 43: penumbra.core.transaction.v1alpha1.TransactionBodyView.transaction_parameters:type_name -> penumbra.core.transaction.v1alpha1.TransactionParameters - 25, // 44: penumbra.core.transaction.v1alpha1.TransactionBodyView.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee + 26, // 44: penumbra.core.transaction.v1alpha1.TransactionBodyView.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee 5, // 45: penumbra.core.transaction.v1alpha1.TransactionBodyView.detection_data:type_name -> penumbra.core.transaction.v1alpha1.DetectionData - 21, // 46: penumbra.core.transaction.v1alpha1.TransactionBodyView.memo_view:type_name -> penumbra.core.transaction.v1alpha1.MemoView - 55, // 47: penumbra.core.transaction.v1alpha1.ActionView.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendView - 56, // 48: penumbra.core.transaction.v1alpha1.ActionView.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputView - 57, // 49: penumbra.core.transaction.v1alpha1.ActionView.swap:type_name -> penumbra.core.component.dex.v1alpha1.SwapView - 58, // 50: penumbra.core.transaction.v1alpha1.ActionView.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaimView - 31, // 51: penumbra.core.transaction.v1alpha1.ActionView.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition - 32, // 52: penumbra.core.transaction.v1alpha1.ActionView.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay - 33, // 53: penumbra.core.transaction.v1alpha1.ActionView.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit - 34, // 54: penumbra.core.transaction.v1alpha1.ActionView.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw - 35, // 55: penumbra.core.transaction.v1alpha1.ActionView.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote - 59, // 56: penumbra.core.transaction.v1alpha1.ActionView.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVoteView - 37, // 57: penumbra.core.transaction.v1alpha1.ActionView.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim - 38, // 58: penumbra.core.transaction.v1alpha1.ActionView.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen - 39, // 59: penumbra.core.transaction.v1alpha1.ActionView.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose - 40, // 60: penumbra.core.transaction.v1alpha1.ActionView.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdraw - 41, // 61: penumbra.core.transaction.v1alpha1.ActionView.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaim - 42, // 62: penumbra.core.transaction.v1alpha1.ActionView.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate - 43, // 63: penumbra.core.transaction.v1alpha1.ActionView.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate - 45, // 64: penumbra.core.transaction.v1alpha1.ActionView.dao_spend:type_name -> penumbra.core.component.governance.v1alpha1.DaoSpend - 46, // 65: penumbra.core.transaction.v1alpha1.ActionView.dao_output:type_name -> penumbra.core.component.governance.v1alpha1.DaoOutput - 47, // 66: penumbra.core.transaction.v1alpha1.ActionView.dao_deposit:type_name -> penumbra.core.component.governance.v1alpha1.DaoDeposit - 44, // 67: penumbra.core.transaction.v1alpha1.ActionView.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaim - 48, // 68: penumbra.core.transaction.v1alpha1.ActionView.ics20_withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal - 60, // 69: penumbra.core.transaction.v1alpha1.AuthorizationData.effect_hash:type_name -> penumbra.core.component.chain.v1alpha1.EffectHash - 61, // 70: penumbra.core.transaction.v1alpha1.AuthorizationData.spend_auths:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature - 61, // 71: penumbra.core.transaction.v1alpha1.AuthorizationData.delegator_vote_auths:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature - 24, // 72: penumbra.core.transaction.v1alpha1.WitnessData.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot - 62, // 73: penumbra.core.transaction.v1alpha1.WitnessData.state_commitment_proofs:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitmentProof + 22, // 46: penumbra.core.transaction.v1alpha1.TransactionBodyView.memo_view:type_name -> penumbra.core.transaction.v1alpha1.MemoView + 56, // 47: penumbra.core.transaction.v1alpha1.ActionView.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendView + 57, // 48: penumbra.core.transaction.v1alpha1.ActionView.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputView + 58, // 49: penumbra.core.transaction.v1alpha1.ActionView.swap:type_name -> penumbra.core.component.dex.v1alpha1.SwapView + 59, // 50: penumbra.core.transaction.v1alpha1.ActionView.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaimView + 32, // 51: penumbra.core.transaction.v1alpha1.ActionView.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition + 33, // 52: penumbra.core.transaction.v1alpha1.ActionView.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay + 34, // 53: penumbra.core.transaction.v1alpha1.ActionView.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit + 35, // 54: penumbra.core.transaction.v1alpha1.ActionView.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw + 36, // 55: penumbra.core.transaction.v1alpha1.ActionView.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote + 60, // 56: penumbra.core.transaction.v1alpha1.ActionView.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVoteView + 38, // 57: penumbra.core.transaction.v1alpha1.ActionView.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim + 39, // 58: penumbra.core.transaction.v1alpha1.ActionView.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen + 40, // 59: penumbra.core.transaction.v1alpha1.ActionView.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose + 41, // 60: penumbra.core.transaction.v1alpha1.ActionView.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdraw + 42, // 61: penumbra.core.transaction.v1alpha1.ActionView.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaim + 43, // 62: penumbra.core.transaction.v1alpha1.ActionView.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate + 44, // 63: penumbra.core.transaction.v1alpha1.ActionView.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate + 46, // 64: penumbra.core.transaction.v1alpha1.ActionView.dao_spend:type_name -> penumbra.core.component.governance.v1alpha1.DaoSpend + 47, // 65: penumbra.core.transaction.v1alpha1.ActionView.dao_output:type_name -> penumbra.core.component.governance.v1alpha1.DaoOutput + 48, // 66: penumbra.core.transaction.v1alpha1.ActionView.dao_deposit:type_name -> penumbra.core.component.governance.v1alpha1.DaoDeposit + 45, // 67: penumbra.core.transaction.v1alpha1.ActionView.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaim + 49, // 68: penumbra.core.transaction.v1alpha1.ActionView.ics20_withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal + 61, // 69: penumbra.core.transaction.v1alpha1.AuthorizationData.effect_hash:type_name -> penumbra.core.component.chain.v1alpha1.EffectHash + 62, // 70: penumbra.core.transaction.v1alpha1.AuthorizationData.spend_auths:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature + 62, // 71: penumbra.core.transaction.v1alpha1.AuthorizationData.delegator_vote_auths:type_name -> penumbra.crypto.decaf377_rdsa.v1alpha1.SpendAuthSignature + 25, // 72: penumbra.core.transaction.v1alpha1.WitnessData.anchor:type_name -> penumbra.crypto.tct.v1alpha1.MerkleRoot + 63, // 73: penumbra.core.transaction.v1alpha1.WitnessData.state_commitment_proofs:type_name -> penumbra.crypto.tct.v1alpha1.StateCommitmentProof 16, // 74: penumbra.core.transaction.v1alpha1.TransactionPlan.actions:type_name -> penumbra.core.transaction.v1alpha1.ActionPlan - 25, // 75: penumbra.core.transaction.v1alpha1.TransactionPlan.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee + 26, // 75: penumbra.core.transaction.v1alpha1.TransactionPlan.fee:type_name -> penumbra.core.component.fee.v1alpha1.Fee 17, // 76: penumbra.core.transaction.v1alpha1.TransactionPlan.clue_plans:type_name -> penumbra.core.transaction.v1alpha1.CluePlan 18, // 77: penumbra.core.transaction.v1alpha1.TransactionPlan.memo_plan:type_name -> penumbra.core.transaction.v1alpha1.MemoPlan - 63, // 78: penumbra.core.transaction.v1alpha1.ActionPlan.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendPlan - 64, // 79: penumbra.core.transaction.v1alpha1.ActionPlan.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputPlan - 65, // 80: penumbra.core.transaction.v1alpha1.ActionPlan.swap:type_name -> penumbra.core.component.dex.v1alpha1.SwapPlan - 66, // 81: penumbra.core.transaction.v1alpha1.ActionPlan.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaimPlan - 31, // 82: penumbra.core.transaction.v1alpha1.ActionPlan.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition - 32, // 83: penumbra.core.transaction.v1alpha1.ActionPlan.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay - 33, // 84: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit - 34, // 85: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw - 35, // 86: penumbra.core.transaction.v1alpha1.ActionPlan.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote - 67, // 87: penumbra.core.transaction.v1alpha1.ActionPlan.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVotePlan - 37, // 88: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim - 48, // 89: penumbra.core.transaction.v1alpha1.ActionPlan.withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal - 38, // 90: penumbra.core.transaction.v1alpha1.ActionPlan.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen - 39, // 91: penumbra.core.transaction.v1alpha1.ActionPlan.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose - 68, // 92: penumbra.core.transaction.v1alpha1.ActionPlan.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdrawPlan - 69, // 93: penumbra.core.transaction.v1alpha1.ActionPlan.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaimPlan - 42, // 94: penumbra.core.transaction.v1alpha1.ActionPlan.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate - 43, // 95: penumbra.core.transaction.v1alpha1.ActionPlan.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate - 70, // 96: penumbra.core.transaction.v1alpha1.ActionPlan.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaimPlan - 45, // 97: penumbra.core.transaction.v1alpha1.ActionPlan.dao_spend:type_name -> penumbra.core.component.governance.v1alpha1.DaoSpend - 46, // 98: penumbra.core.transaction.v1alpha1.ActionPlan.dao_output:type_name -> penumbra.core.component.governance.v1alpha1.DaoOutput - 47, // 99: penumbra.core.transaction.v1alpha1.ActionPlan.dao_deposit:type_name -> penumbra.core.component.governance.v1alpha1.DaoDeposit - 71, // 100: penumbra.core.transaction.v1alpha1.CluePlan.address:type_name -> penumbra.core.keys.v1alpha1.Address + 64, // 78: penumbra.core.transaction.v1alpha1.ActionPlan.spend:type_name -> penumbra.core.component.shielded_pool.v1alpha1.SpendPlan + 65, // 79: penumbra.core.transaction.v1alpha1.ActionPlan.output:type_name -> penumbra.core.component.shielded_pool.v1alpha1.OutputPlan + 66, // 80: penumbra.core.transaction.v1alpha1.ActionPlan.swap:type_name -> penumbra.core.component.dex.v1alpha1.SwapPlan + 67, // 81: penumbra.core.transaction.v1alpha1.ActionPlan.swap_claim:type_name -> penumbra.core.component.dex.v1alpha1.SwapClaimPlan + 32, // 82: penumbra.core.transaction.v1alpha1.ActionPlan.validator_definition:type_name -> penumbra.core.component.stake.v1alpha1.ValidatorDefinition + 33, // 83: penumbra.core.transaction.v1alpha1.ActionPlan.ibc_relay_action:type_name -> penumbra.core.component.ibc.v1alpha1.IbcRelay + 34, // 84: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_submit:type_name -> penumbra.core.component.governance.v1alpha1.ProposalSubmit + 35, // 85: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_withdraw:type_name -> penumbra.core.component.governance.v1alpha1.ProposalWithdraw + 36, // 86: penumbra.core.transaction.v1alpha1.ActionPlan.validator_vote:type_name -> penumbra.core.component.governance.v1alpha1.ValidatorVote + 68, // 87: penumbra.core.transaction.v1alpha1.ActionPlan.delegator_vote:type_name -> penumbra.core.component.governance.v1alpha1.DelegatorVotePlan + 38, // 88: penumbra.core.transaction.v1alpha1.ActionPlan.proposal_deposit_claim:type_name -> penumbra.core.component.governance.v1alpha1.ProposalDepositClaim + 49, // 89: penumbra.core.transaction.v1alpha1.ActionPlan.withdrawal:type_name -> penumbra.core.component.ibc.v1alpha1.Ics20Withdrawal + 39, // 90: penumbra.core.transaction.v1alpha1.ActionPlan.position_open:type_name -> penumbra.core.component.dex.v1alpha1.PositionOpen + 40, // 91: penumbra.core.transaction.v1alpha1.ActionPlan.position_close:type_name -> penumbra.core.component.dex.v1alpha1.PositionClose + 69, // 92: penumbra.core.transaction.v1alpha1.ActionPlan.position_withdraw:type_name -> penumbra.core.component.dex.v1alpha1.PositionWithdrawPlan + 70, // 93: penumbra.core.transaction.v1alpha1.ActionPlan.position_reward_claim:type_name -> penumbra.core.component.dex.v1alpha1.PositionRewardClaimPlan + 43, // 94: penumbra.core.transaction.v1alpha1.ActionPlan.delegate:type_name -> penumbra.core.component.stake.v1alpha1.Delegate + 44, // 95: penumbra.core.transaction.v1alpha1.ActionPlan.undelegate:type_name -> penumbra.core.component.stake.v1alpha1.Undelegate + 71, // 96: penumbra.core.transaction.v1alpha1.ActionPlan.undelegate_claim:type_name -> penumbra.core.component.stake.v1alpha1.UndelegateClaimPlan + 46, // 97: penumbra.core.transaction.v1alpha1.ActionPlan.dao_spend:type_name -> penumbra.core.component.governance.v1alpha1.DaoSpend + 47, // 98: penumbra.core.transaction.v1alpha1.ActionPlan.dao_output:type_name -> penumbra.core.component.governance.v1alpha1.DaoOutput + 48, // 99: penumbra.core.transaction.v1alpha1.ActionPlan.dao_deposit:type_name -> penumbra.core.component.governance.v1alpha1.DaoDeposit + 72, // 100: penumbra.core.transaction.v1alpha1.CluePlan.address:type_name -> penumbra.core.keys.v1alpha1.Address 20, // 101: penumbra.core.transaction.v1alpha1.MemoPlan.plaintext:type_name -> penumbra.core.transaction.v1alpha1.MemoPlaintext - 71, // 102: penumbra.core.transaction.v1alpha1.MemoPlaintext.return_address:type_name -> penumbra.core.keys.v1alpha1.Address - 22, // 103: penumbra.core.transaction.v1alpha1.MemoView.visible:type_name -> penumbra.core.transaction.v1alpha1.MemoView.Visible - 23, // 104: penumbra.core.transaction.v1alpha1.MemoView.opaque:type_name -> penumbra.core.transaction.v1alpha1.MemoView.Opaque - 19, // 105: penumbra.core.transaction.v1alpha1.MemoView.Visible.ciphertext:type_name -> penumbra.core.transaction.v1alpha1.MemoCiphertext - 20, // 106: penumbra.core.transaction.v1alpha1.MemoView.Visible.plaintext:type_name -> penumbra.core.transaction.v1alpha1.MemoPlaintext - 19, // 107: penumbra.core.transaction.v1alpha1.MemoView.Opaque.ciphertext:type_name -> penumbra.core.transaction.v1alpha1.MemoCiphertext - 108, // [108:108] is the sub-list for method output_type - 108, // [108:108] is the sub-list for method input_type - 108, // [108:108] is the sub-list for extension type_name - 108, // [108:108] is the sub-list for extension extendee - 0, // [0:108] is the sub-list for field type_name + 72, // 102: penumbra.core.transaction.v1alpha1.MemoPlaintext.return_address:type_name -> penumbra.core.keys.v1alpha1.Address + 51, // 103: penumbra.core.transaction.v1alpha1.MemoPlaintextView.return_address:type_name -> penumbra.core.keys.v1alpha1.AddressView + 23, // 104: penumbra.core.transaction.v1alpha1.MemoView.visible:type_name -> penumbra.core.transaction.v1alpha1.MemoView.Visible + 24, // 105: penumbra.core.transaction.v1alpha1.MemoView.opaque:type_name -> penumbra.core.transaction.v1alpha1.MemoView.Opaque + 19, // 106: penumbra.core.transaction.v1alpha1.MemoView.Visible.ciphertext:type_name -> penumbra.core.transaction.v1alpha1.MemoCiphertext + 21, // 107: penumbra.core.transaction.v1alpha1.MemoView.Visible.plaintext:type_name -> penumbra.core.transaction.v1alpha1.MemoPlaintextView + 19, // 108: penumbra.core.transaction.v1alpha1.MemoView.Opaque.ciphertext:type_name -> penumbra.core.transaction.v1alpha1.MemoCiphertext + 109, // [109:109] is the sub-list for method output_type + 109, // [109:109] is the sub-list for method input_type + 109, // [109:109] is the sub-list for extension type_name + 109, // [109:109] is the sub-list for extension extendee + 0, // [0:109] is the sub-list for field type_name } func init() { file_penumbra_core_transaction_v1alpha1_transaction_proto_init() } @@ -3688,7 +3753,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MemoView); i { + switch v := v.(*MemoPlaintextView); i { case 0: return &v.state case 1: @@ -3700,7 +3765,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MemoView_Visible); i { + switch v := v.(*MemoView); i { case 0: return &v.state case 1: @@ -3712,6 +3777,18 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { } } file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MemoView_Visible); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MemoView_Opaque); i { case 0: return &v.state @@ -3796,7 +3873,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { (*ActionPlan_DaoOutput)(nil), (*ActionPlan_DaoDeposit)(nil), } - file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[21].OneofWrappers = []interface{}{ + file_penumbra_core_transaction_v1alpha1_transaction_proto_msgTypes[22].OneofWrappers = []interface{}{ (*MemoView_Visible_)(nil), (*MemoView_Opaque_)(nil), } @@ -3806,7 +3883,7 @@ func file_penumbra_core_transaction_v1alpha1_transaction_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_penumbra_core_transaction_v1alpha1_transaction_proto_rawDesc, NumEnums: 0, - NumMessages: 24, + NumMessages: 25, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/penumbra/penumbra/core/transaction/v1alpha1/transaction.proto b/proto/penumbra/penumbra/core/transaction/v1alpha1/transaction.proto index 80d8ef6e15..79a18e42da 100644 --- a/proto/penumbra/penumbra/core/transaction/v1alpha1/transaction.proto +++ b/proto/penumbra/penumbra/core/transaction/v1alpha1/transaction.proto @@ -311,10 +311,15 @@ message MemoPlaintext { string text = 2; } +message MemoPlaintextView { + keys.v1alpha1.AddressView return_address = 1; + string text = 2; +} + message MemoView { message Visible { MemoCiphertext ciphertext = 1; - MemoPlaintext plaintext = 2; + MemoPlaintextView plaintext = 2; } message Opaque {