penumbra_sdk_app/action_handler/
actions.rs1use 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}