Skip to main content

Number literals

FunC supports decimal and hexadecimal integer literals, including those with leading zeros:
  • Examples of valid integer literals: 0, 123, -17, 00987, and -0.
  • Examples of valid hexadecimal literals: 0xef, 0xEF, 0x0, -0xfFAb, 0x0001, and -0x0.

Identifiers

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: Additionally, function names in function definitions can start with . or ~. 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...`

Constants

FunC allows defining compile-time constants that are substituted and pre-computed during compilation. Syntax:
  • optional-type (e.g., int or slice) is optional but improves readability and ensures type correctness.
  • value-or-expressioncan be a literal or an expression involving literals and previously defined constants.
Multiple constants can be defined in the same const declaration by separating them with ,. Example usage:

Compile-time built-ins

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:
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:
We now describe the possible string suffixes.

String without suffix

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.

String with suffix s

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.

String with suffix a

Suffix a interprets the string as an address and creates a slice containing a MsgAddressInt structure from the address.

String with suffix u

Suffix u produces the decimal representation of the binary code of the ASCII string.

String with suffix h

Suffix h generates an integer from the first 32 bits of the string’s SHA-256 hash.

String with suffix H

Suffix H generates an integer from the full 256-bit SHA-256 hash of the string.

String with suffix c

Suffix c generates an integer from the crc32 value of the string.

String with multiple lines

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: