penumbra_sdk_transaction/view/
action_view.rs1use penumbra_sdk_auction::auction::dutch::{
2 actions::view::{ActionDutchAuctionScheduleView, ActionDutchAuctionWithdrawView},
3 ActionDutchAuctionEnd,
4};
5use penumbra_sdk_community_pool::{CommunityPoolDeposit, CommunityPoolOutput, CommunityPoolSpend};
6use penumbra_sdk_dex::{
7 lp::action::{PositionClose, PositionOpen, PositionWithdraw},
8 swap::SwapView,
9 swap_claim::SwapClaimView,
10};
11use penumbra_sdk_governance::{
12 ProposalDepositClaim, ProposalSubmit, ProposalWithdraw, ValidatorVote,
13};
14use penumbra_sdk_ibc::IbcRelay;
15use penumbra_sdk_proto::{core::transaction::v1 as pbt, DomainType};
16use penumbra_sdk_shielded_pool::Ics20Withdrawal;
17use penumbra_sdk_stake::{Delegate, Undelegate, UndelegateClaim};
18use serde::{Deserialize, Serialize};
19
20pub use penumbra_sdk_governance::DelegatorVoteView;
21pub use penumbra_sdk_shielded_pool::OutputView;
22pub use penumbra_sdk_shielded_pool::SpendView;
23
24use crate::Action;
25
26#[derive(Clone, Debug, Serialize, Deserialize)]
27#[serde(try_from = "pbt::ActionView", into = "pbt::ActionView")]
28#[allow(clippy::large_enum_variant)]
29pub enum ActionView {
30 Spend(SpendView),
32 Output(OutputView),
33 Swap(SwapView),
34 SwapClaim(SwapClaimView),
35 DelegatorVote(DelegatorVoteView),
36 ValidatorDefinition(penumbra_sdk_stake::validator::Definition),
38 IbcRelay(IbcRelay),
39 ProposalSubmit(ProposalSubmit),
40 ProposalWithdraw(ProposalWithdraw),
41 ValidatorVote(ValidatorVote),
42 ProposalDepositClaim(ProposalDepositClaim),
43 PositionOpen(PositionOpen),
44 PositionClose(PositionClose),
45 PositionWithdraw(PositionWithdraw),
46 Delegate(Delegate),
47 Undelegate(Undelegate),
48 UndelegateClaim(UndelegateClaim),
49 Ics20Withdrawal(Ics20Withdrawal),
50 CommunityPoolDeposit(CommunityPoolDeposit),
51 CommunityPoolSpend(CommunityPoolSpend),
52 CommunityPoolOutput(CommunityPoolOutput),
53 ActionDutchAuctionSchedule(ActionDutchAuctionScheduleView),
54 ActionDutchAuctionEnd(ActionDutchAuctionEnd),
55 ActionDutchAuctionWithdraw(ActionDutchAuctionWithdrawView),
56}
57
58impl DomainType for ActionView {
59 type Proto = pbt::ActionView;
60}
61
62impl TryFrom<pbt::ActionView> for ActionView {
63 type Error = anyhow::Error;
64
65 fn try_from(v: pbt::ActionView) -> Result<Self, Self::Error> {
66 use pbt::action_view::ActionView as AV;
67 Ok(
68 match v
69 .action_view
70 .ok_or_else(|| anyhow::anyhow!("missing action_view"))?
71 {
72 AV::Delegate(x) => ActionView::Delegate(x.try_into()?),
73 AV::Spend(x) => ActionView::Spend(x.try_into()?),
74 AV::Output(x) => ActionView::Output(x.try_into()?),
75 AV::Undelegate(x) => ActionView::Undelegate(x.try_into()?),
76 AV::UndelegateClaim(x) => ActionView::UndelegateClaim(x.try_into()?),
77 AV::Swap(x) => ActionView::Swap(x.try_into()?),
78 AV::SwapClaim(x) => ActionView::SwapClaim(x.try_into()?),
79 AV::ValidatorDefinition(x) => ActionView::ValidatorDefinition(x.try_into()?),
80 AV::IbcRelayAction(x) => ActionView::IbcRelay(x.try_into()?),
81 AV::ProposalSubmit(x) => ActionView::ProposalSubmit(x.try_into()?),
82 AV::ProposalWithdraw(x) => ActionView::ProposalWithdraw(x.try_into()?),
83 AV::ProposalDepositClaim(x) => ActionView::ProposalDepositClaim(x.try_into()?),
84 AV::ValidatorVote(x) => ActionView::ValidatorVote(x.try_into()?),
85 AV::DelegatorVote(x) => ActionView::DelegatorVote(x.try_into()?),
86 AV::PositionOpen(x) => ActionView::PositionOpen(x.try_into()?),
87 AV::PositionClose(x) => ActionView::PositionClose(x.try_into()?),
88 AV::PositionWithdraw(x) => ActionView::PositionWithdraw(x.try_into()?),
89 AV::PositionRewardClaim(_) => {
90 return Err(anyhow::anyhow!(
91 "PositionRewardClaim is deprecated and unsupported"
92 ))
93 }
94 AV::Ics20Withdrawal(x) => ActionView::Ics20Withdrawal(x.try_into()?),
95 AV::CommunityPoolDeposit(x) => ActionView::CommunityPoolDeposit(x.try_into()?),
96 AV::CommunityPoolSpend(x) => ActionView::CommunityPoolSpend(x.try_into()?),
97 AV::CommunityPoolOutput(x) => ActionView::CommunityPoolOutput(x.try_into()?),
98 AV::ActionDutchAuctionSchedule(x) => {
99 ActionView::ActionDutchAuctionSchedule(x.try_into()?)
100 }
101 AV::ActionDutchAuctionEnd(x) => ActionView::ActionDutchAuctionEnd(x.try_into()?),
102 AV::ActionDutchAuctionWithdraw(x) => {
103 ActionView::ActionDutchAuctionWithdraw(x.try_into()?)
104 }
105 },
106 )
107 }
108}
109
110impl From<ActionView> for pbt::ActionView {
111 fn from(v: ActionView) -> Self {
112 use pbt::action_view::ActionView as AV;
113 Self {
114 action_view: Some(match v {
115 ActionView::Swap(x) => AV::Swap(x.into()),
116 ActionView::SwapClaim(x) => AV::SwapClaim(x.into()),
117 ActionView::Output(x) => AV::Output(x.into()),
118 ActionView::Spend(x) => AV::Spend(x.into()),
119 ActionView::Delegate(x) => AV::Delegate(x.into()),
120 ActionView::Undelegate(x) => AV::Undelegate(x.into()),
121 ActionView::UndelegateClaim(x) => AV::UndelegateClaim(x.into()),
122 ActionView::ValidatorDefinition(x) => AV::ValidatorDefinition(x.into()),
123 ActionView::IbcRelay(x) => AV::IbcRelayAction(x.into()),
124 ActionView::ProposalSubmit(x) => AV::ProposalSubmit(x.into()),
125 ActionView::ProposalWithdraw(x) => AV::ProposalWithdraw(x.into()),
126 ActionView::ValidatorVote(x) => AV::ValidatorVote(x.into()),
127 ActionView::DelegatorVote(x) => AV::DelegatorVote(x.into()),
128 ActionView::ProposalDepositClaim(x) => AV::ProposalDepositClaim(x.into()),
129 ActionView::PositionOpen(x) => AV::PositionOpen(x.into()),
130 ActionView::PositionClose(x) => AV::PositionClose(x.into()),
131 ActionView::PositionWithdraw(x) => AV::PositionWithdraw(x.into()),
132 ActionView::Ics20Withdrawal(x) => AV::Ics20Withdrawal(x.into()),
133 ActionView::CommunityPoolDeposit(x) => AV::CommunityPoolDeposit(x.into()),
134 ActionView::CommunityPoolSpend(x) => AV::CommunityPoolSpend(x.into()),
135 ActionView::CommunityPoolOutput(x) => AV::CommunityPoolOutput(x.into()),
136 ActionView::ActionDutchAuctionSchedule(x) => {
137 AV::ActionDutchAuctionSchedule(x.into())
138 }
139 ActionView::ActionDutchAuctionEnd(x) => AV::ActionDutchAuctionEnd(x.into()),
140 ActionView::ActionDutchAuctionWithdraw(x) => {
141 AV::ActionDutchAuctionWithdraw(x.into())
142 }
143 }),
144 }
145 }
146}
147
148impl From<ActionView> for Action {
149 fn from(action_view: ActionView) -> Action {
150 match action_view {
151 ActionView::Swap(x) => Action::Swap(x.into()),
152 ActionView::SwapClaim(x) => Action::SwapClaim(x.into()),
153 ActionView::Output(x) => Action::Output(x.into()),
154 ActionView::Spend(x) => Action::Spend(x.into()),
155 ActionView::Delegate(x) => Action::Delegate(x),
156 ActionView::Undelegate(x) => Action::Undelegate(x),
157 ActionView::UndelegateClaim(x) => Action::UndelegateClaim(x),
158 ActionView::ValidatorDefinition(x) => Action::ValidatorDefinition(x),
159 ActionView::IbcRelay(x) => Action::IbcRelay(x),
160 ActionView::ProposalSubmit(x) => Action::ProposalSubmit(x),
161 ActionView::ProposalWithdraw(x) => Action::ProposalWithdraw(x),
162 ActionView::ValidatorVote(x) => Action::ValidatorVote(x),
163 ActionView::DelegatorVote(x) => Action::DelegatorVote(x.into()),
164 ActionView::ProposalDepositClaim(x) => Action::ProposalDepositClaim(x),
165 ActionView::PositionOpen(x) => Action::PositionOpen(x),
166 ActionView::PositionClose(x) => Action::PositionClose(x),
167 ActionView::PositionWithdraw(x) => Action::PositionWithdraw(x),
168 ActionView::Ics20Withdrawal(x) => Action::Ics20Withdrawal(x),
169 ActionView::CommunityPoolDeposit(x) => Action::CommunityPoolDeposit(x),
170 ActionView::CommunityPoolSpend(x) => Action::CommunityPoolSpend(x),
171 ActionView::CommunityPoolOutput(x) => Action::CommunityPoolOutput(x),
172 ActionView::ActionDutchAuctionSchedule(x) => {
173 Action::ActionDutchAuctionSchedule(x.into())
174 }
175 ActionView::ActionDutchAuctionEnd(x) => Action::ActionDutchAuctionEnd(x),
176 ActionView::ActionDutchAuctionWithdraw(x) => {
177 Action::ActionDutchAuctionWithdraw(x.into())
178 }
179 }
180 }
181}