110 lines
3.1 KiB
Rust
110 lines
3.1 KiB
Rust
//! 代币发行适配器
|
||
//!
|
||
//! 通过 ACC-20 协议在 NAC 主网发行 RWA 资产代币。
|
||
//! ACC-20 是 NAC 原生代币协议,不是 ERC-20 的衍生。
|
||
|
||
use crate::error::{OnboardingError, Result};
|
||
use crate::types::{AssetSubmission, TokenResult};
|
||
use rust_decimal::Decimal;
|
||
use chrono::Utc;
|
||
use tracing::info;
|
||
|
||
/// 代币发行适配器
|
||
///
|
||
/// 封装 ACC-20 协议的代币部署和查询逻辑。
|
||
pub struct TokenAdapter {
|
||
/// NVM 服务端点(通过 NAC_Lens 4.0 通信)
|
||
nvm_endpoint: String,
|
||
}
|
||
|
||
impl TokenAdapter {
|
||
/// 创建新的代币适配器
|
||
pub fn new() -> Result<Self> {
|
||
Ok(Self {
|
||
nvm_endpoint: "http://localhost:9547".to_string(),
|
||
})
|
||
}
|
||
|
||
/// 发行 ACC-20 资产代币
|
||
///
|
||
/// 通过 NVM 执行 Charter 合约,在 NAC 主网部署 ACC-20 代币合约。
|
||
pub async fn issue_token(
|
||
&self,
|
||
submission: &AssetSubmission,
|
||
dna_hash: &str,
|
||
xtzh_amount: Decimal,
|
||
) -> Result<TokenResult> {
|
||
info!("开始发行 ACC-20 代币: {}", submission.asset_name);
|
||
|
||
// 生成代币符号(NAC 原生格式)
|
||
let token_symbol = self.generate_symbol(&submission.asset_name);
|
||
|
||
// TODO: 通过 NAC_Lens 4.0 调用 NVM 部署 Charter ACC-20 合约
|
||
// 当前为 stub 实现,待 NVM 服务接口稳定后替换
|
||
let token_address = format!(
|
||
"NAC-ACC20-{}-{}",
|
||
&dna_hash[..8.min(dna_hash.len())],
|
||
token_symbol
|
||
);
|
||
let deploy_tx_hash = format!(
|
||
"TX-ACC20-{}-{}",
|
||
&dna_hash[..8.min(dna_hash.len())],
|
||
chrono::Utc::now().timestamp()
|
||
);
|
||
|
||
info!(
|
||
"ACC-20 代币发行完成: symbol={}, address={}",
|
||
token_symbol, token_address
|
||
);
|
||
|
||
Ok(TokenResult {
|
||
token_symbol,
|
||
token_address,
|
||
total_supply: xtzh_amount,
|
||
deploy_tx_hash,
|
||
timestamp: Utc::now(),
|
||
})
|
||
}
|
||
|
||
/// 生成 NAC 原生代币符号
|
||
fn generate_symbol(&self, asset_name: &str) -> String {
|
||
let prefix: String = asset_name
|
||
.chars()
|
||
.filter(|c| c.is_alphabetic())
|
||
.take(3)
|
||
.collect();
|
||
format!("{}RWA", prefix.to_uppercase())
|
||
}
|
||
|
||
/// 查询 ACC-20 代币余额
|
||
pub async fn get_balance(&self, token_address: &str, owner: &str) -> Result<Decimal> {
|
||
// TODO: 通过 NAC_Lens 4.0 查询 NVM 中的 ACC-20 合约余额
|
||
let _ = (token_address, owner, &self.nvm_endpoint);
|
||
Ok(Decimal::ZERO)
|
||
}
|
||
}
|
||
|
||
impl Default for TokenAdapter {
|
||
fn default() -> Self {
|
||
Self::new().expect("TokenAdapter 初始化失败")
|
||
}
|
||
}
|
||
|
||
#[cfg(test)]
|
||
mod tests {
|
||
use super::*;
|
||
|
||
#[test]
|
||
fn test_generate_symbol() {
|
||
let adapter = TokenAdapter::new().expect("初始化失败");
|
||
let symbol = adapter.generate_symbol("Real Estate Asset");
|
||
assert_eq!(symbol, "REARWA");
|
||
}
|
||
|
||
#[test]
|
||
fn test_adapter_creation() {
|
||
let adapter = TokenAdapter::new();
|
||
assert!(adapter.is_ok());
|
||
}
|
||
}
|