penumbra_sdk_community_pool/action/
community_pool_deposit.rs1use 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};
7use 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 -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}