penumbra_sdk_app/action_handler/
actions.rs

1use std::sync::Arc;
2
3use anyhow::Result;
4use async_trait::async_trait;
5use cnidarium::{StateRead, StateWrite};
6use penumbra_sdk_shielded_pool::component::Ics20Transfer;
7use penumbra_sdk_transaction::Action;
8use penumbra_sdk_txhash::TransactionContext;
9
10mod submit;
11
12use crate::PenumbraHost;
13
14use super::AppActionHandler;
15use cnidarium_component::ActionHandler as _;
16
17#[async_trait]
18impl AppActionHandler for Action {
19    type CheckStatelessContext = TransactionContext;
20
21    async fn check_stateless(&self, context: TransactionContext) -> Result<()> {
22        match self {
23            Action::SwapClaim(action) => action.check_stateless(context).await,
24            Action::Spend(action) => action.check_stateless(context).await,
25            Action::DelegatorVote(action) => action.check_stateless(context).await,
26            Action::Delegate(action) => action.check_stateless(()).await,
27            Action::Undelegate(action) => action.check_stateless(()).await,
28            Action::UndelegateClaim(action) => action.check_stateless(()).await,
29            Action::ValidatorDefinition(action) => action.check_stateless(()).await,
30            Action::ValidatorVote(action) => action.check_stateless(()).await,
31            Action::PositionClose(action) => action.check_stateless(()).await,
32            Action::PositionOpen(action) => action.check_stateless(()).await,
33            Action::PositionWithdraw(action) => action.check_stateless(()).await,
34            Action::ProposalSubmit(action) => action.check_stateless(()).await,
35            Action::ProposalWithdraw(action) => action.check_stateless(()).await,
36            Action::ProposalDepositClaim(action) => action.check_stateless(()).await,
37            Action::Swap(action) => action.check_stateless(()).await,
38            Action::Output(action) => action.check_stateless(()).await,
39            Action::IbcRelay(action) => {
40                action
41                    .clone()
42                    .with_handler::<Ics20Transfer, PenumbraHost>()
43                    .check_stateless(())
44                    .await
45            }
46            Action::Ics20Withdrawal(action) => {
47                action
48                    .clone()
49                    .with_handler::<PenumbraHost>()
50                    .check_stateless(())
51                    .await
52            }
53            Action::CommunityPoolSpend(action) => action.check_stateless(()).await,
54            Action::CommunityPoolOutput(action) => action.check_stateless(()).await,
55            Action::CommunityPoolDeposit(action) => action.check_stateless(()).await,
56            Action::ActionDutchAuctionSchedule(action) => action.check_stateless(()).await,
57            Action::ActionDutchAuctionEnd(action) => action.check_stateless(()).await,
58            Action::ActionDutchAuctionWithdraw(action) => action.check_stateless(()).await,
59            Action::ActionLiquidityTournamentVote(action) => action.check_stateless(context).await,
60        }
61    }
62
63    async fn check_historical<S: StateRead + 'static>(&self, state: Arc<S>) -> Result<()> {
64        match self {
65            Action::Delegate(action) => action.check_historical(state).await,
66            Action::Undelegate(action) => action.check_historical(state).await,
67            Action::UndelegateClaim(action) => action.check_historical(state).await,
68            Action::ValidatorDefinition(action) => action.check_historical(state).await,
69            Action::DelegatorVote(action) => action.check_historical(state).await,
70            Action::ValidatorVote(action) => action.check_historical(state).await,
71            Action::PositionClose(action) => action.check_historical(state).await,
72            Action::PositionOpen(action) => action.check_historical(state).await,
73            Action::PositionWithdraw(action) => action.check_historical(state).await,
74            Action::ProposalSubmit(action) => action.check_historical(state).await,
75            Action::ProposalWithdraw(action) => action.check_historical(state).await,
76            Action::ProposalDepositClaim(action) => action.check_historical(state).await,
77            Action::Swap(action) => action.check_historical(state).await,
78            Action::SwapClaim(action) => action.check_historical(state).await,
79            Action::Spend(action) => action.check_historical(state).await,
80            Action::Output(action) => action.check_historical(state).await,
81            Action::IbcRelay(action) => {
82                action
83                    .clone()
84                    .with_handler::<Ics20Transfer, PenumbraHost>()
85                    .check_historical(state)
86                    .await
87            }
88            Action::Ics20Withdrawal(action) => {
89                action
90                    .clone()
91                    .with_handler::<PenumbraHost>()
92                    .check_historical(state)
93                    .await
94            }
95            Action::CommunityPoolSpend(action) => action.check_historical(state).await,
96            Action::CommunityPoolOutput(action) => action.check_historical(state).await,
97            Action::CommunityPoolDeposit(action) => action.check_historical(state).await,
98            Action::ActionDutchAuctionSchedule(action) => action.check_historical(state).await,
99            Action::ActionDutchAuctionEnd(action) => action.check_historical(state).await,
100            Action::ActionDutchAuctionWithdraw(action) => action.check_historical(state).await,
101            Action::ActionLiquidityTournamentVote(action) => action.check_historical(state).await,
102        }
103    }
104
105    async fn check_and_execute<S: StateWrite>(&self, state: S) -> Result<()> {
106        match self {
107            Action::Delegate(action) => action.check_and_execute(state).await,
108            Action::Undelegate(action) => action.check_and_execute(state).await,
109            Action::UndelegateClaim(action) => action.check_and_execute(state).await,
110            Action::ValidatorDefinition(action) => action.check_and_execute(state).await,
111            Action::DelegatorVote(action) => action.check_and_execute(state).await,
112            Action::ValidatorVote(action) => action.check_and_execute(state).await,
113            Action::PositionClose(action) => action.check_and_execute(state).await,
114            Action::PositionOpen(action) => action.check_and_execute(state).await,
115            Action::PositionWithdraw(action) => action.check_and_execute(state).await,
116            Action::ProposalSubmit(action) => action.check_and_execute(state).await,
117            Action::ProposalWithdraw(action) => action.check_and_execute(state).await,
118            Action::ProposalDepositClaim(action) => action.check_and_execute(state).await,
119            Action::Swap(action) => action.check_and_execute(state).await,
120            Action::SwapClaim(action) => action.check_and_execute(state).await,
121            Action::Spend(action) => action.check_and_execute(state).await,
122            Action::Output(action) => action.check_and_execute(state).await,
123            Action::IbcRelay(action) => {
124                action
125                    .clone()
126                    .with_handler::<Ics20Transfer, PenumbraHost>()
127                    .check_and_execute(state)
128                    .await
129            }
130            Action::Ics20Withdrawal(action) => {
131                action
132                    .clone()
133                    .with_handler::<PenumbraHost>()
134                    .check_and_execute(state)
135                    .await
136            }
137            Action::CommunityPoolSpend(action) => action.check_and_execute(state).await,
138            Action::CommunityPoolOutput(action) => action.check_and_execute(state).await,
139            Action::CommunityPoolDeposit(action) => action.check_and_execute(state).await,
140            Action::ActionDutchAuctionSchedule(action) => action.check_and_execute(state).await,
141            Action::ActionDutchAuctionEnd(action) => action.check_and_execute(state).await,
142            Action::ActionDutchAuctionWithdraw(action) => action.check_and_execute(state).await,
143            Action::ActionLiquidityTournamentVote(action) => action.check_and_execute(state).await,
144        }
145    }
146}