Tact v1.6.5 is released! Back with another round of refinements!… — Tact Kitchen — TG.ME

🎉 Tact v1.6.5 is released!

Back with another round of refinements! While we're working on many exciting things in the background, we're committed to fixing every bug that the community might discover so that Tact can provide a flawless developer experience.

Furthermore, we now actively employ AI and large language model (LLM) fuzzing techniques, such as documentation-driven approaches where LLMs are given only the Tact language documentation and access to the compiler. Then, LLM agents generate potentially problematic code snippets, compile them, and analyze results. They further iterate and provide new, interesting bug reports — resolving those makes both Tact compiler and Tact documentation better at the same time!

Check out this awesome article from one of the team members to learn more: Documentation-Driven Compiler Fuzzing with Large Language Models.

And now, let's see what's new in Tact v1.6.5, starting with the most prominent part of this patch release:

🛠 Bug fixes

• Ternary operator ?: now correctly works with structs and null values
• New parser now properly handles the code that wasn't completed at the end of the file
• The error for assembly functions and the get attribute is now correctly shown
• Now, when you call the dump() function with an argument of the unsupported StringBuilder type, the error will always be shown even if the debug mode is disabled
• Improper whitespace between the operator and the equals sign is no longer allowed
• The &&= and ||= augmented assignment operators are now properly short-circuited
• Get methods now can return an optional contract state
• The Struct.fromSlice(), Message.fromSlice(), and similar functions now work properly if the slice has been parsed entirely and the last field of the struct had the serialization annotation as remaining
• The wildcard symbol _ is prohibited for struct and message struct fields, function names, contract, and trait names
• The contract's state is now properly saved on early return statements in the receiver functions

🧳 Miscellaneous improvements

• Whenever you access context().sender, it now calls the sender() function instead to optimize the gas usage
• The internalExternalReceiversOutsideMethodsMap option and its respective receiver order optimization were reworked to ensure compatibility with explorers and user wallets
• The SendPayGasSeparately constant was deprecated in favor of SendPayFwdFeesSeparately — they're functionally identical, but the latter better expresses the intent and action that this optional flag makes when sending messages
• The Stoppable trait now throws the exit code 133 instead of the exit code generated by the require() function from the "Contract stopped" message

📜 See the full release notes for Tact v1.6.5
📥 And upgrade Tact in your projects

LLMs are great, but we value our community no less. It's great being around a bunch of talented, passionate, and bright engineers who make a future of safe and scalable ⚡️ Tact smart contracts on TON possible for everyone. Thank you for everything you do and for the feedback you give!

A special shoutout goes to the RSquad team @rsquadlife for their early adoption of Tact features, thoughtful suggestions, and bug reports. If punk were code, they'd be its maintainers 🤘

🍲 ghibli deez bugs
♨️ @tact_kitchen from the @ton_studio
⚡9
March 29, 2025 799 3