fedimint_testing_core/
config.rs

1use std::collections::{BTreeMap, BTreeSet, HashMap};
2use std::sync::{Arc, LazyLock};
3
4use fedimint_core::PeerId;
5use fedimint_core::core::ModuleKind;
6use fedimint_core::module::ApiAuth;
7use fedimint_core::setup_code::{PeerEndpoints, PeerSetupCode};
8use fedimint_server::config::ConfigGenParams;
9use fedimint_server::core::ServerModuleInitRegistry;
10use fedimint_server::net::p2p_connector::gen_cert_and_key;
11use tokio_rustls::rustls;
12
13pub static API_AUTH: LazyLock<ApiAuth> = LazyLock::new(|| ApiAuth("pass".to_string()));
14
15/// Creates the config gen params for each peer
16///
17/// Uses peers * 2 ports offset from `base_port`
18pub fn local_config_gen_params(
19    peers: &[PeerId],
20    base_port: u16,
21    enable_mint_fees: bool,
22    registry: &ServerModuleInitRegistry,
23) -> anyhow::Result<HashMap<PeerId, ConfigGenParams>> {
24    let enabled_modules: BTreeSet<ModuleKind> =
25        registry.iter().map(|(kind, _)| kind.clone()).collect();
26
27    // Generate TLS cert and private key
28    let tls_keys: HashMap<
29        PeerId,
30        (
31            rustls::pki_types::CertificateDer<'static>,
32            Arc<rustls::pki_types::PrivateKeyDer<'static>>,
33        ),
34    > = peers
35        .iter()
36        .map(|peer| {
37            (
38                *peer,
39                gen_cert_and_key(&format!("peer-{}", peer.to_usize())).unwrap(),
40            )
41        })
42        .collect();
43
44    // Generate the P2P and API URL on 2 different ports for each peer
45    let connections: BTreeMap<PeerId, PeerSetupCode> = peers
46        .iter()
47        .map(|peer| {
48            let peer_port = base_port + u16::from(*peer) * 3;
49
50            let p2p_url = format!("fedimint://127.0.0.1:{peer_port}");
51            let api_url = format!("ws://127.0.0.1:{}", peer_port + 1);
52
53            let params = PeerSetupCode {
54                name: format!("peer-{}", peer.to_usize()),
55                endpoints: PeerEndpoints::Tcp {
56                    api_url: api_url.parse().expect("Should parse"),
57                    p2p_url: p2p_url.parse().expect("Should parse"),
58                    cert: tls_keys[peer].0.as_ref().to_vec(),
59                },
60                federation_name: None,
61                disable_base_fees: Some(!enable_mint_fees),
62                enabled_modules: None,
63            };
64            (*peer, params)
65        })
66        .collect();
67
68    peers
69        .iter()
70        .map(|peer| {
71            let params = ConfigGenParams {
72                identity: *peer,
73                api_auth: API_AUTH.clone(),
74                tls_key: Some(tls_keys[peer].1.clone()),
75                iroh_api_sk: None,
76                iroh_p2p_sk: None,
77                peers: connections.clone(),
78                meta: BTreeMap::new(),
79                disable_base_fees: !enable_mint_fees,
80                enabled_modules: enabled_modules.clone(),
81                network: bitcoin::Network::Regtest,
82            };
83            Ok((*peer, params))
84        })
85        .collect()
86}