238 lines
9.4 KiB
Rust
238 lines
9.4 KiB
Rust
//! 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(())
|
||
}
|