NAC_Blockchain/sdk/nac-sdk/tests/acc20c_integration_test.rs

313 lines
11 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.

//! 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,
&eth_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,
&eth_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,
&eth_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(())
}