penumbra_sdk_community_pool/action/
community_pool_spend.rs1use anyhow::{Context, Error};
2use serde::{Deserialize, Serialize};
3use std::convert::TryFrom;
4
5use penumbra_sdk_asset::{Balance, Value};
6use penumbra_sdk_proto::{penumbra::core::component::governance::v1 as pb, DomainType};
7use penumbra_sdk_txhash::{EffectHash, EffectingData};
8
9#[derive(Clone, Debug, Serialize, Deserialize)]
10#[serde(try_from = "pb::CommunityPoolSpend", into = "pb::CommunityPoolSpend")]
11pub struct CommunityPoolSpend {
12 pub value: Value,
13}
14
15impl EffectingData for CommunityPoolSpend {
16 fn effect_hash(&self) -> EffectHash {
17 EffectHash::from_proto_effecting_data(&self.to_proto())
18 }
19}
20
21impl CommunityPoolSpend {
22 pub fn balance(&self) -> Balance {
23 Balance::from(self.value)
25 }
26}
27
28impl DomainType for CommunityPoolSpend {
29 type Proto = pb::CommunityPoolSpend;
30}
31
32impl From<CommunityPoolSpend> for pb::CommunityPoolSpend {
33 fn from(msg: CommunityPoolSpend) -> Self {
34 pb::CommunityPoolSpend {
35 value: Some(msg.value.into()),
36 }
37 }
38}
39
40impl TryFrom<pb::CommunityPoolSpend> for CommunityPoolSpend {
41 type Error = Error;
42
43 fn try_from(proto: pb::CommunityPoolSpend) -> anyhow::Result<Self, Self::Error> {
44 let value = proto
45 .value
46 .ok_or_else(|| anyhow::anyhow!("missing value"))?
47 .try_into()
48 .context("malformed value")?;
49
50 Ok(CommunityPoolSpend { value })
51 }
52}