nym_bandwidth_controller/
traits.rs

1// Copyright 2025 - Nym Technologies SA <contact@nymtech.net>
2// SPDX-License-Identifier: Apache-2.0
3
4use 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
14// TODO: this does not really belong here
15pub 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        // upgrade mode credential is just a simple stringified JWT
55        let token = String::from_utf8(emergency_credential.data.content)
56            .map_err(|_| BandwidthControllerError::MalformedUpgradeModeToken)?;
57        Ok(Some(token))
58    }
59}