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        }
60    }
61
62    async fn check_historical<S: StateRead + 'static>(&self, state: Arc<S>) -> Result<()> {
63        match self {
64            Action::Delegate(action) => action.check_historical(state).await,
65            Action::Undelegate(action) => action.check_historical(state).await,
66            Action::UndelegateClaim(action) => action.check_historical(state).await,
67            Action::ValidatorDefinition(action) => action.check_historical(state).await,
68            Action::DelegatorVote(action) => action.check_historical(state).await,
69            Action::ValidatorVote(action) => action.check_historical(state).await,
70            Action::PositionClose(action) => action.check_historical(state).await,
71            Action::PositionOpen(action) => action.check_historical(state).await,
72            Action::PositionWithdraw(action) => action.check_historical(state).await,
73            Action::ProposalSubmit(action) => action.check_historical(state).await,
74            Action::ProposalWithdraw(action) => action.check_historical(state).await,
75            Action::ProposalDepositClaim(action) => action.check_historical(state).await,
76            Action::Swap(action) => action.check_historical(state).await,
77            Action::SwapClaim(action) => action.check_historical(state).await,
78            Action::Spend(action) => action.check_historical(state).await,
79            Action::Output(action) => action.check_historical(state).await,
80            Action::IbcRelay(action) => {
81                action
82                    .clone()
83                    .with_handler::<Ics20Transfer, PenumbraHost>()
84                    .check_historical(state)
85                    .await
86            }
87            Action::Ics20Withdrawal(action) => {
88                action
89                    .clone()
90                    .with_handler::<PenumbraHost>()
91                    .check_historical(state)
92                    .await
93            }
94            Action::CommunityPoolSpend(action) => action.check_historical(state).await,
95            Action::CommunityPoolOutput(action) => action.check_historical(state).await,
96            Action::CommunityPoolDeposit(action) => action.check_historical(state).await,
97            Action::ActionDutchAuctionSchedule(action) => action.check_historical(state).await,
98            Action::ActionDutchAuctionEnd(action) => action.check_historical(state).await,
99            Action::ActionDutchAuctionWithdraw(action) => action.check_historical(state).await,
100        }
101    }
102
103    async fn check_and_execute<S: StateWrite>(&self, state: S) -> Result<()> {
104        match self {
105            Action::Delegate(action) => action.check_and_execute(state).await,
106            Action::Undelegate(action) => action.check_and_execute(state).await,
107            Action::UndelegateClaim(action) => action.check_and_execute(state).await,
108            Action::ValidatorDefinition(action) => action.check_and_execute(state).await,
109            Action::DelegatorVote(action) => action.check_and_execute(state).await,
110            Action::ValidatorVote(action) => action.check_and_execute(state).await,
111            Action::PositionClose(action) => action.check_and_execute(state).await,
112            Action::PositionOpen(action) => action.check_and_execute(state).await,
113            Action::PositionWithdraw(action) => action.check_and_execute(state).await,
114            Action::ProposalSubmit(action) => action.check_and_execute(state).await,
115            Action::ProposalWithdraw(action) => action.check_and_execute(state).await,
116            Action::ProposalDepositClaim(action) => action.check_and_execute(state).await,
117            Action::Swap(action) => action.check_and_execute(state).await,
118            Action::SwapClaim(action) => action.check_and_execute(state).await,
119            Action::Spend(action) => action.check_and_execute(state).await,
120            Action::Output(action) => action.check_and_execute(state).await,
121            Action::IbcRelay(action) => {
122                action
123                    .clone()
124                    .with_handler::<Ics20Transfer, PenumbraHost>()
125                    .check_and_execute(state)
126                    .await
127            }
128            Action::Ics20Withdrawal(action) => {
129                action
130                    .clone()
131                    .with_handler::<PenumbraHost>()
132                    .check_and_execute(state)
133                    .await
134            }
135            Action::CommunityPoolSpend(action) => action.check_and_execute(state).await,
136            Action::CommunityPoolOutput(action) => action.check_and_execute(state).await,
137            Action::CommunityPoolDeposit(action) => action.check_and_execute(state).await,
138            Action::ActionDutchAuctionSchedule(action) => action.check_and_execute(state).await,
139            Action::ActionDutchAuctionEnd(action) => action.check_and_execute(state).await,
140            Action::ActionDutchAuctionWithdraw(action) => action.check_and_execute(state).await,
141        }
142    }
143}