//! ACC-20C兼容层协议使用示例 //! //! 本示例演示如何使用NAC SDK与ACC-20C兼容层进行跨链交互 use nac_sdk::client::NRPC3Client; use nac_sdk::protocols::ACC20C; use nac_sdk::error::Result; use nac_udm::primitives::Address; use nac_udm::l1_protocol::acc20c::{EthAddress, u256}; #[tokio::main] async fn main() -> Result<()> { println!("=== ACC-20C 兼容层协议示例 ===\n"); // 1. 连接到NAC节点 println!("1. 连接到NAC节点..."); let client = NRPC3Client::new("https://rpc.newassetchain.io"); let acc20c = ACC20C::new(client); println!("✓ 已连接到NAC节点\n"); // 2. 准备测试数据 println!("2. 准备测试数据..."); let wrapper_address = Address::from_hex("0x12345678901234567890123456789012345678901234567890123456789012345678901234567890") .map_err(|e| nac_sdk::error::NACError::InvalidAddress(e))?; let nac_owner = Address::from_hex("0x22345678901234567890123456789012345678902234567890123456789012345678901234567890") .map_err(|e| nac_sdk::error::NACError::InvalidAddress(e))?; // 以太坊接收地址 let mut eth_recipient_bytes = [0u8; 20]; eth_recipient_bytes[0] = 0x33; eth_recipient_bytes[1] = 0x44; let eth_recipient = EthAddress(eth_recipient_bytes); println!("包装器地址: {}", wrapper_address); println!("NAC所有者: {}", nac_owner); println!("以太坊接收者: 0x{}", hex::encode(eth_recipient.0)); println!(); // 3. 查询包装器配置 println!("3. 查询包装器配置..."); let config = acc20c.get_wrapper_config(&wrapper_address).await?; println!("✓ 包装器配置:"); println!(" 每个NFT代表的ACC-20数量: {}", config.acc20_per_nft); println!(" 允许部分包装: {}", config.allow_partial_wrap); println!(" 包装手续费: {} 基点 ({}%)", config.wrap_fee_bps, config.wrap_fee_bps as f64 / 100.0); println!(" 解包装手续费: {} 基点 ({}%)", config.unwrap_fee_bps, config.unwrap_fee_bps as f64 / 100.0); println!(" 手续费接收地址: {}", config.fee_recipient); println!(" 保留合规检查: {}", config.preserve_compliance); println!(" 最小包装数量: {}", config.min_wrap_amount); println!(" 最大包装数量: {}", config.max_wrap_amount); println!(); // 4. 查询包装器状态 println!("4. 查询包装器状态..."); let status = acc20c.get_wrapper_status(&wrapper_address).await?; println!("✓ 包装器状态: {:?}\n", status); // 5. 计算包装手续费 println!("5. 计算包装手续费..."); let amount = 5_000_000_000_000_000_000u128; // 5 ACC-20 let wrap_fee = acc20c.calculate_wrap_fee(&wrapper_address, amount).await?; let net_amount = amount - wrap_fee; println!("✓ 手续费计算:"); println!(" 原始数量: {} (5 ACC-20)", amount); println!(" 包装手续费: {}", wrap_fee); println!(" 净数量: {}", net_amount); println!(); // 6. 包装ACC-20为ERC-721 println!("6. 包装ACC-20为ERC-721..."); println!(" 这将锁定NAC链上的ACC-20资产"); println!(" 并在以太坊链上铸造ERC-721 NFT"); let token_id = acc20c.wrap( &wrapper_address, &nac_owner, ð_recipient, amount, ).await?; println!("✓ 包装成功!"); println!(" ERC-721 Token ID: {}", token_id.low); println!(" 以太坊接收者: 0x{}", hex::encode(eth_recipient.0)); println!(); // 7. 查询包装资产信息 println!("7. 查询包装资产信息..."); let wrapped_asset = acc20c.get_wrapped_asset(&wrapper_address, token_id).await?; println!("✓ 包装资产详情:"); println!(" Token ID: {}", wrapped_asset.token_id.low); println!(" 原始持有量: {}", wrapped_asset.original_holdings); println!(" 原始所有者: {}", wrapped_asset.original_owner); println!(" 当前所有者: 0x{}", hex::encode(wrapped_asset.current_owner.0)); println!(" GNACS编码: {}", wrapped_asset.gnacs_code.format_readable()); println!(" 包装时间: {}", wrapped_asset.wrapped_at.as_secs()); println!(" 元数据URI: {}", wrapped_asset.metadata_uri); println!(" 状态: {:?}", wrapped_asset.status); println!(); // 8. 查询合规快照 println!("8. 查询合规快照..."); 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()); println!(" 快照哈希: {}", snapshot.snapshot_hash); println!(); // 9. 查询锁定的持有量 println!("9. 查询锁定的持有量..."); let locked = acc20c.get_locked_holdings(&wrapper_address, &nac_owner).await?; println!("✓ 锁定持有量:"); println!(" 所有者: {}", nac_owner); println!(" 锁定数量: {}", locked); println!(); // 10. 获取元数据URI println!("10. 获取元数据URI..."); let metadata_uri = acc20c.get_metadata_uri(&wrapper_address, token_id).await?; println!("✓ ERC-721元数据URI:"); println!(" {}", metadata_uri); println!(" (符合OpenSea标准,包含GNACS信息)"); println!(); // 11. 模拟在OpenSea交易 println!("11. 模拟在OpenSea交易..."); println!(" NFT现在可以在以太坊生态中自由交易"); println!(" - 在OpenSea上架"); println!(" - 在Uniswap提供流动性"); println!(" - 在其他DeFi协议中使用"); let mut new_eth_owner_bytes = [0u8; 20]; new_eth_owner_bytes[0] = 0x55; new_eth_owner_bytes[1] = 0x66; let new_eth_owner = EthAddress(new_eth_owner_bytes); println!("✓ NFT已交易给新所有者: 0x{}", hex::encode(new_eth_owner.0)); println!(); // 12. 计算解包装手续费 println!("12. 计算解包装手续费..."); let unwrap_fee = acc20c.calculate_unwrap_fee(&wrapper_address, net_amount).await?; let final_amount = net_amount - unwrap_fee; println!("✓ 解包装手续费计算:"); println!(" 锁定数量: {}", net_amount); println!(" 解包装手续费: {}", unwrap_fee); println!(" 最终数量: {}", final_amount); println!(); // 13. 解包装ERC-721为ACC-20 println!("13. 解包装ERC-721为ACC-20..."); println!(" 新所有者决定解包装回NAC链"); let new_nac_owner = Address::from_hex("0x62345678901234567890123456789012345678906234567890123456789012345678901234567890") .map_err(|e| nac_sdk::error::NACError::InvalidAddress(e))?; let unwrapped_amount = acc20c.unwrap( &wrapper_address, token_id, &new_eth_owner, &new_nac_owner, ).await?; println!("✓ 解包装成功!"); println!(" 销毁的ERC-721 Token ID: {}", token_id.low); println!(" 解锁的ACC-20数量: {}", unwrapped_amount); println!(" NAC接收者: {}", new_nac_owner); println!(); // 14. 验证锁定持有量已减少 println!("14. 验证锁定持有量已减少..."); let locked_after = acc20c.get_locked_holdings(&wrapper_address, &nac_owner).await?; println!("✓ 锁定持有量变化:"); println!(" 解包装前: {}", locked); println!(" 解包装后: {}", locked_after); println!(" 差额: {}", locked - locked_after); println!(); // 15. 冻结包装资产(演示) println!("15. 冻结包装资产(合规演示)..."); println!(" 如果发现合规问题,可以冻结包装资产"); // 创建一个新的token_id用于演示 let demo_token_id = u256::from_u128(999); acc20c.freeze_wrapped_asset(&wrapper_address, demo_token_id).await?; println!("✓ 包装资产已冻结"); println!(" Token ID: {}", demo_token_id.low); println!(" 冻结后无法解包装"); println!(); // 16. 解冻包装资产 println!("16. 解冻包装资产..."); println!(" 合规问题解决后,可以解冻资产"); acc20c.unfreeze_wrapped_asset(&wrapper_address, demo_token_id).await?; println!("✓ 包装资产已解冻"); println!(" Token ID: {}", demo_token_id.low); println!(" 现在可以正常解包装"); println!(); // 17. 总结 println!("=== ACC-20C 跨链流程总结 ===\n"); println!("完整的跨链流程:"); println!("1. NAC链: 锁定ACC-20资产"); println!("2. 以太坊链: 铸造ERC-721 NFT"); println!("3. 以太坊生态: 在OpenSea等平台交易"); println!("4. 以太坊链: 销毁ERC-721 NFT"); println!("5. NAC链: 解锁ACC-20资产"); println!(); println!("核心特性:"); println!("✓ 双向包装: NAC ↔ 以太坊"); println!("✓ 合规不妥协: 保留KYC/AML检查"); println!("✓ 状态同步: 跨链事件监听"); println!("✓ 元数据生成: 符合OpenSea标准"); println!("✓ 冻结机制: 跨链合规控制"); println!(); println!("战略定位:"); println!("- 短期(1-2年): 流动性入口,在OpenSea交易"); println!("- 中期(2-3年): 引导用户使用NAC原生工具"); println!("- 长期(3年+): ACC-20C变成可选而非必需"); println!(); println!("=== 示例完成 ==="); Ok(()) }