# 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; }