penumbra_sdk_community_pool/action/
community_pool_deposit.rs

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