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 }
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}