//! XTZH 稳定币铸造适配器 //! //! 通过 ACC-XTZH 协议在 NAC 主网铸造 XTZH 稳定币。 //! XTZH 采用 SDR 锚定模型 + 黄金储备保障,125% 抵押覆盖率。 use crate::error::{OnboardingError, Result}; use crate::types::{ValuationResult, XTZHResult, XTZHProtocol}; use rust_decimal::Decimal; use chrono::Utc; use tracing::info; /// XTZH 铸造适配器 pub struct XTZHAdapter { /// XTZH 协议实例 protocol: XTZHProtocol, } impl XTZHAdapter { /// 创建新的 XTZH 适配器 pub fn new() -> Result { Ok(Self { protocol: XTZHProtocol::new(), }) } /// 铸造 XTZH 稳定币 /// /// 根据 AI 估值结果,通过 ACC-XTZH 协议铸造对应数量的稳定币。 /// 铸造需要 125% 抵押覆盖率(由宪法层强制执行)。 pub async fn mint_xtzh( &self, valuation: &ValuationResult, dna_hash: &str, custody_hash: &str, ) -> Result { info!("开始铸造 XTZH: {} XTZH", valuation.valuation_xtzh); // 将 Decimal 转为 u128(XTZH 精度为 18 位) let amount_u128 = valuation.valuation_xtzh .to_string() .parse::() .unwrap_or(0.0) as u128; // 通过 ACC-XTZH 协议铸造(需要 125% 抵押) let mint_result = self.protocol.mint(amount_u128, custody_hash) .await .map_err(|e| OnboardingError::XTZHMintingError(format!("XTZH 铸造失败: {}", e)))?; let tx_hash = mint_result.transaction_hash; let xtzh_address = mint_result.xtzh_address; info!( "XTZH 铸造完成: amount={}, address={}, tx={}", valuation.valuation_xtzh, xtzh_address, tx_hash ); Ok(XTZHResult { xtzh_amount: valuation.valuation_xtzh, xtzh_address, mint_tx_hash: tx_hash, timestamp: Utc::now(), }) } /// 查询 XTZH 余额 pub async fn get_balance(&self, address: &str) -> Result { let balance = self.protocol.balance_of(address) .await .map_err(|e| OnboardingError::XTZHMintingError(format!("查询余额失败: {}", e)))?; Ok(Decimal::from(balance)) } /// 查询当前 SDR 汇率 pub async fn get_sdr_rate(&self) -> Result { let rate = self.protocol.get_sdr_rate() .await .map_err(|e| OnboardingError::XTZHMintingError(format!("查询 SDR 汇率失败: {}", e)))?; Ok(Decimal::try_from(rate).unwrap_or(Decimal::ONE)) } } impl Default for XTZHAdapter { fn default() -> Self { Self::new().expect("XTZHAdapter 初始化失败") } } #[cfg(test)] mod tests { use super::*; #[test] fn test_adapter_creation() { let adapter = XTZHAdapter::new(); assert!(adapter.is_ok()); } }