Appearance
退出code
本页面正在按照 #106 重构。所有锚链接(#)将来可能会更改!
退出code是一个 16 位无符号整数,范围从 0 到 65535(或 (2^{16}-1))。
从 0 到 127 的代码为 FunC(TVM)分配,从 128 到 255 为 Tact 分配。从 256 到 65535 的范围可供开发者自定义退出code。
预分配的退出code列表:
退出code | 阶段 | 描述 |
---|---|---|
0 | 计算阶段 | 标准成功执行退出code |
2 | 计算阶段 | 栈下溢。最后一个操作码消耗的元素比栈上的元素多 |
3 | 计算阶段 | 栈溢出。存储在栈上的值超过了本版本 TVM 所允许的数量 |
4 | 计算阶段 | 整数溢出。整数不符合 (-2^{256} \leq x < 2^{256}) 或发生了除零 |
5 | 计算阶段 | 整数超出预期范围 |
6 | 计算阶段 | 无效操作码。指令在当前 TVM 版本中未知 |
7 | 计算阶段 | 类型检查错误。原语的参数值类型不正确 |
8 | 计算阶段 | 单元格溢出。写入构建器后操作会导致超过 1023 位或 4 个引用 |
9 | 计算阶段 | 单元格下溢。从切片原语读取的位或引用超出存在的数量 |
10 | 计算阶段 | 字典错误。操作字典(哈希映射)时出错 |
13 | 计算阶段 | 燃料耗尽错误。当剩余燃料变为负时由 TVM 抛出 |
-14 | 计算阶段 | 表示燃料耗尽错误,与 13 相同。负数,因为它不能被伪造 |
32 | 操作阶段 | 操作列表无效。如果执行后 c5 寄存器包含无法解析的对象则在操作阶段设置 |
34 | 操作阶段 | 操作无效或不支持。如果当前操作无法应用则在操作阶段设置 |
37 | 操作阶段 | TON 不足。消息发送的 TON 过多(或扣除费用后 TON 不足) |
38 | 操作阶段 | 额外货币不足 |
128 | Tact(编译器) | 空引用异常 —— 编译器期望一个整数或单元格但传递了一个空值 |
129 | Tact(编译器) | 无效的序列化前缀 —— 如果与前一个操作码检查不一致,将抛出此退出code |
130 | Tact(编译器) | 无效的传入消息 —— 没有找到合适的操作 |
131 | Tact(编译器) | 约束错误 |
132 | Tact(编译器) | 访问被拒 —— 发送消息到合约的人不是所有者 |
133 | Tact(编译器) | 合约已停止 —— 向已停止的合约发送了消息 |
134 | Tact(编译器) | 无效的参数 —— 无效的 Base64 字符串 |
135 | Tact(编译器) | 未找到合约的代码 —— 字典调用的错误标记 |
136 | Tact(编译器) | 无效地址 —— 非 267 位地址或无效的链 ID(非 0 或 -1) |
137 | Tact(编译器) | 未为此合约启用主链支持 |
如何查看项目中所有自动生成的退出code?
答:Tact 编译器在 *.md 文件的末尾收集所有退出code,您可以在路径 "./ProjectFolder/build/ProjectName/tact_ProjectName.md" 的目录中跟踪它们。
如何查看抛出的退出code?
答:在 Tact 中,查看交易结果不宜直接打印,因为它们不易阅读。如果您想查看交易的退出code,请在您的 Typescript 本地测试中使用以下模板:
typescript
const sender = await blockchain.treasury('sender');
const result = await contractName.send(sender.getSender(), { value: toNano('0.05'), }, { transactionData });
expect(result.transactions).toHaveTransaction(
{ from: sender.address, to: contractName.address, exitCode: YOUR_DESIRED_EXIT_CODE }
);
- 第一行定义发送者。
- 第二行发送交易。
- 第三行检查结果是否有从发送者到您合约的交易,并带有您期望的退出code。