175 lines
6.3 KiB
Rust
Raw Normal View History

use std::{io::Write as _, path::Path, time::Duration};
2025-12-08 18:26:35 +03:00
use anyhow::{Context as _, Result};
use common::config::BasicAuth;
use humantime_serde;
use log::warn;
2025-08-19 14:14:09 +03:00
use serde::{Deserialize, Serialize};
use url::Url;
2024-12-03 09:32:35 +02:00
2026-07-20 11:34:05 +03:00
const DEFAULT_CALLIBRATION_LIMIT: usize = 100;
2026-07-21 18:01:04 +03:00
const DEFAULT_DISTRIBUTION_LIMIT: usize = 1;
2026-07-20 11:34:05 +03:00
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SequencerConnectionData {
/// Connection data of all known sequencers.
pub sequencer_addr: Url,
2026-07-14 13:10:32 +03:00
/// Basic authentication credentials.
#[serde(skip_serializing_if = "Option::is_none")]
pub basic_auth: Option<BasicAuth>,
}
2025-02-28 12:32:54 +02:00
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GasConfig {
2026-03-10 00:17:43 +03:00
/// Gas spent per deploying one byte of data.
2025-02-28 12:32:54 +02:00
pub gas_fee_per_byte_deploy: u64,
2026-03-10 00:17:43 +03:00
/// Gas spent per reading one byte of data in VM.
2025-02-28 12:32:54 +02:00
pub gas_fee_per_input_buffer_runtime: u64,
2026-03-10 00:17:43 +03:00
/// Gas spent per one byte of contract data in runtime.
2025-02-28 12:32:54 +02:00
pub gas_fee_per_byte_runtime: u64,
2026-03-10 00:17:43 +03:00
/// Cost of one gas of runtime in public balance.
2025-02-28 12:32:54 +02:00
pub gas_cost_runtime: u64,
2026-03-10 00:17:43 +03:00
/// Cost of one gas of deployment in public balance.
2025-02-28 12:32:54 +02:00
pub gas_cost_deploy: u64,
2026-03-10 00:17:43 +03:00
/// Gas limit for deployment.
2025-02-28 12:32:54 +02:00
pub gas_limit_deploy: u64,
2026-03-10 00:17:43 +03:00
/// Gas limit for runtime.
2025-02-28 12:32:54 +02:00
pub gas_limit_runtime: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MultiSequencerClientConfig {
2026-07-22 10:13:01 +03:00
/// Maximum numbers of sequencers to send requests. Client can have AT MOST
/// `distribution_limit` active clients.
pub distribution_limit: usize,
2026-07-21 18:01:04 +03:00
/// Limit number of sequencer polls during callibration, should not be zero.
pub calibration_limit: usize,
}
impl Default for MultiSequencerClientConfig {
fn default() -> Self {
Self {
2026-07-21 18:01:04 +03:00
distribution_limit: DEFAULT_DISTRIBUTION_LIMIT,
calibration_limit: DEFAULT_CALLIBRATION_LIMIT,
}
}
}
2026-02-03 19:04:41 -03:00
#[optfield::optfield(pub WalletConfigOverrides, rewrap, attrs = (derive(Debug, Default, Clone)))]
2024-12-03 09:32:35 +02:00
#[derive(Debug, Clone, Serialize, Deserialize)]
2025-08-11 08:55:08 +03:00
pub struct WalletConfig {
/// Connection data of all known sequencers.
2026-07-17 16:57:12 +03:00
pub sequencers: Vec<SequencerConnectionData>,
2026-03-10 00:17:43 +03:00
/// Sequencer polling duration for new blocks.
#[serde(with = "humantime_serde")]
pub seq_poll_timeout: Duration,
2026-03-10 00:17:43 +03:00
/// Sequencer polling max number of blocks to find transaction.
pub seq_tx_poll_max_blocks: usize,
2026-03-10 00:17:43 +03:00
/// Sequencer polling max number error retries.
2025-08-21 15:58:31 +03:00
pub seq_poll_max_retries: u64,
2026-03-10 00:17:43 +03:00
/// Max amount of blocks to poll in one request.
pub seq_block_poll_max_amount: u64,
2026-07-21 18:01:04 +03:00
#[serde(default = "MultiSequencerClientConfig::default")]
pub multi_sequencer_client_config: MultiSequencerClientConfig,
2024-12-03 09:32:35 +02:00
}
2025-10-29 13:23:07 +02:00
impl Default for WalletConfig {
fn default() -> Self {
Self {
2026-07-17 16:57:12 +03:00
sequencers: vec![SequencerConnectionData {
sequencer_addr: "https://testnet.lez.logos.co".parse().unwrap(),
basic_auth: None,
}],
seq_poll_timeout: Duration::from_secs(12),
seq_tx_poll_max_blocks: 5,
2025-10-29 13:23:07 +02:00
seq_poll_max_retries: 5,
seq_block_poll_max_amount: 100,
multi_sequencer_client_config: MultiSequencerClientConfig::default(),
2025-10-29 13:23:07 +02:00
}
}
}
impl WalletConfig {
2026-03-09 18:27:56 +03:00
pub fn from_path_or_initialize_default(config_path: &Path) -> Result<Self> {
match std::fs::File::open(config_path) {
Ok(file) => {
let reader = std::io::BufReader::new(file);
Ok(serde_json::from_reader(reader)?)
}
Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
println!("Config not found, setting up default config");
let config_home = config_path.parent().ok_or_else(|| {
anyhow::anyhow!(
2026-03-03 23:21:08 +03:00
"Could not get parent directory of config file at {}",
config_path.display()
)
})?;
std::fs::create_dir_all(config_home)?;
2026-03-03 23:21:08 +03:00
println!("Created configs dir at path {}", config_home.display());
let mut file = std::fs::OpenOptions::new()
.write(true)
.create(true)
.truncate(true)
.open(config_path)?;
2026-03-09 18:27:56 +03:00
let config = Self::default();
let default_config_serialized = serde_json::to_vec_pretty(&config).unwrap();
file.write_all(&default_config_serialized)?;
println!("Configs set up");
Ok(config)
}
Err(err) => Err(err).context("IO error"),
}
}
pub fn apply_overrides(&mut self, overrides: WalletConfigOverrides) {
2026-03-09 18:27:56 +03:00
let Self {
2026-07-17 16:57:12 +03:00
sequencers,
seq_poll_timeout,
seq_tx_poll_max_blocks,
seq_poll_max_retries,
seq_block_poll_max_amount,
multi_sequencer_client_config,
} = self;
let WalletConfigOverrides {
2026-07-17 16:57:12 +03:00
sequencers: o_sequencers,
seq_poll_timeout: o_seq_poll_timeout,
seq_tx_poll_max_blocks: o_seq_tx_poll_max_blocks,
seq_poll_max_retries: o_seq_poll_max_retries,
seq_block_poll_max_amount: o_seq_block_poll_max_amount,
multi_sequencer_client_config: o_multi_sequencer_client_config,
} = overrides;
2026-07-17 16:57:12 +03:00
if let Some(v) = o_sequencers {
warn!("Overriding wallet config 'sequencers' to {v:?}");
*sequencers = v;
}
if let Some(v) = o_seq_poll_timeout {
warn!("Overriding wallet config 'seq_poll_timeout' to {v:?}");
*seq_poll_timeout = v;
}
if let Some(v) = o_seq_tx_poll_max_blocks {
warn!("Overriding wallet config 'seq_tx_poll_max_blocks' to {v}");
*seq_tx_poll_max_blocks = v;
}
if let Some(v) = o_seq_poll_max_retries {
warn!("Overriding wallet config 'seq_poll_max_retries' to {v}");
*seq_poll_max_retries = v;
}
if let Some(v) = o_seq_block_poll_max_amount {
warn!("Overriding wallet config 'seq_block_poll_max_amount' to {v}");
*seq_block_poll_max_amount = v;
}
if let Some(v) = o_multi_sequencer_client_config {
warn!("Overriding wallet config 'multi_sequencer_client_config' to {v:?}");
*multi_sequencer_client_config = v;
}
}
}