Skip to content

退出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操作阶段额外货币不足
128Tact(编译器)空引用异常 —— 编译器期望一个整数或单元格但传递了一个空值
129Tact(编译器)无效的序列化前缀 —— 如果与前一个操作码检查不一致,将抛出此退出code
130Tact(编译器)无效的传入消息 —— 没有找到合适的操作
131Tact(编译器)约束错误
132Tact(编译器)访问被拒 —— 发送消息到合约的人不是所有者
133Tact(编译器)合约已停止 —— 向已停止的合约发送了消息
134Tact(编译器)无效的参数 —— 无效的 Base64 字符串
135Tact(编译器)未找到合约的代码 —— 字典调用的错误标记
136Tact(编译器)无效地址 —— 非 267 位地址或无效的链 ID(非 0 或 -1)
137Tact(编译器)未为此合约启用主链支持

如何查看项目中所有自动生成的退出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。