255 lines
6.5 KiB
Rust
255 lines
6.5 KiB
Rust
//! 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<u128>,
|
||
/// 当前供应量
|
||
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<TokenId>,
|
||
/// 数量列表
|
||
pub amounts: Vec<u128>,
|
||
/// 转移时间
|
||
pub transferred_at: Timestamp,
|
||
/// 宪法收据哈希
|
||
pub constitutional_receipt: Hash,
|
||
}
|
||
|
||
/// 批量铸造记录
|
||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
pub struct BatchMint {
|
||
/// 接收者地址
|
||
pub to: Address,
|
||
/// 代币ID列表
|
||
pub token_ids: Vec<TokenId>,
|
||
/// 数量列表
|
||
pub amounts: Vec<u128>,
|
||
/// 铸造时间
|
||
pub minted_at: Timestamp,
|
||
/// 宪法收据哈希
|
||
pub constitutional_receipt: Hash,
|
||
}
|
||
|
||
/// 批量销毁记录
|
||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
pub struct BatchBurn {
|
||
/// 持有者地址
|
||
pub from: Address,
|
||
/// 代币ID列表
|
||
pub token_ids: Vec<TokenId>,
|
||
/// 数量列表
|
||
pub amounts: Vec<u128>,
|
||
/// 销毁时间
|
||
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<TokenId>,
|
||
/// 不可替代代币ID列表
|
||
pub non_fungible_token_ids: Vec<TokenId>,
|
||
/// 半可替代代币ID列表
|
||
pub semi_fungible_token_ids: Vec<TokenId>,
|
||
/// 创建时间
|
||
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);
|
||
}
|
||
}
|