anya_core/bip/
validation.rs

1// [AIR-3][AIS-3][BPC-3][AIT-3] BIP Validation Implementation
2
3use serde::{Deserialize, Serialize};
4use std::error::Error;
5use std::fmt;
6
7/// Result type for BIP validation
8pub type Result<T> = std::result::Result<T, Box<dyn Error>>;
9
10/// Compliance status for BIP validation
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
12pub enum ComplianceStatus {
13    /// BIP is enabled and compliant
14    Compliant,
15    /// BIP is present but not fully compliant
16    Partial,
17    /// BIP is not present or not implemented
18    Missing,
19}
20
21impl From<bool> for ComplianceStatus {
22    fn from(status: bool) -> Self {
23        if status {
24            ComplianceStatus::Compliant
25        } else {
26            ComplianceStatus::Missing
27        }
28    }
29}
30
31impl fmt::Display for ComplianceStatus {
32    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
33        match self {
34            ComplianceStatus::Compliant => write!(f, "Compliant"),
35            ComplianceStatus::Partial => write!(f, "Partial"),
36            ComplianceStatus::Missing => write!(f, "Missing"),
37        }
38    }
39}
40
41/// Trait for validating BIP implementations
42pub trait BipValidator {
43    /// Validate a BIP implementation
44    fn validate_bip(&self, bip: &str) -> Result<ComplianceStatus>;
45}
46
47/// Configuration for Bitcoin functionality
48#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct BitcoinConfig {
50    pub taproot_enabled: bool,
51    pub psbt_version: u8,
52    pub tapscript_enabled: bool,
53    pub bip353_enabled: bool,
54    pub bip353_status: super::bip353::Bip353Status,
55}
56
57impl Default for BitcoinConfig {
58    fn default() -> Self {
59        Self {
60            taproot_enabled: true,
61            psbt_version: 2,
62            tapscript_enabled: true,
63            bip353_enabled: false,
64            bip353_status: super::bip353::Bip353Status::Disabled,
65        }
66    }
67}
68
69impl BipValidator for BitcoinConfig {
70    fn validate_bip(&self, bip: &str) -> Result<ComplianceStatus> {
71        match bip {
72            "BIP-341" => Ok(self.taproot_enabled.into()),
73            "BIP-174" => Ok((self.psbt_version >= 2).into()),
74            "BIP-342" => Ok(self.tapscript_enabled.into()),
75            "BIP-370" => Ok((self.psbt_version >= 2).into()),
76            "BIP-353" => match self.bip353_status {
77                super::bip353::Bip353Status::Disabled => Ok(ComplianceStatus::Missing),
78                super::bip353::Bip353Status::Stable => Ok(ComplianceStatus::Compliant),
79                super::bip353::Bip353Status::Beta => Ok(ComplianceStatus::Partial),
80            },
81            _ => Ok(ComplianceStatus::Missing),
82        }
83    }
84}