NAC_Blockchain/charter-std-zh/acc/acc20.ch

384 lines
9.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

///!
///! 资产凭证合约 - 20 (ACC-20)
///! NAC的可替代资产协议专为RWA设计
///!
///! **版本**: v1.0
///! **模块**: charter-std-zh/acc/acc20.ch
使用 资产::gnacs::GNACS编码;
使用 主权::规则::主权类型;
// ============================================================================
// ACC-20接口定义
// ============================================================================
/// ACC-20可替代资产接口
///
/// 定义可替代资产的标准操作
接口 ACC20 {
// ========== 查询函数 ==========
/// 查询资产总供应量
///
/// # 返回
/// - `u256`: 总供应量
函数 总供应量() -> u256;
/// 查询账户持有量
///
/// # 参数
/// - `持有者`: 账户地址
///
/// # 返回
/// - `u256`: 持有量
函数 持有量(持有者: 地址) -> u256;
/// 查询资产名称
///
/// # 返回
/// - `字符串`: 资产名称
函数 名称() -> 字符串;
/// 查询资产符号
///
/// # 返回
/// - `字符串`: 资产符号
函数 符号() -> 字符串;
/// 查询小数位数
///
/// # 返回
/// - `u8`: 小数位数
函数 小数位() -> u8;
/// 查询GNACS编码
///
/// # 返回
/// - `GNACS编码`: 资产分类编码
函数 GNACS编码() -> GNACS编码;
/// 查询主权类型
///
/// # 返回
/// - `主权类型`: 资产主权类型
函数 主权类型() -> 主权类型;
/// 查询授权额度
///
/// # 参数
/// - `持有者`: 资产持有者地址
/// - `代理人`: 被授权的代理人地址
///
/// # 返回
/// - `u256`: 授权额度
函数 授权额度(持有者: 地址, 代理人: 地址) -> u256;
// ========== 交易函数 ==========
/// 转移资产
///
/// # 参数
/// - `接收者`: 接收地址
/// - `数额`: 转移数额
///
/// # 返回
/// - `bool`: 是否成功
///
/// # 事件
/// - `转移事件(发送者, 接收者, 数额)`
函数 转移(接收者: 地址, 数额: u256) -> bool;
/// 授权代理
///
/// # 参数
/// - `代理人`: 被授权的代理人地址
/// - `数额`: 授权数额
///
/// # 返回
/// - `bool`: 是否成功
///
/// # 事件
/// - `授权事件(持有者, 代理人, 数额)`
函数 授权(代理人: 地址, 数额: u256) -> bool;
/// 代理转移
///
/// # 参数
/// - `发送者`: 资产持有者地址
/// - `接收者`: 接收地址
/// - `数额`: 转移数额
///
/// # 返回
/// - `bool`: 是否成功
///
/// # 事件
/// - `转移事件(发送者, 接收者, 数额)`
函数 代理转移(发送者: 地址, 接收者: 地址, 数额: u256) -> bool;
/// 增发资产
///
/// # 参数
/// - `接收者`: 接收地址
/// - `数额`: 增发数额
///
/// # 返回
/// - `bool`: 是否成功
///
/// # 权限
/// - 仅发行者
///
/// # 事件
/// - `增发事件(接收者, 数额)`
函数 增发(接收者: 地址, 数额: u256) -> bool;
/// 销毁资产
///
/// # 参数
/// - `数额`: 销毁数额
///
/// # 返回
/// - `bool`: 是否成功
///
/// # 事件
/// - `销毁事件(持有者, 数额)`
函数 销毁(数额: u256) -> bool;
}
// ============================================================================
// ACC-20事件定义
// ============================================================================
/// 转移事件
///
/// 当资产转移时触发
事件 转移事件 {
发送者: 地址,
接收者: 地址,
数额: u256,
}
/// 授权事件
///
/// 当授权代理时触发
事件 授权事件 {
持有者: 地址,
代理人: 地址,
数额: u256,
}
/// 增发事件
///
/// 当增发资产时触发
事件 增发事件 {
接收者: 地址,
数额: u256,
}
/// 销毁事件
///
/// 当销毁资产时触发
事件 销毁事件 {
持有者: 地址,
数额: u256,
}
// ============================================================================
// ACC-20基础实现
// ============================================================================
/// ACC-20基础实现合约
///
/// 提供ACC-20接口的标准实现
合约 ACC20基础 实现 ACC20 {
// ========== 状态变量 ==========
/// 资产名称
私有 _名称: 字符串;
/// 资产符号
私有 _符号: 字符串;
/// 小数位数
私有 _小数位: u8;
/// GNACS编码
私有 _gnacs编码: GNACS编码;
/// 主权类型
私有 _主权类型: 主权类型;
/// 总供应量
私有 _总供应量: u256;
/// 持有量映射
私有 _持有量: 映射<地址, u256>;
/// 授权映射
私有 _授权: 映射<地址, 映射<地址, u256>>;
/// 发行者地址
私有 _发行者: 地址;
// ========== 构造函数 ==========
/// 构造函数
///
/// # 参数
/// - `名称`: 资产名称
/// - `符号`: 资产符号
/// - `小数位`: 小数位数
/// - `gnacs编码`: GNACS分类编码
/// - `主权类型`: 主权类型
/// - `初始供应量`: 初始供应量
构造函数(
名称: 字符串,
符号: 字符串,
小数位: u8,
gnacs编码: GNACS编码,
主权类型: 主权类型,
初始供应量: u256
) {
_名称 = 名称;
_符号 = 符号;
_小数位 = 小数位;
_gnacs编码 = gnacs编码;
_主权类型 = 主权类型;
_发行者 = 消息.发送者;
如果 初始供应量 > 0 {
_总供应量 = 初始供应量;
_持有量[消息.发送者] = 初始供应量;
触发 转移事件 {
发送者: 地址::零地址(),
接收者: 消息.发送者,
数额: 初始供应量,
};
}
}
// ========== 查询函数实现 ==========
函数 总供应量() -> u256 {
返回 _总供应量;
}
函数 持有量(持有者: 地址) -> u256 {
返回 _持有量[持有者];
}
函数 名称() -> 字符串 {
返回 _名称;
}
函数 符号() -> 字符串 {
返回 _符号;
}
函数 小数位() -> u8 {
返回 _小数位;
}
函数 GNACS编码() -> GNACS编码 {
返回 _gnacs编码;
}
函数 主权类型() -> 主权类型 {
返回 _主权类型;
}
函数 授权额度(持有者: 地址, 代理人: 地址) -> u256 {
返回 _授权[持有者][代理人];
}
// ========== 交易函数实现 ==========
函数 转移(接收者: 地址, 数额: u256) -> bool {
要求(接收者 != 地址::零地址(), "ACC20: 不能转移到零地址");
要求(_持有量[消息.发送者] >= 数额, "ACC20: 余额不足");
_持有量[消息.发送者] -= 数额;
_持有量[接收者] += 数额;
触发 转移事件 {
发送者: 消息.发送者,
接收者: 接收者,
数额: 数额,
};
返回 真;
}
函数 授权(代理人: 地址, 数额: u256) -> bool {
要求(代理人 != 地址::零地址(), "ACC20: 不能授权给零地址");
_授权[消息.发送者][代理人] = 数额;
触发 授权事件 {
持有者: 消息.发送者,
代理人: 代理人,
数额: 数额,
};
返回 真;
}
函数 代理转移(发送者: 地址, 接收者: 地址, 数额: u256) -> bool {
要求(接收者 != 地址::零地址(), "ACC20: 不能转移到零地址");
要求(_持有量[发送者] >= 数额, "ACC20: 余额不足");
要求(_授权[发送者][消息.发送者] >= 数额, "ACC20: 授权额度不足");
_持有量[发送者] -= 数额;
_持有量[接收者] += 数额;
_授权[发送者][消息.发送者] -= 数额;
触发 转移事件 {
发送者: 发送者,
接收者: 接收者,
数额: 数额,
};
返回 真;
}
函数 增发(接收者: 地址, 数额: u256) -> bool {
要求(消息.发送者 == _发行者, "ACC20: 仅发行者可以增发");
要求(接收者 != 地址::零地址(), "ACC20: 不能增发到零地址");
_总供应量 += 数额;
_持有量[接收者] += 数额;
触发 增发事件 {
接收者: 接收者,
数额: 数额,
};
触发 转移事件 {
发送者: 地址::零地址(),
接收者: 接收者,
数额: 数额,
};
返回 真;
}
函数 销毁(数额: u256) -> bool {
要求(_持有量[消息.发送者] >= 数额, "ACC20: 余额不足");
_持有量[消息.发送者] -= 数额;
_总供应量 -= 数额;
触发 销毁事件 {
持有者: 消息.发送者,
数额: 数额,
};
触发 转移事件 {
发送者: 消息.发送者,
接收者: 地址::零地址(),
数额: 数额,
};
返回 真;
}
}