跳转到内容

Message `mode`

如前所述,信息是通过结构体 SendParametersmode 参数发送的。这是一个Int值,由基本模式和可选标志(也是Int值)组合而成。

您可以使用原始的 Int值,并手动为 mode 提供这些值,但为了方便起见,您可以使用一组常量来轻松构建复合 mode。有关基本模式和可选标记的更多信息,请参阅下表。

基本模式

模式值恒定名称说明
00-普通信息(默认)。
6464SendRemainingValue除了新报文中最初显示的值外,还携带入站报文的所有剩余值。
128128SendRemainingBalance携带当前智能合约的所有余额,而不是信息中最初显示的值。

可选标记

标志值恒定名称说明
+1+1SendPayGasSeparately将转发费用与信息价值分开支付。
+2+2SendIgnoreErrors忽略行动阶段处理该信息时出现的任何错误。
+16+16SendBounceIfActionFail如果在操作阶段出现任何错误,则退回交易。 Has no effect if flag +2+2, SendIgnoreErrors is used.
+32+32SendDestroyIfZeroCurrent account must be destroyed if its resulting balance is zero (often used with mode 128128, SendRemainingBalance).

将模式与标志相结合

要为 SendParametersmode 字段创建 Int 值,只需通过 bitwise OR 运算将基本模式与可选标记结合起来。

例如,如果您想分别发送普通信息和支付转账费用,请使用模式 00(默认)和标志 +1+1,以获得 mode =1= 1,这等同于使用 SendPayGasSeparately 常量。

或者,如果要发送全部合约余额并立即销毁,使用模式 128128 和标志 +32+32,得到 mode =160= 160,相当于 SendRemainingBalance | SendDestroyIfZero 常量。

下面是后一个示例的代码:

let to: Address = ...;
let value: Int = ton("1");
send(SendParameters{
to: to,
value: value,
mode: SendRemainingBalance | SendDestroyIfZero,
body: "Hello, World!".asComment(),
});