nym_bandwidth_controller/
traits.rs1use async_trait::async_trait;
5use nym_credential_storage::storage::Storage;
6use nym_credentials_interface::TicketType;
7use nym_crypto::asymmetric::ed25519;
8use nym_validator_client::nyxd::contract_traits::DkgQueryClient;
9
10use crate::{error::BandwidthControllerError, BandwidthController, PreparedCredential};
11
12pub const DEFAULT_TICKETS_TO_SPEND: u32 = 1;
13
14pub const UPGRADE_MODE_JWT_TYPE: &str = "UPGRADE_MODE_JWT";
16
17#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
18#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
19pub trait BandwidthTicketProvider: Send + Sync {
20 async fn get_ecash_ticket(
21 &self,
22 ticket_type: TicketType,
23 gateway_id: ed25519::PublicKey,
24 tickets_to_spend: u32,
25 ) -> Result<PreparedCredential, BandwidthControllerError>;
26
27 async fn get_upgrade_mode_token(&self) -> Result<Option<String>, BandwidthControllerError>;
28}
29
30#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
31#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
32impl<C, St> BandwidthTicketProvider for BandwidthController<C, St>
33where
34 C: DkgQueryClient + Sync + Send,
35 St: nym_credential_storage::storage::Storage,
36 <St as Storage>::StorageError: Send + Sync + 'static,
37{
38 async fn get_ecash_ticket(
39 &self,
40 ticket_type: TicketType,
41 gateway_id: ed25519::PublicKey,
42 tickets_to_spend: u32,
43 ) -> Result<PreparedCredential, BandwidthControllerError> {
44 self.prepare_ecash_ticket(ticket_type, gateway_id.to_bytes(), tickets_to_spend)
45 .await
46 }
47
48 async fn get_upgrade_mode_token(&self) -> Result<Option<String>, BandwidthControllerError> {
49 let Some(emergency_credential) =
50 self.get_emergency_credential(UPGRADE_MODE_JWT_TYPE).await?
51 else {
52 return Ok(None);
53 };
54 let token = String::from_utf8(emergency_credential.data.content)
56 .map_err(|_| BandwidthControllerError::MalformedUpgradeModeToken)?;
57 Ok(Some(token))
58 }
59}