NAC_Blockchain/nac-sdk/examples/acc20c_example.rs

238 lines
9.4 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兼容层协议使用示例
//!
//! 本示例演示如何使用NAC SDK与ACC-20C兼容层进行跨链交互
use nac_sdk::client::NacLensClient;
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 = NacLensClient::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,
&eth_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(())
}