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