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::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    // Action types with encrypted contents
31    Spend(SpendView),
32    Output(OutputView),
33    Swap(SwapView),
34    SwapClaim(SwapClaimView),
35    DelegatorVote(DelegatorVoteView),
36    // Action types with transparent contents
37    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}