The official smart contract language of TON Blockchain is Tolk. FunC is now a legacy language, with its compiler no longer maintained.
FunC pages will be moved down in the sidebar in mid-April 2026. Here is the preview of a possible future placement, right between "Blockchain foundations" and "Contribute" sections:
FunC allows a broad range of identifiers for functions and variable names. Any single-line string that meets the following conditions qualifies as a valid identifier:
It does not contain special symbols: ;, ,, (, ), [, ], spaces including tabs, ~, and ..
Additionally, function names in function definitions can start with . or ~.
FunC allows an exception regarding identifiers for local variables. Local variables can use the name of a built-in with a non-symbolic name.
Examples of valid identifiers:
query, query', query''
elem0, elem1, elem2
CHECK
_internal_value
message_found?
get_pubkeys&signatures
dict::udict_set_builder
fatal!
Examples of less common, but still valid identifiers:
123validname
2+2=2*2
-alsovalidname
0xefefefhahaha
{hehehe}
pa{--}in"`aaa`"
Examples of valid function names:
fun_a
~fun_a?
._how123
Examples of invalid identifiers:
take(first)Entry - contains parentheses ( and )
"not_a_string - starts with a ", like a string literal
msg.sender - includes a .
send_message,then_terminate - contains a ,
_ - just an underscore, which is not valid on its own
pa;;in"`aaa`" - contains ;
{-aaa-} - it is a comment
aa(bb - contains an opening parenthesis
123 - a number literal
_+_ - it is a reserved builtin name
Special identifiers in backticks:
FunC allows identifiers enclosed in backticks `.
These identifiers can contain any characters except:
Newline characters \n
Backticks ` themselves, except the opening and closing ones.
Examples of valid backtick identifiers:
`I'm a variable identifier too`
`any symbols ; ~ () are allowed here...`
Identifiers in FunC usually follow these naming conventions:
Apostrophe ' at the end: used when a variable is a modified version of its original value.
Example:
cell dict' = udict_set(dict, 100, 0, v);
Here, function udict_set updates key 0 with value v in dictionary dict. The updated dictionary name is dict'.
Question mark ? at the end: typically used for boolean variables or functions that return a success flag.
Example:
(slice v, int found?) = udict_get?(dict, 100, 0);
Here, function udict_get? looks up index 0 in dictionary dict, and returns the associated value v (if found) and a flag found? which indicates whether the index was found in the dictionary.
FunC has a special syntax for compile-time operations that compute slices and integer hashes out of ASCII strings. These compile-time operations are invoked by enclosing the ASCII string in double quotes ", followed by a suffix representing the compile-time operation to apply on the string, like:
"this is a string"u
where the suffix u represents the compile-time operation to invoke on the ASCII string.
These built-ins are evaluated during compilation time, which means that the FunC compiler replaces the built-in call anywhere it occurs with the result of the call. In particular, it is possible to use these compile-time built-ins while declaring constants:
If no suffix is provided, the compiler computes a slice from the ASCII string, such that the contents of the slice is the binary code of the ASCII string.
const c = "hello"; ;; c has the slice x{68656c6c6f}, where 68656c6c6f ;; is the slice contents in hexadecimal, representing ;; the ASCII code of the string.
Suffix s interprets the string as an hexadecimal number and produces a slice having the binary representation of the hexadecimal number. If the string is not an hexadecimal number, the compiler signals an error.
const c = "abcdef"s; ;; c has the slice x{abcdef}, where abcdef is the ;; slice contents in hexadecimal. ;; Note that abcdef is a valid hexadecimal number.
Suffix a interprets the string as an address and creates a slice containing a MsgAddressInt structure from the address.
;; c has slice x{9FE6666666666666666666666666666666666666666666666666666666666666667_};; The slice contents represent the MsgAddressInt structure:;; addr_std$10 anycast:none$0 workchain_id:int8=0xFF address:bits256=0x33...33const c = "Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF"a;
Special characters like \n are not supported in strings, but you can create multi-line strings by writing the text across multiple lines, all surrounded by triple quotes """. The triple quotes syntax also supports the previously described suffixes.
For example:
int a = """ hash me baby one more time .... Oh, baby, baby"""h; ;; a has value 876244482