penumbra_sdk_shielded_pool/component/
assets.rs

1use async_trait::async_trait;
2use cnidarium::{StateRead, StateWrite};
3use penumbra_sdk_asset::asset::{self, Metadata};
4use penumbra_sdk_proto::{StateReadProto, StateWriteProto};
5
6use tracing::instrument;
7
8use crate::state_key;
9
10#[async_trait]
11pub trait AssetRegistryRead: StateRead {
12    async fn denom_metadata_by_asset(&self, asset_id: &asset::Id) -> Option<Metadata> {
13        self.get(&state_key::denom_metadata_by_asset::by_asset_id(asset_id))
14            .await
15            .expect("no deserialization error")
16    }
17}
18
19impl<T: StateRead + ?Sized> AssetRegistryRead for T {}
20
21#[async_trait]
22pub trait AssetRegistry: StateWrite {
23    /// Register a new asset present in the shielded pool.
24    /// If the asset is already registered, this is a no-op.
25    #[instrument(skip(self))]
26    async fn register_denom(&mut self, denom: &Metadata) {
27        let asset_id = denom.id();
28        tracing::debug!(?asset_id, "registering asset metadata in shielded pool");
29
30        if self.denom_metadata_by_asset(&asset_id).await.is_none() {
31            self.put(
32                state_key::denom_metadata_by_asset::by_asset_id(&asset_id),
33                denom.clone(),
34            );
35        }
36    }
37}
38
39impl<T: StateWrite + ?Sized> AssetRegistry for T {}