//! ACC-1155: 多代币证书协议 //! //! UID: nac.acc.ACC1155.v2 //! //! ACC-1155是NAC原生的多代币证书协议,用于在单个证书中管理多种代币类型。 //! 与ERC-1155不同,ACC-1155集成了NAC的核心特性: //! - GNACS 48位编码 //! - 代币类型DNA //! - 主权类型 //! - 合规掩码 //! - 批量操作优化 //! - 混合资产管理(可替代+不可替代) //! - 托管信息 //! - 保险信息 //! - 碎片化支持 use crate::primitives::{Address, Hash, Timestamp}; use crate::l1_protocol::gnacs::GNACSCode; use crate::l2_governance::SovereigntyRight; use serde::{Deserialize, Serialize}; /// 代币ID类型 pub type TokenId = u128; /// 代币类型(可替代性) #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub enum TokenType { /// 可替代代币(Fungible Token,类似ACC-20) Fungible, /// 不可替代代币(Non-Fungible Token,类似ACC-721) NonFungible, /// 半可替代代币(Semi-Fungible Token,如游戏道具) SemiFungible, } /// 代币类型DNA #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TokenTypeDNA { /// DNA哈希(Blake3哈希) pub dna_hash: Hash, /// 代币类型ID pub token_id: TokenId, /// GNACS编码 pub gnacs_code: GNACSCode, /// 代币类型(可替代性) pub token_type: TokenType, /// 主权类型 pub sovereignty_type: SovereigntyRight, /// 元数据哈希 pub metadata_hash: Hash, /// 生成时间 pub generated_at: Timestamp, } /// 代币类型元数据 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TokenTypeMetadata { /// 代币类型ID pub token_id: TokenId, /// 代币名称 pub name: String, /// 代币符号 pub symbol: String, /// 代币类型 pub token_type: TokenType, /// 元数据URI pub uri: String, /// 最大供应量(None表示无限制) pub max_supply: Option, /// 当前供应量 pub current_supply: u128, /// 创建时间 pub created_at: Timestamp, } /// 批量转移记录 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct BatchTransfer { /// 发送者地址 pub from: Address, /// 接收者地址 pub to: Address, /// 代币ID列表 pub token_ids: Vec, /// 数量列表 pub amounts: Vec, /// 转移时间 pub transferred_at: Timestamp, /// 宪法收据哈希 pub constitutional_receipt: Hash, } /// 批量铸造记录 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct BatchMint { /// 接收者地址 pub to: Address, /// 代币ID列表 pub token_ids: Vec, /// 数量列表 pub amounts: Vec, /// 铸造时间 pub minted_at: Timestamp, /// 宪法收据哈希 pub constitutional_receipt: Hash, } /// 批量销毁记录 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct BatchBurn { /// 持有者地址 pub from: Address, /// 代币ID列表 pub token_ids: Vec, /// 数量列表 pub amounts: Vec, /// 销毁时间 pub burned_at: Timestamp, /// 宪法收据哈希 pub constitutional_receipt: Hash, } /// 托管信息(按代币类型) #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TokenCustodyInfo { /// 代币类型ID pub token_id: TokenId, /// 托管方地址 pub custodian: Address, /// 托管开始时间 pub custody_start: Timestamp, /// 托管状态 pub is_active: bool, /// 托管证明哈希 pub custody_proof: Hash, } /// 保险信息(按代币类型) #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TokenInsuranceInfo { /// 代币类型ID pub token_id: TokenId, /// 保险提供者地址 pub insurer: Address, /// 单位保险金额(XTZH) pub coverage_per_unit_xtzh: u128, /// 保险开始时间 pub insurance_start: Timestamp, /// 保险到期时间 pub insurance_expiry: Timestamp, /// 保险单号 pub policy_number: String, } /// 代币类型估值 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TokenTypeValuation { /// 代币类型ID pub token_id: TokenId, /// 单位估值金额(XTZH) pub value_per_unit_xtzh: u128, /// 估值提供者地址 pub valuation_provider: Address, /// 估值时间 pub valued_at: Timestamp, /// 估值有效期(秒) pub validity_period: u64, } /// 授权信息 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ApprovalInfo { /// 所有者地址 pub owner: Address, /// 被授权者地址 pub operator: Address, /// 是否授权 pub approved: bool, /// 授权时间 pub approved_at: Timestamp, } /// 代币余额信息 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TokenBalance { /// 持有者地址 pub holder: Address, /// 代币类型ID pub token_id: TokenId, /// 余额 pub balance: u128, /// 最后更新时间 pub last_updated: Timestamp, } /// 混合资产池(同时管理可替代和不可替代代币) #[derive(Debug, Clone, Serialize, Deserialize)] pub struct HybridAssetPool { /// 证书地址 pub certificate_address: Address, /// 可替代代币ID列表 pub fungible_token_ids: Vec, /// 不可替代代币ID列表 pub non_fungible_token_ids: Vec, /// 半可替代代币ID列表 pub semi_fungible_token_ids: Vec, /// 创建时间 pub created_at: Timestamp, } /// 代币类型配置 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TokenTypeConfig { /// 代币类型ID pub token_id: TokenId, /// 是否可铸造 pub mintable: bool, /// 是否可销毁 pub burnable: bool, /// 是否可暂停 pub pausable: bool, /// 是否需要合规检查 pub compliance_required: bool, /// 最小转移数量 pub min_transfer_amount: u128, /// 创建时间 pub created_at: Timestamp, } #[cfg(test)] mod tests { use super::*; use crate::primitives::SovereigntyType; #[test] fn test_token_type() { let fungible = TokenType::Fungible; let non_fungible = TokenType::NonFungible; let semi_fungible = TokenType::SemiFungible; assert_ne!(fungible, non_fungible); assert_ne!(fungible, semi_fungible); assert_ne!(non_fungible, semi_fungible); } #[test] fn test_sovereignty_type() { let a0 = SovereigntyType::A0; let c0 = SovereigntyType::C0; assert_ne!(a0, c0); } }