All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-e
/--eval
CLI flags to evaluate constant Tact expressions: PR #462-q
/--quiet
CLI flags to suppress compiler log output: PR #509- Markdown report for compiled contracts now includes Mermaid diagrams for trait inheritance and contract dependencies: PR #560
- Documentation comments to Zod schema of
tact.config.json
for descriptive hover pop-ups in editors: PR #575
- Removed the
LValue
grammatical category and replaced it withExpression
: PR #479 - Compilation results are placed into the source file directory when compiling without
tact.config.json
file: PR #495 - External receivers are enabled for single file compilation: PR #495
[DEBUG]
prefix was removed from debug prints because a similar prefix was already present: PR #506- File paths in debug prints always use POSIX file paths (even on Windows): PR #523
- The IPFS ABI and supported interfaces getters are not generated by default; to generate those, set to
true
the two newly introduced per-project options intact.config.json
:ipfsAbiGetter
andinterfacesGetter
: PR #534 - Values of
Slice
andBuilder
types are not converted toCell
in Typescript bindings anymore: PR #562 - Debug prints now include line content for better debugging experience: PR #563
- Compilation error in case of access to a non-existent variable that is present in the contract storage now suggests the
self.
prefix: PR #568
- Name clashes with FunC keywords in struct constructor function parameters: PR #467
- Error messages for traversing non-path-expressions in
foreach
-loops : PR #479 - Shadowing of trait constants by contract storage variables: PR #480
- Parsing of non-decimal message opcodes: PR #481
- Detection of multiple receivers of the same message: PR #491
- Detection of non-unique message opcodes: PR #493
- Error messages for non-abstract constants in traits: PR #483
- All immediately inherited traits must be unique: PR #500
- Do not throw error when overriding abstract and virtual getters: PR #503
- Error message for non-existent storage variables: PR #519
- Error message for duplicate receiver definitions inherited from traits: PR #519
- Usage of
initOf
inside ofinit()
does not cause error135
anymore: PR #521 - Usage of
newAddress
with hash parts shorter than 64 hexadecimal digits does not cause constant evaluation errorInvalid address hash length
anymore: PR #525 - Introduced a streamlined error logger for compilation pipeline to support third-party tools: PR #509
- Collisions of PascalCase getter names in generated wrappers are now checked: PR #556
- Display a clearer error in case the source code file is missing when using Tact's CLI: PR #561
- Error messages for unicode code points outside of valid range: PR #535
- Correct regex for unicode code points and escaping of control codes in generated comments: PR #535
- Add
impure
specifier to some stdlib functions that are expected to throw errors: PR #565 - Defining non-existing native FunC functions now throws an understandable compilation error: PR #585
- Bump used
@tact-lang/opcode
version to0.0.16
which fixes the issue withDIV
instructions: PR #589 - Incorrect FunC code generated for
recv_external
: PR #604
- The bitwise NOT operation (
~
): PR #337 - Augmented assignment bitwise operators
|=
,&=
,^=
: PR #350 - Traversing maps from contract storage and structs is now allowed: PR #389
- The
loadBool
method forSlice
type: PR #412 - CLI flag
--with-decompilation
to turn on decompilation of BoC files at the end of the compilation pipeline: PR #417 - Support more Tact expressions in the constant evaluator: conditional expressions, struct instances, struct field accesses,
emptyMap()
: PR #432 and PR #445 - The
fromCell
andfromSlice
methods for struct and message parsing: PR #418 and PR #454 - The
return
-statement reachability analysis now takes into account thethrow
andnativeThrow
functions: PR #447
- Trailing semicolons in struct and message declarations are optional now: PR #395
- Tests are refactored and renamed to convey the sense of what is being tested and to reduce the amount of merge conflicts during development: PR #402
let
-statements can now be used without an explicit type declaration and determine the type automatically if it was not specified: PR #198 and PR #438- The outdated TextMate-style grammar files for text editors have been removed (the most recent grammar files can be found in the tact-sublime repo): PR #404
- The JSON schema for
tact.config.json
has been moved to theschemas
project folder: PR #404 - Allow underscores as unused variable identifiers: PR #338
- The default compilation mode does not decompile BoC files anymore, to additionally perform decompilation at the end of the pipeline, set the
fullWithDecompilation
mode in themode
project properties oftact.config.json
: PR #417 - Trait lists, parameters and arguments in the Tact grammar were assigned their own names in the grammar for better readability and code deduplication: PR #422
- The semicolon (
;
) terminating a statement is optional if the statement is the last one in the statement block: PR #434
- Return type of
skipBits
now matches FunC and does not lead to compilation errors: PR #388 - Typechecking of conditional expressions when one branch's type is a subtype of another, i.e. for optionals and maps/
null
: PR #394 - Typechecking of conditional expressions when the types of their branches can be generalized, i.e. for non-optionals and
null
can be inferred an optional type: PR #429 - External fallback receivers now work properly: PR #408
Int as coins
as a value type of a map in persistent storage does not throw compilation error anymore: PR #413- The semantics of the Tact arithmetic operations in the constant evaluator to perform rounding towards negative infinity: PR #432
- Better error messages for the
void
type: PR #442 - Fixed the native function binding for the stdlib function
nativeThrowWhen
(it needed to bethrow_if
instead ofthrow_when
) and also renamed it tonativeThrowIf
for consistency with FunC: PR #451
- Tests for recursive functions: PR #359
- API for AST traversal: PR #368
- Spell checking for the whole code base: PR #372
- GitHub actions updated to use Node.js 20: PR #360
- Refactor AST types to simplify access to third-party tools: PR #325
- Refactor the compiler API used to access AST store: PR #326
- Update JSON Schema to inform about usage in Blueprint: PR #330
- All identifiers in error messages are now quoted for consistency: PR #363
- The Tact grammar has been refactored for better readability: PR #365
- Error messages now use relative file paths: PR #456
- Comparison between
null
and non-optionals now throws a compilation error: PR #571
- The
log2
andlog
math functions were adjusted for consistency in error throwing: PR #342 - Shadowing built-in static functions is now forbidden: PR #351
- Augmented assignment now throws compilation error for non-integer types: PR #356
- Built-in function
address()
now handles parse errors correctly: PR #357 - The grammar of the unary operators has been fixed, constant and function declarations are prohibited for contracts and at the top level of Tact modules: PR #365
- Typos in ABI generation: PR #372
__tact_load_address_opt
code generation: PR #373- Empty messages are now correctly converted into cells: PR #380
- All integer and boolean expressions are now being attempted to be evaluated as constants. Additionally, compile-time errors are thrown for errors encountered during the evaluation of actual constants: PR #352
- Chaining mutable extension functions now does not throw compilation errors: PR #384
- Removed unused
ton-compiler
dependency: PR #452
log2
andlog
math functions in@stdlib/math
: PR #166- Reserve mode constants in
@stdlib/reserve
, namelyReserveExact
,ReserveAllExcept
,ReserveAtMost
,ReserveAddOriginalBalance
,ReserveInvertSign
,ReserveBounceIfActionFail
: PR #173 - Support for string escape sequences (
\\
,\"
,\n
,\r
,\t
,\v
,\b
,\f
,\u{0}
through\u{FFFFFF}
,\u0000
through\uFFFF
,\x00
through\xFF
): PR #192 - JSON Schema for
tact.config.json
: PR #194 - Struct fields punning, i.e.
{foo, bar}
is syntactic sugar for{ foo: foo, bar: bar }
: PR #272 - The ability to use
dump
function on the values of theAddress
type: PR #175 - The non-modifying
StringBuilder
'sconcat
extension function for chained string concatenations: PR #217 - The
toString
extension function forAddress
type: PR #224 - The bitwise XOR operation (
^
): PR #238 - The
isEmpty
extension function for theMap
type: PR #266 - The
pow2
power function with base 2: PR #267 - The
try
andtry-catch
statements: PR #212 - The
del
method for theMap
type: PR #95 - The
-h
/--help
,-v
(short for--version
),-p
(short for--project
),--func
(for only outputting FunC code) and--check
(for only doing the syntax and type checking) command-line flags: PR #287 - The
mode
enum in project properties oftact.config.json
for specifying compilation mode:full
(default),funcOnly
(only outputs FunC code and exits), orcheckOnly
(only does the syntax and type checking, then exits): PR #287 - The
foreach
loop for theMap
type: PR #106
- The implicit empty
init
function is now present by default in the contract if not declared: PR #167 - Support trailing commas in all comma-separated lists (struct instantiations,
initOf
arguments,init()
parameters, inherited traits viawith
, function arguments and parameters): PR #179 and PR #246 @stdlib/stoppable
now imports@stdlib/ownable
so the programmer does not have to do it separately: PR #193- The
newAddress
function now evaluates to a constant value if possible: PR #237 - The
pow
power function could only be used at compile-time, but now it is available in the standard library and can be called both at runtime and compile-time: PR #267 - The
dump()
anddumpStack()
functions now print the file path, line number, and column number in addition to the data: PR #271 - Use
|
instead of+
for send mode flags because the bitwise OR operation is idempotent and hence safer: PR #274 - Bumped the versions of
@ton/core
andohm-js
to the most recent ones: PR #276 - Generated
.pkg
-files always use POSIX file paths (even on Windows): PR # 300 - The
-p
/--project
flags now allow specifying more than one project name. Additionally, they also require a--config
flag to be specified: PR #287 - Command-line interface now allows compiling a single Tact file directly, without specifying a config: PR #287
- Escape backticks in error messages for generated TypeScript code: PR #192
- Integer overflows during compile-time constant evaluation are properly propagated as a compilation error: PR #200
- Incorrect "already exists" errors when using the
toString
andvalueOf
identifiers: PR #208 - Empty inherited trait lists after
with
keyword are now disallowed: PR #246 - Allow chaining method calls with
!!
, for instance,map.asCell()!!.hash()
is grammatically correct now: PR #257 - Precedence levels for bitwise operators, equality and comparisons now matches common languages, like JavaScript: PR #265
- Incorrect variable scoping in the
repeat
,while
anduntil
loops: PR #269 - FunC compilation errors when trying to
dump()
values of theCell
,Slice
,Builder
andStringBuilder
types: PR #271 - Tact's CLI returns a non-zero exit code if compilation fails: PR #278
- Use the most recent version of the FunC standard library
stdlib.fc
: PR #283 - The WASM version of the FunC compiler has been updated to 0.4.4 and patched to work on larger contracts: PR #297
- The
return
-statement reachability analysis: PR #302
- Augmented assignment operators (
+=
,-=
,*=
,/=
and%=
): PR #87 - Binary and octal literals with underscores as numerical separators: PR #99
- Ternary conditional operator (
condition ? then : else
): PR #97 - The
--version
command-line flag for the Tact executable: PR #137 - The
SendBounceIfActionFail
send mode constant to the standard library: PR #122
- Decimal and hexadecimal literals now allow underscores as numerical separators: PR #99
- The equality and non-equality operators (
==
and!=
) now support slices and strings by comparing the hashes of the left-hand and right-hand sides : PR #105 - Continuous integration now tests the dev tact-template's version with the dev version of Tact: PR #111
- Continuous integration now tests the latest Blueprint's version with the dev version of Tact: PR #152
- Continuous integration now checks there are no ESLint warnings: PR #157
- Relative imports from parent directories: PR #125
- The typechecker failed to identify different types when using the
==
and!=
operators: PR #127 - ESLint warnings for the whole Tact codebase: PR #157
- The versions of some vulnerable dependencies were bumped in
package.json
andyarn.lock
: PR #158 and PR #160
- Continuous integration to run Tact tests on Linux, macOS and Windows: PR #96
- Migration to
@ton
NPM packages: PR #89
- Struct and message identifiers need to be capitalized: PRs #81 and #83
- Fixed the signature of the
checkDataSignature
function instdlib/std/crypto.tact
: PR #50 - Show location info for the internal compiler error 'Invalid types for binary operation': PR #63
- Hacked paths to support builds on Windows
- bitwise and and or operations
- statically compile expressions with bitwise operations if possible
- Add full ABI in bindings
- Fix typescript bindings generation for custom key and value serialization formats
- Fix missing external messages in bindings
reply
is now a method ofContract
instead of global context and changed it's behavior if storage reserve is non-zero in contract.- Logical expressions are now calculated differently:
&&
now does not execute right expression if left isfalse
and||
does not execute right expression if left istrue
. Before it was executed in any case. This change is made in attempt to reduce unexpected behavior. OwnableTransferable
is now sends response to the sender.overwrites
was renamed tooverride
Deployable
trait now sends non-bounceable notifications instead of bounceable ones.
Address
toAddress
maps- Ability to define key and value serializations for maps
sha256
hashingforward
andnotify
functions that can be used to send messages to other contracts using remaining value of incoming messagevirtual
andabstract
constants that can be shared between traitsstorageReserve
constant in every contract that can be used to reserve some storage space by any traitabstract
functions that can be implemented in contractsFactoryDeployable
trait for deploying from factory contract@stdlib/dns
for easier DNS resolution- Opt-in
external
message support - Typed
bounce
receiver andbounce<T>
type modifier commit
for committing state changesinline
modifier for functions for inlining them into the caller- Ability to define empty messages (but not structs)
- Some string-related operations are now computed at compile time if possible
- Signature of
preloadBits
function - Fixed
readForwardFee
function
- Fix
func
invocation
- Remove tact-bindings binary reference
- Ability to define empty messages (but not structs)
- Support for bounced receivers for message structs
- Bounced messages now skipped first 32 bits before passing it to receivers
- Passing optional structs as arguments
- deploy trait now sends non-bounceable notifications
- changed
forward
and added bounceable and init arguments
Contract.notify()
non-bounceable alternative to reply
commit
function to commit state changes
- Work-around func
0.4.3
bug with pragma processing - Fix external messages with arguments type checking
- Upgrade
func
to0.4.3
- Fix bouncing unknown messages
FactoryDeployable
trait for deploying from factory contract
- Abstract functions
- Abstract and virtual constants in traits
- Rename
overrides
tooverride
- Updated ownership transferring methods
- Unused
public
modifier
reply
now in contract instead of global context
asCell
to maps
- Fix
dnsResolveWallet
compilation error
dns
library- map key and value serialization formats
- Upgrade decompiler to a
@tact-lang/[email protected]
- Signature of
preloadBits
function
sha256
function to compute sha256 hash of a text or byte string
- Opt-in external messages support
- Missing implementation of
Address
toAddress
maps
inline
modifier for functions to inline them into the caller
- Fix missing
method_id
inget_abi_ipfs
andlazy_deployment_completed
- Optimization of gas usage of low level primitives
- Optimization of
String.asComment()
that tries to compute it compile time if possible
- Ability to compare cells
- Fixed contract crash when equality check involving nullable variables
- Change logic of
&&
and||
. Now second argument is not calculated when first argument isfalse
ortrue
respectively.
emit
function to emit events
- Fixed possible inconsistent behavior when calling mutating get methods from inside of the contract
- Fixed regression of order of functions in generated files
- Tact now emits func in multiple files, optimized not only for blockchain, but also for human
- Some functions for deep structures with optionals not emitted
- Crash in bindings generator on boolean value in dictionary
overwrites
->override
- Invalid
check
function error generation - Error message for
address(0)
sender()
function to get message sender address
- Upgrade
func
to0.4.2
- Windows paths support
pow
is now compile-only function
- Use new FunC wasm bundle
- exported
check
function for language server support
- Contracts now can be deployed only to the basic workchain unless
masterchain
settrue
- Checking field initialization in init function
- Contracts now work only with basic workchain. To enable masterchain support set
masterchain: true
intact.conf.json
pow
function for exponentiationaddress()
compile-time function for creating addresses from stringscell()
compile-time function for creating cells from base64 stringsinterfaces
field to ABI- report workchain support in interfaces
logger
interface to programmatic API
verify
function to verify compiled package
- Fixing npm exports
- Fixing npm exports for typescript
- Fixing npm exports for typescript
- Fixed browser/node typings and exports
- Fixed browser environment execution
- Fixed missing
mkdirp
dependency
- Fixed cli command
@ton-lang/compiler/node
to invoke compiler from node similar how cli works@ton-lang/compiler/browser
to invoke compiler from browser
- Removed jetton library from stdlib. It would be re-introduced after 1.0 version with more thought put into it.
- Display line and column numbers in error messages to be able to navigate to the error in the editor
- Execution order of struct and message fields
initOf
argument type checks
- Tact contracts are now Argument-addressable meaning that they depend on init arguments and code hash only. Init function is now called when first valid message is received.
- Refactoring of allocator
- Moving contract's load function to the beginning of the execution
- Moving contract's save function to the end of the execution
- moving
debug
flag fromexperimental
toparameters
intact.config.json
- Unknown fields in config are now considered an error
- Allow contracts without fields
- Typescript bindings are now working in browser and doesn't have
ton-emulator
dependency map
syntax now uses<>
instead of[]
for future compatibility with generics
- Allow
Builder
type as a field type similar toCell
andSlice
- Allow
String
type as a field type
- Error codes in reports
- Client-friendly typescript bindings
- Change repository locations
emptyMap()
for creating empty maps- Allowing assigning
null
value to a map variable (same as callingemptyMap()
)
- Update
dump
function to handle booleans and strings, better type checking or arguments - Report
org.ton.debug.v0
interface if debug mode is enabled - Update bindings generator to support
ton-emulator >= v2.1.0
- Importing
func
files
- Upgrade
func
to0.4.1
- Enforce
func
version in generated files - Enable critical pragmas by default
- Enable inlining in a lot of places thanks to fixed crashes in
func
- Optional
Address
fields in typescript bindings
Address.asSlice
for manual address parsing@stdlib/content
library withcreateOffchainContent
functions
>>
and<<
operations- Type checking of struct constructors
- Fix missing func compiler in distributive
- TextMate Grammar for syntax highlighting
- Embed
func
compiler to package - Better builder types
- Moved docs to
ton-docs
repository
beginTailString
andbeginStringFromBuilder
for starting aStringBuilder
Slice.asString
for converting slice to aString
(without checks of contents)
- Fixing passing non-nullable type as second argument to map's
set
operation
- New
2022.v12
func compiler
- Improve gas usage in
storeBool
-newAddress
function to create a new address from chain and hash -getConfigParam
to get system configuration
- Deep contract dependencies
loadAddress
inSlice
Fixing missing NPM release
- Changed message id algorithm to the one based on type signatures instead of tlb
- Dictionaries in typescript bindings
- Introduced packaging compilation step that packages a contract to a single package that can be deployed in predictable way.
tact-bindings
to build bindings to non-tact contracts
- Assignability type checks
toCell
to all structs and messages- restored disassembler as part of a compilation flow
typescript
bindings parser of structs and messages
abi.pack_cell
andabi.pack_slice
- Updated codegen to prefix function names with a
$
to avoid clashing with system functions random
andrandomInt
that are correctly initialized on first use unlike native one- Changed the way get and init methods expect their arguments and return values to match func-like primitives
- non-nullable value could break the nullable variable memory representation
- Large bindings generator refactoring to match new
ton-core
andton-emulator
packages
Deployable
trait in@stdlib/deploy
- Constants in contracts
- Global constants
- Added
SendRemainingBalance
,SendRemainingValue
,SendIgnoreErrors
,SendPayGasSeparately
,SendDestroyIfZero
constants in stdlib - Added
emptyCell
andemptySlice
helpers - Added jettons example
require
now accepts two arguments, second one must be a string literal that has error message. This error message then will be exported to ABI- Optional
Address
fields are not encoded using native representation
- Renamed Map's
get2
toget
and removingget
from keywords list.
- Fixed missing call arguments verification
String
literals and variablesInt.toString()
andInt.toFloatString()
StringBuilder
for gas-efficient string building- Global compile-time
ton
function that converts string to Int during compile time. checkDataSignature
similar to funccheck_data_signature
String.asComment
for conversion text to a comment payloadResumable
trait, allows to resume contract operations once it was stopped- Comment receiver that allows to receive arbitrary comment
String.asSlice
cast string to a slice for parsing- Binary shift operators
>>
and<<
Slice.fromBase64
that converts text slice that has base64 to binary representation (both classic and url)Slice.asCell
,Builder.asCell
,Cell.asSlice
,Builder.asCell
convenience functionsSlice.loadCoins
that reads coins from slicemyBalance
that returns current balance of a contract before execution phase
contractAddress
now accepts single argument of typeStateInit
and always produces address for workchain. Old method is renamed tocontractAddressExt
.hashCell
andhashSlice
are now extension functionhash
onSlice
andCell
- Removed some keywords such as
message
,contract
,init
to allow use this names as variable names - Renamed
receiveBounced
tobounced
- Fixing importing tact with providing extension, now
import "./lib";
andimport "./lib.tact";
are equivalent. - Fixing extension function generation
- Fixing clashing of variable names with func primitives and global functions
- Fix fallback and bounce argument type resolving
- Fixed
loadUint
/preloadUint
- Fixed invalid generation of
>=
and>
operators
supported_interfaces
TEP support. TACT now automatically builds a list of supported interfaces of a contractIPFS
-based ABI reporting. TACT now automatically calculates and embeds ABI hash into smart contract and prepares a file to upload to IPFS.