351 lines
11 KiB
Plaintext
351 lines
11 KiB
Plaintext
///! ACC-20增强版完整使用示例
|
||
///!
|
||
///! 本示例展示如何使用ACC-20增强版和ACC-20C兼容层
|
||
|
||
module acc20_enhanced_example;
|
||
|
||
use acc::acc20_enhanced::{ACC20Enhanced, KYCLevel, AMLStatus, ComplianceStatus};
|
||
use acc::acc20c::{ACC20CWrapper};
|
||
use asset::gnacs::{GNACSCode, AssetCategory, Jurisdiction, ComplianceLevel, RiskLevel};
|
||
use sovereignty::types::{SovereigntyType};
|
||
|
||
/// 示例1:创建上海办公室股权资产
|
||
fn example1_create_shanghai_office_share() {
|
||
// 1. 创建GNACS编码
|
||
let gnacs = GNACSCode::new(
|
||
AssetCategory::Equity, // 股权类资产
|
||
1, // 子类别:商业地产股权
|
||
Jurisdiction::CN, // 中国司法辖区
|
||
ComplianceLevel::High, // 高合规要求
|
||
RiskLevel::Medium, // 中等风险
|
||
);
|
||
|
||
// 2. 创建ACC-20增强版资产
|
||
let mut asset = ACC20Enhanced::new(
|
||
"Shanghai Office Share".to_string(),
|
||
"SH-OFFICE".to_string(),
|
||
18, // 18位小数
|
||
gnacs,
|
||
SovereigntyType::A0, // 绝对所有权
|
||
).unwrap();
|
||
|
||
// 3. 设置合规状态为已批准
|
||
asset.compliance_status = ComplianceStatus::Approved;
|
||
|
||
// 4. 铸造资产(总共100万股)
|
||
let owner = Address::from("0x1234...");
|
||
asset.mint(owner, 1_000_000 * 10^18, &context).unwrap();
|
||
|
||
println!("✅ 创建上海办公室股权资产成功!");
|
||
println!(" 资产名称: {}", asset.name);
|
||
println!(" 资产符号: {}", asset.symbol);
|
||
println!(" GNACS编码: {}", asset.gnacs_code.to_hex());
|
||
println!(" 主权类型: {:?}", asset.sovereignty_type);
|
||
println!(" 总供应量: {}", asset.total_supply);
|
||
}
|
||
|
||
/// 示例2:转账(包含合规检查)
|
||
fn example2_transfer_with_compliance() {
|
||
let mut asset = create_test_asset();
|
||
|
||
let alice = Address::from("0xalice...");
|
||
let bob = Address::from("0xbob...");
|
||
|
||
// 1. 设置KYC状态
|
||
let mut context = TransactionContext::new();
|
||
context.kyc_status.insert(alice, KYCLevel::Advanced);
|
||
context.kyc_status.insert(bob, KYCLevel::Advanced);
|
||
|
||
// 2. 设置AML状态
|
||
context.aml_status.insert(alice, AMLStatus::Clear);
|
||
context.aml_status.insert(bob, AMLStatus::Clear);
|
||
|
||
// 3. 执行转账
|
||
asset.transfer(
|
||
&alice,
|
||
&bob,
|
||
10_000 * 10^18, // 转账10,000股
|
||
&context,
|
||
).unwrap();
|
||
|
||
println!("✅ 转账成功!");
|
||
println!(" 从: {}", alice);
|
||
println!(" 到: {}", bob);
|
||
println!(" 数量: 10,000股");
|
||
}
|
||
|
||
/// 示例3:主权规则验证
|
||
fn example3_sovereignty_validation() {
|
||
// 创建使用权资产(B1主权)
|
||
let gnacs = GNACSCode::new(
|
||
AssetCategory::RealEstate,
|
||
2, // 住宅地产
|
||
Jurisdiction::US,
|
||
ComplianceLevel::High,
|
||
RiskLevel::Low,
|
||
);
|
||
|
||
let mut asset = ACC20Enhanced::new(
|
||
"Manhattan Apartment Usage Right".to_string(),
|
||
"MAN-APT-B1".to_string(),
|
||
18,
|
||
gnacs,
|
||
SovereigntyType::B1, // 使用权(有期限)
|
||
).unwrap();
|
||
|
||
// 设置使用权期限(10年)
|
||
asset.sovereignty_rules.set_expiry_date(
|
||
block::timestamp() + 10 * 365 * 24 * 60 * 60
|
||
);
|
||
|
||
// 尝试转账(B1主权可以转让)
|
||
let result = asset.transfer(&alice, &bob, 1000, &context);
|
||
|
||
if result.is_ok() {
|
||
println!("✅ 使用权转让成功!");
|
||
} else {
|
||
println!("❌ 使用权转让失败: {:?}", result.err());
|
||
}
|
||
}
|
||
|
||
/// 示例4:ACC-20C包装(跨链到以太坊)
|
||
fn example4_wrap_to_ethereum() {
|
||
// 1. 创建ACC-20增强版资产
|
||
let mut asset = create_test_asset();
|
||
|
||
// 2. 创建ACC-20C包装器
|
||
let mut wrapper = ACC20CWrapper::new(
|
||
asset.contract_address, // NAC链上的ACC-20合约
|
||
EthAddress::from("0xeth_contract..."), // 以太坊链上的ERC-721合约
|
||
asset.contract_address, // 底层资产
|
||
);
|
||
|
||
// 3. 用户包装资产
|
||
let user = Address::from("0xuser...");
|
||
let amount = 1000 * 10^18; // 包装1000股
|
||
|
||
let token_id = wrapper.wrap(user, amount, &asset).unwrap();
|
||
|
||
println!("✅ 资产包装成功!");
|
||
println!(" TokenId: {}", token_id);
|
||
println!(" 包装数量: 1000股");
|
||
println!(" 现在可以在OpenSea等平台交易");
|
||
|
||
// 4. 生成ERC-721元数据
|
||
let metadata = wrapper.generate_metadata(token_id).unwrap();
|
||
|
||
println!("\n📄 ERC-721元数据:");
|
||
println!(" 名称: {}", metadata.name);
|
||
println!(" 描述: {}", metadata.description);
|
||
println!(" GNACS编码: {}", metadata.attributes.get("GNACS Code"));
|
||
println!(" 主权类型: {}", metadata.attributes.get("Sovereignty Type"));
|
||
}
|
||
|
||
/// 示例5:解包装(从以太坊回到NAC)
|
||
fn example5_unwrap_from_ethereum() {
|
||
let mut wrapper = create_test_wrapper();
|
||
let token_id = 1;
|
||
|
||
// 用户从以太坊解包装回NAC
|
||
let eth_owner = EthAddress::from("0xeth_user...");
|
||
let nac_recipient = Address::from("0xnac_user...");
|
||
|
||
let net_amount = wrapper.unwrap(
|
||
token_id,
|
||
eth_owner,
|
||
nac_recipient,
|
||
&asset,
|
||
).unwrap();
|
||
|
||
println!("✅ 资产解包装成功!");
|
||
println!(" TokenId: {}", token_id);
|
||
println!(" 接收数量: {} (扣除手续费后)", net_amount);
|
||
println!(" 资产已回到NAC链");
|
||
}
|
||
|
||
/// 示例6:冻结资产(合规场景)
|
||
fn example6_freeze_asset() {
|
||
let mut asset = create_test_asset();
|
||
|
||
let suspicious_account = Address::from("0xsuspicious...");
|
||
|
||
// 合规官冻结可疑账户
|
||
asset.freeze_account(suspicious_account).unwrap();
|
||
|
||
println!("✅ 账户已冻结!");
|
||
println!(" 账户: {}", suspicious_account);
|
||
println!(" 原因: AML风险检测");
|
||
|
||
// 尝试从冻结账户转账(会失败)
|
||
let result = asset.transfer(
|
||
&suspicious_account,
|
||
&other_account,
|
||
1000,
|
||
&context,
|
||
);
|
||
|
||
assert!(result.is_err());
|
||
println!("❌ 冻结账户无法转账(预期行为)");
|
||
}
|
||
|
||
/// 示例7:估值更新
|
||
fn example7_valuation_update() {
|
||
let mut asset = create_test_asset();
|
||
|
||
let valuator = Address::from("0xvaluator...");
|
||
let new_valuation = 5_000_000 * 10^18; // 500万XTZH
|
||
let report_hash = Hash::from("0xreport...");
|
||
|
||
// 估值师更新资产估值
|
||
asset.update_valuation(
|
||
new_valuation,
|
||
valuator,
|
||
report_hash,
|
||
).unwrap();
|
||
|
||
println!("✅ 估值更新成功!");
|
||
println!(" 新估值: 500万XTZH");
|
||
println!(" 估值师: {}", valuator);
|
||
println!(" 报告哈希: {}", report_hash);
|
||
}
|
||
|
||
/// 示例8:审计追踪查询
|
||
fn example8_audit_trail() {
|
||
let asset = create_test_asset();
|
||
|
||
// 查询最近10条审计记录
|
||
let recent_audits = asset.audit_trail.iter().rev().take(10);
|
||
|
||
println!("📋 最近10条审计记录:");
|
||
for (i, record) in recent_audits.enumerate() {
|
||
println!("\n{}. 操作类型: {:?}", i + 1, record.operation);
|
||
println!(" 操作者: {}", record.operator);
|
||
if let Some(target) = record.target {
|
||
println!(" 目标: {}", target);
|
||
}
|
||
if let Some(amount) = record.amount {
|
||
println!(" 数量: {}", amount);
|
||
}
|
||
println!(" 时间: {}", record.timestamp);
|
||
println!(" 交易哈希: {}", record.tx_hash);
|
||
}
|
||
}
|
||
|
||
/// 示例9:碎片化资产
|
||
fn example9_fragmentation() {
|
||
let mut asset = create_test_asset();
|
||
|
||
// 启用碎片化
|
||
asset.is_fragmentable = true;
|
||
asset.fragmentation_config = Some(FragmentationConfig {
|
||
min_fragment_size: 1 * 10^18, // 最小1股
|
||
total_fragments: 1000, // 分成1000份
|
||
fragment_pool_address: Address::from("0xpool..."),
|
||
allow_recomposition: true, // 允许重组
|
||
});
|
||
|
||
println!("✅ 碎片化配置成功!");
|
||
println!(" 最小碎片: 1股");
|
||
println!(" 总碎片数: 1000份");
|
||
println!(" 允许重组: 是");
|
||
}
|
||
|
||
/// 示例10:跨链支持
|
||
fn example10_cross_chain() {
|
||
let mut asset = create_test_asset();
|
||
|
||
// 启用跨链
|
||
asset.cross_chain_enabled = true;
|
||
|
||
// 添加支持的链
|
||
asset.supported_chains.push(ChainId(1)); // 以太坊主网
|
||
asset.supported_chains.push(ChainId(56)); // BSC
|
||
asset.supported_chains.push(ChainId(137)); // Polygon
|
||
|
||
// 设置跨链合约地址
|
||
asset.cross_chain_contracts.insert(
|
||
ChainId(1),
|
||
Address::from("0xeth_contract...")
|
||
);
|
||
asset.cross_chain_contracts.insert(
|
||
ChainId(56),
|
||
Address::from("0xbsc_contract...")
|
||
);
|
||
|
||
println!("✅ 跨链配置成功!");
|
||
println!(" 支持的链: 以太坊、BSC、Polygon");
|
||
println!(" 资产可在多链流通");
|
||
}
|
||
|
||
// ========== 辅助函数 ==========
|
||
|
||
fn create_test_asset() -> ACC20Enhanced {
|
||
let gnacs = GNACSCode::new(
|
||
AssetCategory::Equity,
|
||
1,
|
||
Jurisdiction::CN,
|
||
ComplianceLevel::High,
|
||
RiskLevel::Medium,
|
||
);
|
||
|
||
let mut asset = ACC20Enhanced::new(
|
||
"Test Asset".to_string(),
|
||
"TEST".to_string(),
|
||
18,
|
||
gnacs,
|
||
SovereigntyType::A0,
|
||
).unwrap();
|
||
|
||
asset.compliance_status = ComplianceStatus::Approved;
|
||
|
||
return asset;
|
||
}
|
||
|
||
fn create_test_wrapper() -> ACC20CWrapper {
|
||
let asset = create_test_asset();
|
||
|
||
return ACC20CWrapper::new(
|
||
asset.contract_address,
|
||
EthAddress::from("0xeth..."),
|
||
asset.contract_address,
|
||
);
|
||
}
|
||
|
||
// ========== 主函数 ==========
|
||
|
||
fn main() {
|
||
println!("🚀 ACC-20增强版完整示例\n");
|
||
|
||
println!("=== 示例1: 创建上海办公室股权资产 ===");
|
||
example1_create_shanghai_office_share();
|
||
|
||
println!("\n=== 示例2: 转账(包含合规检查) ===");
|
||
example2_transfer_with_compliance();
|
||
|
||
println!("\n=== 示例3: 主权规则验证 ===");
|
||
example3_sovereignty_validation();
|
||
|
||
println!("\n=== 示例4: ACC-20C包装(跨链到以太坊) ===");
|
||
example4_wrap_to_ethereum();
|
||
|
||
println!("\n=== 示例5: 解包装(从以太坊回到NAC) ===");
|
||
example5_unwrap_from_ethereum();
|
||
|
||
println!("\n=== 示例6: 冻结资产(合规场景) ===");
|
||
example6_freeze_asset();
|
||
|
||
println!("\n=== 示例7: 估值更新 ===");
|
||
example7_valuation_update();
|
||
|
||
println!("\n=== 示例8: 审计追踪查询 ===");
|
||
example8_audit_trail();
|
||
|
||
println!("\n=== 示例9: 碎片化资产 ===");
|
||
example9_fragmentation();
|
||
|
||
println!("\n=== 示例10: 跨链支持 ===");
|
||
example10_cross_chain();
|
||
|
||
println!("\n✅ 所有示例执行完成!");
|
||
}
|