313 lines
11 KiB
Rust
313 lines
11 KiB
Rust
//! ACC-20C兼容层协议集成测试
|
||
|
||
use nac_sdk::client::NacLensClient;
|
||
use nac_sdk::protocols::ACC20C;
|
||
use nac_sdk::error::{Result, NACError};
|
||
use nac_udm::primitives::{Address, Timestamp};
|
||
use nac_udm::l1_protocol::acc20c::{EthAddress, u256};
|
||
|
||
// ===== 单元测试(不需要NAC节点) =====
|
||
|
||
#[test]
|
||
fn test_acc20c_interface_creation() {
|
||
let client = NacLensClient::new("https://rpc.newassetchain.io");
|
||
let acc20c = ACC20C::new(client);
|
||
|
||
// 验证接口创建成功
|
||
assert!(true);
|
||
}
|
||
|
||
#[test]
|
||
fn test_u256_creation() {
|
||
let token_id = u256::from_u128(12345);
|
||
assert_eq!(token_id.low, 12345);
|
||
assert_eq!(token_id.high, 0);
|
||
|
||
let zero = u256::zero();
|
||
assert_eq!(zero.low, 0);
|
||
assert_eq!(zero.high, 0);
|
||
}
|
||
|
||
#[test]
|
||
fn test_eth_address_creation() {
|
||
let eth_addr = EthAddress([0u8; 20]);
|
||
assert_eq!(eth_addr.0.len(), 20);
|
||
|
||
// 测试以太坊地址格式
|
||
let mut addr_bytes = [0u8; 20];
|
||
addr_bytes[0] = 0xde;
|
||
addr_bytes[1] = 0xad;
|
||
addr_bytes[2] = 0xbe;
|
||
addr_bytes[3] = 0xef;
|
||
let eth_addr2 = EthAddress(addr_bytes);
|
||
assert_eq!(eth_addr2.0[0], 0xde);
|
||
}
|
||
|
||
#[test]
|
||
fn test_address_parsing() {
|
||
let addr_str = "0x12345678901234567890123456789012345678901234567890123456789012345678901234567890";
|
||
let result = Address::from_hex(addr_str);
|
||
assert!(result.is_ok());
|
||
}
|
||
|
||
// ===== 集成测试(需要NAC节点运行) =====
|
||
|
||
#[tokio::test]
|
||
#[ignore]
|
||
async fn test_acc20c_wrap_and_unwrap() -> Result<()> {
|
||
// 1. 创建客户端
|
||
let client = NacLensClient::new("https://testnet.newassetchain.io");
|
||
let acc20c = ACC20C::new(client);
|
||
|
||
// 2. 准备测试数据
|
||
let wrapper_address = Address::from_hex("0x12345678901234567890123456789012345678901234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
let owner_address = Address::from_hex("0x22345678901234567890123456789012345678902234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
|
||
// 以太坊接收地址
|
||
let mut eth_recipient_bytes = [0u8; 20];
|
||
eth_recipient_bytes[0] = 0x33;
|
||
let eth_recipient = EthAddress(eth_recipient_bytes);
|
||
|
||
// 3. 包装ACC-20为ERC-721
|
||
let amount = 1_000_000_000_000_000_000u128; // 1 ACC-20
|
||
let token_id = acc20c.wrap(
|
||
&wrapper_address,
|
||
&owner_address,
|
||
ð_recipient,
|
||
amount,
|
||
).await?;
|
||
|
||
println!("✓ 包装成功,Token ID: {}", token_id.low);
|
||
|
||
// 4. 查询包装资产信息
|
||
let wrapped_asset = acc20c.get_wrapped_asset(&wrapper_address, token_id).await?;
|
||
|
||
assert_eq!(wrapped_asset.token_id, token_id);
|
||
assert_eq!(wrapped_asset.original_owner, owner_address);
|
||
assert_eq!(wrapped_asset.current_owner, eth_recipient);
|
||
println!("✓ 包装资产信息查询成功");
|
||
|
||
// 5. 查询锁定的持有量
|
||
let locked = acc20c.get_locked_holdings(&wrapper_address, &owner_address).await?;
|
||
assert!(locked > 0);
|
||
println!("✓ 锁定持有量: {}", locked);
|
||
|
||
// 6. 解包装ERC-721为ACC-20
|
||
let nac_recipient = Address::from_hex("0x42345678901234567890123456789012345678904234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
let unwrapped_amount = acc20c.unwrap(
|
||
&wrapper_address,
|
||
token_id,
|
||
ð_recipient,
|
||
&nac_recipient,
|
||
).await?;
|
||
|
||
assert!(unwrapped_amount > 0);
|
||
println!("✓ 解包装成功,数量: {}", unwrapped_amount);
|
||
|
||
Ok(())
|
||
}
|
||
|
||
#[tokio::test]
|
||
#[ignore]
|
||
async fn test_acc20c_freeze_and_unfreeze() -> Result<()> {
|
||
// 1. 创建客户端
|
||
let client = NacLensClient::new("https://testnet.newassetchain.io");
|
||
let acc20c = ACC20C::new(client);
|
||
|
||
// 2. 准备测试数据
|
||
let wrapper_address = Address::from_hex("0x12345678901234567890123456789012345678901234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
let token_id = u256::from_u128(1);
|
||
|
||
// 3. 冻结包装资产
|
||
acc20c.freeze_wrapped_asset(&wrapper_address, token_id).await?;
|
||
println!("✓ 包装资产已冻结");
|
||
|
||
// 4. 查询包装资产状态
|
||
let wrapped_asset = acc20c.get_wrapped_asset(&wrapper_address, token_id).await?;
|
||
println!("✓ 资产状态: {:?}", wrapped_asset.status);
|
||
|
||
// 5. 解冻包装资产
|
||
acc20c.unfreeze_wrapped_asset(&wrapper_address, token_id).await?;
|
||
println!("✓ 包装资产已解冻");
|
||
|
||
Ok(())
|
||
}
|
||
|
||
#[tokio::test]
|
||
#[ignore]
|
||
async fn test_acc20c_wrapper_config() -> Result<()> {
|
||
// 1. 创建客户端
|
||
let client = NacLensClient::new("https://testnet.newassetchain.io");
|
||
let acc20c = ACC20C::new(client);
|
||
|
||
// 2. 准备测试数据
|
||
let wrapper_address = Address::from_hex("0x12345678901234567890123456789012345678901234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
|
||
// 3. 查询包装器配置
|
||
let config = acc20c.get_wrapper_config(&wrapper_address).await?;
|
||
|
||
println!("✓ 包装器配置:");
|
||
println!(" 每个NFT代表的ACC-20数量: {}", config.acc20_per_nft);
|
||
println!(" 包装手续费: {} 基点", config.wrap_fee_bps);
|
||
println!(" 解包装手续费: {} 基点", config.unwrap_fee_bps);
|
||
println!(" 保留合规检查: {}", config.preserve_compliance);
|
||
println!(" 最小包装数量: {}", config.min_wrap_amount);
|
||
println!(" 最大包装数量: {}", config.max_wrap_amount);
|
||
|
||
assert!(config.acc20_per_nft > 0);
|
||
assert!(config.min_wrap_amount > 0);
|
||
|
||
Ok(())
|
||
}
|
||
|
||
#[tokio::test]
|
||
#[ignore]
|
||
async fn test_acc20c_wrapper_status() -> Result<()> {
|
||
// 1. 创建客户端
|
||
let client = NacLensClient::new("https://testnet.newassetchain.io");
|
||
let acc20c = ACC20C::new(client);
|
||
|
||
// 2. 准备测试数据
|
||
let wrapper_address = Address::from_hex("0x12345678901234567890123456789012345678901234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
|
||
// 3. 查询包装器状态
|
||
let status = acc20c.get_wrapper_status(&wrapper_address).await?;
|
||
|
||
println!("✓ 包装器状态: {:?}", status);
|
||
|
||
Ok(())
|
||
}
|
||
|
||
#[tokio::test]
|
||
#[ignore]
|
||
async fn test_acc20c_metadata_uri() -> Result<()> {
|
||
// 1. 创建客户端
|
||
let client = NacLensClient::new("https://testnet.newassetchain.io");
|
||
let acc20c = ACC20C::new(client);
|
||
|
||
// 2. 准备测试数据
|
||
let wrapper_address = Address::from_hex("0x12345678901234567890123456789012345678901234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
let token_id = u256::from_u128(1);
|
||
|
||
// 3. 获取元数据URI
|
||
let metadata_uri = acc20c.get_metadata_uri(&wrapper_address, token_id).await?;
|
||
|
||
println!("✓ 元数据URI: {}", metadata_uri);
|
||
assert!(metadata_uri.starts_with("https://") || metadata_uri.starts_with("ipfs://"));
|
||
|
||
Ok(())
|
||
}
|
||
|
||
#[tokio::test]
|
||
#[ignore]
|
||
async fn test_acc20c_fee_calculation() -> Result<()> {
|
||
// 1. 创建客户端
|
||
let client = NacLensClient::new("https://testnet.newassetchain.io");
|
||
let acc20c = ACC20C::new(client);
|
||
|
||
// 2. 准备测试数据
|
||
let wrapper_address = Address::from_hex("0x12345678901234567890123456789012345678901234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
let amount = 1_000_000_000_000_000_000u128; // 1 ACC-20
|
||
|
||
// 3. 计算包装手续费
|
||
let wrap_fee = acc20c.calculate_wrap_fee(&wrapper_address, amount).await?;
|
||
println!("✓ 包装手续费: {}", wrap_fee);
|
||
|
||
// 4. 计算解包装手续费
|
||
let unwrap_fee = acc20c.calculate_unwrap_fee(&wrapper_address, amount).await?;
|
||
println!("✓ 解包装手续费: {}", unwrap_fee);
|
||
|
||
// 手续费应该小于原始金额
|
||
assert!(wrap_fee < amount);
|
||
assert!(unwrap_fee < amount);
|
||
|
||
Ok(())
|
||
}
|
||
|
||
#[tokio::test]
|
||
#[ignore]
|
||
async fn test_acc20c_compliance_snapshot() -> Result<()> {
|
||
// 1. 创建客户端
|
||
let client = NacLensClient::new("https://testnet.newassetchain.io");
|
||
let acc20c = ACC20C::new(client);
|
||
|
||
// 2. 准备测试数据
|
||
let wrapper_address = Address::from_hex("0x12345678901234567890123456789012345678901234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
let token_id = u256::from_u128(1);
|
||
|
||
// 3. 查询包装资产信息(包含合规快照)
|
||
let wrapped_asset = acc20c.get_wrapped_asset(&wrapper_address, token_id).await?;
|
||
|
||
let snapshot = &wrapped_asset.compliance_snapshot;
|
||
println!("✓ 合规快照:");
|
||
println!(" KYC级别: {}", snapshot.kyc_level);
|
||
println!(" AML状态: {}", snapshot.aml_status);
|
||
println!(" 合规级别: {}", snapshot.compliance_level);
|
||
println!(" 司法辖区: {}", snapshot.jurisdiction);
|
||
println!(" 快照时间: {}", snapshot.snapshot_at.as_secs());
|
||
|
||
// 验证合规快照存在
|
||
assert!(snapshot.kyc_level > 0);
|
||
assert!(snapshot.snapshot_at.as_secs() > 0);
|
||
|
||
Ok(())
|
||
}
|
||
|
||
#[tokio::test]
|
||
#[ignore]
|
||
async fn test_acc20c_cross_chain_flow() -> Result<()> {
|
||
// 完整的跨链流程测试
|
||
|
||
// 1. 创建客户端
|
||
let client = NacLensClient::new("https://testnet.newassetchain.io");
|
||
let acc20c = ACC20C::new(client);
|
||
|
||
// 2. 准备测试数据
|
||
let wrapper_address = Address::from_hex("0x12345678901234567890123456789012345678901234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
let nac_owner = Address::from_hex("0x22345678901234567890123456789012345678902234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
|
||
let mut eth_trader_bytes = [0u8; 20];
|
||
eth_trader_bytes[0] = 0x33;
|
||
let eth_trader = EthAddress(eth_trader_bytes);
|
||
|
||
let amount = 5_000_000_000_000_000_000u128; // 5 ACC-20
|
||
|
||
println!("=== 跨链流程测试 ===");
|
||
|
||
// 3. 步骤1:在NAC链包装
|
||
println!("\n步骤1:在NAC链包装ACC-20...");
|
||
let token_id = acc20c.wrap(
|
||
&wrapper_address,
|
||
&nac_owner,
|
||
ð_trader,
|
||
amount,
|
||
).await?;
|
||
println!("✓ 包装成功,Token ID: {}", token_id.low);
|
||
|
||
// 4. 步骤2:在以太坊链交易(模拟)
|
||
println!("\n步骤2:在以太坊链交易(模拟)...");
|
||
let mut new_eth_owner_bytes = [0u8; 20];
|
||
new_eth_owner_bytes[0] = 0x44;
|
||
let new_eth_owner = EthAddress(new_eth_owner_bytes);
|
||
println!("✓ NFT已在OpenSea交易给新所有者");
|
||
|
||
// 5. 步骤3:新所有者解包装回NAC链
|
||
println!("\n步骤3:新所有者解包装回NAC链...");
|
||
let new_nac_owner = Address::from_hex("0x52345678901234567890123456789012345678905234567890123456789012345678901234567890").map_err(|e| NACError::InvalidAddress(e))?;
|
||
let unwrapped_amount = acc20c.unwrap(
|
||
&wrapper_address,
|
||
token_id,
|
||
&new_eth_owner,
|
||
&new_nac_owner,
|
||
).await?;
|
||
println!("✓ 解包装成功,数量: {}", unwrapped_amount);
|
||
|
||
// 6. 验证完整流程
|
||
println!("\n✓ 跨链流程测试完成");
|
||
println!(" 原始数量: {}", amount);
|
||
println!(" 解包装数量: {}", unwrapped_amount);
|
||
println!(" 手续费: {}", amount - unwrapped_amount);
|
||
|
||
Ok(())
|
||
}
|