penumbra_sdk_community_pool/action/
community_pool_spend.rs

1use 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        // Spends from the Community Pool produce value
24        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}