An IDE auto-completes all functions.
With Cmd+Click or Ctrl+Click, navigate to any function/method and read detailed comments right in an editor.
Compile-time calculations and embeds
Constant data can be embedded into a contract by dedicated functions.address(“UQ…”)
A functionaddress() embeds a constant address:
stringCrc32(“some_str”) and other
Several functions operate on strings. They all expect a constant literal and are evaluated toint at compile-time.
ton(“0.05”)
Calculates “nanotoncoins” at compile-time.Common functions, available always
All the functions in this section are visible everywhere. Actually, they are placed in@stdlib/common.tolk, which is auto-imported.
Tuples
Tuple-related functions allow interacting with tuple types (a dynamic container up to 255 elements).createEmptyTuple
Creates a tuple with zero elements.tuple.push, tuple.get, etc.
An IDE suggests all methods after a dot:T.toTuple and T.fromTuple
Packs any object from a stack into a tuple (and back). If a value occupies N stack slots, the resulting tuple has size N.Mathematical primitives
These functions accept and return integers unless stated otherwise. All integers are 257-bit, see numbers.min(x, y)
Computes the minimum of two integers.max(x, y)
Computes the maximum of two integers.minMax(x, y)
Returns(int, int) — a tensor (smallest, largest).
abs(x)
Computes the absolute value of an integer.sign(x)
Returns the sign of an integer value:-1if x < 00if x == 01if x > 0
divMod(x, y)
Returns(int, int) — the quotient and remainder of x / y.
Example: divMod(112, 3) = (37, 1).
modDiv(x, y)
Returns(int, int) — the remainder and quotient of x / y.
Example: modDiv(112, 3) = (1, 37).
mulDivFloor(x, y, z)
Computes multiple-then-divide:floor(x * y / z). The intermediate result is stored in a 513-bit integer to prevent precision loss.
mulDivRound(x, y, z)
Similar tomulDivFloor, but rounds the result: round(x * y / z).
mulDivCeil(x, y, z)
Similar tomulDivFloor, but ceils the result: ceil(x * y / z).
mulDivMod(x, y, z)
Returns(int, int) — the quotient and remainder of (x * y / z).
Example: mulDivMod(112, 3, 10) = (33, 6).
Global getters and setters of current contract state
All these functions are actually methods of the empty structcontract.
contract.getAddress
Returnsaddress — the internal address of the current smart contract.
It can be parsed further using address.getWorkchain and others.
contract.getOriginalBalance
Returnscoins — the balance (in nanotoncoins) of the smart contract at the start of Computation Phase.
contract.getOriginalBalanceWithExtraCurrencies
Returns[coins, ExtraCurrenciesMap] — similar to contract.getOriginalBalance, but also returns extra currencies.
contract.getData
Returnscell — the persistent contract storage cell. Typically, its result is used as Storage.fromCell().
See contract storage.
contract.setData(cell)
Sets the persistent contract storage. Typically, the argument isstorageObject.toCell().
See contract storage.
contract.getCode
Returnscell — the code of the smart contract from a TVM register c7.
contract.setCodePostponed(newCodeCell)
Creates an output action that would change this smart contract code after successful termination of the current run.Global getters of the blockchain (environment) state
Most of these functions are methods of the empty structblockchain.
blockchain.now
Returnsint — current Unix timestamp (in seconds).
blockchain.logicalTime
Returnsint — the logical time of the current transaction.
blockchain.currentBlockLogicalTime
Returnsint — the starting logical time of the current block.
blockchain.configParam(i)
Returnscell? — the value of the global configuration parameter with integer index i, or null if not exists.
commitContractDataAndActions
Commits current state of TVM registersc4 (persistent data) and c5 (actions),
so that the current execution is considered “successful” with the saved values even if an exception
in Computation Phase is thrown later.
Signature checks, hashing, cryptography
Functions and methods for hashing, verifying, and randomization.cell.hash
Returnsuint256 — the representation hash of a cell. Useful for signing and checking signatures of arbitrary entities represented by a tree of cells.
slice.hash
Returnsuint256 — the hash of data in a slice. The same as cell.hash for a cell containing data and references from this slice.
builder.hash
Returnsuint256 — the hash of data in a builder. The same as “transform builder to cell + calc hash of that cell”, but without cell creation.
slice.bitsHash
Returnsuint256 — sha256 of the data bits of a slice (without refs). If the bit length is not divisible by eight, throws a cell underflow exception.
isSignatureValid(hash, signatureSlice, publicKey)
Checks the Ed25519 -signatureSlice of a hash (an integer, usually computed as the hash of some data) using publicKey (also uint256). The signature must contain at least 512 data bits; only the first 512 bits are used. Returns bool.
isSliceSignatureValid(dataSlice, signatureSlice, publicKey)
Similar to the above, but accepts aslice instead of an already-calculated integer hash. If the bit length of data is not divisible by eight, throws a cell underflow exception.
random.uint256
Returnsuint256 — a new pseudo-random number.
Ensure you’ve called random.initialize to make it unpredictable!
random.range(limit)
Returnsint — a new pseudo-random integer z in the range 0..limit−1 (or limit..−1 if negative).
More precisely, an unsigned random value x is generated, then z := x * limit / 2^256 is computed.
Ensure you’ve called random.initialize to make it unpredictable!
random.getSeed
Returnsuint256 — the current random seed used to generate pseudo-random numbers.
random.setSeed(newSeed)
Sets the random seed to the provided value.random.initializeBy(mixSeedWith)
Initializes (mixes) the random seed with the provided value.random.initialize
Initializes the seed with current time to make randomization unpredictable. Call this function once before usingrandom.uint256 or random.range.
Size computation primitives
May be useful for computing storage fees of user-provided data.cell.calculateSize(maxCells)
Returns(x, y, z, -1) or (null, null, null, 0). Recursively computes the count of distinct cells x, data bits y, and cell references z in a tree of cells. The total count of visited cells x cannot exceed non-negative maxCells; otherwise a zero flag is returned to indicate failure.
slice.calculateSize(maxCells)
Similar tocell.calculateSize, but accepting a slice instead of a cell.
The returned value x does count the cell that contains the slice itself.
cell.calculateSizeStrict(maxCells)
A non-quiet version ofcell.calculateSize that throws a cell overflow exception on failure.
slice.calculateSizeStrict(maxCells)
A non-quiet version ofslice.calculateSize that throws a cell overflow exception on failure.
cell.depth
Returnsint — the depth of a cell: 0 if no references, otherwise 1 + maximum of depths of all references.
slice.depth
Returnsint — the depth of a slice, like cell.depth.
builder.depth
Returnsint — the depth of a builder, like cell.depth.
sizeof<T>(anyVariable)
Returnsint — the number of stack slots anyVariable occupies (works at compile-time).
Debug primitives
Only work for local TVM execution with debug level verbosity.debug.print<T>(anyVariable)
Dump a variable to the debug log.debug.printString(str)
Dump a string to the debug log.debug.dumpStack
Dump the stack (at most the top 255 values) and show its depth.Slice primitives: parsing cells
cell.beginParse() converts a cell into a slice.
slice.loadAddress and other loadXXX methods are automatically suggested after a dot.
Prefer automatic serialization to manual working with slices.
Builder primitives: constructing cells
beginCell() creates a builder.
builder.storeAddress and other storeXXX methods are automatically suggested after a dot.
builder.endCell() composes a cell from the data written.
Prefer automatic serialization to manual working with builders.
Address manipulation primitives
Methods foraddress and any_address (see address types) are suggested after a dot.
address.fromWorkchainAndHash(wc, hash)
A static method ofaddress — constructs an internal address (267 bits) from arguments.
address.getWorkchain
Returnsint8 — workchain from a standard (internal) address.
address.getWorkchainAndHash
Returns(int8, uint256) — workchain and hash from a standard (internal) address.
address.calculateSameAddressInAnotherShard(options)
Given an internal address A=“aaaa…a” returns “bbaa…a” (D bits from address B, 256-D from A).createAddressNone
Returnsany_address — holding a slice ‘00’ (two zero bits) at runtime.
It means “none address”.
It's a rarely used `any_address`, NOT `address`Use it in combination with external addresses only. E.g., pass “none” to
createExternalLogMessage, which accepts any_address.To represent “internal or none”, use address? (nullable) and null accordingly.
See address.any_address.isNone / isInternal / isExternal
Tests which specific blockchain address is contained in “any”.any_address.castToInternal
Castsany_address to address checking that “any” is actually “internal”.
To skip the runtime check, use an unsafe cast: addr = myAny as address.
Reserving Toncoins on contract’s balance
Stdlib contains several constantsRESERVE_MODE_XXX for reserve modes.
As well as a couple of functions:
reserveToncoinsOnBalance
Creates an output action which would reserve Toncoins on balance.reserveExtraCurrenciesOnBalance
Similar toreserveToncoinsOnBalance, but also accepts a dictionary extraAmount.
Creating and sending messages
Stdlib contains several constantsSEND_MODE_XXX for sending modes.
Composing message cells is encapsulated with a power function createMessage, see message sending.
For externals (createExternalLogMessage), follow the same link.
A low-level function sendRawMessage also exists, but its use is not recommended.
Modules requiring explicit imports
Besides “always-available” functions fromcommon.tolk, Tolk has separate files that must be imported in order to be used.
getGasConsumedAtTheMomentacceptExternalMessagesetGasLimitToMaximumsetGasLimitcalculateGasFeecalculateGasFeeWithoutFlatPricecalculateStorageFeecalculateForwardFeecalculateForwardFeeWithoutLumpPricecontract.getStorageDuePaymentcontract.getStoragePaidPayment
[1, [2, [3, null]]] represents the list [1, 2, 3].
They are used rarely nowadays.
Q: Why are some functions builtin?
Many functions in common.tolk don’t provide asm instructions:
len is constant (say, 32), loadUint is translated to 32 LDU, but if it’s a variable,
it’s taken from a stack, and the LDUX instruction is emitted.
Another example — builder.storeUint(1, 32).storeUint(2, 64) is not translated to 32 STU and 64 STU.
Instead, these calls are merged into a single STSLICECONST.
See compiler optimizations for details.
Appendix: How the embedded stdlib works
The stdlib is bundled with the compiler — it’s a foldertolk-stdlib/, automatically discovered.
An import @stdlib/xxx actually loads {STLIB_PATH}/xxx.tolk.
Here is how the folder is discovered:
-
The compiler searches in predefined and relative paths.
For example, when launched from a system-installed package, e.g.,
/usr/bin/tolk, the stdlib is located in/usr/share/ton/smartcont. For custom installations, theTOLK_STDLIBenvironment variable can be set. This is standard practice for compilers. - The WASM wrapper tolk-js also includes the stdlib, so it’s already installed when using blueprint.
-
IDE plugins automatically locate the stdlib to provide auto-completion.
Blueprint installs tolk-js, creating the
node_modules/@ton/tolk-js/folder in the project structure. It containscommon.tolk,tvm-dicts.tolk, and other files.