NAC_Blockchain/nvm_v2/nvm-l1/tests/integration_test.rs

207 lines
7.8 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// NAC公链完整集成测试
// 测试资产上链权益化的完整闭环
#[cfg(test)]
mod integration_tests {
use nvm_l1::asset_management::{AssetCertificate, AssetCertificateRegistry, XTZHStakingManager};
use nvm_l1::assetization::{EquityAsset, EquityAssetRegistry};
#[test]
fn test_complete_asset_tokenization_flow() {
println!("\n========== NAC公链资产上链权益化完整闭环测试 ==========\n");
// 1. 资产申请上链
println!("步骤1: 资产申请上链");
let asset_owner = vec![1u8; 20];
let asset_data = "商业地产-北京CBD核心区A座".as_bytes().to_vec();
let asset_value = 5_000_000; // 500万美元
// 2. 资产估值流程
println!("步骤2: 资产估值完成 - ${}", asset_value);
// 3. 获得链上确权 - 生成资产TOKEN
println!("步骤3: 链上确权 - 生成资产TOKEN");
let mut token_registry = AssetCertificateRegistry::new();
let asset_token = AssetCertificate::new(
asset_data.clone(),
asset_owner.clone(),
asset_value,
1234567890,
);
let token_id = asset_token.token_id.clone();
println!(" TOKEN ID: 0x{}", hex::encode(&token_id[..8]));
println!(" DNA哈希: 0x{}", hex::encode(&asset_token.asset_dna[..8]));
token_registry.register(asset_token).unwrap();
// 4. XTZH质押80%规则)
println!("\n步骤4: XTZH质押80%规则)");
let mut staking_manager = XTZHStakingManager::new();
let xtzh_amount = (asset_value * 80) / 100; // 质押80%
println!(" 需要质押: {} XTZH", xtzh_amount);
let stake_id = staking_manager.stake(
token_id.clone(),
asset_owner.clone(),
xtzh_amount,
asset_value,
1234567891,
).unwrap();
println!(" 质押ID: 0x{}", hex::encode(&stake_id[..8]));
// 验证80%规则
let stake = staking_manager.get_stake(&stake_id).unwrap();
assert!(stake.meets_80_percent_rule());
println!(" ✓ 满足80%规则");
// 5. 铸造权益化代币
println!("\n步骤5: 发行权益化资产代币");
let mut equity_registry = EquityAssetRegistry::new();
let equity_token = EquityAsset::new(
"CBD Commercial Real Estate Asset".to_string(),
"CBDRE".to_string(),
18,
asset_value, // 总供应量等于资产估值
token_id.clone(),
stake_id.clone(),
asset_owner.clone(),
1234567892,
);
println!(" 代币名称: {}", equity_token.name);
println!(" 代币符号: {}", equity_token.symbol);
println!(" 总供应量: {}", equity_token.total_supply);
println!(" 合约地址: 0x{}", hex::encode(&equity_token.contract_address[..8]));
equity_registry.register(equity_token.clone()).unwrap();
// 标记质押已用于发行
staking_manager.mark_issued(&stake_id).unwrap();
// 6. 测试代币转账
println!("\n步骤6: 代币交易测试");
let buyer = vec![2u8; 20];
let transfer_amount = 100_000;
{
let asset = equity_registry.get_mut(&equity_token.contract_address).unwrap();
asset.transfer(&asset_owner, buyer.clone(), transfer_amount).unwrap();
println!(" ✓ 转账成功: {} CBDRE", transfer_amount);
println!(" 所有者余额: {}", asset.balance_of(&asset_owner));
println!(" 买家余额: {}", asset.balance_of(&buyer));
}
// 7. 验证完整闭环
println!("\n========== 闭环验证 ==========");
// 闭环1: 资产TOKEN生成
let retrieved_token = token_registry.get(&token_id).unwrap();
assert_eq!(retrieved_token.asset_value, asset_value);
println!("✓ 闭环1: 资产TOKEN生成 - 通过");
// 闭环2: XTZH质押机制
let retrieved_stake = staking_manager.get_stake(&stake_id).unwrap();
assert!(retrieved_stake.is_used_for_issuance);
println!("✓ 闭环2: XTZH质押机制80%规则)- 通过");
// 闭环3: 权益化代币发行
let retrieved_equity = equity_registry.get(&equity_token.contract_address).unwrap();
assert_eq!(retrieved_equity.total_supply, asset_value);
println!("✓ 闭环3: 权益化代币发行 - 通过");
// 闭环4: 代币流通
let asset = equity_registry.get(&equity_token.contract_address).unwrap();
assert_eq!(asset.balance_of(&buyer), transfer_amount);
println!("✓ 闭环4: 代币流通交易 - 通过");
// 闭环5: 链上确权
assert_eq!(retrieved_token.owner, asset_owner);
println!("✓ 闭环5: 链上确权 - 通过");
println!("\n========== 所有闭环测试通过!==========\n");
}
#[test]
fn test_multiple_assets_flow() {
println!("\n========== 多资产并发测试 ==========\n");
let mut token_registry = AssetCertificateRegistry::new();
let mut staking_manager = XTZHStakingManager::new();
let mut equity_registry = EquityAssetRegistry::new();
// 创建3个不同的资产
let assets = vec![
("商业地产", 5_000_000),
("艺术品收藏", 2_000_000),
("知识产权", 1_000_000),
];
for (index, (name, value)) in assets.iter().enumerate() {
println!("资产{}: {} - ${}", index + 1, name, value);
let owner = vec![(index + 1) as u8; 20];
let asset_data = name.as_bytes().to_vec();
// 生成TOKEN
let asset_token = AssetCertificate::new(
asset_data,
owner.clone(),
*value,
1234567890 + index as u64,
);
let token_id = asset_token.token_id.clone();
token_registry.register(asset_token).unwrap();
// 质押XTZH
let xtzh_amount = (value * 80) / 100;
let stake_id = staking_manager.stake(
token_id.clone(),
owner.clone(),
xtzh_amount,
*value,
1234567891 + index as u64,
).unwrap();
// 发行代币
let symbol = format!("ASSET{}", index + 1);
let equity_token = EquityAsset::new(
name.to_string(),
symbol,
18,
*value,
token_id,
stake_id.clone(),
owner,
1234567892 + index as u64,
);
equity_registry.register(equity_token).unwrap();
staking_manager.mark_issued(&stake_id).unwrap();
println!(" ✓ 完成");
}
// 验证统计
let token_stats = token_registry.stats();
let staking_stats = staking_manager.stats();
let equity_stats = equity_registry.stats();
println!("\n统计信息:");
println!(" 资产TOKEN数: {}", token_stats.total_tokens);
println!(" XTZH质押总量: {}", staking_stats.total_xtzh_staked);
println!(" 权益代币数: {}", equity_stats.total_tokens);
println!(" 总资产价值: ${}", token_stats.total_value);
assert_eq!(token_stats.total_tokens, 3);
assert_eq!(staking_stats.issued_stakes, 3);
assert_eq!(equity_stats.total_tokens, 3);
println!("\n========== 多资产并发测试通过!==========\n");
}
}