Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(stdlib): send() costs less gas #1800

Merged
merged 17 commits into from
Feb 14, 2025
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/src/content/docs/book/send.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ Messages in Tact are commonly composed using a built-in [Struct](/book/structs-a

Field | Type | Description
:------- | :--------------------- | :----------
`bounce` | [`Bool{:tact}`][p] | When set to `true` (default) message bounces back to the sender if the receiver contract doesn't exist or wasn't able to process the message.
`to` | [`Address{:tact}`][p] | Receiver internal [`Address{:tact}`][p] in TON blockchain.
`value` | [`Int{:tact}`][int] | The amount of [nanoToncoins][nano] you want to send with the message. This value is usually used to cover [forward fees][fwdfee], unless the optional flag [`SendPayGasSeparately{:tact}`](/book/message-mode#optional-flags) is used.
`mode` | [`Int{:tact}`][int] | An 8-bit value that configures how to send a message, defaults to $0$. See: [Message `mode`](/book/message-mode).
`body` | [`Cell?{:tact}`][cell] | [Optional][opt] message body as a [`Cell{:tact}`][cell]
`code` | [`Cell?{:tact}`][cell] | [Optional][opt] initial code of the contract (the compiled bytecode)
`data` | [`Cell?{:tact}`][cell] | [Optional][opt] initial data of the contract (arguments of [`init(){:tact}` function](/book/contracts#init-function) of the contract)
`value` | [`Int{:tact}`][int] | The amount of [nanoToncoins][nano] you want to send with the message. This value is usually used to cover [forward fees][fwdfee], unless the optional flag [`SendPayGasSeparately{:tact}`](/book/message-mode#optional-flags) is used.
`to` | [`Address{:tact}`][p] | Receiver internal [`Address{:tact}`][p] in TON blockchain.
`bounce` | [`Bool{:tact}`][p] | When set to `true` (default) message bounces back to the sender if the receiver contract doesn't exist or wasn't able to process the message.

Fields `code` and `data` are what's called an [init package](/book/expressions#initof), which is used in deployments of new contracts.

Expand Down
72 changes: 35 additions & 37 deletions src/stdlib/stdlib.ts
Original file line number Diff line number Diff line change
Expand Up @@ -728,9 +728,9 @@ files["std/internal/send.tact"] =
"Rm9yd2FyZEZlZShtc2c6IENlbGwsIG1vZGU6IEludCk6IEludCB7IFNFTkRNU0cgfQoKY29uc3QgU2VuZFJlbWFpbmluZ0JhbGFuY2U6IEludCA9IDEyODsKY29uc3Qg" +
"U2VuZFJlbWFpbmluZ1ZhbHVlOiBJbnQgPSA2NDsKY29uc3QgU2VuZERlZmF1bHRNb2RlOiBJbnQgPSAwOwpjb25zdCBTZW5kSWdub3JlRXJyb3JzOiBJbnQgPSAyOwpj" +
"b25zdCBTZW5kUGF5R2FzU2VwYXJhdGVseTogSW50ID0gMTsKY29uc3QgU2VuZERlc3Ryb3lJZlplcm86IEludCA9IDMyOwpjb25zdCBTZW5kQm91bmNlSWZBY3Rpb25G" +
"YWlsOiBJbnQgPSAxNjsKY29uc3QgU2VuZE9ubHlFc3RpbWF0ZUZlZTogSW50ID0gMTAyNDsKCnN0cnVjdCBTZW5kUGFyYW1ldGVycyB7CiAgICBib3VuY2U6IEJvb2wg" +
"PSB0cnVlOwogICAgdG86IEFkZHJlc3M7CiAgICB2YWx1ZTogSW50OwogICAgbW9kZTogSW50ID0gU2VuZERlZmF1bHRNb2RlOwogICAgYm9keTogQ2VsbD8gPSBudWxs" +
"OwogICAgY29kZTogQ2VsbD8gPSBudWxsOwogICAgZGF0YTogQ2VsbD8gPSBudWxsOwp9CgoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gUXVldWVzIHRoZSBtZXNzYWdlIHRv" +
"YWlsOiBJbnQgPSAxNjsKY29uc3QgU2VuZE9ubHlFc3RpbWF0ZUZlZTogSW50ID0gMTAyNDsKCnN0cnVjdCBTZW5kUGFyYW1ldGVycyB7CiAgICBtb2RlOiBJbnQgPSBT" +
"ZW5kRGVmYXVsdE1vZGU7CiAgICBib2R5OiBDZWxsPyA9IG51bGw7CiAgICBjb2RlOiBDZWxsPyA9IG51bGw7CiAgICBkYXRhOiBDZWxsPyA9IG51bGw7CiAgICB2YWx1" +
"ZTogSW50OwogICAgdG86IEFkZHJlc3M7CiAgICBib3VuY2U6IEJvb2wgPSB0cnVlOwp9CgoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gUXVldWVzIHRoZSBtZXNzYWdlIHRv" +
"IGJlIHNlbnQgdXNpbmcgYSBgU2VuZFBhcmFtZXRlcnNgIFN0cnVjdC4KLy8vCi8vLyBBdHRlbXB0cyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2VzIHRocm93" +
"IGFuIGV4Y2VwdGlvbiB3aXRoIGFuIGV4aXQgY29kZSAzMzogYEFjdGlvbiBsaXN0IGlzIHRvbyBsb25nYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgp" +
"IHsKLy8vICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzewovLy8gICAgICAgICB0bzogc2VuZGVyKCksICAgIC8vIGJhY2sgdG8gdGhlIHNlbmRlciwKLy8vICAgICAgICAg" +
Expand All @@ -740,40 +740,38 @@ files["std/internal/send.tact"] =
"dGFjayBzdGF0ZXMgdGhleSBwcm9kdWNlIGFzIGEgZ3JvdXAgYXJlIHNob3duIHJpZ2h0IGFmdGVyLgogICAgLy8gSW4gdGhlIGVuZCwgb3VyIG1lc3NhZ2UgQ2VsbCBz" +
"aG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIFRMLUIgc3RydWN0dXJlOgogICAgLy8gbWVzc2FnZSRfIHtYOlR5cGV9CiAgICAvLyAgIGluZm86Q29tbW9uTXNnSW5mb1Jl" +
"bGF4ZWQKICAgIC8vICAgaW5pdDooTWF5YmUgKEVpdGhlciBTdGF0ZUluaXQgXlN0YXRlSW5pdCkpCiAgICAvLyAgIGJvZHk6KEVpdGhlciBYIF5YKQogICAgLy8gPSBN" +
"ZXNzYWdlUmVsYXhlZCBYOwoKICAgIC8vIEdyb3VwIDE6IFJlYXJyYW5nZW1lbnRzCiAgICAzIDQgQkxLU1dBUAogICAgczIgWENIRzAKICAgIC8vIOKGkiBTdGFjayBz" +
"dGF0ZQogICAgLy8gczA6IGBwYXJhbXMuYm91bmNlYAogICAgLy8gczE6IGBwYXJhbXMudG9gCiAgICAvLyBzMjogYHBhcmFtcy52YWx1ZWAKICAgIC8vIHMzOiBgcGFy" +
"YW1zLmRhdGFgCiAgICAvLyBzNDogYHBhcmFtcy5jb2RlYAogICAgLy8gczU6IGBwYXJhbXMuYm9keWAKICAgIC8vIHM2OiBgcGFyYW1zLm1vZGVgCiAgICAvLyBGb3Ig" +
"YnJldml0eSwgdGhlICJwYXJhbXMiIHByZWZpeCB3aWxsIGJlIG9taXR0ZWQgZnJvbSBub3cgb24uCgogICAgLy8gR3JvdXAgMjogU3RvcmluZyB0aGUgYGJvdW5jZWAs" +
"IGB0b2AgYW5kIGB2YWx1ZWAgaW50byBhIEJ1aWxkZXIKICAgIE5FV0MKICAgIGJ7MDF9IFNUU0xJQ0VDT05TVCAgLy8gc3RvcmUgdGFnID0gJDAgYW5kIGlocl9kaXNh" +
"YmxlZCA9IHRydWUKICAgIDEgU1RJICAgICAgICAgICAgICAgLy8gc3RvcmUgYGJvdW5jZWAKICAgIGJ7MDAwfSBTVFNMSUNFQ09OU1QgLy8gc3RvcmUgYm91bmNlZCA9" +
"IGZhbHNlIGFuZCBzcmMgPSBhZGRyX25vbmUKICAgIFNUU0xJQ0UgICAgICAgICAgICAgLy8gc3RvcmUgYHRvYAogICAgU1dBUAogICAgU1RHUkFNUyAgICAgICAgICAg" +
"ICAvLyBzdG9yZSBgdmFsdWVgCiAgICAxMDUgUFVTSElOVCAgICAgICAgIC8vIDEgKyA0ICsgNCArIDY0ICsgMzIKICAgIFNUWkVST0VTICAgICAgICAgICAgLy8gc3Rv" +
"cmUgY3VycmVuY3lfY29sbGVjdGlvbiwgaWhyX2ZlZSwgZndkX2ZlZSwgY3JlYXRlZF9sdCBhbmQgY3JlYXRlZF9hdAogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAv" +
"LyBzMDogQnVpbGRlcgogICAgLy8gczE6IGBkYXRhYAogICAgLy8gczI6IGBjb2RlYAogICAgLy8gczM6IGBib2R5YAogICAgLy8gczQ6IGBtb2RlYAoKICAgIC8vIEdy" +
"b3VwIDM6IFBsYWNpbmcgdGhlIEJ1aWxkZXIgYWZ0ZXIgY29kZSBhbmQgZGF0YSwgdGhlbiBjaGVja2luZyB0aG9zZSBmb3IgbnVsbGFiaWxpdHkKICAgIHMyIFhDSEcw" +
"CiAgICBEVVAyCiAgICBJU05VTEwKICAgIFNXQVAKICAgIElTTlVMTAogICAgTVVMIC8vIG5vdGUgdGhhdCAtMSAqIC0xIHdyYXBzIGJhY2sgdG8gLTEKICAgIC8vIOKG" +
"kiBTdGFjayBzdGF0ZQogICAgLy8gczA6IC0xICh0cnVlKSBpZiBgZGF0YWAgYW5kIGBjb2RlYCBhcmUgYm90aCBudWxsLCAwIChmYWxzZSkgb3RoZXJ3aXNlCiAgICAv" +
"LyBzMTogYGNvZGVgCiAgICAvLyBzMjogYGRhdGFgCiAgICAvLyBzMzogQnVpbGRlcgogICAgLy8gczQ6IGBib2R5YAogICAgLy8gczU6IGBtb2RlYAoKICAgIC8vIEdy" +
"b3VwIDQ6IExlZnQgYnJhbmNoIG9mIHRoZSBJRkVMU0UsIGV4ZWN1dGVkIGlmIHMwIGlzIC0xICh0cnVlKQogICAgPHsKICAgICAgICBEUk9QMiAvLyBkcm9wIGBkYXRh" +
"YCBhbmQgYGNvZGVgLCBzaW5jZSBlaXRoZXIgb2YgdGhvc2UgaXMgbnVsbAogICAgICAgIE5VTEwgIC8vIHB1c2ggYSBzaW5nbGUgbnVsbAogICAgICAgIFNXQVAgIC8v" +
"IHBsYWNlIEJ1aWxkZXIgb24gdG9wCiAgICB9PiBQVVNIQ09OVAoKICAgIC8vIEdyb3VwIDQ6IFJpZ2h0IGJyYW5jaCBvZiB0aGUgSUZFTFNFLCBleGVjdXRlZCBpZiBz" +
"MCBpcyAwIChmYWxzZSkKICAgIDx7CiAgICAgICAgLy8gXyBzcGxpdF9kZXB0aDooTWF5YmUgKCMjIDUpKQogICAgICAgIC8vICAgc3BlY2lhbDooTWF5YmUgVGlja1Rv" +
"Y2spCiAgICAgICAgLy8gICBjb2RlOihNYXliZSBeQ2VsbCkKICAgICAgICAvLyAgIGRhdGE6KE1heWJlIF5DZWxsKQogICAgICAgIC8vICAgbGlicmFyeTooTWF5YmUg" +
"XkNlbGwpCiAgICAgICAgLy8gPSBTdGF0ZUluaXQ7CiAgICAgICAgTkVXQyAgICAgICAgICAgICAgIC8vIHN0YXJ0IGNvbXBvc2luZyBTdGF0ZUluaXQKICAgICAgICBi" +
"ezAwfSBTVFNMSUNFQ09OU1QgLy8gc3BsaXRfZGVwdGggYW5kIHNwZWNpYWwKICAgICAgICBTVERJQ1QgICAgICAgICAgICAgLy8gc3RvcmUgY29kZQogICAgICAgIFNU" +
"RElDVCAgICAgICAgICAgICAvLyBzdG9yZSBkYXRhCiAgICAgICAgYnswfSBTVFNMSUNFQ09OU1QgIC8vIHN0b3JlIGxpYnJhcnkKICAgICAgICBFTkRDICAgICAgICAg" +
"ICAgICAgLy8gZW5kIGNvbXBvc2luZyBTdGF0ZUluaXQKICAgICAgICBTV0FQICAgICAgICAgICAgICAgLy8gcGxhY2UgQnVpbGRlciBvbiB0b3AKICAgICAgICBiezF9" +
"IFNUU0xJQ0VDT05TVCAgLy8gYW4gZXh0cmEgYml0IGZvciBzdG9yaW5nIFN0YXRlSW5pdCBhcyByZWYKICAgIH0+IFBVU0hDT05UCgogICAgLy8gR3JvdXAgNDogSUZF" +
"TFNFIHRoYXQgZG9lcyB0aGUgYnJhbmNoaW5nIHNob3duIGFib3ZlCiAgICBJRkVMU0UKICAgIC8vIOKGkiBTdGFjayBzdGF0ZQogICAgLy8gczA6IEJ1aWxkZXIKICAg" +
"IC8vIHMxOiBudWxsIG9yIFN0YXRlSW5pdAogICAgLy8gczI6IGBib2R5YAogICAgLy8gczM6IGBtb2RlYAoKICAgIC8vIEdyb3VwIDU6IEZpbmFsaXppbmcgdGhlIG1l" +
"c3NhZ2UKICAgIFNURElDVCAvLyBzdG9yZSBTdGF0ZUluaXQKICAgIFNURElDVCAvLyBzdG9yZSBgYm9keWAgYXMgcmVmIHdpdGggYW4gZXh0cmEgTWF5YmUgYml0LCBz" +
"aW5jZSBgYm9keWAgbWlnaHQgYmUgbnVsbAogICAgRU5EQwogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQ2VsbAogICAgLy8gczE6IGBtb2RlYAoKICAg" +
"IC8vIEdyb3VwIDY6IFNlbmRpbmcgdGhlIG1lc3NhZ2UsIHdpdGggYG1vZGVgIG9uIHRvcAogICAgU1dBUAogICAgU0VORFJBV01TRyAvLyBodHRwczovL2dpdGh1Yi5j" +
"b20vdGFjdC1sYW5nL3RhY3QvaXNzdWVzLzE1NTgKfQoKaW5saW5lIGZ1biBlbWl0KGJvZHk6IENlbGwpIHsKICAgIC8vIGV4dF9vdXRfbXNnX2luZm8kMTEgc3JjOk1z" +
"Z0FkZHJlc3NJbnQgZGVzdDpNc2dBZGRyZXNzRXh0IGNyZWF0ZWRfbHQ6dWludDY0IGNyZWF0ZWRfYXQ6dWludDMyCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIG1h" +
"eWJlOiBzdGF0ZUluaXQgKGZhbHNlKSBib2R5UmVmOiBib29sICh0cnVlKQogICAgbGV0IGM6IENlbGwgPSBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9yZVVpbnQoMTUy" +
"MTE4MDcyMDI3Mzg3NTI4MTc5NjA0Mzg0NjQ1MTMsIDEwNCkKICAgICAgICAuc3RvcmVSZWYoYm9keSkKICAgICAgICAuZW5kQ2VsbCgpOwogICAgbmF0aXZlU2VuZE1l" +
"c3NhZ2UoYywgMCk7Cn0KCmFzbSBmdW4gYWNjZXB0TWVzc2FnZSgpIHsgQUNDRVBUIH0KCmFzbSBmdW4gY29tbWl0KCkgeyBDT01NSVQgfQo=";
"ZXNzYWdlUmVsYXhlZCBYOwoKICAgIC8vIOKGkiBTdGFjayBzdGF0ZQogICAgLy8gczA6IGBwYXJhbXMuYm91bmNlYAogICAgLy8gczE6IGBwYXJhbXMudG9gCiAgICAv" +
"LyBzMjogYHBhcmFtcy52YWx1ZWAKICAgIC8vIHMzOiBgcGFyYW1zLmRhdGFgCiAgICAvLyBzNDogYHBhcmFtcy5jb2RlYAogICAgLy8gczU6IGBwYXJhbXMuYm9keWAK" +
"ICAgIC8vIHM2OiBgcGFyYW1zLm1vZGVgCiAgICAvLyBGb3IgYnJldml0eSwgdGhlICJwYXJhbXMiIHByZWZpeCB3aWxsIGJlIG9taXR0ZWQgZnJvbSBub3cgb24uCgog" +
"ICAgLy8gR3JvdXAgMTogU3RvcmluZyB0aGUgYGJvdW5jZWAsIGB0b2AgYW5kIGB2YWx1ZWAgaW50byBhIEJ1aWxkZXIKICAgIE5FV0MKICAgIGJ7MDF9IFNUU0xJQ0VD" +
"T05TVCAgLy8gc3RvcmUgdGFnID0gJDAgYW5kIGlocl9kaXNhYmxlZCA9IHRydWUKICAgIDEgU1RJICAgICAgICAgICAgICAgLy8gc3RvcmUgYGJvdW5jZWAKICAgIGJ7" +
"MDAwfSBTVFNMSUNFQ09OU1QgLy8gc3RvcmUgYm91bmNlZCA9IGZhbHNlIGFuZCBzcmMgPSBhZGRyX25vbmUKICAgIFNUU0xJQ0UgICAgICAgICAgICAgLy8gc3RvcmUg" +
"YHRvYAogICAgU1dBUAogICAgU1RHUkFNUyAgICAgICAgICAgICAvLyBzdG9yZSBgdmFsdWVgCiAgICAxMDUgUFVTSElOVCAgICAgICAgIC8vIDEgKyA0ICsgNCArIDY0" +
"ICsgMzIKICAgIFNUWkVST0VTICAgICAgICAgICAgLy8gc3RvcmUgY3VycmVuY3lfY29sbGVjdGlvbiwgaWhyX2ZlZSwgZndkX2ZlZSwgY3JlYXRlZF9sdCBhbmQgY3Jl" +
"YXRlZF9hdAogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQnVpbGRlcgogICAgLy8gczE6IGBkYXRhYAogICAgLy8gczI6IGBjb2RlYAogICAgLy8gczM6" +
"IGBib2R5YAogICAgLy8gczQ6IGBtb2RlYAoKICAgIC8vIEdyb3VwIDI6IFBsYWNpbmcgdGhlIEJ1aWxkZXIgYWZ0ZXIgY29kZSBhbmQgZGF0YSwgdGhlbiBjaGVja2lu" +
"ZyB0aG9zZSBmb3IgbnVsbGFiaWxpdHkKICAgIHMyIFhDSEcwCiAgICBEVVAyCiAgICBJU05VTEwKICAgIFNXQVAKICAgIElTTlVMTAogICAgTVVMIC8vIG5vdGUgdGhh" +
"dCAtMSAqIC0xIHdyYXBzIGJhY2sgdG8gLTEKICAgIC8vIOKGkiBTdGFjayBzdGF0ZQogICAgLy8gczA6IC0xICh0cnVlKSBpZiBgZGF0YWAgYW5kIGBjb2RlYCBhcmUg" +
"Ym90aCBudWxsLCAwIChmYWxzZSkgb3RoZXJ3aXNlCiAgICAvLyBzMTogYGNvZGVgCiAgICAvLyBzMjogYGRhdGFgCiAgICAvLyBzMzogQnVpbGRlcgogICAgLy8gczQ6" +
"IGBib2R5YAogICAgLy8gczU6IGBtb2RlYAoKICAgIC8vIEdyb3VwIDM6IExlZnQgYnJhbmNoIG9mIHRoZSBJRkVMU0UsIGV4ZWN1dGVkIGlmIHMwIGlzIC0xICh0cnVl" +
"KQogICAgPHsKICAgICAgICBEUk9QMiAvLyBkcm9wIGBkYXRhYCBhbmQgYGNvZGVgLCBzaW5jZSBlaXRoZXIgb2YgdGhvc2UgaXMgbnVsbAogICAgICAgIGJ7MH0gU1RT" +
"TElDRUNPTlNUCiAgICB9PiBQVVNIQ09OVAoKICAgIC8vIEdyb3VwIDM6IFJpZ2h0IGJyYW5jaCBvZiB0aGUgSUZFTFNFLCBleGVjdXRlZCBpZiBzMCBpcyAwIChmYWxz" +
"ZSkKICAgIDx7CiAgICAgICAgLy8gXyBzcGxpdF9kZXB0aDooTWF5YmUgKCMjIDUpKQogICAgICAgIC8vICAgc3BlY2lhbDooTWF5YmUgVGlja1RvY2spCiAgICAgICAg" +
"Ly8gICBjb2RlOihNYXliZSBeQ2VsbCkKICAgICAgICAvLyAgIGRhdGE6KE1heWJlIF5DZWxsKQogICAgICAgIC8vICAgbGlicmFyeTooTWF5YmUgXkNlbGwpCiAgICAg" +
"ICAgLy8gPSBTdGF0ZUluaXQ7CiAgICAgICAgUk9UICAgICAgICAgICAgICAgIC8vIHBsYWNlIG1lc3NhZ2UgQnVpbGRlciBvbiB0b3AKICAgICAgICBiezEwfSBTVFNM" +
"SUNFQ09OU1QgLy8gc3RvcmUgTWF5YmUgPSB0cnVlLCBFaXRoZXIgPSBmYWxzZQogICAgICAgIC8vIFN0YXJ0IGNvbXBvc2luZyBpbmxpbmVkIFN0YXRlSW5pdAogICAg" +
"ICAgIGJ7MDB9IFNUU0xJQ0VDT05TVCAvLyBzdG9yZSBzcGxpdF9kZXB0aCBhbmQgc3BlY2lhbCBmaXJzdAogICAgICAgIFNURElDVCAgICAgICAgICAgICAvLyBzdG9y" +
"ZSBjb2RlCiAgICAgICAgU1RESUNUICAgICAgICAgICAgIC8vIHN0b3JlIGRhdGEKICAgICAgICBiezB9IFNUU0xJQ0VDT05TVCAgLy8gc3RvcmUgbGlicmFyeQogICAg" +
"fT4gUFVTSENPTlQKCiAgICAvLyBHcm91cCAzOiBJRkVMU0UgdGhhdCBkb2VzIHRoZSBicmFuY2hpbmcgc2hvd24gYWJvdmUKICAgIElGRUxTRQogICAgLy8g4oaSIFN0" +
"YWNrIHN0YXRlCiAgICAvLyBzMDogQnVpbGRlcgogICAgLy8gczE6IG51bGwgb3IgU3RhdGVJbml0CiAgICAvLyBzMjogYGJvZHlgCiAgICAvLyBzMzogYG1vZGVgCgog" +
"ICAgLy8gR3JvdXAgNDogRmluYWxpemluZyB0aGUgbWVzc2FnZQogICAgU1RESUNUIC8vIHN0b3JlIGBib2R5YCBhcyByZWYgd2l0aCBhbiBleHRyYSBNYXliZSBiaXQs" +
"IHNpbmNlIGBib2R5YCBtaWdodCBiZSBudWxsCiAgICBFTkRDCiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBDZWxsCiAgICAvLyBzMTogYG1vZGVgCgog" +
"ICAgLy8gR3JvdXAgNTogU2VuZGluZyB0aGUgbWVzc2FnZSwgd2l0aCBgbW9kZWAgb24gdG9wCiAgICBTV0FQCiAgICBTRU5EUkFXTVNHIC8vIGh0dHBzOi8vZ2l0aHVi" +
"LmNvbS90YWN0LWxhbmcvdGFjdC9pc3N1ZXMvMTU1OAp9CgppbmxpbmUgZnVuIGVtaXQoYm9keTogQ2VsbCkgewogICAgLy8gZXh0X291dF9tc2dfaW5mbyQxMSBzcmM6" +
"TXNnQWRkcmVzc0ludCBkZXN0Ok1zZ0FkZHJlc3NFeHQgY3JlYXRlZF9sdDp1aW50NjQgY3JlYXRlZF9hdDp1aW50MzIKICAgIC8vICAgICAgICAgICAgICAgICAgICAg" +
"bWF5YmU6IHN0YXRlSW5pdCAoZmFsc2UpIGJvZHlSZWY6IGJvb2wgKHRydWUpCiAgICBsZXQgYzogQ2VsbCA9IGJlZ2luQ2VsbCgpCiAgICAgICAgLnN0b3JlVWludCgx" +
"NTIxMTgwNzIwMjczODc1MjgxNzk2MDQzODQ2NDUxMywgMTA0KQogICAgICAgIC5zdG9yZVJlZihib2R5KQogICAgICAgIC5lbmRDZWxsKCk7CiAgICBuYXRpdmVTZW5k" +
"TWVzc2FnZShjLCAwKTsKfQoKYXNtIGZ1biBhY2NlcHRNZXNzYWdlKCkgeyBBQ0NFUFQgfQoKYXNtIGZ1biBjb21taXQoKSB7IENPTU1JVCB9Cg==";
files["std/internal/text.tact"] =
"Ly8KLy8gU3RyaW5nIGJ1aWxkZXIKLy8KCkBuYW1lKF9fdGFjdF9zdHJpbmdfYnVpbGRlcl9zdGFydF9zdHJpbmcpCm5hdGl2ZSBiZWdpblN0cmluZygpOiBTdHJpbmdC" +
"dWlsZGVyOwoKQG5hbWUoX190YWN0X3N0cmluZ19idWlsZGVyX3N0YXJ0X2NvbW1lbnQpCm5hdGl2ZSBiZWdpbkNvbW1lbnQoKTogU3RyaW5nQnVpbGRlcjsKCkBuYW1l" +
Expand Down
36 changes: 15 additions & 21 deletions src/stdlib/stdlib/std/internal/send.tact
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ const SendBounceIfActionFail: Int = 16;
const SendOnlyEstimateFee: Int = 1024;

struct SendParameters {
bounce: Bool = true;
to: Address;
value: Int;
mode: Int = SendDefaultMode;
body: Cell? = null;
code: Cell? = null;
data: Cell? = null;
value: Int;
to: Address;
bounce: Bool = true;
}


Expand Down Expand Up @@ -47,9 +47,6 @@ asm fun send(params: SendParameters) {
// body:(Either X ^X)
// = MessageRelaxed X;

// Group 1: Rearrangements
3 4 BLKSWAP
s2 XCHG0
// → Stack state
// s0: `params.bounce`
// s1: `params.to`
Expand All @@ -60,7 +57,7 @@ asm fun send(params: SendParameters) {
// s6: `params.mode`
// For brevity, the "params" prefix will be omitted from now on.

// Group 2: Storing the `bounce`, `to` and `value` into a Builder
// Group 1: Storing the `bounce`, `to` and `value` into a Builder
NEWC
b{01} STSLICECONST // store tag = $0 and ihr_disabled = true
1 STI // store `bounce`
Expand All @@ -77,7 +74,7 @@ asm fun send(params: SendParameters) {
// s3: `body`
// s4: `mode`

// Group 3: Placing the Builder after code and data, then checking those for nullability
// Group 2: Placing the Builder after code and data, then checking those for nullability
s2 XCHG0
DUP2
ISNULL
Expand All @@ -92,48 +89,45 @@ asm fun send(params: SendParameters) {
// s4: `body`
// s5: `mode`

// Group 4: Left branch of the IFELSE, executed if s0 is -1 (true)
// Group 3: Left branch of the IFELSE, executed if s0 is -1 (true)
<{
DROP2 // drop `data` and `code`, since either of those is null
NULL // push a single null
SWAP // place Builder on top
b{0} STSLICECONST
}> PUSHCONT

// Group 4: Right branch of the IFELSE, executed if s0 is 0 (false)
// Group 3: Right branch of the IFELSE, executed if s0 is 0 (false)
<{
// _ split_depth:(Maybe (## 5))
// special:(Maybe TickTock)
// code:(Maybe ^Cell)
// data:(Maybe ^Cell)
// library:(Maybe ^Cell)
// = StateInit;
NEWC // start composing StateInit
b{00} STSLICECONST // split_depth and special
ROT // place message Builder on top
b{10} STSLICECONST // store Maybe = true, Either = false
// Start composing inlined StateInit
b{00} STSLICECONST // store split_depth and special first
STDICT // store code
STDICT // store data
b{0} STSLICECONST // store library
ENDC // end composing StateInit
SWAP // place Builder on top
b{1} STSLICECONST // an extra bit for storing StateInit as ref
}> PUSHCONT

// Group 4: IFELSE that does the branching shown above
// Group 3: IFELSE that does the branching shown above
IFELSE
// → Stack state
// s0: Builder
// s1: null or StateInit
// s2: `body`
// s3: `mode`

// Group 5: Finalizing the message
STDICT // store StateInit
// Group 4: Finalizing the message
STDICT // store `body` as ref with an extra Maybe bit, since `body` might be null
ENDC
// → Stack state
// s0: Cell
// s1: `mode`

// Group 6: Sending the message, with `mode` on top
// Group 5: Sending the message, with `mode` on top
SWAP
SENDRAWMSG // https://github.com/tact-lang/tact/issues/1558
}
Expand Down
8 changes: 4 additions & 4 deletions src/test/benchmarks/jetton/results.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@
"discovery": "10067"
},
{
"label": "master",
"transfer": "21402",
"burn": "16029",
"discovery": "10067"
"label": "1.5.3 with more optimized send()",
"transfer": "20714",
"burn": "15909",
"discovery": "10003"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -459,61 +459,61 @@ exports[`local-type-inference should automatically set types for let statements
{
"fields": [
{
"name": "bounce",
"name": "mode",
"type": {
"format": 257,
"kind": "simple",
"optional": false,
"type": "bool",
"type": "int",
},
},
{
"name": "to",
"name": "body",
"type": {
"kind": "simple",
"optional": false,
"type": "address",
"optional": true,
"type": "cell",
},
},
{
"name": "value",
"name": "code",
"type": {
"format": 257,
"kind": "simple",
"optional": false,
"type": "int",
"optional": true,
"type": "cell",
},
},
{
"name": "mode",
"name": "data",
"type": {
"format": 257,
"kind": "simple",
"optional": false,
"type": "int",
"optional": true,
"type": "cell",
},
},
{
"name": "body",
"name": "value",
"type": {
"format": 257,
"kind": "simple",
"optional": true,
"type": "cell",
"optional": false,
"type": "int",
},
},
{
"name": "code",
"name": "to",
"type": {
"kind": "simple",
"optional": true,
"type": "cell",
"optional": false,
"type": "address",
},
},
{
"name": "data",
"name": "bounce",
"type": {
"kind": "simple",
"optional": true,
"type": "cell",
"optional": false,
"type": "bool",
},
},
],
Expand Down
Loading