From 9f362c09da2ca8dbfd3c8f745fa5c463a4754ddf Mon Sep 17 00:00:00 2001 From: b4cksl4sh Date: Fri, 31 Jan 2025 00:14:41 +0300 Subject: [PATCH 01/10] New send function, and comments for ReadForwardFee --- src/stdlib/stdlib.ts | 72 +++++++----- src/stdlib/stdlib/std/context.tact | 32 ++++-- src/stdlib/stdlib/std/send.tact | 170 +++++++++++++++++++++-------- 3 files changed, 192 insertions(+), 82 deletions(-) diff --git a/src/stdlib/stdlib.ts b/src/stdlib/stdlib.ts index ded72e632..e476acfa4 100644 --- a/src/stdlib/stdlib.ts +++ b/src/stdlib/stdlib.ts @@ -232,9 +232,16 @@ files["std/config.tact"] = files["std/context.tact"] = "c3RydWN0IENvbnRleHQgewogICAgYm91bmNlZDogQm9vbDsKICAgIHNlbmRlcjogQWRkcmVzczsKICAgIHZhbHVlOiBJbnQ7CiAgICByYXc6IFNsaWNlOwp9CgpAbmFt" + "ZShfX3RhY3RfY29udGV4dF9nZXQpCm5hdGl2ZSBjb250ZXh0KCk6IENvbnRleHQ7CgpAbmFtZShfX3RhY3RfY29udGV4dF9nZXRfc2VuZGVyKQpuYXRpdmUgc2VuZGVy" + - "KCk6IEFkZHJlc3M7Cgphc20gZXh0ZW5kcyBmdW4gcmVhZEZvcndhcmRGZWUoc2VsZjogQ29udGV4dCk6IEludCB7CiAgICBMRE1TR0FERFIKICAgIExER1JBTVMKICAg" + - "IE9ORQogICAgU0RTS0lQRklSU1QKICAgIExER1JBTVMKICAgIExER1JBTVMKICAgIERST1AKICAgIDYgMSBCTEtEUk9QMgogICAgWkVSTwogICAgR0VUT1JJR0lOQUxG" + - "V0RGRUUKfQ=="; + "KCk6IEFkZHJlc3M7CgovKgpJbiB0aGlzIGZ1bmN0aW9uIHdlIG5lZWQgbm90aGluZyBidXQgc2VsZi5yYXcKU28gd2Ugd2lsbCBkcm9wIGJvdW5jZWQsIHNlbmRlciBh" + + "bmQgdmFsdWUgaW4gdGhlIGVuZApCeSA2IDEgQkxLRFJPUDIuCiovCi8qCmludF9tc2dfaW5mbyQwIGlocl9kaXNhYmxlZDpCb29sIGJvdW5jZTpCb29sIGJvdW5jZWQ6" + + "Qm9vbApzcmM6TXNnQWRkcmVzcyBkZXN0Ok1zZ0FkZHJlc3NJbnQKdmFsdWU6Q3VycmVuY3lDb2xsZWN0aW9uIGlocl9mZWU6R3JhbXMgZndkX2ZlZTpHcmFtcwpjcmVh" + + "dGVkX2x0OnVpbnQ2NCBjcmVhdGVkX2F0OnVpbnQzMiA9IENvbW1vbk1zZ0luZm9SZWxheGVkOwoKQ29udGV4dC5yYXcgaXMgYSBzbGljZSwgdGhhdCBiZWdpbnMgd2l0" + + "aCBkZXN0CiovCmFzbSBleHRlbmRzIGZ1biByZWFkRm9yd2FyZEZlZShzZWxmOiBDb250ZXh0KTogSW50IHsKICAgIExETVNHQUREUiAvLyBTa2lwIGRlc3RpbmF0aW9u" + + "CiAgICBMREdSQU1TIC8vIFNraXAgdmFsdWUKICAgIE9ORQogICAgU0RTS0lQRklSU1QgLy8gU2tpcCBleHRyYSBjdXJyZW5jeSBjb2xsZWN0aW9uCiAgICBMREdSQU1T" + + "IC8vIFNraXAgaWhyX2ZlZQogICAgTERHUkFNUyAvLyBMb2FkIGZ3ZF9mZWUsIHdlIG5lZWQgdGhpcwogICAgRFJPUCAvLyBEcm9wIHJlbWFpbmluZyBTbGljZQogICAg" + + "Ly8gRndkX2ZlZSB0aGF0IHdlIG5lZWQgaXMgb24gdG9wIG9mIHRoZSBzdGFjawogICAgNiAxIEJMS0RST1AyIC8vIERyb3AgaWhyX2ZlZSwgdmFsdWUobWVzc2FnZSks" + + "IGRlc3RpbmF0aW9uLCB2YWx1ZShjb250ZXh0KSwgc2VuZGVyLCBib3VuY2VkCiAgICBaRVJPIC8vIE1hc3RlcmNoYWluIC0gZmFsc2UKICAgIEdFVE9SSUdJTkFMRldE" + + "RkVFIC8vIEdldCBvcmlnaW5hbCBmd2RfZmVlCn0="; files["std/contract.tact"] = "c3RydWN0IFN0YXRlSW5pdCB7CiAgICBjb2RlOiBDZWxsOwogICAgZGF0YTogQ2VsbDsKfQoKQG5hbWUoX190YWN0X2NvbXB1dGVfY29udHJhY3RfYWRkcmVzcykKbmF0" + "aXZlIGNvbnRyYWN0QWRkcmVzc0V4dChjaGFpbjogSW50LCBjb2RlOiBDZWxsLCBkYXRhOiBDZWxsKTogQWRkcmVzczsKCmlubGluZSBmdW4gY29udHJhY3RBZGRyZXNz" + @@ -400,29 +407,42 @@ files["std/send.tact"] = "b25zdCBTZW5kUGF5R2FzU2VwYXJhdGVseTogSW50ID0gMTsKY29uc3QgU2VuZERlc3Ryb3lJZlplcm86IEludCA9IDMyOwpjb25zdCBTZW5kQm91bmNlSWZBY3Rpb25G" + "YWlsOiBJbnQgPSAxNjsKY29uc3QgU2VuZE9ubHlFc3RpbWF0ZUZlZTogSW50ID0gMTAyNDsKCnN0cnVjdCBTZW5kUGFyYW1ldGVycyB7CiAgICBib3VuY2U6IEJvb2wg" + "PSB0cnVlOwogICAgdG86IEFkZHJlc3M7CiAgICB2YWx1ZTogSW50OwogICAgbW9kZTogSW50ID0gMDsKICAgIGJvZHk6IENlbGw/ID0gbnVsbDsKICAgIGNvZGU6IENl" + - "bGw/ID0gbnVsbDsKICAgIGRhdGE6IENlbGw/ID0gbnVsbDsKfQoKZnVuIHNlbmQocGFyYW1zOiBTZW5kUGFyYW1ldGVycyk6IEludCB7IC8vIHJldHVybnMgZm9yd2Fy" + - "ZCBmZWUKICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7CiAgICBiID0gYi5zdG9yZUludCgxLCAyKTsgLy8gaW50ZXJuYWxfbWVzc2FnZSArIGloZF9kaXNh" + - "YmxlZAogICAgYiA9IGIuc3RvcmVCb29sKHBhcmFtcy5ib3VuY2UpOyAvLyBib3VuY2UKICAgIGIgPSBiLnN0b3JlSW50KDAsIDMpOyAvLyBib3VuY2VkICsgZnJvbQog" + - "ICAgYiA9IGIuc3RvcmVBZGRyZXNzKHBhcmFtcy50byk7IC8vIFRvCiAgICBiID0gYi5zdG9yZUNvaW5zKHBhcmFtcy52YWx1ZSk7IC8vIFZhbHVlCiAgICBiID0gYi5z" + - "dG9yZUludCgwLCAxICsgNCArIDQgKyA2NCArIDMyKTsgLy8gY3VycmVuY3lfY29sbGVjdGlvbiArIElIUiBmZWVzICsgRndkIGZlZXMgKyBDcmVhdGVkTFQgKyBDcmVh" + - "dGVkQXQKCiAgICAvLyBTdGF0ZWluaXQKICAgIGlmIChwYXJhbXMuY29kZSAhPSBudWxsIHx8IHBhcmFtcy5kYXRhICE9IG51bGwpIHsKICAgICAgICBiID0gYi5zdG9y" + - "ZUJvb2wodHJ1ZSk7IC8vIFN0YXRlIGluaXQKCiAgICAgICAgLy8gQXNzZW1ibGUgc3RhdGUgaW5pdCBjZWxsCiAgICAgICAgbGV0IGJjOiBCdWlsZGVyID0gYmVnaW5D" + - "ZWxsKCk7CiAgICAgICAgYmMgPSBiYy5zdG9yZUJvb2woZmFsc2UpOyAvLyBTcGxpdERlcHRoCiAgICAgICAgYmMgPSBiYy5zdG9yZUJvb2woZmFsc2UpOyAvLyBUaWNr" + - "VG9jawogICAgICAgIGlmIChwYXJhbXMuY29kZSAhPSBudWxsKSB7CiAgICAgICAgICAgIGJjID0gYmMuc3RvcmVCb29sKHRydWUpOyAvLyBDb2RlIHByZXNlbmNlCiAg" + - "ICAgICAgICAgIGJjID0gYmMuc3RvcmVSZWYocGFyYW1zLmNvZGUhISk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYmMgPSBiYy5zdG9yZUJvb2woZmFsc2Up" + - "OyAvLyBDb2RlIHByZXNlbmNlCiAgICAgICAgfQogICAgICAgIGlmIChwYXJhbXMuZGF0YSAhPSBudWxsKSB7CiAgICAgICAgICAgIGJjID0gYmMuc3RvcmVCb29sKHRy" + - "dWUpOyAvLyBEYXRhIHByZXNlbmNlCiAgICAgICAgICAgIGJjID0gYmMuc3RvcmVSZWYocGFyYW1zLmRhdGEhISk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAg" + - "YmMgPSBiYy5zdG9yZUJvb2woZmFsc2UpOyAvLyBEYXRhIHByZXNlbmNlCiAgICAgICAgfQogICAgICAgIGJjID0gYmMuc3RvcmVCb29sKGZhbHNlKTsgLy8gTGlicmFy" + - "eQoKICAgICAgICBiID0gYi5zdG9yZUJvb2wodHJ1ZSk7IC8vIFN0b3JlIGFzIHJlZgogICAgICAgIGIgPSBiLnN0b3JlUmVmKGJjLmVuZENlbGwoKSk7CiAgICB9IGVs" + - "c2UgewogICAgICAgIGIgPSBiLnN0b3JlQm9vbChmYWxzZSk7IC8vIE5vIHN0YXRlIGluaXQKICAgIH0KCiAgICAvLyBCb2R5CiAgICBsZXQgYm9keTogQ2VsbD8gPSBw" + - "YXJhbXMuYm9keTsKICAgIGlmIChib2R5ICE9IG51bGwpIHsKICAgICAgICBiID0gYi5zdG9yZUJvb2wodHJ1ZSk7CiAgICAgICAgYiA9IGIuc3RvcmVSZWYoYm9keSEh" + - "KTsKICAgIH0gZWxzZSB7CiAgICAgICAgYiA9IGIuc3RvcmVCb29sKGZhbHNlKTsgLy8gTm8gYm9keQogICAgfQoKICAgIC8vIFNlbmQKICAgIGxldCBjOiBDZWxsID0g" + - "Yi5lbmRDZWxsKCk7CiAgICByZXR1cm4gbmF0aXZlU2VuZE1lc3NhZ2VSZXR1cm5Gb3J3YXJkRmVlKGMsIHBhcmFtcy5tb2RlKTsKfQoKaW5saW5lIGZ1biBlbWl0KGJv" + - "ZHk6IENlbGwpIHsKICAgIC8vIGV4dF9vdXRfbXNnX2luZm8kMTEgc3JjOk1zZ0FkZHJlc3NJbnQgZGVzdDpNc2dBZGRyZXNzRXh0IGNyZWF0ZWRfbHQ6dWludDY0IGNy" + - "ZWF0ZWRfYXQ6dWludDMyCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIG1heWJlOiBzdGF0ZUluaXQgKGZhbHNlKSBib2R5UmVmOiBib29sICh0cnVlKQogICAgbGV0" + - "IGM6IENlbGwgPSBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9yZVVpbnQoMTUyMTE4MDcyMDI3Mzg3NTI4MTc5NjA0Mzg0NjQ1MTMsIDEwNCkKICAgICAgICAuc3RvcmVS" + - "ZWYoYm9keSkKICAgICAgICAuZW5kQ2VsbCgpOwogICAgbmF0aXZlU2VuZE1lc3NhZ2UoYywgMCk7Cn0KCmFzbSBmdW4gYWNjZXB0TWVzc2FnZSgpIHsgQUNDRVBUIH0K" + - "CmFzbSBmdW4gY29tbWl0KCkgeyBDT01NSVQgfQo="; + "bGw/ID0gbnVsbDsKICAgIGRhdGE6IENlbGw/ID0gbnVsbDsKfQoKLyoKaW50X21zZ19pbmZvJDAgaWhyX2Rpc2FibGVkOkJvb2wgYm91bmNlOkJvb2wgYm91bmNlZDpC" + + "b29sCiAgc3JjOk1zZ0FkZHJlc3MgZGVzdDpNc2dBZGRyZXNzSW50CiAgdmFsdWU6Q3VycmVuY3lDb2xsZWN0aW9uIGlocl9mZWU6R3JhbXMgZndkX2ZlZTpHcmFtcwog" + + "IGNyZWF0ZWRfbHQ6dWludDY0IGNyZWF0ZWRfYXQ6dWludDMyID0gQ29tbW9uTXNnSW5mb1JlbGF4ZWQ7CgptZXNzYWdlJF8ge1g6VHlwZX0gaW5mbzpDb21tb25Nc2dJ" + + "bmZvUmVsYXhlZAogIGluaXQ6KE1heWJlIChFaXRoZXIgU3RhdGVJbml0IF5TdGF0ZUluaXQpKQogIGJvZHk6KEVpdGhlciBYIF5YKSA9IE1lc3NhZ2VSZWxheGVkIFg7" + + "Cgpib3VuY2U6IHM2CnRvOiBzNQp2YWx1ZTogczQKbW9kZTogczMKYm9keTogczIKY29kZTogczEKZGF0YTogczAKKi8KYXNtIGZ1biBzZW5kKHBhcmFtczogU2VuZFBh" + + "cmFtZXRlcnMpIHsKICAgIDMgNCBCTEtTV0FQCiAgICBzMiBYQ0hHMAogICAgLyoKICAgIFRoZXNlIHR3byBpbnN0dWN0aW9ucyBkbyB0aGlzCiAgICBtb2RlOiBzNgog" + + "ICAgYm9keTogczUKICAgIGNvZGU6IHM0CiAgICBkYXRhOiBzMwogICAgdmFsdWU6IHMyCiAgICB0bzogczEKICAgIGJvdW5jZTogczAKICAgICovCiAgICBORVdDCiAg" + + "ICBiezAxfSBTVFNMSUNFQ09OU1QgLy8gU3RvcmUgdGFnID0gJDAsIGlocl9kaXNhYmxlZCA9IHRydWUKICAgIDEgU1RJIC8vIFN0b3JlIGJvdW5jZQogICAgYnswMDB9" + + "IFNUU0xJQ0VDT05TVCAvLyBTdG9yZSBzcmNfYWRkciA9IGFkZHJfbm9uZQogICAgU1RTTElDRSAvLyBTdG9yZSB0bwogICAgU1dBUCAvLyBCZWNhdXNlIFNUR1JBTVMg" + + "aXMga2luZGEgcmV2ZXJzZWQgYiB4IC0gYicKICAgIFNUR1JBTVMgLy8gU3RvcmUgZ3JhbXMKICAgIDEwNSBQVVNISU5UIC8vIDEgKyA0ICsgNCArIDY0ICsgMzIKICAg" + + "IFNUWkVST0VTIC8vIFN0b3JlIGN1cnJlbmN5X2NvbGxlY3Rpb24gKyBJSFIgZmVlcyArIEZ3ZCBmZWVzICsgQ3JlYXRlZExUICsgQ3JlYXRlZEF0CiAgICAvKgogICAg" + + "bW9kZTogczQKICAgIGJvZHk6IHMzCiAgICBjb2RlOiBzMgogICAgZGF0YTogczEKICAgIE1lc3NhZ2VCdWlsZGVyOiBzMAogICAgKi8KICAgIHMyIFhDSEcwIC8vIFdl" + + "IHdhbnQgdG8gY2hlY2ssIGlmIGNvZGUgb3IgZGF0YSBpcyBOVUxMLCBzbyBwbGFjZSBhIGJ1aWxkZXIgdW5kZXIgdGhlbQogICAgLyoKICAgIG1vZGU6IHM0CiAgICBi" + + "b2R5OiBzMwogICAgTWVzc2FnZUJ1aWxkZXI6IHMyCiAgICBkYXRhOiBzMQogICAgY29kZTogczAKICAgICovCiAgICBEVVAyCiAgICBJU05VTEwKICAgIFNXQVAKICAg" + + "IElTTlVMTAogICAgTVVMCiAgICAvKgogICAgbW9kZTogczQKICAgIGJvZHk6IHMzCiAgICBNZXNzYWdlQnVpbGRlcjogczIKICAgIGRhdGE6IHMxCiAgICBjb2RlOiBz" + + "MAogICAgMCBpZiBhbnkgb2YgdGhlbSBpcyBub3QtbnVsbAogICAgLTEgaWYgYm90aCBhcmUgbnVsbAogICAgKi8KICAgIDx7CiAgICAgICAgRFJPUDIgLy8gZHJvcCBl" + + "eHRyYSBjb2RlIGFuZCBkYXRhCiAgICAgICAgUFVTSE5VTEwKICAgICAgICBTV0FQCiAgICAgICAgLyoKICAgICAgICBtb2RlOiBzNAogICAgICAgIGJvZHk6IHMzCiAg" + + "ICAgICAgTlVMTDogczEKICAgICAgICBNZXNzYWdlQnVpbGRlcjogczAKICAgICAgICAqLwogICAgfT4gUFVTSENPTlQKICAgIDx7CiAgICAgICAgLyoKICAgICAgICBt" + + "b2RlOiBzNAogICAgICAgIGJvZHk6IHMzCiAgICAgICAgTWVzc2FnZUJ1aWxkZXI6IHMyCiAgICAgICAgZGF0YTogczEKICAgICAgICBjb2RlOiBzMAogICAgICAgICov" + + "CiAgICAgICAgLyoKICAgICAgICBfIHNwbGl0X2RlcHRoOihNYXliZSAoIyMgNSkpIHNwZWNpYWw6KE1heWJlIFRpY2tUb2NrKQogICAgICAgICAgICBjb2RlOihNYXli" + + "ZSBeQ2VsbCkgZGF0YTooTWF5YmUgXkNlbGwpCiAgICAgICAgICAgIGxpYnJhcnk6KE1heWJlIF5DZWxsKSA9IFN0YXRlSW5pdDsKICAgICAgICAqLwogICAgICAgIE5F" + + "V0MgLy8gQXNzZW1ibGUgc3RhdGUgaW5pdAogICAgICAgIGJ7MDB9IFNUU0xJQ0VDT05TVCAvLyBTcGxpdERlcHRoIGFuZCBUaWNrVG9jawogICAgICAgIFNURElDVCAv" + + "LyBTdG9yZSBjb2RlCiAgICAgICAgU1RESUNUIC8vIFN0b3JlIGRhdGEKICAgICAgICBiezB9IFNUU0xJQ0VDT05TVCAvLyBTdG9yZSBsaWJyYXJ5CiAgICAgICAgRU5E" + + "QyAvLyBDb21wbGV0ZWQgYnVpbGluZyBTdGF0ZUluaXQKICAgICAgICBTV0FQCiAgICAgICAgLyoKICAgICAgICBtb2RlOiBzMgogICAgICAgIGJvZHk6IHMxCiAgICAg" + + "ICAgU3RhdGVJbml0Q2VsbDogczEKICAgICAgICBNZXNzYWdlQnVpbGRlcjogczAKICAgICAgICAqLwogICAgICAgIGJ7MX0gU1RTTElDRUNPTlNUIC8vIFN0YXRlSW5p" + + "dCB3aWxsIGJlIHNhdmVkIGFzIHJlZiAoRWl0aGVyIGJpdCkKICAgICAgICAvLyBpbml0OihNYXliZSAoRWl0aGVyIFN0YXRlSW5pdCBeU3RhdGVJbml0KSkKICAgIH0+" + + "IFBVU0hDT05UCiAgICBJRkVMU0UKICAgIC8qCiAgICBtb2RlOiBzMgogICAgYm9keTogczEKICAgIFN0YXRlSW5pdENlbGw6IHMxIE9SIE5VTEwKICAgIE1lc3NhZ2VC" + + "dWlsZGVyOiBzMAogICAgKi8KICAgIFNURElDVCAvLyBTYXZlIHN0YXRlIGluaXQgKGFuZCBNYXliZSBiaXQpCiAgICBTVERJQ1QgLy8gU2F2ZSBib2R5IGFzIHJlZiBh" + + "bmQgcGxhY2UgTWF5YmUgYml0IChib2R5IGFsc28gbWF5IGJlIE5VTEwpCiAgICBFTkRDIC8vIFdlIGZpbmlzaGVkIGJ1aWxpbmcgbWVzc2FnZSEKICAgIC8qCiAgICBt" + + "b2RlOiBzMgogICAgTWVzc2FnZUNlbGw6IHMwCiAgICAqLwogICAgU1dBUCAvLyBCZWNhdXNlIFNFTkRSQVdNU0cgZG9lcyB0aGF0IChpbiB0ZXJtcyBvZiBzdGFjayk6" + + "IGBjIHggLSBgIHdoZXJlIHggaXMgdGhlIG1vZGUsIGFuZCBjIGluIHRoZSBtZXNzYWdlCiAgICBTRU5EUkFXTVNHIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YWN0LWxh" + + "bmcvdGFjdC9pc3N1ZXMvMTU1OAp9CgppbmxpbmUgZnVuIGVtaXQoYm9keTogQ2VsbCkgewogICAgLy8gZXh0X291dF9tc2dfaW5mbyQxMSBzcmM6TXNnQWRkcmVzc0lu" + + "dCBkZXN0Ok1zZ0FkZHJlc3NFeHQgY3JlYXRlZF9sdDp1aW50NjQgY3JlYXRlZF9hdDp1aW50MzIKICAgIC8vICAgICAgICAgICAgICAgICAgICAgbWF5YmU6IHN0YXRl" + + "SW5pdCAoZmFsc2UpIGJvZHlSZWY6IGJvb2wgKHRydWUpCiAgICBsZXQgYzogQ2VsbCA9IGJlZ2luQ2VsbCgpCiAgICAgICAgLnN0b3JlVWludCgxNTIxMTgwNzIwMjcz" + + "ODc1MjgxNzk2MDQzODQ2NDUxMywgMTA0KQogICAgICAgIC5zdG9yZVJlZihib2R5KQogICAgICAgIC5lbmRDZWxsKCk7CiAgICBuYXRpdmVTZW5kTWVzc2FnZShjLCAw" + + "KTsKfQoKYXNtIGZ1biBhY2NlcHRNZXNzYWdlKCkgeyBBQ0NFUFQgfQoKYXNtIGZ1biBjb21taXQoKSB7IENPTU1JVCB9Cg=="; files["std/text.tact"] = "Ly8KLy8gU3RyaW5nIGJ1aWxkZXIKLy8KCkBuYW1lKF9fdGFjdF9zdHJpbmdfYnVpbGRlcl9zdGFydF9zdHJpbmcpCm5hdGl2ZSBiZWdpblN0cmluZygpOiBTdHJpbmdC" + "dWlsZGVyOwoKQG5hbWUoX190YWN0X3N0cmluZ19idWlsZGVyX3N0YXJ0X2NvbW1lbnQpCm5hdGl2ZSBiZWdpbkNvbW1lbnQoKTogU3RyaW5nQnVpbGRlcjsKCkBuYW1l" + diff --git a/src/stdlib/stdlib/std/context.tact b/src/stdlib/stdlib/std/context.tact index 938872797..3f7257259 100644 --- a/src/stdlib/stdlib/std/context.tact +++ b/src/stdlib/stdlib/std/context.tact @@ -11,15 +11,29 @@ native context(): Context; @name(__tact_context_get_sender) native sender(): Address; +/* +In this function we need nothing but self.raw +So we will drop bounced, sender and value in the end +By 6 1 BLKDROP2. +*/ +/* +int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool +src:MsgAddress dest:MsgAddressInt +value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams +created_lt:uint64 created_at:uint32 = CommonMsgInfoRelaxed; + +Context.raw is a slice, that begins with dest +*/ asm extends fun readForwardFee(self: Context): Int { - LDMSGADDR - LDGRAMS + LDMSGADDR // Skip destination + LDGRAMS // Skip value ONE - SDSKIPFIRST - LDGRAMS - LDGRAMS - DROP - 6 1 BLKDROP2 - ZERO - GETORIGINALFWDFEE + SDSKIPFIRST // Skip extra currency collection + LDGRAMS // Skip ihr_fee + LDGRAMS // Load fwd_fee, we need this + DROP // Drop remaining Slice + // Fwd_fee that we need is on top of the stack + 6 1 BLKDROP2 // Drop ihr_fee, value(message), destination, value(context), sender, bounced + ZERO // Masterchain - false + GETORIGINALFWDFEE // Get original fwd_fee } \ No newline at end of file diff --git a/src/stdlib/stdlib/std/send.tact b/src/stdlib/stdlib/std/send.tact index 276814c43..5b317102a 100644 --- a/src/stdlib/stdlib/std/send.tact +++ b/src/stdlib/stdlib/std/send.tact @@ -21,55 +21,131 @@ struct SendParameters { data: Cell? = null; } -fun send(params: SendParameters): Int { // returns forward fee - let b: Builder = beginCell(); - b = b.storeInt(1, 2); // internal_message + ihd_disabled - b = b.storeBool(params.bounce); // bounce - b = b.storeInt(0, 3); // bounced + from - b = b.storeAddress(params.to); // To - b = b.storeCoins(params.value); // Value - b = b.storeInt(0, 1 + 4 + 4 + 64 + 32); // currency_collection + IHR fees + Fwd fees + CreatedLT + CreatedAt +/* +int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool + src:MsgAddress dest:MsgAddressInt + value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams + created_lt:uint64 created_at:uint32 = CommonMsgInfoRelaxed; - // Stateinit - if (params.code != null || params.data != null) { - b = b.storeBool(true); // State init +message$_ {X:Type} info:CommonMsgInfoRelaxed + init:(Maybe (Either StateInit ^StateInit)) + body:(Either X ^X) = MessageRelaxed X; - // Assemble state init cell - let bc: Builder = beginCell(); - bc = bc.storeBool(false); // SplitDepth - bc = bc.storeBool(false); // TickTock - if (params.code != null) { - bc = bc.storeBool(true); // Code presence - bc = bc.storeRef(params.code!!); - } else { - bc = bc.storeBool(false); // Code presence - } - if (params.data != null) { - bc = bc.storeBool(true); // Data presence - bc = bc.storeRef(params.data!!); - } else { - bc = bc.storeBool(false); // Data presence - } - bc = bc.storeBool(false); // Library - - b = b.storeBool(true); // Store as ref - b = b.storeRef(bc.endCell()); - } else { - b = b.storeBool(false); // No state init - } - - // Body - let body: Cell? = params.body; - if (body != null) { - b = b.storeBool(true); - b = b.storeRef(body!!); - } else { - b = b.storeBool(false); // No body - } - - // Send - let c: Cell = b.endCell(); - return nativeSendMessageReturnForwardFee(c, params.mode); +bounce: s6 +to: s5 +value: s4 +mode: s3 +body: s2 +code: s1 +data: s0 +*/ +asm fun send(params: SendParameters) { + 3 4 BLKSWAP + s2 XCHG0 + /* + These two instuctions do this + mode: s6 + body: s5 + code: s4 + data: s3 + value: s2 + to: s1 + bounce: s0 + */ + NEWC + b{01} STSLICECONST // Store tag = $0, ihr_disabled = true + 1 STI // Store bounce + b{000} STSLICECONST // Store src_addr = addr_none + STSLICE // Store to + SWAP // Because STGRAMS is kinda reversed b x - b' + STGRAMS // Store grams + 105 PUSHINT // 1 + 4 + 4 + 64 + 32 + STZEROES // Store currency_collection + IHR fees + Fwd fees + CreatedLT + CreatedAt + /* + mode: s4 + body: s3 + code: s2 + data: s1 + MessageBuilder: s0 + */ + s2 XCHG0 // We want to check, if code or data is NULL, so place a builder under them + /* + mode: s4 + body: s3 + MessageBuilder: s2 + data: s1 + code: s0 + */ + DUP2 + ISNULL + SWAP + ISNULL + MUL + /* + mode: s4 + body: s3 + MessageBuilder: s2 + data: s1 + code: s0 + 0 if any of them is not-null + -1 if both are null + */ + <{ + DROP2 // drop extra code and data + PUSHNULL + SWAP + /* + mode: s4 + body: s3 + NULL: s1 + MessageBuilder: s0 + */ + }> PUSHCONT + <{ + /* + mode: s4 + body: s3 + MessageBuilder: s2 + data: s1 + code: s0 + */ + /* + _ split_depth:(Maybe (## 5)) special:(Maybe TickTock) + code:(Maybe ^Cell) data:(Maybe ^Cell) + library:(Maybe ^Cell) = StateInit; + */ + NEWC // Assemble state init + b{00} STSLICECONST // SplitDepth and TickTock + STDICT // Store code + STDICT // Store data + b{0} STSLICECONST // Store library + ENDC // Completed builing StateInit + SWAP + /* + mode: s2 + body: s1 + StateInitCell: s1 + MessageBuilder: s0 + */ + b{1} STSLICECONST // StateInit will be saved as ref (Either bit) + // init:(Maybe (Either StateInit ^StateInit)) + }> PUSHCONT + IFELSE + /* + mode: s2 + body: s1 + StateInitCell: s1 OR NULL + MessageBuilder: s0 + */ + STDICT // Save state init (and Maybe bit) + STDICT // Save body as ref and place Maybe bit (body also may be NULL) + ENDC // We finished builing message! + /* + mode: s2 + MessageCell: s0 + */ + SWAP // Because SENDRAWMSG does that (in terms of stack): `c x - ` where x is the mode, and c in the message + SENDRAWMSG // https://github.com/tact-lang/tact/issues/1558 } inline fun emit(body: Cell) { From ff06aef8f6140f37e339b81bb64c33d8e4941d1b Mon Sep 17 00:00:00 2001 From: b4cksl4sh Date: Fri, 31 Jan 2025 00:17:07 +0300 Subject: [PATCH 02/10] Fixed spelling --- src/stdlib/stdlib/std/send.tact | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/stdlib/stdlib/std/send.tact b/src/stdlib/stdlib/std/send.tact index 5b317102a..41e3da703 100644 --- a/src/stdlib/stdlib/std/send.tact +++ b/src/stdlib/stdlib/std/send.tact @@ -43,7 +43,7 @@ asm fun send(params: SendParameters) { 3 4 BLKSWAP s2 XCHG0 /* - These two instuctions do this + These two instructions do this mode: s6 body: s5 code: s4 @@ -92,7 +92,7 @@ asm fun send(params: SendParameters) { */ <{ DROP2 // drop extra code and data - PUSHNULL + NULL // push NULL SWAP /* mode: s4 @@ -119,7 +119,7 @@ asm fun send(params: SendParameters) { STDICT // Store code STDICT // Store data b{0} STSLICECONST // Store library - ENDC // Completed builing StateInit + ENDC // Completed building StateInit SWAP /* mode: s2 @@ -139,7 +139,7 @@ asm fun send(params: SendParameters) { */ STDICT // Save state init (and Maybe bit) STDICT // Save body as ref and place Maybe bit (body also may be NULL) - ENDC // We finished builing message! + ENDC // We finished building message! /* mode: s2 MessageCell: s0 From 0314f0eeea9b382f56f258638bca5cdcdcc17e50 Mon Sep 17 00:00:00 2001 From: b4cksl4sh Date: Fri, 31 Jan 2025 00:52:39 +0300 Subject: [PATCH 03/10] Fixed stack typos and CI --- src/stdlib/stdlib.ts | 62 ++++++++++++++++----------------- src/stdlib/stdlib/std/send.tact | 28 +++++++-------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/stdlib/stdlib.ts b/src/stdlib/stdlib.ts index e476acfa4..e2525e547 100644 --- a/src/stdlib/stdlib.ts +++ b/src/stdlib/stdlib.ts @@ -412,37 +412,37 @@ files["std/send.tact"] = "IGNyZWF0ZWRfbHQ6dWludDY0IGNyZWF0ZWRfYXQ6dWludDMyID0gQ29tbW9uTXNnSW5mb1JlbGF4ZWQ7CgptZXNzYWdlJF8ge1g6VHlwZX0gaW5mbzpDb21tb25Nc2dJ" + "bmZvUmVsYXhlZAogIGluaXQ6KE1heWJlIChFaXRoZXIgU3RhdGVJbml0IF5TdGF0ZUluaXQpKQogIGJvZHk6KEVpdGhlciBYIF5YKSA9IE1lc3NhZ2VSZWxheGVkIFg7" + "Cgpib3VuY2U6IHM2CnRvOiBzNQp2YWx1ZTogczQKbW9kZTogczMKYm9keTogczIKY29kZTogczEKZGF0YTogczAKKi8KYXNtIGZ1biBzZW5kKHBhcmFtczogU2VuZFBh" + - "cmFtZXRlcnMpIHsKICAgIDMgNCBCTEtTV0FQCiAgICBzMiBYQ0hHMAogICAgLyoKICAgIFRoZXNlIHR3byBpbnN0dWN0aW9ucyBkbyB0aGlzCiAgICBtb2RlOiBzNgog" + - "ICAgYm9keTogczUKICAgIGNvZGU6IHM0CiAgICBkYXRhOiBzMwogICAgdmFsdWU6IHMyCiAgICB0bzogczEKICAgIGJvdW5jZTogczAKICAgICovCiAgICBORVdDCiAg" + - "ICBiezAxfSBTVFNMSUNFQ09OU1QgLy8gU3RvcmUgdGFnID0gJDAsIGlocl9kaXNhYmxlZCA9IHRydWUKICAgIDEgU1RJIC8vIFN0b3JlIGJvdW5jZQogICAgYnswMDB9" + - "IFNUU0xJQ0VDT05TVCAvLyBTdG9yZSBzcmNfYWRkciA9IGFkZHJfbm9uZQogICAgU1RTTElDRSAvLyBTdG9yZSB0bwogICAgU1dBUCAvLyBCZWNhdXNlIFNUR1JBTVMg" + - "aXMga2luZGEgcmV2ZXJzZWQgYiB4IC0gYicKICAgIFNUR1JBTVMgLy8gU3RvcmUgZ3JhbXMKICAgIDEwNSBQVVNISU5UIC8vIDEgKyA0ICsgNCArIDY0ICsgMzIKICAg" + - "IFNUWkVST0VTIC8vIFN0b3JlIGN1cnJlbmN5X2NvbGxlY3Rpb24gKyBJSFIgZmVlcyArIEZ3ZCBmZWVzICsgQ3JlYXRlZExUICsgQ3JlYXRlZEF0CiAgICAvKgogICAg" + - "bW9kZTogczQKICAgIGJvZHk6IHMzCiAgICBjb2RlOiBzMgogICAgZGF0YTogczEKICAgIE1lc3NhZ2VCdWlsZGVyOiBzMAogICAgKi8KICAgIHMyIFhDSEcwIC8vIFdl" + - "IHdhbnQgdG8gY2hlY2ssIGlmIGNvZGUgb3IgZGF0YSBpcyBOVUxMLCBzbyBwbGFjZSBhIGJ1aWxkZXIgdW5kZXIgdGhlbQogICAgLyoKICAgIG1vZGU6IHM0CiAgICBi" + - "b2R5OiBzMwogICAgTWVzc2FnZUJ1aWxkZXI6IHMyCiAgICBkYXRhOiBzMQogICAgY29kZTogczAKICAgICovCiAgICBEVVAyCiAgICBJU05VTEwKICAgIFNXQVAKICAg" + - "IElTTlVMTAogICAgTVVMCiAgICAvKgogICAgbW9kZTogczQKICAgIGJvZHk6IHMzCiAgICBNZXNzYWdlQnVpbGRlcjogczIKICAgIGRhdGE6IHMxCiAgICBjb2RlOiBz" + - "MAogICAgMCBpZiBhbnkgb2YgdGhlbSBpcyBub3QtbnVsbAogICAgLTEgaWYgYm90aCBhcmUgbnVsbAogICAgKi8KICAgIDx7CiAgICAgICAgRFJPUDIgLy8gZHJvcCBl" + - "eHRyYSBjb2RlIGFuZCBkYXRhCiAgICAgICAgUFVTSE5VTEwKICAgICAgICBTV0FQCiAgICAgICAgLyoKICAgICAgICBtb2RlOiBzNAogICAgICAgIGJvZHk6IHMzCiAg" + - "ICAgICAgTlVMTDogczEKICAgICAgICBNZXNzYWdlQnVpbGRlcjogczAKICAgICAgICAqLwogICAgfT4gUFVTSENPTlQKICAgIDx7CiAgICAgICAgLyoKICAgICAgICBt" + - "b2RlOiBzNAogICAgICAgIGJvZHk6IHMzCiAgICAgICAgTWVzc2FnZUJ1aWxkZXI6IHMyCiAgICAgICAgZGF0YTogczEKICAgICAgICBjb2RlOiBzMAogICAgICAgICov" + - "CiAgICAgICAgLyoKICAgICAgICBfIHNwbGl0X2RlcHRoOihNYXliZSAoIyMgNSkpIHNwZWNpYWw6KE1heWJlIFRpY2tUb2NrKQogICAgICAgICAgICBjb2RlOihNYXli" + - "ZSBeQ2VsbCkgZGF0YTooTWF5YmUgXkNlbGwpCiAgICAgICAgICAgIGxpYnJhcnk6KE1heWJlIF5DZWxsKSA9IFN0YXRlSW5pdDsKICAgICAgICAqLwogICAgICAgIE5F" + - "V0MgLy8gQXNzZW1ibGUgc3RhdGUgaW5pdAogICAgICAgIGJ7MDB9IFNUU0xJQ0VDT05TVCAvLyBTcGxpdERlcHRoIGFuZCBUaWNrVG9jawogICAgICAgIFNURElDVCAv" + - "LyBTdG9yZSBjb2RlCiAgICAgICAgU1RESUNUIC8vIFN0b3JlIGRhdGEKICAgICAgICBiezB9IFNUU0xJQ0VDT05TVCAvLyBTdG9yZSBsaWJyYXJ5CiAgICAgICAgRU5E" + - "QyAvLyBDb21wbGV0ZWQgYnVpbGluZyBTdGF0ZUluaXQKICAgICAgICBTV0FQCiAgICAgICAgLyoKICAgICAgICBtb2RlOiBzMgogICAgICAgIGJvZHk6IHMxCiAgICAg" + - "ICAgU3RhdGVJbml0Q2VsbDogczEKICAgICAgICBNZXNzYWdlQnVpbGRlcjogczAKICAgICAgICAqLwogICAgICAgIGJ7MX0gU1RTTElDRUNPTlNUIC8vIFN0YXRlSW5p" + - "dCB3aWxsIGJlIHNhdmVkIGFzIHJlZiAoRWl0aGVyIGJpdCkKICAgICAgICAvLyBpbml0OihNYXliZSAoRWl0aGVyIFN0YXRlSW5pdCBeU3RhdGVJbml0KSkKICAgIH0+" + - "IFBVU0hDT05UCiAgICBJRkVMU0UKICAgIC8qCiAgICBtb2RlOiBzMgogICAgYm9keTogczEKICAgIFN0YXRlSW5pdENlbGw6IHMxIE9SIE5VTEwKICAgIE1lc3NhZ2VC" + - "dWlsZGVyOiBzMAogICAgKi8KICAgIFNURElDVCAvLyBTYXZlIHN0YXRlIGluaXQgKGFuZCBNYXliZSBiaXQpCiAgICBTVERJQ1QgLy8gU2F2ZSBib2R5IGFzIHJlZiBh" + - "bmQgcGxhY2UgTWF5YmUgYml0IChib2R5IGFsc28gbWF5IGJlIE5VTEwpCiAgICBFTkRDIC8vIFdlIGZpbmlzaGVkIGJ1aWxpbmcgbWVzc2FnZSEKICAgIC8qCiAgICBt" + - "b2RlOiBzMgogICAgTWVzc2FnZUNlbGw6IHMwCiAgICAqLwogICAgU1dBUCAvLyBCZWNhdXNlIFNFTkRSQVdNU0cgZG9lcyB0aGF0IChpbiB0ZXJtcyBvZiBzdGFjayk6" + - "IGBjIHggLSBgIHdoZXJlIHggaXMgdGhlIG1vZGUsIGFuZCBjIGluIHRoZSBtZXNzYWdlCiAgICBTRU5EUkFXTVNHIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YWN0LWxh" + - "bmcvdGFjdC9pc3N1ZXMvMTU1OAp9CgppbmxpbmUgZnVuIGVtaXQoYm9keTogQ2VsbCkgewogICAgLy8gZXh0X291dF9tc2dfaW5mbyQxMSBzcmM6TXNnQWRkcmVzc0lu" + - "dCBkZXN0Ok1zZ0FkZHJlc3NFeHQgY3JlYXRlZF9sdDp1aW50NjQgY3JlYXRlZF9hdDp1aW50MzIKICAgIC8vICAgICAgICAgICAgICAgICAgICAgbWF5YmU6IHN0YXRl" + - "SW5pdCAoZmFsc2UpIGJvZHlSZWY6IGJvb2wgKHRydWUpCiAgICBsZXQgYzogQ2VsbCA9IGJlZ2luQ2VsbCgpCiAgICAgICAgLnN0b3JlVWludCgxNTIxMTgwNzIwMjcz" + - "ODc1MjgxNzk2MDQzODQ2NDUxMywgMTA0KQogICAgICAgIC5zdG9yZVJlZihib2R5KQogICAgICAgIC5lbmRDZWxsKCk7CiAgICBuYXRpdmVTZW5kTWVzc2FnZShjLCAw" + - "KTsKfQoKYXNtIGZ1biBhY2NlcHRNZXNzYWdlKCkgeyBBQ0NFUFQgfQoKYXNtIGZ1biBjb21taXQoKSB7IENPTU1JVCB9Cg=="; + "cmFtZXRlcnMpIHsKICAgIDMgNCBCTEtTV0FQCiAgICBzMiBYQ0hHMAogICAgLyoKICAgIFRoZXNlIHR3byBpbnN0cnVjdGlvbnMgZG8gdGhpcwogICAgbW9kZTogczYK" + + "ICAgIGJvZHk6IHM1CiAgICBjb2RlOiBzNAogICAgZGF0YTogczMKICAgIHZhbHVlOiBzMgogICAgdG86IHMxCiAgICBib3VuY2U6IHMwCiAgICAqLwogICAgTkVXQwog" + + "ICAgYnswMX0gU1RTTElDRUNPTlNUIC8vIFN0b3JlIHRhZyA9ICQwLCBpaHJfZGlzYWJsZWQgPSB0cnVlCiAgICAxIFNUSSAvLyBTdG9yZSBib3VuY2UKICAgIGJ7MDAw" + + "fSBTVFNMSUNFQ09OU1QgLy8gU3RvcmUgc3JjX2FkZHIgPSBhZGRyX25vbmUKICAgIFNUU0xJQ0UgLy8gU3RvcmUgdG8KICAgIFNXQVAgLy8gQmVjYXVzZSBTVEdSQU1T" + + "IGlzIGtpbmRhIHJldmVyc2VkIGIgeCAtIGInCiAgICBTVEdSQU1TIC8vIFN0b3JlIGdyYW1zCiAgICAxMDUgUFVTSElOVCAvLyAxICsgNCArIDQgKyA2NCArIDMyCiAg" + + "ICBTVFpFUk9FUyAvLyBTdG9yZSBjdXJyZW5jeV9jb2xsZWN0aW9uICsgSUhSIGZlZXMgKyBGd2QgZmVlcyArIENyZWF0ZWRMVCArIENyZWF0ZWRBdAogICAgLyoKICAg" + + "IG1vZGU6IHM0CiAgICBib2R5OiBzMwogICAgY29kZTogczIKICAgIGRhdGE6IHMxCiAgICBNZXNzYWdlQnVpbGRlcjogczAKICAgICovCiAgICBzMiBYQ0hHMCAvLyBX" + + "ZSB3YW50IHRvIGNoZWNrLCBpZiBjb2RlIG9yIGRhdGEgaXMgTlVMTCwgc28gcGxhY2UgYSBidWlsZGVyIHVuZGVyIHRoZW0KICAgIC8qCiAgICBtb2RlOiBzNAogICAg" + + "Ym9keTogczMKICAgIE1lc3NhZ2VCdWlsZGVyOiBzMgogICAgZGF0YTogczEKICAgIGNvZGU6IHMwCiAgICAqLwogICAgRFVQMgogICAgSVNOVUxMCiAgICBTV0FQCiAg" + + "ICBJU05VTEwKICAgIE1VTAogICAgLyoKICAgIG1vZGU6IHM1CiAgICBib2R5OiBzNAogICAgTWVzc2FnZUJ1aWxkZXI6IHMzCiAgICBkYXRhOiBzMgogICAgY29kZTog" + + "czEKICAgIHMwOiAwIGlmIGFueSBvZiB0aGVtIGlzIG5vdC1udWxsCiAgICAtMSBpZiBib3RoIGFyZSBudWxsCiAgICAqLwogICAgPHsKICAgICAgICBEUk9QMiAvLyBk" + + "cm9wIGV4dHJhIGNvZGUgYW5kIGRhdGEKICAgICAgICBOVUxMIC8vIHB1c2ggTlVMTAogICAgICAgIFNXQVAKICAgICAgICAvKgogICAgICAgIG1vZGU6IHMzCiAgICAg" + + "ICAgYm9keTogczIKICAgICAgICBOVUxMOiBzMQogICAgICAgIE1lc3NhZ2VCdWlsZGVyOiBzMAogICAgICAgICovCiAgICB9PiBQVVNIQ09OVAogICAgPHsKICAgICAg" + + "ICAvKgogICAgICAgIG1vZGU6IHM0CiAgICAgICAgYm9keTogczMKICAgICAgICBNZXNzYWdlQnVpbGRlcjogczIKICAgICAgICBkYXRhOiBzMQogICAgICAgIGNvZGU6" + + "IHMwCiAgICAgICAgKi8KICAgICAgICAvKgogICAgICAgIF8gc3BsaXRfZGVwdGg6KE1heWJlICgjIyA1KSkgc3BlY2lhbDooTWF5YmUgVGlja1RvY2spCiAgICAgICAg" + + "ICAgIGNvZGU6KE1heWJlIF5DZWxsKSBkYXRhOihNYXliZSBeQ2VsbCkKICAgICAgICAgICAgbGlicmFyeTooTWF5YmUgXkNlbGwpID0gU3RhdGVJbml0OwogICAgICAg" + + "ICovCiAgICAgICAgTkVXQyAvLyBBc3NlbWJsZSBzdGF0ZSBpbml0CiAgICAgICAgYnswMH0gU1RTTElDRUNPTlNUIC8vIFNwbGl0RGVwdGggYW5kIFRpY2tUb2NrCiAg" + + "ICAgICAgU1RESUNUIC8vIFN0b3JlIGNvZGUKICAgICAgICBTVERJQ1QgLy8gU3RvcmUgZGF0YQogICAgICAgIGJ7MH0gU1RTTElDRUNPTlNUIC8vIFN0b3JlIGxpYnJh" + + "cnkKICAgICAgICBFTkRDIC8vIENvbXBsZXRlZCBidWlsZGluZyBTdGF0ZUluaXQKICAgICAgICBTV0FQCiAgICAgICAgLyoKICAgICAgICBtb2RlOiBzMwogICAgICAg" + + "IGJvZHk6IHMyCiAgICAgICAgU3RhdGVJbml0Q2VsbDogczEKICAgICAgICBNZXNzYWdlQnVpbGRlcjogczAKICAgICAgICAqLwogICAgICAgIGJ7MX0gU1RTTElDRUNP" + + "TlNUIC8vIFN0YXRlSW5pdCB3aWxsIGJlIHNhdmVkIGFzIHJlZiAoRWl0aGVyIGJpdCkKICAgICAgICAvLyBpbml0OihNYXliZSAoRWl0aGVyIFN0YXRlSW5pdCBeU3Rh" + + "dGVJbml0KSkKICAgIH0+IFBVU0hDT05UCiAgICBJRkVMU0UKICAgIC8qCiAgICBtb2RlOiBzMwogICAgYm9keTogczIKICAgIFN0YXRlSW5pdENlbGwgT1IgTlVMTDog" + + "czEKICAgIE1lc3NhZ2VCdWlsZGVyOiBzMAogICAgKi8KICAgIFNURElDVCAvLyBTYXZlIHN0YXRlIGluaXQgKGFuZCBNYXliZSBiaXQpCiAgICBTVERJQ1QgLy8gU2F2" + + "ZSBib2R5IGFzIHJlZiBhbmQgcGxhY2UgTWF5YmUgYml0IChib2R5IGFsc28gbWF5IGJlIE5VTEwpCiAgICBFTkRDIC8vIFdlIGZpbmlzaGVkIGJ1aWxkaW5nIG1lc3Nh" + + "Z2UhCiAgICAvKgogICAgbW9kZTogczEKICAgIE1lc3NhZ2VDZWxsOiBzMAogICAgKi8KICAgIFNXQVAgLy8gQmVjYXVzZSBTRU5EUkFXTVNHIGRvZXMgdGhhdCAoaW4g" + + "dGVybXMgb2Ygc3RhY2spOiBgYyB4IC0gYCB3aGVyZSB4IGlzIHRoZSBtb2RlLCBhbmQgYyBpbiB0aGUgbWVzc2FnZQogICAgU0VORFJBV01TRyAvLyBodHRwczovL2dp" + + "dGh1Yi5jb20vdGFjdC1sYW5nL3RhY3QvaXNzdWVzLzE1NTgKfQoKaW5saW5lIGZ1biBlbWl0KGJvZHk6IENlbGwpIHsKICAgIC8vIGV4dF9vdXRfbXNnX2luZm8kMTEg" + + "c3JjOk1zZ0FkZHJlc3NJbnQgZGVzdDpNc2dBZGRyZXNzRXh0IGNyZWF0ZWRfbHQ6dWludDY0IGNyZWF0ZWRfYXQ6dWludDMyCiAgICAvLyAgICAgICAgICAgICAgICAg" + + "ICAgIG1heWJlOiBzdGF0ZUluaXQgKGZhbHNlKSBib2R5UmVmOiBib29sICh0cnVlKQogICAgbGV0IGM6IENlbGwgPSBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9yZVVp" + + "bnQoMTUyMTE4MDcyMDI3Mzg3NTI4MTc5NjA0Mzg0NjQ1MTMsIDEwNCkKICAgICAgICAuc3RvcmVSZWYoYm9keSkKICAgICAgICAuZW5kQ2VsbCgpOwogICAgbmF0aXZl" + + "U2VuZE1lc3NhZ2UoYywgMCk7Cn0KCmFzbSBmdW4gYWNjZXB0TWVzc2FnZSgpIHsgQUNDRVBUIH0KCmFzbSBmdW4gY29tbWl0KCkgeyBDT01NSVQgfQo="; files["std/text.tact"] = "Ly8KLy8gU3RyaW5nIGJ1aWxkZXIKLy8KCkBuYW1lKF9fdGFjdF9zdHJpbmdfYnVpbGRlcl9zdGFydF9zdHJpbmcpCm5hdGl2ZSBiZWdpblN0cmluZygpOiBTdHJpbmdC" + "dWlsZGVyOwoKQG5hbWUoX190YWN0X3N0cmluZ19idWlsZGVyX3N0YXJ0X2NvbW1lbnQpCm5hdGl2ZSBiZWdpbkNvbW1lbnQoKTogU3RyaW5nQnVpbGRlcjsKCkBuYW1l" + diff --git a/src/stdlib/stdlib/std/send.tact b/src/stdlib/stdlib/std/send.tact index 41e3da703..c31e9b854 100644 --- a/src/stdlib/stdlib/std/send.tact +++ b/src/stdlib/stdlib/std/send.tact @@ -82,12 +82,12 @@ asm fun send(params: SendParameters) { ISNULL MUL /* - mode: s4 - body: s3 - MessageBuilder: s2 - data: s1 - code: s0 - 0 if any of them is not-null + mode: s5 + body: s4 + MessageBuilder: s3 + data: s2 + code: s1 + s0: 0 if any of them is not-null -1 if both are null */ <{ @@ -95,8 +95,8 @@ asm fun send(params: SendParameters) { NULL // push NULL SWAP /* - mode: s4 - body: s3 + mode: s3 + body: s2 NULL: s1 MessageBuilder: s0 */ @@ -122,8 +122,8 @@ asm fun send(params: SendParameters) { ENDC // Completed building StateInit SWAP /* - mode: s2 - body: s1 + mode: s3 + body: s2 StateInitCell: s1 MessageBuilder: s0 */ @@ -132,16 +132,16 @@ asm fun send(params: SendParameters) { }> PUSHCONT IFELSE /* - mode: s2 - body: s1 - StateInitCell: s1 OR NULL + mode: s3 + body: s2 + StateInitCell OR NULL: s1 MessageBuilder: s0 */ STDICT // Save state init (and Maybe bit) STDICT // Save body as ref and place Maybe bit (body also may be NULL) ENDC // We finished building message! /* - mode: s2 + mode: s1 MessageCell: s0 */ SWAP // Because SENDRAWMSG does that (in terms of stack): `c x - ` where x is the mode, and c in the message From cb4f689788a9adf9689f19f4c9be2b11e4df316b Mon Sep 17 00:00:00 2001 From: b4cksl4sh Date: Fri, 31 Jan 2025 15:28:02 +0300 Subject: [PATCH 04/10] Updated benchmark results --- src/test/benchmarks/jetton/results.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/test/benchmarks/jetton/results.json b/src/test/benchmarks/jetton/results.json index 6d4c7bacd..f8f4325c1 100644 --- a/src/test/benchmarks/jetton/results.json +++ b/src/test/benchmarks/jetton/results.json @@ -42,11 +42,17 @@ "burn": "17718", "discovery": "11063" }, + { + "label": "Optimized send()", + "transfer": "21464", + "burn": "16029", + "discovery": "10093" + }, { "label": "master", - "transfer": "26121", - "burn": "17718", - "discovery": "11063" + "transfer": "21464", + "burn": "16029", + "discovery": "10093" } ] } From 736f532b4d886eda52b1479c258c846f5dd3606d Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Fri, 31 Jan 2025 17:17:30 +0100 Subject: [PATCH 05/10] docs: `context.tact` edits --- src/stdlib/stdlib.ts | 30 ++++++++----- src/stdlib/stdlib/std/context.tact | 71 ++++++++++++++++++++---------- 2 files changed, 67 insertions(+), 34 deletions(-) diff --git a/src/stdlib/stdlib.ts b/src/stdlib/stdlib.ts index e2525e547..fce906f2c 100644 --- a/src/stdlib/stdlib.ts +++ b/src/stdlib/stdlib.ts @@ -232,16 +232,26 @@ files["std/config.tact"] = files["std/context.tact"] = "c3RydWN0IENvbnRleHQgewogICAgYm91bmNlZDogQm9vbDsKICAgIHNlbmRlcjogQWRkcmVzczsKICAgIHZhbHVlOiBJbnQ7CiAgICByYXc6IFNsaWNlOwp9CgpAbmFt" + "ZShfX3RhY3RfY29udGV4dF9nZXQpCm5hdGl2ZSBjb250ZXh0KCk6IENvbnRleHQ7CgpAbmFtZShfX3RhY3RfY29udGV4dF9nZXRfc2VuZGVyKQpuYXRpdmUgc2VuZGVy" + - "KCk6IEFkZHJlc3M7CgovKgpJbiB0aGlzIGZ1bmN0aW9uIHdlIG5lZWQgbm90aGluZyBidXQgc2VsZi5yYXcKU28gd2Ugd2lsbCBkcm9wIGJvdW5jZWQsIHNlbmRlciBh" + - "bmQgdmFsdWUgaW4gdGhlIGVuZApCeSA2IDEgQkxLRFJPUDIuCiovCi8qCmludF9tc2dfaW5mbyQwIGlocl9kaXNhYmxlZDpCb29sIGJvdW5jZTpCb29sIGJvdW5jZWQ6" + - "Qm9vbApzcmM6TXNnQWRkcmVzcyBkZXN0Ok1zZ0FkZHJlc3NJbnQKdmFsdWU6Q3VycmVuY3lDb2xsZWN0aW9uIGlocl9mZWU6R3JhbXMgZndkX2ZlZTpHcmFtcwpjcmVh" + - "dGVkX2x0OnVpbnQ2NCBjcmVhdGVkX2F0OnVpbnQzMiA9IENvbW1vbk1zZ0luZm9SZWxheGVkOwoKQ29udGV4dC5yYXcgaXMgYSBzbGljZSwgdGhhdCBiZWdpbnMgd2l0" + - "aCBkZXN0CiovCmFzbSBleHRlbmRzIGZ1biByZWFkRm9yd2FyZEZlZShzZWxmOiBDb250ZXh0KTogSW50IHsKICAgIExETVNHQUREUiAvLyBTa2lwIGRlc3RpbmF0aW9u" + - "CiAgICBMREdSQU1TIC8vIFNraXAgdmFsdWUKICAgIE9ORQogICAgU0RTS0lQRklSU1QgLy8gU2tpcCBleHRyYSBjdXJyZW5jeSBjb2xsZWN0aW9uCiAgICBMREdSQU1T" + - "IC8vIFNraXAgaWhyX2ZlZQogICAgTERHUkFNUyAvLyBMb2FkIGZ3ZF9mZWUsIHdlIG5lZWQgdGhpcwogICAgRFJPUCAvLyBEcm9wIHJlbWFpbmluZyBTbGljZQogICAg" + - "Ly8gRndkX2ZlZSB0aGF0IHdlIG5lZWQgaXMgb24gdG9wIG9mIHRoZSBzdGFjawogICAgNiAxIEJMS0RST1AyIC8vIERyb3AgaWhyX2ZlZSwgdmFsdWUobWVzc2FnZSks" + - "IGRlc3RpbmF0aW9uLCB2YWx1ZShjb250ZXh0KSwgc2VuZGVyLCBib3VuY2VkCiAgICBaRVJPIC8vIE1hc3RlcmNoYWluIC0gZmFsc2UKICAgIEdFVE9SSUdJTkFMRldE" + - "RkVFIC8vIEdldCBvcmlnaW5hbCBmd2RfZmVlCn0="; + "KCk6IEFkZHJlc3M7CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYENvbnRleHRgIHN0cnVjdHVyZS4KLy8vCi8vLyBSZWFkcyBmb3J3YXJkIGZlZSBhbmQg" + + "cmV0dXJucyBpdCBhcyBgSW50YCBhbW91bnQgb2YgbmFub1RvbmNvaW5zLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBmd2RG" + + "ZWU6IEludCA9IGNvbnRleHQoKS5yZWFkRm9yd2FyZEZlZSgpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9y" + + "Zy9yZWYvY29yZS1hZHZhbmNlZCNjb250ZXh0cmVhZGZvcndhcmRmZWUKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWR2YW5jZWQjZ2V0" + + "b3JpZ2luYWxmd2RmZWUKLy8vCmFzbSBleHRlbmRzIGZ1biByZWFkRm9yd2FyZEZlZShzZWxmOiBDb250ZXh0KTogSW50IHsKICAgIC8vIE9ubHkgdGhlIHNlbGYucmF3" + + "IChDb250ZXh0LnJhdykgaXMgaW1wb3J0YW50LAogICAgLy8gc28gYWxsIHRoZSBvdGhlciBmaWVsZHMgYW5kIGxvYWRlZCB2YWx1ZXMgd2lsbCBiZSBkcm9wcGVkIGJ5" + + "IGBCTEtEUk9QMmAKICAgIC8vCiAgICAvLyBDb250ZXh0LnJhdyBzdGFydHMgYXQgdGhlIGRlc3Q6TXNnQWRkcmVzc0ludCwgZm9sbG93aW5nIHRoaXMgVEwtQiBzY2hl" + + "bWU6CiAgICAvLyBpbnRfbXNnX2luZm8kMAogICAgLy8gICBpaHJfZGlzYWJsZWQ6Qm9vbAogICAgLy8gICBib3VuY2U6Qm9vbAogICAgLy8gICBib3VuY2VkOkJvb2wK" + + "ICAgIC8vICAgc3JjOk1zZ0FkZHJlc3MKICAgIC8vICAgZGVzdDpNc2dBZGRyZXNzSW50IOKGkCBoZXJlIGlzIHRoZSBzdGFydAogICAgLy8gICB2YWx1ZTpDdXJyZW5j" + + "eUNvbGxlY3Rpb24KICAgIC8vICAgaWhyX2ZlZTpHcmFtcwogICAgLy8gICBmd2RfZmVlOkdyYW1zCiAgICAvLyAgIGNyZWF0ZWRfbHQ6dWludDY0CiAgICAvLyAgIGNy" + + "ZWF0ZWRfYXQ6dWludDMyCiAgICAvLyA9IENvbW1vbk1zZ0luZm9SZWxheGVkOwoKICAgIExETVNHQUREUiAgIC8vIGxvYWQgZGVzdDpNc2dBZGRyZXNzSW50CiAgICBM" + + "REdSQU1TICAgICAvLyBsb2FkIHZhbHVlOkN1cnJlbmN5Q29sbGVjdGlvbgogICAgT05FCiAgICBTRFNLSVBGSVJTVCAvLyBza2lwIGV4dHJhIGN1cnJlbmN5IGNvbGxl" + + "Y3Rpb24KICAgIExER1JBTVMgICAgIC8vIGxvYWQgaWhyX2ZlZQogICAgTERHUkFNUyAgICAgLy8gbG9hZCBmd2RfZmVlLCB3ZSdsbCBiZSB1c2luZyB0aGlzIQogICAg" + + "RFJPUCAgICAgICAgLy8gZHJvcCByZW1haW5pbmcgU2xpY2UgKHdpdGggY3JlYXRlZF9sdCBhbmQgY3JlYXRlZF9hdCkKCiAgICAvLyBUaGVyZSBhcmUgNyBlbnRyaWVz" + + "IG9uIHRoZSBzdGFjayDigJQgZmlyc3QgMyBmaWVsZHMgb2YgQ29udGV4dCBwbHVzIDQgbG9hZGVkIG9uZXMuCiAgICAvLyBUaGUgdG9wbW9zdCBpcyBmd2RfZmVlLCB3" + + "aGljaCBpcyB0aGUgb25seSBvbmUgd2UncmUgYWZ0ZXIsIHNvIGxldCdzIGRyb3AgNiBlbnRyaWVzIGJlbG93OgogICAgNiAxIEJMS0RST1AyIC8vIGRyb3AgdGhlIGxv" + + "YWRlZCB2YWx1ZXMgYXMgd2VsbCBhcyB0aGUgZmlyc3QgMyBmaWVsZHMgb2YgQ29udGV4dAoKICAgIFpFUk8gICAgICAgICAgICAgIC8vIG5vdCBtYXN0ZXJjaGFpbgog" + + "ICAgR0VUT1JJR0lOQUxGV0RGRUUgLy8gKGZ3ZF9mZWUgKiAyXjE2KSAvIGZpcnN0X2ZyYWMsIHdoZXJlCiAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdF9mcmFj" + + "IGlzIGEgdmFsdWUgbGlzdGVkIGluIGNvbmZpZyBwYXJhbSAyNQogICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGJsb2NrY2hhaW46IGh0dHBzOi8vdG9uc2Nh" + + "bi5vcmcvY29uZmlnIzI1Cn0K"; files["std/contract.tact"] = "c3RydWN0IFN0YXRlSW5pdCB7CiAgICBjb2RlOiBDZWxsOwogICAgZGF0YTogQ2VsbDsKfQoKQG5hbWUoX190YWN0X2NvbXB1dGVfY29udHJhY3RfYWRkcmVzcykKbmF0" + "aXZlIGNvbnRyYWN0QWRkcmVzc0V4dChjaGFpbjogSW50LCBjb2RlOiBDZWxsLCBkYXRhOiBDZWxsKTogQWRkcmVzczsKCmlubGluZSBmdW4gY29udHJhY3RBZGRyZXNz" + diff --git a/src/stdlib/stdlib/std/context.tact b/src/stdlib/stdlib/std/context.tact index 3f7257259..6cd82b409 100644 --- a/src/stdlib/stdlib/std/context.tact +++ b/src/stdlib/stdlib/std/context.tact @@ -11,29 +11,52 @@ native context(): Context; @name(__tact_context_get_sender) native sender(): Address; -/* -In this function we need nothing but self.raw -So we will drop bounced, sender and value in the end -By 6 1 BLKDROP2. -*/ -/* -int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool -src:MsgAddress dest:MsgAddressInt -value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams -created_lt:uint64 created_at:uint32 = CommonMsgInfoRelaxed; - -Context.raw is a slice, that begins with dest -*/ +/// Extension function for the `Context` structure. +/// +/// Reads forward fee and returns it as `Int` amount of nanoToncoins. +/// +/// ```tact +/// fun example() { +/// let fwdFee: Int = context().readForwardFee(); +/// } +/// ``` +/// +/// See: +/// * https://docs.tact-lang.org/ref/core-advanced#contextreadforwardfee +/// * https://docs.tact-lang.org/ref/core-advanced#getoriginalfwdfee +/// asm extends fun readForwardFee(self: Context): Int { - LDMSGADDR // Skip destination - LDGRAMS // Skip value + // Only the self.raw (Context.raw) is important, + // so all the other fields and loaded values will be dropped by `BLKDROP2` + // + // Context.raw starts at the dest:MsgAddressInt, following this TL-B scheme: + // int_msg_info$0 + // ihr_disabled:Bool + // bounce:Bool + // bounced:Bool + // src:MsgAddress + // dest:MsgAddressInt ← here is the start + // value:CurrencyCollection + // ihr_fee:Grams + // fwd_fee:Grams + // created_lt:uint64 + // created_at:uint32 + // = CommonMsgInfoRelaxed; + + LDMSGADDR // load dest:MsgAddressInt + LDGRAMS // load value:CurrencyCollection ONE - SDSKIPFIRST // Skip extra currency collection - LDGRAMS // Skip ihr_fee - LDGRAMS // Load fwd_fee, we need this - DROP // Drop remaining Slice - // Fwd_fee that we need is on top of the stack - 6 1 BLKDROP2 // Drop ihr_fee, value(message), destination, value(context), sender, bounced - ZERO // Masterchain - false - GETORIGINALFWDFEE // Get original fwd_fee -} \ No newline at end of file + SDSKIPFIRST // skip extra currency collection + LDGRAMS // load ihr_fee + LDGRAMS // load fwd_fee, we'll be using this! + DROP // drop remaining Slice (with created_lt and created_at) + + // There are 7 entries on the stack — first 3 fields of Context plus 4 loaded ones. + // The topmost is fwd_fee, which is the only one we're after, so let's drop 6 entries below: + 6 1 BLKDROP2 // drop the loaded values as well as the first 3 fields of Context + + ZERO // not masterchain + GETORIGINALFWDFEE // (fwd_fee * 2^16) / first_frac, where + // first_frac is a value listed in config param 25 + // of the blockchain: https://tonscan.org/config#25 +} From d9ec5598e567fce5c0f16857c27e47cb27da3e88 Mon Sep 17 00:00:00 2001 From: Shvetc Andrei <91282981+Shvandre@users.noreply.github.com> Date: Fri, 31 Jan 2025 19:34:45 +0300 Subject: [PATCH 06/10] Update src/test/benchmarks/jetton/results.json Co-authored-by: Anton Trunov --- src/test/benchmarks/jetton/results.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/benchmarks/jetton/results.json b/src/test/benchmarks/jetton/results.json index af8735b75..3eba4c29f 100644 --- a/src/test/benchmarks/jetton/results.json +++ b/src/test/benchmarks/jetton/results.json @@ -49,7 +49,7 @@ "discovery": "11039" }, { - "label": "Optimized send()", + "label": "1.5.3 with optimized send()", "transfer": "21464", "burn": "16029", "discovery": "10093" From 1a956b8c19cf704d1661d4befe18106ee0e1ca6f Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Fri, 31 Jan 2025 20:35:28 +0100 Subject: [PATCH 07/10] docs: `send.tact` edits --- docs/src/content/docs/ref/core-advanced.mdx | 2 +- src/stdlib/stdlib.ts | 80 ++++---- src/stdlib/stdlib/std/send.tact | 212 ++++++++++---------- 3 files changed, 146 insertions(+), 148 deletions(-) diff --git a/docs/src/content/docs/ref/core-advanced.mdx b/docs/src/content/docs/ref/core-advanced.mdx index 415e94df1..412367e38 100644 --- a/docs/src/content/docs/ref/core-advanced.mdx +++ b/docs/src/content/docs/ref/core-advanced.mdx @@ -163,7 +163,7 @@ extends fun readForwardFee(self: Context): Int; Extension function for the [`Context{:tact}`](/ref/core-common#context). -Reads [forward fee](https://docs.ton.org/develop/smart-contracts/guidelines/processing) and returns it as [`Int{:tact}`][int] amount of [nanoToncoins][nanotoncoin]. +Reads [forward fee][forward-fee] and returns it as [`Int{:tact}`][int] amount of [nanoToncoins][nanotoncoin]. Usage example: diff --git a/src/stdlib/stdlib.ts b/src/stdlib/stdlib.ts index fce906f2c..1c041bc22 100644 --- a/src/stdlib/stdlib.ts +++ b/src/stdlib/stdlib.ts @@ -417,42 +417,50 @@ files["std/send.tact"] = "b25zdCBTZW5kUGF5R2FzU2VwYXJhdGVseTogSW50ID0gMTsKY29uc3QgU2VuZERlc3Ryb3lJZlplcm86IEludCA9IDMyOwpjb25zdCBTZW5kQm91bmNlSWZBY3Rpb25G" + "YWlsOiBJbnQgPSAxNjsKY29uc3QgU2VuZE9ubHlFc3RpbWF0ZUZlZTogSW50ID0gMTAyNDsKCnN0cnVjdCBTZW5kUGFyYW1ldGVycyB7CiAgICBib3VuY2U6IEJvb2wg" + "PSB0cnVlOwogICAgdG86IEFkZHJlc3M7CiAgICB2YWx1ZTogSW50OwogICAgbW9kZTogSW50ID0gMDsKICAgIGJvZHk6IENlbGw/ID0gbnVsbDsKICAgIGNvZGU6IENl" + - "bGw/ID0gbnVsbDsKICAgIGRhdGE6IENlbGw/ID0gbnVsbDsKfQoKLyoKaW50X21zZ19pbmZvJDAgaWhyX2Rpc2FibGVkOkJvb2wgYm91bmNlOkJvb2wgYm91bmNlZDpC" + - "b29sCiAgc3JjOk1zZ0FkZHJlc3MgZGVzdDpNc2dBZGRyZXNzSW50CiAgdmFsdWU6Q3VycmVuY3lDb2xsZWN0aW9uIGlocl9mZWU6R3JhbXMgZndkX2ZlZTpHcmFtcwog" + - "IGNyZWF0ZWRfbHQ6dWludDY0IGNyZWF0ZWRfYXQ6dWludDMyID0gQ29tbW9uTXNnSW5mb1JlbGF4ZWQ7CgptZXNzYWdlJF8ge1g6VHlwZX0gaW5mbzpDb21tb25Nc2dJ" + - "bmZvUmVsYXhlZAogIGluaXQ6KE1heWJlIChFaXRoZXIgU3RhdGVJbml0IF5TdGF0ZUluaXQpKQogIGJvZHk6KEVpdGhlciBYIF5YKSA9IE1lc3NhZ2VSZWxheGVkIFg7" + - "Cgpib3VuY2U6IHM2CnRvOiBzNQp2YWx1ZTogczQKbW9kZTogczMKYm9keTogczIKY29kZTogczEKZGF0YTogczAKKi8KYXNtIGZ1biBzZW5kKHBhcmFtczogU2VuZFBh" + - "cmFtZXRlcnMpIHsKICAgIDMgNCBCTEtTV0FQCiAgICBzMiBYQ0hHMAogICAgLyoKICAgIFRoZXNlIHR3byBpbnN0cnVjdGlvbnMgZG8gdGhpcwogICAgbW9kZTogczYK" + - "ICAgIGJvZHk6IHM1CiAgICBjb2RlOiBzNAogICAgZGF0YTogczMKICAgIHZhbHVlOiBzMgogICAgdG86IHMxCiAgICBib3VuY2U6IHMwCiAgICAqLwogICAgTkVXQwog" + - "ICAgYnswMX0gU1RTTElDRUNPTlNUIC8vIFN0b3JlIHRhZyA9ICQwLCBpaHJfZGlzYWJsZWQgPSB0cnVlCiAgICAxIFNUSSAvLyBTdG9yZSBib3VuY2UKICAgIGJ7MDAw" + - "fSBTVFNMSUNFQ09OU1QgLy8gU3RvcmUgc3JjX2FkZHIgPSBhZGRyX25vbmUKICAgIFNUU0xJQ0UgLy8gU3RvcmUgdG8KICAgIFNXQVAgLy8gQmVjYXVzZSBTVEdSQU1T" + - "IGlzIGtpbmRhIHJldmVyc2VkIGIgeCAtIGInCiAgICBTVEdSQU1TIC8vIFN0b3JlIGdyYW1zCiAgICAxMDUgUFVTSElOVCAvLyAxICsgNCArIDQgKyA2NCArIDMyCiAg" + - "ICBTVFpFUk9FUyAvLyBTdG9yZSBjdXJyZW5jeV9jb2xsZWN0aW9uICsgSUhSIGZlZXMgKyBGd2QgZmVlcyArIENyZWF0ZWRMVCArIENyZWF0ZWRBdAogICAgLyoKICAg" + - "IG1vZGU6IHM0CiAgICBib2R5OiBzMwogICAgY29kZTogczIKICAgIGRhdGE6IHMxCiAgICBNZXNzYWdlQnVpbGRlcjogczAKICAgICovCiAgICBzMiBYQ0hHMCAvLyBX" + - "ZSB3YW50IHRvIGNoZWNrLCBpZiBjb2RlIG9yIGRhdGEgaXMgTlVMTCwgc28gcGxhY2UgYSBidWlsZGVyIHVuZGVyIHRoZW0KICAgIC8qCiAgICBtb2RlOiBzNAogICAg" + - "Ym9keTogczMKICAgIE1lc3NhZ2VCdWlsZGVyOiBzMgogICAgZGF0YTogczEKICAgIGNvZGU6IHMwCiAgICAqLwogICAgRFVQMgogICAgSVNOVUxMCiAgICBTV0FQCiAg" + - "ICBJU05VTEwKICAgIE1VTAogICAgLyoKICAgIG1vZGU6IHM1CiAgICBib2R5OiBzNAogICAgTWVzc2FnZUJ1aWxkZXI6IHMzCiAgICBkYXRhOiBzMgogICAgY29kZTog" + - "czEKICAgIHMwOiAwIGlmIGFueSBvZiB0aGVtIGlzIG5vdC1udWxsCiAgICAtMSBpZiBib3RoIGFyZSBudWxsCiAgICAqLwogICAgPHsKICAgICAgICBEUk9QMiAvLyBk" + - "cm9wIGV4dHJhIGNvZGUgYW5kIGRhdGEKICAgICAgICBOVUxMIC8vIHB1c2ggTlVMTAogICAgICAgIFNXQVAKICAgICAgICAvKgogICAgICAgIG1vZGU6IHMzCiAgICAg" + - "ICAgYm9keTogczIKICAgICAgICBOVUxMOiBzMQogICAgICAgIE1lc3NhZ2VCdWlsZGVyOiBzMAogICAgICAgICovCiAgICB9PiBQVVNIQ09OVAogICAgPHsKICAgICAg" + - "ICAvKgogICAgICAgIG1vZGU6IHM0CiAgICAgICAgYm9keTogczMKICAgICAgICBNZXNzYWdlQnVpbGRlcjogczIKICAgICAgICBkYXRhOiBzMQogICAgICAgIGNvZGU6" + - "IHMwCiAgICAgICAgKi8KICAgICAgICAvKgogICAgICAgIF8gc3BsaXRfZGVwdGg6KE1heWJlICgjIyA1KSkgc3BlY2lhbDooTWF5YmUgVGlja1RvY2spCiAgICAgICAg" + - "ICAgIGNvZGU6KE1heWJlIF5DZWxsKSBkYXRhOihNYXliZSBeQ2VsbCkKICAgICAgICAgICAgbGlicmFyeTooTWF5YmUgXkNlbGwpID0gU3RhdGVJbml0OwogICAgICAg" + - "ICovCiAgICAgICAgTkVXQyAvLyBBc3NlbWJsZSBzdGF0ZSBpbml0CiAgICAgICAgYnswMH0gU1RTTElDRUNPTlNUIC8vIFNwbGl0RGVwdGggYW5kIFRpY2tUb2NrCiAg" + - "ICAgICAgU1RESUNUIC8vIFN0b3JlIGNvZGUKICAgICAgICBTVERJQ1QgLy8gU3RvcmUgZGF0YQogICAgICAgIGJ7MH0gU1RTTElDRUNPTlNUIC8vIFN0b3JlIGxpYnJh" + - "cnkKICAgICAgICBFTkRDIC8vIENvbXBsZXRlZCBidWlsZGluZyBTdGF0ZUluaXQKICAgICAgICBTV0FQCiAgICAgICAgLyoKICAgICAgICBtb2RlOiBzMwogICAgICAg" + - "IGJvZHk6IHMyCiAgICAgICAgU3RhdGVJbml0Q2VsbDogczEKICAgICAgICBNZXNzYWdlQnVpbGRlcjogczAKICAgICAgICAqLwogICAgICAgIGJ7MX0gU1RTTElDRUNP" + - "TlNUIC8vIFN0YXRlSW5pdCB3aWxsIGJlIHNhdmVkIGFzIHJlZiAoRWl0aGVyIGJpdCkKICAgICAgICAvLyBpbml0OihNYXliZSAoRWl0aGVyIFN0YXRlSW5pdCBeU3Rh" + - "dGVJbml0KSkKICAgIH0+IFBVU0hDT05UCiAgICBJRkVMU0UKICAgIC8qCiAgICBtb2RlOiBzMwogICAgYm9keTogczIKICAgIFN0YXRlSW5pdENlbGwgT1IgTlVMTDog" + - "czEKICAgIE1lc3NhZ2VCdWlsZGVyOiBzMAogICAgKi8KICAgIFNURElDVCAvLyBTYXZlIHN0YXRlIGluaXQgKGFuZCBNYXliZSBiaXQpCiAgICBTVERJQ1QgLy8gU2F2" + - "ZSBib2R5IGFzIHJlZiBhbmQgcGxhY2UgTWF5YmUgYml0IChib2R5IGFsc28gbWF5IGJlIE5VTEwpCiAgICBFTkRDIC8vIFdlIGZpbmlzaGVkIGJ1aWxkaW5nIG1lc3Nh" + - "Z2UhCiAgICAvKgogICAgbW9kZTogczEKICAgIE1lc3NhZ2VDZWxsOiBzMAogICAgKi8KICAgIFNXQVAgLy8gQmVjYXVzZSBTRU5EUkFXTVNHIGRvZXMgdGhhdCAoaW4g" + - "dGVybXMgb2Ygc3RhY2spOiBgYyB4IC0gYCB3aGVyZSB4IGlzIHRoZSBtb2RlLCBhbmQgYyBpbiB0aGUgbWVzc2FnZQogICAgU0VORFJBV01TRyAvLyBodHRwczovL2dp" + - "dGh1Yi5jb20vdGFjdC1sYW5nL3RhY3QvaXNzdWVzLzE1NTgKfQoKaW5saW5lIGZ1biBlbWl0KGJvZHk6IENlbGwpIHsKICAgIC8vIGV4dF9vdXRfbXNnX2luZm8kMTEg" + - "c3JjOk1zZ0FkZHJlc3NJbnQgZGVzdDpNc2dBZGRyZXNzRXh0IGNyZWF0ZWRfbHQ6dWludDY0IGNyZWF0ZWRfYXQ6dWludDMyCiAgICAvLyAgICAgICAgICAgICAgICAg" + - "ICAgIG1heWJlOiBzdGF0ZUluaXQgKGZhbHNlKSBib2R5UmVmOiBib29sICh0cnVlKQogICAgbGV0IGM6IENlbGwgPSBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9yZVVp" + - "bnQoMTUyMTE4MDcyMDI3Mzg3NTI4MTc5NjA0Mzg0NjQ1MTMsIDEwNCkKICAgICAgICAuc3RvcmVSZWYoYm9keSkKICAgICAgICAuZW5kQ2VsbCgpOwogICAgbmF0aXZl" + - "U2VuZE1lc3NhZ2UoYywgMCk7Cn0KCmFzbSBmdW4gYWNjZXB0TWVzc2FnZSgpIHsgQUNDRVBUIH0KCmFzbSBmdW4gY29tbWl0KCkgeyBDT01NSVQgfQo="; + "bGw/ID0gbnVsbDsKICAgIGRhdGE6IENlbGw/ID0gbnVsbDsKfQoKCi8vLyBHbG9iYWwgZnVuY3Rpb24uIFF1ZXVlcyB0aGUgbWVzc2FnZSB0byBiZSBzZW50IHVzaW5n" + + "IGEgYFNlbmRQYXJhbWV0ZXJzYCBTdHJ1Y3QuCi8vLwovLy8gQXR0ZW1wdHMgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBtZXNzYWdlcyB0aHJvdyBhbiBleGNlcHRpb24g" + + "d2l0aCBhbiBleGl0IGNvZGUgMzM6IGBBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgc2Vu" + + "ZChTZW5kUGFyYW1ldGVyc3sKLy8vICAgICAgICAgdG86IHNlbmRlcigpLCAgICAvLyBiYWNrIHRvIHRoZSBzZW5kZXIsCi8vLyAgICAgICAgIHZhbHVlOiB0b24oIjEi" + + "KSwgLy8gd2l0aCAxIFRvbmNvaW4gKDFfMDAwXzAwMF8wMDAgbmFub1RvbmNvaW4pLAovLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBubyBtZXNzYWdl" + + "IGJvZHkKLy8vICAgICB9KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY29tbW9uI3NlbmQKLy8v" + + "CmFzbSBmdW4gc2VuZChwYXJhbXM6IFNlbmRQYXJhbWV0ZXJzKSB7CiAgICAvLyBJbnN0cnVjdGlvbnMgYXJlIGdyb3VwZWQsIGFuZCB0aGUgc3RhY2sgc3RhdGVzIHRo" + + "ZXkgcHJvZHVjZSBhcyBhIGdyb3VwIGFyZSBzaG93biByaWdodCBhZnRlci4KICAgIC8vIEluIHRoZSBlbmQsIG91ciBtZXNzYWdlIENlbGwgc2hvdWxkIGhhdmUgdGhl" + + "IGZvbGxvd2luZyBUTC1CIHN0cnVjdHVyZToKICAgIC8vIG1lc3NhZ2UkXyB7WDpUeXBlfQogICAgLy8gICBpbmZvOkNvbW1vbk1zZ0luZm9SZWxheGVkCiAgICAvLyAg" + + "IGluaXQ6KE1heWJlIChFaXRoZXIgU3RhdGVJbml0IF5TdGF0ZUluaXQpKQogICAgLy8gICBib2R5OihFaXRoZXIgWCBeWCkKICAgIC8vID0gTWVzc2FnZVJlbGF4ZWQg" + + "WDsKCiAgICAvLyBHcm91cCAxOiBSZWFycmFuZ2VtZW50cwogICAgMyA0IEJMS1NXQVAKICAgIHMyIFhDSEcwCiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMw" + + "OiBgcGFyYW1zLmJvdW5jZWAKICAgIC8vIHMxOiBgcGFyYW1zLnRvYAogICAgLy8gczI6IGBwYXJhbXMudmFsdWVgCiAgICAvLyBzMzogYHBhcmFtcy5kYXRhYAogICAg" + + "Ly8gczQ6IGBwYXJhbXMuY29kZWAKICAgIC8vIHM1OiBgcGFyYW1zLmJvZHlgCiAgICAvLyBzNjogYHBhcmFtcy5tb2RlYAogICAgLy8gRm9yIGJyZXdpdHksIHRoZSAi" + + "cGFyYW1zIiBwcmVmaXggd2lsbCBiZSBvbWl0dGVkIGZyb20gbm93IG9uLgoKICAgIC8vIEdyb3VwIDI6IFN0b3JpbmcgdGhlIGBib3VuY2VgLCBgdG9gIGFuZCBgdmFs" + + "dWVgIGludG8gYSBCdWlsZGVyCiAgICBORVdDCiAgICBiezAxfSBTVFNMSUNFQ09OU1QgIC8vIHN0b3JlIHRhZyA9ICQwLCBpaHJfZGlzYWJsZWQgPSB0cnVlCiAgICAx" + + "IFNUSSAgICAgICAgICAgICAgIC8vIHN0b3JlIGBib3VuY2VgCiAgICBiezAwMH0gU1RTTElDRUNPTlNUIC8vIHN0b3JlIHNyY19hZGRyID0gYWRkcl9ub25lCiAgICBT" + + "VFNMSUNFICAgICAgICAgICAgIC8vIHN0b3JlIGB0b2AKICAgIFNXQVAKICAgIFNUR1JBTVMgICAgICAgICAgICAgLy8gc3RvcmUgbmFub3RvbnMKICAgIDEwNSBQVVNI" + + "SU5UICAgICAgICAgLy8gMSArIDQgKyA0ICsgNjQgKyAzMgogICAgU1RaRVJPRVMgICAgICAgICAgICAvLyBzdG9yZSBjdXJyZW5jeV9jb2xsZWN0aW9uLCBpaHJfZmVl" + + "LCBmd2RfZmVlLCBjcmVhdGVkX2x0IGFuZCBjcmVhdGVkX2F0CiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBCdWlsZGVyCiAgICAvLyBzMTogYGRhdGFg" + + "CiAgICAvLyBzMjogYGNvZGVgCiAgICAvLyBzMzogYGJvZHlgCiAgICAvLyBzNDogYG1vZGVgCgogICAgLy8gR3JvdXAgMzogUGxhY2luZyB0aGUgQnVpbGRlciBhZnRl" + + "ciBjb2RlIGFuZCBkYXRhLCB0aGVuIGNoZWNraW5nIHRob3NlIGZvciBudWxsYWJpbGl0eQogICAgczIgWENIRzAKICAgIERVUDIKICAgIElTTlVMTAogICAgU1dBUAog" + + "ICAgSVNOVUxMCiAgICBNVUwgLy8gbm90ZSB0aGF0IC0xICogLTEgd3JhcHMgYmFjayB0byAtMQogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogLTEgKHRy" + + "dWUpIGlmIGBkYXRhYCBhbmQgYGNvZGVgIGFyZSBib3RoIG51bGwsIDAgKGZhbHNlKSBvdGhlcndpc2UKICAgIC8vIHMxOiBgY29kZWAKICAgIC8vIHMyOiBgZGF0YWAK" + + "ICAgIC8vIHMzOiBCdWlsZGVyCiAgICAvLyBzNDogYGJvZHlgCiAgICAvLyBzNTogYG1vZGVgCgogICAgLy8gR3JvdXAgNDogTGVmdCBicmFuY2ggb2YgdGhlIElGRUxT" + + "RSwgZXhlY3V0ZWQgaWYgczAgaXMgLTEgKHRydWUpCiAgICA8ewogICAgICAgIERST1AyIC8vIGRyb3AgYGRhdGFgIGFuZCBgY29kZWAsIHNpbmNlIGVpdGhlciBvZiB0" + + "aG9zZSBpcyBudWxsCiAgICAgICAgTlVMTCAgLy8gcHVzaCBhIHNpbmdsZSBudWxsCiAgICAgICAgU1dBUCAgLy8gcGxhY2UgQnVpbGRlciBvbiB0b3AKICAgIH0+IFBV" + + "U0hDT05UCgogICAgLy8gR3JvdXAgNDogUmlnaHQgYnJhbmNoIG9mIHRoZSBJRkVMU0UsIGV4ZWN1dGVkIGlmIHMwIGlzIDAgKGZhbHNlKQogICAgPHsKICAgICAgICAv" + + "LyBfIHNwbGl0X2RlcHRoOihNYXliZSAoIyMgNSkpCiAgICAgICAgLy8gICBzcGVjaWFsOihNYXliZSBUaWNrVG9jaykKICAgICAgICAvLyAgIGNvZGU6KE1heWJlIF5D" + + "ZWxsKQogICAgICAgIC8vICAgZGF0YTooTWF5YmUgXkNlbGwpCiAgICAgICAgLy8gICBsaWJyYXJ5OihNYXliZSBeQ2VsbCkKICAgICAgICAvLyA9IFN0YXRlSW5pdDsK" + + "ICAgICAgICBORVdDICAgICAgICAgICAgICAgLy8gc3RhcnQgY29tcG9zaW5nIFN0YXRlSW5pdAogICAgICAgIGJ7MDB9IFNUU0xJQ0VDT05TVCAvLyBzcGxpdF9kZXB0" + + "aCBhbmQgc3BlY2lhbAogICAgICAgIFNURElDVCAgICAgICAgICAgICAvLyBzdG9yZSBjb2RlCiAgICAgICAgU1RESUNUICAgICAgICAgICAgIC8vIHN0b3JlIGRhdGEK" + + "ICAgICAgICBiezB9IFNUU0xJQ0VDT05TVCAgLy8gc3RvcmUgbGlicmFyeQogICAgICAgIEVOREMgICAgICAgICAgICAgICAvLyBlbmQgY29tcG9zaW5nIFN0YXRlSW5p" + + "dAogICAgICAgIFNXQVAgICAgICAgICAgICAgICAvLyBwbGFjZSBCdWlsZGVyIG9uIHRvcAogICAgICAgIGJ7MX0gU1RTTElDRUNPTlNUICAvLyBhbiBleHRyYSBiaXQg" + + "Zm9yIHN0b3JpbmcgU3RhdGVJbml0IGFzIHJlZgogICAgfT4gUFVTSENPTlQKCiAgICAvLyBHcm91cCA0OiBJRkVMU0UgdGhhdCBkb2VzIHRoZSBicmFuY2hpbmcgc2hv" + + "d24gYWJvdmUKICAgIElGRUxTRQogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQnVpbGRlcgogICAgLy8gczE6IG51bGwgb3IgU3RhdGVJbml0CiAgICAv" + + "LyBzMjogYGJvZHlgCiAgICAvLyBzMzogYG1vZGVgCgogICAgLy8gR3JvdXAgNTogRmluaWxpemluZyBidWlsZGluZyB0aGUgbWVzc2FnZQogICAgU1RESUNUIC8vIHN0" + + "b3JlIFN0YXRlSW5pdAogICAgU1RESUNUIC8vIHN0b3JlIGBib2R5YCBhcyByZWYgd2l0aCBhbiBleHRyYSBNYXliZSBiaXQsIHNpbmNlIGBib2R5YCBtaWdodCBiZSBu" + + "dWxsCiAgICBFTkRDICAgLy8gZmluaWxpemUgdGhlIEJ1aWxkZXIgYXMgYSBDZWxsCiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBDZWxsCiAgICAvLyBz" + + "MTogYG1vZGVgCgogICAgLy8gR3JvdXAgNjogU2VuZGluZyB0aGUgbWVzc2FnZSwgd2l0aCBgbW9kZWAgb24gdG9wCiAgICBTV0FQCiAgICBTRU5EUkFXTVNHIC8vIGh0" + + "dHBzOi8vZ2l0aHViLmNvbS90YWN0LWxhbmcvdGFjdC9pc3N1ZXMvMTU1OAp9CgppbmxpbmUgZnVuIGVtaXQoYm9keTogQ2VsbCkgewogICAgLy8gZXh0X291dF9tc2df" + + "aW5mbyQxMSBzcmM6TXNnQWRkcmVzc0ludCBkZXN0Ok1zZ0FkZHJlc3NFeHQgY3JlYXRlZF9sdDp1aW50NjQgY3JlYXRlZF9hdDp1aW50MzIKICAgIC8vICAgICAgICAg" + + "ICAgICAgICAgICAgbWF5YmU6IHN0YXRlSW5pdCAoZmFsc2UpIGJvZHlSZWY6IGJvb2wgKHRydWUpCiAgICBsZXQgYzogQ2VsbCA9IGJlZ2luQ2VsbCgpCiAgICAgICAg" + + "LnN0b3JlVWludCgxNTIxMTgwNzIwMjczODc1MjgxNzk2MDQzODQ2NDUxMywgMTA0KQogICAgICAgIC5zdG9yZVJlZihib2R5KQogICAgICAgIC5lbmRDZWxsKCk7CiAg" + + "ICBuYXRpdmVTZW5kTWVzc2FnZShjLCAwKTsKfQoKYXNtIGZ1biBhY2NlcHRNZXNzYWdlKCkgeyBBQ0NFUFQgfQoKYXNtIGZ1biBjb21taXQoKSB7IENPTU1JVCB9Cg=="; files["std/text.tact"] = "Ly8KLy8gU3RyaW5nIGJ1aWxkZXIKLy8KCkBuYW1lKF9fdGFjdF9zdHJpbmdfYnVpbGRlcl9zdGFydF9zdHJpbmcpCm5hdGl2ZSBiZWdpblN0cmluZygpOiBTdHJpbmdC" + "dWlsZGVyOwoKQG5hbWUoX190YWN0X3N0cmluZ19idWlsZGVyX3N0YXJ0X2NvbW1lbnQpCm5hdGl2ZSBiZWdpbkNvbW1lbnQoKTogU3RyaW5nQnVpbGRlcjsKCkBuYW1l" + diff --git a/src/stdlib/stdlib/std/send.tact b/src/stdlib/stdlib/std/send.tact index c31e9b854..0c16e12bf 100644 --- a/src/stdlib/stdlib/std/send.tact +++ b/src/stdlib/stdlib/std/send.tact @@ -21,130 +21,120 @@ struct SendParameters { data: Cell? = null; } -/* -int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool - src:MsgAddress dest:MsgAddressInt - value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams - created_lt:uint64 created_at:uint32 = CommonMsgInfoRelaxed; - -message$_ {X:Type} info:CommonMsgInfoRelaxed - init:(Maybe (Either StateInit ^StateInit)) - body:(Either X ^X) = MessageRelaxed X; - -bounce: s6 -to: s5 -value: s4 -mode: s3 -body: s2 -code: s1 -data: s0 -*/ + +/// Global function. Queues the message to be sent using a `SendParameters` Struct. +/// +/// Attempts to queue more than 255 messages throw an exception with an exit code 33: `Action list is too long`. +/// +/// ```tact +/// fun example() { +/// send(SendParameters{ +/// to: sender(), // back to the sender, +/// value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin), +/// // and no message body +/// }); +/// } +/// ``` +/// +/// See: https://docs.tact-lang.org/ref/core-common#send +/// asm fun send(params: SendParameters) { + // Instructions are grouped, and the stack states they produce as a group are shown right after. + // In the end, our message Cell should have the following TL-B structure: + // message$_ {X:Type} + // info:CommonMsgInfoRelaxed + // init:(Maybe (Either StateInit ^StateInit)) + // body:(Either X ^X) + // = MessageRelaxed X; + + // Group 1: Rearrangements 3 4 BLKSWAP s2 XCHG0 - /* - These two instructions do this - mode: s6 - body: s5 - code: s4 - data: s3 - value: s2 - to: s1 - bounce: s0 - */ + // → Stack state + // s0: `params.bounce` + // s1: `params.to` + // s2: `params.value` + // s3: `params.data` + // s4: `params.code` + // s5: `params.body` + // s6: `params.mode` + // For brewity, the "params" prefix will be omitted from now on. + + // Group 2: Storing the `bounce`, `to` and `value` into a Builder NEWC - b{01} STSLICECONST // Store tag = $0, ihr_disabled = true - 1 STI // Store bounce - b{000} STSLICECONST // Store src_addr = addr_none - STSLICE // Store to - SWAP // Because STGRAMS is kinda reversed b x - b' - STGRAMS // Store grams - 105 PUSHINT // 1 + 4 + 4 + 64 + 32 - STZEROES // Store currency_collection + IHR fees + Fwd fees + CreatedLT + CreatedAt - /* - mode: s4 - body: s3 - code: s2 - data: s1 - MessageBuilder: s0 - */ - s2 XCHG0 // We want to check, if code or data is NULL, so place a builder under them - /* - mode: s4 - body: s3 - MessageBuilder: s2 - data: s1 - code: s0 - */ + b{01} STSLICECONST // store tag = $0, ihr_disabled = true + 1 STI // store `bounce` + b{000} STSLICECONST // store src_addr = addr_none + STSLICE // store `to` + SWAP + STGRAMS // store nanotons + 105 PUSHINT // 1 + 4 + 4 + 64 + 32 + STZEROES // store currency_collection, ihr_fee, fwd_fee, created_lt and created_at + // → Stack state + // s0: Builder + // s1: `data` + // s2: `code` + // s3: `body` + // s4: `mode` + + // Group 3: Placing the Builder after code and data, then checking those for nullability + s2 XCHG0 DUP2 ISNULL SWAP ISNULL - MUL - /* - mode: s5 - body: s4 - MessageBuilder: s3 - data: s2 - code: s1 - s0: 0 if any of them is not-null - -1 if both are null - */ + MUL // note that -1 * -1 wraps back to -1 + // → Stack state + // s0: -1 (true) if `data` and `code` are both null, 0 (false) otherwise + // s1: `code` + // s2: `data` + // s3: Builder + // s4: `body` + // s5: `mode` + + // Group 4: Left branch of the IFELSE, executed if s0 is -1 (true) <{ - DROP2 // drop extra code and data - NULL // push NULL - SWAP - /* - mode: s3 - body: s2 - NULL: s1 - MessageBuilder: s0 - */ + DROP2 // drop `data` and `code`, since either of those is null + NULL // push a single null + SWAP // place Builder on top }> PUSHCONT + + // Group 4: Right branch of the IFELSE, executed if s0 is 0 (false) <{ - /* - mode: s4 - body: s3 - MessageBuilder: s2 - data: s1 - code: s0 - */ - /* - _ split_depth:(Maybe (## 5)) special:(Maybe TickTock) - code:(Maybe ^Cell) data:(Maybe ^Cell) - library:(Maybe ^Cell) = StateInit; - */ - NEWC // Assemble state init - b{00} STSLICECONST // SplitDepth and TickTock - STDICT // Store code - STDICT // Store data - b{0} STSLICECONST // Store library - ENDC // Completed building StateInit - SWAP - /* - mode: s3 - body: s2 - StateInitCell: s1 - MessageBuilder: s0 - */ - b{1} STSLICECONST // StateInit will be saved as ref (Either bit) - // init:(Maybe (Either StateInit ^StateInit)) + // _ 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 + 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 IFELSE - /* - mode: s3 - body: s2 - StateInitCell OR NULL: s1 - MessageBuilder: s0 - */ - STDICT // Save state init (and Maybe bit) - STDICT // Save body as ref and place Maybe bit (body also may be NULL) - ENDC // We finished building message! - /* - mode: s1 - MessageCell: s0 - */ - SWAP // Because SENDRAWMSG does that (in terms of stack): `c x - ` where x is the mode, and c in the message + // → Stack state + // s0: Builder + // s1: null or StateInit + // s2: `body` + // s3: `mode` + + // Group 5: Finilizing building the message + STDICT // store StateInit + STDICT // store `body` as ref with an extra Maybe bit, since `body` might be null + ENDC // finilize the Builder as a Cell + // → Stack state + // s0: Cell + // s1: `mode` + + // Group 6: Sending the message, with `mode` on top + SWAP SENDRAWMSG // https://github.com/tact-lang/tact/issues/1558 } From f243e72da73b48d9088eac11abb11f0a902882ce Mon Sep 17 00:00:00 2001 From: Novus Nota <68142933+novusnota@users.noreply.github.com> Date: Fri, 31 Jan 2025 20:36:48 +0100 Subject: [PATCH 08/10] typo --- src/stdlib/stdlib/std/send.tact | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/stdlib/stdlib/std/send.tact b/src/stdlib/stdlib/std/send.tact index 0c16e12bf..3d16382d5 100644 --- a/src/stdlib/stdlib/std/send.tact +++ b/src/stdlib/stdlib/std/send.tact @@ -58,7 +58,7 @@ asm fun send(params: SendParameters) { // s4: `params.code` // s5: `params.body` // s6: `params.mode` - // For brewity, the "params" prefix will be omitted from now on. + // For brevity, the "params" prefix will be omitted from now on. // Group 2: Storing the `bounce`, `to` and `value` into a Builder NEWC @@ -125,10 +125,10 @@ asm fun send(params: SendParameters) { // s2: `body` // s3: `mode` - // Group 5: Finilizing building the message + // Group 5: Finalizing the message STDICT // store StateInit STDICT // store `body` as ref with an extra Maybe bit, since `body` might be null - ENDC // finilize the Builder as a Cell + ENDC // → Stack state // s0: Cell // s1: `mode` From 691601f203a47e87367d0cb3f55923dde0fad0c1 Mon Sep 17 00:00:00 2001 From: Anton Trunov Date: Sat, 1 Feb 2025 00:42:36 +0400 Subject: [PATCH 09/10] Update src/test/benchmarks/jetton/results.json --- src/test/benchmarks/jetton/results.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/benchmarks/jetton/results.json b/src/test/benchmarks/jetton/results.json index 3eba4c29f..510a24ed6 100644 --- a/src/test/benchmarks/jetton/results.json +++ b/src/test/benchmarks/jetton/results.json @@ -56,9 +56,9 @@ }, { "label": "master", - "transfer": "21464", + "transfer": "21402", "burn": "16029", - "discovery": "10093" + "discovery": "10085" } ] } From 20440741ce797054e3dbf2a44944ddc7aac6abce Mon Sep 17 00:00:00 2001 From: Anton Trunov Date: Sat, 1 Feb 2025 00:55:30 +0400 Subject: [PATCH 10/10] update stdlib.ts --- src/stdlib/stdlib.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/stdlib/stdlib.ts b/src/stdlib/stdlib.ts index 1c041bc22..b65e8b655 100644 --- a/src/stdlib/stdlib.ts +++ b/src/stdlib/stdlib.ts @@ -429,7 +429,7 @@ files["std/send.tact"] = "IGluaXQ6KE1heWJlIChFaXRoZXIgU3RhdGVJbml0IF5TdGF0ZUluaXQpKQogICAgLy8gICBib2R5OihFaXRoZXIgWCBeWCkKICAgIC8vID0gTWVzc2FnZVJlbGF4ZWQg" + "WDsKCiAgICAvLyBHcm91cCAxOiBSZWFycmFuZ2VtZW50cwogICAgMyA0IEJMS1NXQVAKICAgIHMyIFhDSEcwCiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMw" + "OiBgcGFyYW1zLmJvdW5jZWAKICAgIC8vIHMxOiBgcGFyYW1zLnRvYAogICAgLy8gczI6IGBwYXJhbXMudmFsdWVgCiAgICAvLyBzMzogYHBhcmFtcy5kYXRhYAogICAg" + - "Ly8gczQ6IGBwYXJhbXMuY29kZWAKICAgIC8vIHM1OiBgcGFyYW1zLmJvZHlgCiAgICAvLyBzNjogYHBhcmFtcy5tb2RlYAogICAgLy8gRm9yIGJyZXdpdHksIHRoZSAi" + + "Ly8gczQ6IGBwYXJhbXMuY29kZWAKICAgIC8vIHM1OiBgcGFyYW1zLmJvZHlgCiAgICAvLyBzNjogYHBhcmFtcy5tb2RlYAogICAgLy8gRm9yIGJyZXZpdHksIHRoZSAi" + "cGFyYW1zIiBwcmVmaXggd2lsbCBiZSBvbWl0dGVkIGZyb20gbm93IG9uLgoKICAgIC8vIEdyb3VwIDI6IFN0b3JpbmcgdGhlIGBib3VuY2VgLCBgdG9gIGFuZCBgdmFs" + "dWVgIGludG8gYSBCdWlsZGVyCiAgICBORVdDCiAgICBiezAxfSBTVFNMSUNFQ09OU1QgIC8vIHN0b3JlIHRhZyA9ICQwLCBpaHJfZGlzYWJsZWQgPSB0cnVlCiAgICAx" + "IFNUSSAgICAgICAgICAgICAgIC8vIHN0b3JlIGBib3VuY2VgCiAgICBiezAwMH0gU1RTTElDRUNPTlNUIC8vIHN0b3JlIHNyY19hZGRyID0gYWRkcl9ub25lCiAgICBT" + @@ -452,15 +452,15 @@ files["std/send.tact"] = "dAogICAgICAgIFNXQVAgICAgICAgICAgICAgICAvLyBwbGFjZSBCdWlsZGVyIG9uIHRvcAogICAgICAgIGJ7MX0gU1RTTElDRUNPTlNUICAvLyBhbiBleHRyYSBiaXQg" + "Zm9yIHN0b3JpbmcgU3RhdGVJbml0IGFzIHJlZgogICAgfT4gUFVTSENPTlQKCiAgICAvLyBHcm91cCA0OiBJRkVMU0UgdGhhdCBkb2VzIHRoZSBicmFuY2hpbmcgc2hv" + "d24gYWJvdmUKICAgIElGRUxTRQogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQnVpbGRlcgogICAgLy8gczE6IG51bGwgb3IgU3RhdGVJbml0CiAgICAv" + - "LyBzMjogYGJvZHlgCiAgICAvLyBzMzogYG1vZGVgCgogICAgLy8gR3JvdXAgNTogRmluaWxpemluZyBidWlsZGluZyB0aGUgbWVzc2FnZQogICAgU1RESUNUIC8vIHN0" + - "b3JlIFN0YXRlSW5pdAogICAgU1RESUNUIC8vIHN0b3JlIGBib2R5YCBhcyByZWYgd2l0aCBhbiBleHRyYSBNYXliZSBiaXQsIHNpbmNlIGBib2R5YCBtaWdodCBiZSBu" + - "dWxsCiAgICBFTkRDICAgLy8gZmluaWxpemUgdGhlIEJ1aWxkZXIgYXMgYSBDZWxsCiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBDZWxsCiAgICAvLyBz" + - "MTogYG1vZGVgCgogICAgLy8gR3JvdXAgNjogU2VuZGluZyB0aGUgbWVzc2FnZSwgd2l0aCBgbW9kZWAgb24gdG9wCiAgICBTV0FQCiAgICBTRU5EUkFXTVNHIC8vIGh0" + - "dHBzOi8vZ2l0aHViLmNvbS90YWN0LWxhbmcvdGFjdC9pc3N1ZXMvMTU1OAp9CgppbmxpbmUgZnVuIGVtaXQoYm9keTogQ2VsbCkgewogICAgLy8gZXh0X291dF9tc2df" + - "aW5mbyQxMSBzcmM6TXNnQWRkcmVzc0ludCBkZXN0Ok1zZ0FkZHJlc3NFeHQgY3JlYXRlZF9sdDp1aW50NjQgY3JlYXRlZF9hdDp1aW50MzIKICAgIC8vICAgICAgICAg" + - "ICAgICAgICAgICAgbWF5YmU6IHN0YXRlSW5pdCAoZmFsc2UpIGJvZHlSZWY6IGJvb2wgKHRydWUpCiAgICBsZXQgYzogQ2VsbCA9IGJlZ2luQ2VsbCgpCiAgICAgICAg" + - "LnN0b3JlVWludCgxNTIxMTgwNzIwMjczODc1MjgxNzk2MDQzODQ2NDUxMywgMTA0KQogICAgICAgIC5zdG9yZVJlZihib2R5KQogICAgICAgIC5lbmRDZWxsKCk7CiAg" + - "ICBuYXRpdmVTZW5kTWVzc2FnZShjLCAwKTsKfQoKYXNtIGZ1biBhY2NlcHRNZXNzYWdlKCkgeyBBQ0NFUFQgfQoKYXNtIGZ1biBjb21taXQoKSB7IENPTU1JVCB9Cg=="; + "LyBzMjogYGJvZHlgCiAgICAvLyBzMzogYG1vZGVgCgogICAgLy8gR3JvdXAgNTogRmluYWxpemluZyB0aGUgbWVzc2FnZQogICAgU1RESUNUIC8vIHN0b3JlIFN0YXRl" + + "SW5pdAogICAgU1RESUNUIC8vIHN0b3JlIGBib2R5YCBhcyByZWYgd2l0aCBhbiBleHRyYSBNYXliZSBiaXQsIHNpbmNlIGBib2R5YCBtaWdodCBiZSBudWxsCiAgICBF" + + "TkRDCiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBDZWxsCiAgICAvLyBzMTogYG1vZGVgCgogICAgLy8gR3JvdXAgNjogU2VuZGluZyB0aGUgbWVzc2Fn" + + "ZSwgd2l0aCBgbW9kZWAgb24gdG9wCiAgICBTV0FQCiAgICBTRU5EUkFXTVNHIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YWN0LWxhbmcvdGFjdC9pc3N1ZXMvMTU1OAp9" + + "CgppbmxpbmUgZnVuIGVtaXQoYm9keTogQ2VsbCkgewogICAgLy8gZXh0X291dF9tc2dfaW5mbyQxMSBzcmM6TXNnQWRkcmVzc0ludCBkZXN0Ok1zZ0FkZHJlc3NFeHQg" + + "Y3JlYXRlZF9sdDp1aW50NjQgY3JlYXRlZF9hdDp1aW50MzIKICAgIC8vICAgICAgICAgICAgICAgICAgICAgbWF5YmU6IHN0YXRlSW5pdCAoZmFsc2UpIGJvZHlSZWY6" + + "IGJvb2wgKHRydWUpCiAgICBsZXQgYzogQ2VsbCA9IGJlZ2luQ2VsbCgpCiAgICAgICAgLnN0b3JlVWludCgxNTIxMTgwNzIwMjczODc1MjgxNzk2MDQzODQ2NDUxMywg" + + "MTA0KQogICAgICAgIC5zdG9yZVJlZihib2R5KQogICAgICAgIC5lbmRDZWxsKCk7CiAgICBuYXRpdmVTZW5kTWVzc2FnZShjLCAwKTsKfQoKYXNtIGZ1biBhY2NlcHRN" + + "ZXNzYWdlKCkgeyBBQ0NFUFQgfQoKYXNtIGZ1biBjb21taXQoKSB7IENPTU1JVCB9Cg=="; files["std/text.tact"] = "Ly8KLy8gU3RyaW5nIGJ1aWxkZXIKLy8KCkBuYW1lKF9fdGFjdF9zdHJpbmdfYnVpbGRlcl9zdGFydF9zdHJpbmcpCm5hdGl2ZSBiZWdpblN0cmluZygpOiBTdHJpbmdC" + "dWlsZGVyOwoKQG5hbWUoX190YWN0X3N0cmluZ19idWlsZGVyX3N0YXJ0X2NvbW1lbnQpCm5hdGl2ZSBiZWdpbkNvbW1lbnQoKTogU3RyaW5nQnVpbGRlcjsKCkBuYW1l" +