anya_core/bip/
validation.rs1use serde::{Deserialize, Serialize};
4use std::error::Error;
5use std::fmt;
6
7pub type Result<T> = std::result::Result<T, Box<dyn Error>>;
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
12pub enum ComplianceStatus {
13 Compliant,
15 Partial,
17 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
41pub trait BipValidator {
43 fn validate_bip(&self, bip: &str) -> Result<ComplianceStatus>;
45}
46
47#[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}