//! ACC-20C兼容层协议集成测试 use nac_sdk::client::NRPC3Client; 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 = NRPC3Client::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 = NRPC3Client::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 = NRPC3Client::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 = NRPC3Client::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 = NRPC3Client::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 = NRPC3Client::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 = NRPC3Client::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 = NRPC3Client::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 = NRPC3Client::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(()) }