NAC_Blockchain/charter-std/acc/acc20c_sync.ch

104 lines
4.0 KiB
Plaintext

# ACC-20C 兼容层协议 - 状态同步合约
# 版本: 1.0
# 路径: charter-std/acc/acc20c_sync.ch
# --- 核心原则 ---
# 1. 被动执行: 本合约仅作为执行器,被动接收来自 CBPP 区块扫描器的指令。
# 2. 权限控制: 只有授权的区块扫描器服务(通过地址识别)才能调用本合约的更新函数。
# 3. 目标明确: 主要职责是触发元数据合约的更新,或在极端情况下更新包装器合约的状态。
# --- 标准库与接口导入 ---
import std::types::{ Address, Uint256, Uint64, String }
# 导入元数据合约接口
import charter-std::acc::acc20c_metadata::{ IMetadataGenerator }
# 导入包装器合约接口
import charter-std::acc::acc20c_wrapper::{ IAcc20CWrapper }
# --- 合约状态定义 ---
state {
# 授权的 CBPP 区块扫描器服务地址
scanner_service_address: Address,
# 元数据生成器合约地址
metadata_generator: Address,
# 包装器合约地址
wrapper_contract: Address,
}
# --- 事件定义 ---
event StateSynced {
wrapper_token_id: Uint256,
sync_type: String, # 例如 "VALUATION_UPDATE", "OWNERSHIP_CHANGE"
block_number: Uint64,
}
# --- 合约初始化 ---
fn constructor(scanner_addr: Address, metadata_addr: Address, wrapper_addr: Address) {
state.scanner_service_address = scanner_addr;
state.metadata_generator = metadata_addr;
state.wrapper_contract = wrapper_addr;
}
# --- 核心功能函数 ---
# @dev 由区块扫描器调用,以更新底层资产估值
# @param acc20_contract 发生估值更新的 ACC-20 合约地址
# @param acc20_token_id 发生估值更新的 ACC-20 代币 ID
# @param new_valuation 新的估值
fn update_valuation(acc20_contract: Address, acc20_token_id: Uint256, new_valuation: Uint256) {
# 权限检查:只有授权的扫描器才能调用
require(msg.sender == state.scanner_service_address, "Unauthorized scanner service");
let wrapper = IAcc20CWrapper(state.wrapper_contract);
let wrapper_id = wrapper.get_wrapper_id(acc20_contract, acc20_token_id);
# 如果该资产已被包装,则触发相应的更新
if wrapper_id != 0 {
# 在真实的实现中,这里可能会调用元数据合约的一个函数来强制刷新缓存
# 或者直接在链上记录这个更新,以便元数据合约下次生成时使用
# 为简化,此处仅触发一个事件
emit StateSynced {
wrapper_token_id: wrapper_id,
sync_type: "VALUATION_UPDATE",
block_number: block.number,
};
}
}
# @dev 由区块扫描器调用,处理底层资产状态的重大变更(例如,被司法冻结)
# @param acc20_contract 发生状态变更的 ACC-20 合约地址
# @param acc20_token_id 发生状态变更的 ACC-20 代币 ID
# @param new_status_code 新的状态码
fn handle_critical_status_change(acc20_contract: Address, acc20_token_id: Uint256, new_status_code: Uint64) {
require(msg.sender == state.scanner_service_address, "Unauthorized scanner service");
let wrapper = IAcc20CWrapper(state.wrapper_contract);
let wrapper_id = wrapper.get_wrapper_id(acc20_contract, acc20_token_id);
if wrapper_id != 0 {
# 如果底层资产被冻结,则同步冻结包装后的资产
if new_status_code == 2 { # 假设 2 代表“冻结”
wrapper.freeze_asset(wrapper_id);
}
# 如果底层资产恢复正常,则同步解冻
else if new_status_code == 1 { # 假设 1 代表“活跃”
wrapper.unfreeze_asset(wrapper_id);
}
emit StateSynced {
wrapper_token_id: wrapper_id,
sync_type: "CRITICAL_STATUS_CHANGE",
block_number: block.number,
};
}
}
# --- 管理员函数 ---
# @dev 更新授权的扫描器服务地址
fn set_scanner_address(new_address: Address) {
# 假设合约的 admin 是部署者
require(msg.sender == state.admin, "Only admin can set scanner address");
state.scanner_service_address = new_address;
}