104 lines
4.0 KiB
Plaintext
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;
|
|
}
|