penumbra_sdk_transaction/view/
action_view.rs

1use 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    // Action types with encrypted contents
35    Spend(SpendView),
36    Output(OutputView),
37    Swap(SwapView),
38    SwapClaim(SwapClaimView),
39    DelegatorVote(DelegatorVoteView),
40    // Action types with transparent contents
41    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}