use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct LanguagesConfig {
pub enabled: Vec<String>,
#[serde(default)]
pub rust: Option<LanguageFeatures>,
#[serde(default)]
pub python: Option<LanguageFeatures>,
#[serde(default)]
pub javascript: Option<LanguageFeatures>,
#[serde(default)]
pub typescript: Option<LanguageFeatures>,
#[serde(default)]
pub go: Option<GoLanguageConfig>,
#[serde(default)]
pub solidity: Option<SolidityLanguageConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LanguageFeatures {
#[serde(default = "default_detect_dead_code")]
pub detect_dead_code: bool,
#[serde(default = "default_detect_complexity")]
pub detect_complexity: bool,
#[serde(default = "default_detect_duplication")]
pub detect_duplication: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GoLanguageConfig {
#[serde(flatten)]
pub features: LanguageFeatures,
#[serde(default)]
pub generated_code: GeneratedCodeMode,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SoliditySecurityConfig {
#[serde(default = "default_true")]
pub tx_origin: bool,
#[serde(default = "default_true")]
pub reentrancy_heuristic: bool,
#[serde(default = "default_true")]
pub unchecked_calls: bool,
#[serde(default = "default_true")]
pub delegatecall: bool,
#[serde(default = "default_true")]
pub selfdestruct: bool,
#[serde(default = "default_true")]
pub assembly_blocks: bool,
#[serde(default = "default_true")]
pub unbounded_loops: bool,
#[serde(default = "default_true")]
pub missing_access_control: bool,
#[serde(default = "default_true")]
pub hardcoded_addresses: bool,
#[serde(default = "default_true")]
pub floating_pragma: bool,
#[serde(default = "default_true")]
pub large_contracts: bool,
#[serde(default = "default_true")]
pub unchecked_arithmetic: bool,
#[serde(default = "default_true")]
pub unsafe_erc20_transfer: bool,
#[serde(default = "default_true")]
pub push_without_length_cap: bool,
#[serde(default = "default_true")]
pub block_timestamp_dependency: bool,
#[serde(default = "default_true")]
pub tx_gas_price_dependency: bool,
#[serde(default = "default_true")]
pub encode_packed_collision: bool,
#[serde(default = "default_true")]
pub delegatecall_in_constructor: bool,
}
impl Default for SoliditySecurityConfig {
fn default() -> Self {
Self {
tx_origin: true,
reentrancy_heuristic: true,
unchecked_calls: true,
delegatecall: true,
selfdestruct: true,
assembly_blocks: true,
unbounded_loops: true,
missing_access_control: true,
hardcoded_addresses: true,
floating_pragma: true,
large_contracts: true,
unchecked_arithmetic: true,
unsafe_erc20_transfer: true,
push_without_length_cap: true,
block_timestamp_dependency: true,
tx_gas_price_dependency: true,
encode_packed_collision: true,
delegatecall_in_constructor: true,
}
}
}
fn default_true() -> bool {
true
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SolidityLanguageConfig {
#[serde(flatten)]
pub features: LanguageFeatures,
#[serde(default)]
pub security: SoliditySecurityConfig,
#[serde(default)]
pub vendor_code: GeneratedCodeMode,
#[serde(default = "default_large_contract_threshold")]
pub large_contract_threshold: usize,
}
fn default_large_contract_threshold() -> usize {
20
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum GeneratedCodeMode {
Analyze,
#[default]
SuppressDebt,
Exclude,
}
impl Default for LanguageFeatures {
fn default() -> Self {
Self {
detect_dead_code: default_detect_dead_code(),
detect_complexity: default_detect_complexity(),
detect_duplication: default_detect_duplication(),
}
}
}
pub fn default_detect_dead_code() -> bool {
false
}
pub fn default_detect_complexity() -> bool {
true
}
pub fn default_detect_duplication() -> bool {
true
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EntropyConfig {
#[serde(default = "default_entropy_enabled")]
pub enabled: bool,
#[serde(default = "default_entropy_weight")]
pub weight: f64,
#[serde(default = "default_entropy_min_tokens")]
pub min_tokens: usize,
#[serde(default = "default_entropy_pattern_threshold")]
pub pattern_threshold: f64,
#[serde(default = "default_entropy_threshold")]
pub entropy_threshold: f64,
#[serde(default)]
pub use_classification: Option<bool>,
#[serde(default = "default_branch_threshold")]
pub branch_threshold: f64,
#[serde(default = "default_max_repetition_reduction")]
pub max_repetition_reduction: f64,
#[serde(default = "default_max_entropy_reduction")]
pub max_entropy_reduction: f64,
#[serde(default = "default_max_branch_reduction")]
pub max_branch_reduction: f64,
#[serde(default = "default_max_combined_reduction")]
pub max_combined_reduction: f64,
}
impl Default for EntropyConfig {
fn default() -> Self {
Self {
enabled: default_entropy_enabled(),
weight: default_entropy_weight(),
min_tokens: default_entropy_min_tokens(),
pattern_threshold: default_entropy_pattern_threshold(),
entropy_threshold: default_entropy_threshold(),
use_classification: None, branch_threshold: default_branch_threshold(),
max_repetition_reduction: default_max_repetition_reduction(),
max_entropy_reduction: default_max_entropy_reduction(),
max_branch_reduction: default_max_branch_reduction(),
max_combined_reduction: default_max_combined_reduction(),
}
}
}
pub fn default_entropy_enabled() -> bool {
true }
pub fn default_entropy_weight() -> f64 {
1.0 }
pub fn default_entropy_min_tokens() -> usize {
20
}
pub fn default_entropy_pattern_threshold() -> f64 {
0.7
}
pub fn default_entropy_threshold() -> f64 {
0.4 }
pub fn default_branch_threshold() -> f64 {
0.8 }
pub fn default_max_repetition_reduction() -> f64 {
0.20 }
pub fn default_max_entropy_reduction() -> f64 {
0.15 }
pub fn default_max_branch_reduction() -> f64 {
0.25 }
pub fn default_max_combined_reduction() -> f64 {
0.30 }