Skip to content

Base trait

Every contract and trait in Tact implicitly inherits the BaseTrait trait, which contains a number of the most useful internal functions for any kind of contract, and a constant self.storageReserve aimed at advanced users of Tact.

Constants

self.storageReserve

virtual const storageReserve: Int = 0;

Usage example:

contract AllYourStorageBelongsToUs {
// This would change the behavior of self.forward() function,
// causing it to try reserving this amount of nanoToncoins before
// forwarding a message with SendRemainingBalance mode
override const storageReserve: Int = ton("0.1");
}

Functions

self.reply

virtual fun reply(body: Cell?);

An alias to calling the self.forward() function with the following arguments:

self.forward(sender(), body, true, null);
// ↑ ↑ ↑ ↑
// | | | init: StateInit?
// | | bounce: Bool
// | body: Cell?
// to: Address

Usage example:

// This message can bounce back to us!
self.reply("Beware, this is my reply to you!".asComment());

self.notify

virtual fun notify(body: Cell?);

An alias to calling the self.forward() function with the following arguments:

self.forward(sender(), body, false, null);
// ↑ ↑ ↑ ↑
// | | | init: StateInit?
// | | bounce: Bool
// | body: Cell?
// to: Address

Usage example:

// This message won't bounce!
self.notify("Beware, this is my reply to you!".asComment());

self.forward

virtual fun forward(to: Address, body: Cell?, bounce: Bool, init: StateInit?);

Queues the message (bounceable or non-bounceable) to be sent to the specified address to. Optionally, you may provide a body of the message and the init package.

When self.storageReserve constant is overwritten to be >0> 0, before sending a message it also tries to reserve the self.storageReserve amount of nanoToncoins from the remaining balance before making the send in the SendRemainingBalance (128128) mode.

In case reservation attempt fails and in the default case without the attempt, the message is sent with the SendRemainingValue (6464) mode instead.

Usage example:

import "@stdlib/ownable";
message PayoutOk {
address: Address;
value: Int as coins;
}
contract Payout with Ownable {
completed: Bool;
owner: Address;
init(owner: Address) {
self.owner = owner;
self.completed = false;
}
// ... some actions there ...
// Bounced receiver function, which is called when the specified outgoing message bounces back
bounced(msg: bounced<PayoutOk>) {
// Reset completed flag if our message bounced
self.completed = false;
// Send a notification that the payout failed using the remaining funds for processing this send
self.forward(self.owner, "Payout failed".asComment(), false, null);
}
}