207 lines
7.8 KiB
Rust
207 lines
7.8 KiB
Rust
// 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");
|
||
}
|
||
}
|