penumbra_sdk_distributions/component/
view.rs

1use async_trait::async_trait;
2
3use crate::{component::state_key, params::DistributionsParameters};
4use anyhow::Result;
5use cnidarium::{StateRead, StateWrite};
6use penumbra_sdk_num::Amount;
7use penumbra_sdk_proto::{StateReadProto, StateWriteProto};
8
9#[async_trait]
10pub trait StateReadExt: StateRead {
11    /// Gets the distributions module chain parameters from the JMT.
12    async fn get_distributions_params(&self) -> Result<DistributionsParameters> {
13        self.get(state_key::distributions_parameters())
14            .await?
15            .ok_or_else(|| anyhow::anyhow!("Missing DistributionsParameters"))
16    }
17
18    fn get_staking_token_issuance_for_epoch(&self) -> Option<Amount> {
19        self.object_get(&state_key::staking_token_issuance_for_epoch())
20    }
21}
22
23impl<T: StateRead + ?Sized> StateReadExt for T {}
24#[async_trait]
25
26pub trait StateWriteExt: StateWrite + StateReadExt {
27    /// Set the total amount of staking tokens issued for this epoch.
28    fn set_staking_token_issuance_for_epoch(&mut self, issuance: Amount) {
29        self.object_put(state_key::staking_token_issuance_for_epoch(), issuance);
30    }
31
32    /// Set the Distributions parameters in the JMT.
33    fn put_distributions_params(&mut self, params: DistributionsParameters) {
34        self.put(state_key::distributions_parameters().into(), params)
35    }
36}
37impl<T: StateWrite + ?Sized> StateWriteExt for T {}