Skip to content

Commit

Permalink
feat: Builder.storeMaybeRef, parseStdAddress and `parseVarAddress…
Browse files Browse the repository at this point in the history
…` stdlib functions (tact-lang#793)
  • Loading branch information
Gusarich authored Sep 5, 2024
1 parent dc70c18 commit 54be872
Show file tree
Hide file tree
Showing 8 changed files with 161 additions and 30 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `asm` bodies for module-level functions: PR [#769](https://github.com/tact-lang/tact/pull/769)
- Corresponding stdlib functions for new TVM instructions from 2023.07 and 2024.04 upgrades: PR [#331](https://github.com/tact-lang/tact/pull/331)
- `slice`, `rawSlice`, `ascii` and `crc32` built-in functions: PR [#787](https://github.com/tact-lang/tact/pull/787)
- `Builder.storeMaybeRef`, `parseStdAddress` and `parseVarAddress` stdlib functions: PR [#793](https://github.com/tact-lang/tact/pull/793)

### Changed

Expand Down
3 changes: 3 additions & 0 deletions cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@
"RAWRESERVE",
"rawslice",
"renamer",
"REWRITESTDADDR",
"REWRITEVARADDR",
"rparen",
"rugpull",
"rugpulled",
Expand All @@ -125,6 +127,7 @@
"STDICT",
"stdlib",
"STIX",
"STOPTREF",
"STREF",
"struct",
"structs",
Expand Down
60 changes: 32 additions & 28 deletions src/imports/stdlib.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,33 +133,34 @@ files['std/cells.tact'] =
'ZihzZWxmOiBCdWlsZGVyLCBjZWxsOiBDZWxsKTogQnVpbGRlciB7IFNUUkVGIH0KCmFzbSBleHRlbmRzIGZ1biBzdG9yZVNsaWNlKHNlbGY6IEJ1aWxkZXIsIGNlbGw6' +
'IFNsaWNlKTogQnVpbGRlciB7IFNUU0xJQ0VSIH0KCmFzbSBleHRlbmRzIGZ1biBzdG9yZUJ1aWxkZXIoc2VsZjogQnVpbGRlciwgY2VsbDogQnVpbGRlcik6IEJ1aWxk' +
'ZXIgeyBTVEJSIH0KCkBuYW1lKF9fdGFjdF9zdG9yZV9hZGRyZXNzKQpleHRlbmRzIG5hdGl2ZSBzdG9yZUFkZHJlc3Moc2VsZjogQnVpbGRlciwgYWRkcmVzczogQWRk' +
'cmVzcyk6IEJ1aWxkZXI7Cgphc20gZXh0ZW5kcyBmdW4gZW5kQ2VsbChzZWxmOiBCdWlsZGVyKTogQ2VsbCB7IEVOREMgfQoKYXNtIGV4dGVuZHMgZnVuIHJlZnMoc2Vs' +
'ZjogQnVpbGRlcik6IEludCB7IEJSRUZTIH0KCmFzbSBleHRlbmRzIGZ1biBiaXRzKHNlbGY6IEJ1aWxkZXIpOiBJbnQgeyBCQklUUyB9CgovLwovLyBTbGljZQovLwoK' +
'YXNtIGV4dGVuZHMgZnVuIGJlZ2luUGFyc2Uoc2VsZjogQ2VsbCk6IFNsaWNlIHsgQ1RPUyB9Cgphc20oLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRSZWYo' +
'c2VsZjogU2xpY2UpOiBDZWxsIHsgTERSRUYgfQoKYXNtIGV4dGVuZHMgZnVuIHByZWxvYWRSZWYoc2VsZjogU2xpY2UpOiBDZWxsIHsgUExEUkVGIH0KCi8vIHNwZWNp' +
'YWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiTERTTElDRVgiCkBuYW1lKGxvYWRfYml0cykKZXh0ZW5kcyBtdXRh' +
'dGVzIG5hdGl2ZSBsb2FkQml0cyhzZWxmOiBTbGljZSwgbDogSW50KTogU2xpY2U7CgovLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVyLCBzbyBub3Qg' +
'cmVwbGFjZWQgd2l0aCBhc20gIlBMRFNMSUNFWCIKQG5hbWUocHJlbG9hZF9iaXRzKQpleHRlbmRzIG5hdGl2ZSBwcmVsb2FkQml0cyhzZWxmOiBTbGljZSwgbDogSW50' +
'KTogU2xpY2U7CgovLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVyLCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIkxESVgiCkBuYW1lKGxvYWRfaW50' +
'KQpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRJbnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGls' +
'ZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiUExESVgiCkBuYW1lKHByZWxvYWRfaW50KQpleHRlbmRzIG5hdGl2ZSBwcmVsb2FkSW50KHNlbGY6IFNsaWNlLCBs' +
'OiBJbnQpOiBJbnQ7CgovLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVyLCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIkxEVVgiCkBuYW1lKGxvYWRf' +
'dWludCkKZXh0ZW5kcyBtdXRhdGVzIG5hdGl2ZSBsb2FkVWludChzZWxmOiBTbGljZSwgbDogSW50KTogSW50OwoKLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBj' +
'b21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERVWCIKQG5hbWUocHJlbG9hZF91aW50KQpleHRlbmRzIG5hdGl2ZSBwcmVsb2FkVWludChzZWxmOiBT' +
'bGljZSwgbDogSW50KTogSW50OwoKYXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkQm9vbChzZWxmOiBTbGljZSk6IEJvb2wgeyAxIExESSB9Cgphc20o' +
'LT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRCaXQoc2VsZjogU2xpY2UpOiBCb29sIHsgMSBMREkgfQoKYXNtKCAtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBm' +
'dW4gbG9hZENvaW5zKHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJVSU5UMTYgfQoKQG5hbWUoX190YWN0X2xvYWRfYWRkcmVzcykKZXh0ZW5kcyBtdXRhdGVzIG5hdGl2' +
'ZSBsb2FkQWRkcmVzcyhzZWxmOiBTbGljZSk6IEFkZHJlc3M7Cgphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwQml0cyhzZWxmOiBTbGljZSwgbDogSW50KSB7IFNE' +
'U0tJUEZJUlNUIH0KCmFzbSBleHRlbmRzIGZ1biBlbmRQYXJzZShzZWxmOiBTbGljZSkgeyBFTkRTIH0KCi8vCi8vIFNsaWNlIHNpemUKLy8KCmFzbSBleHRlbmRzIGZ1' +
'biByZWZzKHNlbGY6IFNsaWNlKTogSW50IHsgU1JFRlMgfQoKYXNtIGV4dGVuZHMgZnVuIGJpdHMoc2VsZjogU2xpY2UpOiBJbnQgeyBTQklUUyB9Cgphc20gZXh0ZW5k' +
'cyBmdW4gZW1wdHkoc2VsZjogU2xpY2UpOiBCb29sIHsgU0VNUFRZIH0KCmFzbSBleHRlbmRzIGZ1biBkYXRhRW1wdHkoc2VsZjogU2xpY2UpOiBCb29sIHsgU0RFTVBU' +
'WSB9Cgphc20gZXh0ZW5kcyBmdW4gcmVmc0VtcHR5KHNlbGY6IFNsaWNlKTogQm9vbCB7IFNSRU1QVFkgfQoKLy8KLy8gQ29udmVyc2lvbnMKLy8KCmlubGluZSBleHRl' +
'bmRzIGZ1biBhc1NsaWNlKHNlbGY6IEJ1aWxkZXIpOiBTbGljZSB7CiAgICByZXR1cm4gc2VsZi5lbmRDZWxsKCkuYmVnaW5QYXJzZSgpOwp9CgppbmxpbmUgZXh0ZW5k' +
'cyBmdW4gYXNTbGljZShzZWxmOiBDZWxsKTogU2xpY2UgewogICAgcmV0dXJuIHNlbGYuYmVnaW5QYXJzZSgpOwp9CgppbmxpbmUgZXh0ZW5kcyBmdW4gYXNDZWxsKHNl' +
'bGY6IFNsaWNlKTogQ2VsbCB7CiAgICByZXR1cm4gYmVnaW5DZWxsKCkKICAgICAgICAuc3RvcmVTbGljZShzZWxmKQogICAgICAgIC5lbmRDZWxsKCk7Cn0KCmlubGlu' +
'ZSBleHRlbmRzIGZ1biBhc0NlbGwoc2VsZjogQnVpbGRlcik6IENlbGwgewogICAgcmV0dXJuIHNlbGYuZW5kQ2VsbCgpOwp9CgppbmxpbmUgZnVuIGVtcHR5Q2VsbCgp' +
'OiBDZWxsIHsKICAgIHJldHVybiBiZWdpbkNlbGwoKS5lbmRDZWxsKCk7Cn0KCmlubGluZSBmdW4gZW1wdHlTbGljZSgpOiBTbGljZSB7CiAgICByZXR1cm4gZW1wdHlD' +
'ZWxsKCkuYXNTbGljZSgpOwp9';
'cmVzcyk6IEJ1aWxkZXI7Cgphc20oY2VsbCBzZWxmKSBleHRlbmRzIGZ1biBzdG9yZU1heWJlUmVmKHNlbGY6IEJ1aWxkZXIsIGNlbGw6IENlbGw/KTogQnVpbGRlciB7' +
'IFNUT1BUUkVGIH0KCmFzbSBleHRlbmRzIGZ1biBlbmRDZWxsKHNlbGY6IEJ1aWxkZXIpOiBDZWxsIHsgRU5EQyB9Cgphc20gZXh0ZW5kcyBmdW4gcmVmcyhzZWxmOiBC' +
'dWlsZGVyKTogSW50IHsgQlJFRlMgfQoKYXNtIGV4dGVuZHMgZnVuIGJpdHMoc2VsZjogQnVpbGRlcik6IEludCB7IEJCSVRTIH0KCi8vCi8vIFNsaWNlCi8vCgphc20g' +
'ZXh0ZW5kcyBmdW4gYmVnaW5QYXJzZShzZWxmOiBDZWxsKTogU2xpY2UgeyBDVE9TIH0KCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZFJlZihzZWxm' +
'OiBTbGljZSk6IENlbGwgeyBMRFJFRiB9Cgphc20gZXh0ZW5kcyBmdW4gcHJlbG9hZFJlZihzZWxmOiBTbGljZSk6IENlbGwgeyBQTERSRUYgfQoKLy8gc3BlY2lhbCB0' +
'cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJMRFNMSUNFWCIKQG5hbWUobG9hZF9iaXRzKQpleHRlbmRzIG11dGF0ZXMg' +
'bmF0aXZlIGxvYWRCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBTbGljZTsKCi8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBs' +
'YWNlZCB3aXRoIGFzbSAiUExEU0xJQ0VYIgpAbmFtZShwcmVsb2FkX2JpdHMpCmV4dGVuZHMgbmF0aXZlIHByZWxvYWRCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBT' +
'bGljZTsKCi8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiTERJWCIKQG5hbWUobG9hZF9pbnQpCmV4' +
'dGVuZHMgbXV0YXRlcyBuYXRpdmUgbG9hZEludChzZWxmOiBTbGljZSwgbDogSW50KTogSW50OwoKLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwg' +
'c28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERJWCIKQG5hbWUocHJlbG9hZF9pbnQpCmV4dGVuZHMgbmF0aXZlIHByZWxvYWRJbnQoc2VsZjogU2xpY2UsIGw6IElu' +
'dCk6IEludDsKCi8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiTERVWCIKQG5hbWUobG9hZF91aW50' +
'KQpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRVaW50KHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBJbnQ7CgovLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBp' +
'bGVyLCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIlBMRFVYIgpAbmFtZShwcmVsb2FkX3VpbnQpCmV4dGVuZHMgbmF0aXZlIHByZWxvYWRVaW50KHNlbGY6IFNsaWNl' +
'LCBsOiBJbnQpOiBJbnQ7Cgphc20oLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRCb29sKHNlbGY6IFNsaWNlKTogQm9vbCB7IDEgTERJIH0KCmFzbSgtPiAx' +
'IDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZEJpdChzZWxmOiBTbGljZSk6IEJvb2wgeyAxIExESSB9Cgphc20oIC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBs' +
'b2FkQ29pbnMoc2VsZjogU2xpY2UpOiBJbnQgeyBMRFZBUlVJTlQxNiB9CgpAbmFtZShfX3RhY3RfbG9hZF9hZGRyZXNzKQpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxv' +
'YWRBZGRyZXNzKHNlbGY6IFNsaWNlKTogQWRkcmVzczsKCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpIHsgU0RTS0lQ' +
'RklSU1QgfQoKYXNtIGV4dGVuZHMgZnVuIGVuZFBhcnNlKHNlbGY6IFNsaWNlKSB7IEVORFMgfQoKLy8KLy8gU2xpY2Ugc2l6ZQovLwoKYXNtIGV4dGVuZHMgZnVuIHJl' +
'ZnMoc2VsZjogU2xpY2UpOiBJbnQgeyBTUkVGUyB9Cgphc20gZXh0ZW5kcyBmdW4gYml0cyhzZWxmOiBTbGljZSk6IEludCB7IFNCSVRTIH0KCmFzbSBleHRlbmRzIGZ1' +
'biBlbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTRU1QVFkgfQoKYXNtIGV4dGVuZHMgZnVuIGRhdGFFbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTREVNUFRZIH0K' +
'CmFzbSBleHRlbmRzIGZ1biByZWZzRW1wdHkoc2VsZjogU2xpY2UpOiBCb29sIHsgU1JFTVBUWSB9CgovLwovLyBDb252ZXJzaW9ucwovLwoKaW5saW5lIGV4dGVuZHMg' +
'ZnVuIGFzU2xpY2Uoc2VsZjogQnVpbGRlcik6IFNsaWNlIHsKICAgIHJldHVybiBzZWxmLmVuZENlbGwoKS5iZWdpblBhcnNlKCk7Cn0KCmlubGluZSBleHRlbmRzIGZ1' +
'biBhc1NsaWNlKHNlbGY6IENlbGwpOiBTbGljZSB7CiAgICByZXR1cm4gc2VsZi5iZWdpblBhcnNlKCk7Cn0KCmlubGluZSBleHRlbmRzIGZ1biBhc0NlbGwoc2VsZjog' +
'U2xpY2UpOiBDZWxsIHsKICAgIHJldHVybiBiZWdpbkNlbGwoKQogICAgICAgIC5zdG9yZVNsaWNlKHNlbGYpCiAgICAgICAgLmVuZENlbGwoKTsKfQoKaW5saW5lIGV4' +
'dGVuZHMgZnVuIGFzQ2VsbChzZWxmOiBCdWlsZGVyKTogQ2VsbCB7CiAgICByZXR1cm4gc2VsZi5lbmRDZWxsKCk7Cn0KCmlubGluZSBmdW4gZW1wdHlDZWxsKCk6IENl' +
'bGwgewogICAgcmV0dXJuIGJlZ2luQ2VsbCgpLmVuZENlbGwoKTsKfQoKaW5saW5lIGZ1biBlbXB0eVNsaWNlKCk6IFNsaWNlIHsKICAgIHJldHVybiBlbXB0eUNlbGwo' +
'KS5hc1NsaWNlKCk7Cn0=';
files['std/config.tact'] =
'YXNtIGZ1biBnZXRDb25maWdQYXJhbShpZDogSW50KTogQ2VsbD8geyBDT05GSUdPUFRQQVJBTSB9Cg==';
files['std/context.tact'] =
Expand Down Expand Up @@ -196,7 +197,10 @@ files['std/contract.tact'] =
'ZGVkIHZhbHVlcykgZnJvbSBgZndkX2ZlZWAgcGFyc2VkIGZyb20gaW5jb21pbmcgbWVzc2FnZS4gYGlzX21hc3RlcmNoYWluYCBpcyB0cnVlIGlmIHRoZSBzb3VyY2Ug' +
'b3IgdGhlIGRlc3RpbmF0aW9uIGlzIGluIG1hc3RlcmNoYWluLCBmYWxzZSBpZiBib3RoIGFyZSBpbiBiYXNlY2hhaW4uCmFzbSBmdW4gZ2V0T3JpZ2luYWxGd2RGZWUo' +
'ZndkX2ZlZTogSW50LCBpc19tYXN0ZXJjaGFpbjogQm9vbCk6IEludCB7IEdFVE9SSUdJTkFMRldERkVFIH0KCi8vIEN1cnJlbnQgZGVidCBmb3Igc3RvcmFnZSBmZWUg' +
'aW4gbmFub3RvbnMuCmFzbSBmdW4gbXlTdG9yYWdlRHVlKCk6IEludCB7IERVRVBBWU1FTlQgfQo=';
'aW4gbmFub3RvbnMuCmFzbSBmdW4gbXlTdG9yYWdlRHVlKCk6IEludCB7IERVRVBBWU1FTlQgfQoKc3RydWN0IFN0ZEFkZHJlc3MgewogICAgd29ya2NoYWluOiBJbnQg' +
'YXMgaW50ODsKICAgIGFkZHJlc3M6IEludCBhcyB1aW50MjU2Owp9CgpzdHJ1Y3QgVmFyQWRkcmVzcyB7CiAgICB3b3JrY2hhaW46IEludCBhcyBpbnQzMjsKICAgIGFk' +
'ZHJlc3M6IFNsaWNlOwp9Cgphc20gZnVuIHBhcnNlU3RkQWRkcmVzcyhzbGljZTogU2xpY2UpOiBTdGRBZGRyZXNzIHsgUkVXUklURVNUREFERFIgfQoKYXNtIGZ1biBw' +
'YXJzZVZhckFkZHJlc3Moc2xpY2U6IFNsaWNlKTogVmFyQWRkcmVzcyB7IFJFV1JJVEVWQVJBRERSIH0=';
files['std/crypto.tact'] =
'YXNtIGV4dGVuZHMgZnVuIGhhc2goc2VsZjogQ2VsbCk6IEludCB7IEhBU0hDVSB9Cgphc20gZXh0ZW5kcyBmdW4gaGFzaChzZWxmOiBTbGljZSk6IEludCB7IEhBU0hT' +
'VSB9Cgphc20gZnVuIGNoZWNrU2lnbmF0dXJlKGhhc2g6IEludCwgc2lnbmF0dXJlOiBTbGljZSwgcHVibGljX2tleTogSW50KTogQm9vbCB7IENIS1NJR05VIH0KCmFz' +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,53 @@ exports[`local-type-inference should automatically set types for let statements
"header": null,
"name": "StateInit",
},
{
"fields": [
{
"name": "workchain",
"type": {
"format": 8,
"kind": "simple",
"optional": false,
"type": "int",
},
},
{
"name": "address",
"type": {
"format": 256,
"kind": "simple",
"optional": false,
"type": "uint",
},
},
],
"header": null,
"name": "StdAddress",
},
{
"fields": [
{
"name": "workchain",
"type": {
"format": 32,
"kind": "simple",
"optional": false,
"type": "int",
},
},
{
"name": "address",
"type": {
"kind": "simple",
"optional": false,
"type": "slice",
},
},
],
"header": null,
"name": "VarAddress",
},
{
"fields": [
{
Expand Down
12 changes: 12 additions & 0 deletions src/test/e2e-emulated/contracts/stdlib.tact
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,16 @@ contract StdlibTest {
get fun tvm_2024_04_upgrade(): Int {
return getComputeFee(1000, false) + getStorageFee(1000, 1000, 1000, false) + getForwardFee(1000, 1000, false) + getSimpleComputeFee(1000, false) + getSimpleForwardFee(1000, 1000, false) + getOriginalFwdFee(1000, false) + myStorageDue();
}

get fun storeMaybeRef(bl: Builder, c: Cell?): Builder {
return bl.storeMaybeRef(c);
}

get fun parseStdAddress(slice: Slice): StdAddress {
return parseStdAddress(slice);
}

get fun parseVarAddress(slice: Slice): VarAddress {
return parseVarAddress(slice);
}
}
52 changes: 50 additions & 2 deletions src/test/e2e-emulated/stdlib.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { beginCell, toNano } from "@ton/core";
import { Address, beginCell, toNano } from "@ton/core";
import { Blockchain, SandboxContract, TreasuryContract } from "@ton/sandbox";
import { StdlibTest } from "./contracts/output/stdlib_StdlibTest";
import "@ton/test-utils";
Expand Down Expand Up @@ -55,7 +55,55 @@ describe("stdlib", () => {
.toString(),
).toBe(beginCell().storeBit(true).endCell().toString());

expect(await contract.getTvm_2023_07Upgrade()).toEqual(1255n);
expect(await contract.getTvm_2023_07Upgrade()).toEqual(1355n);
expect(await contract.getTvm_2024_04Upgrade()).toEqual(82009144n);

expect(
(
await contract.getStoreMaybeRef(
beginCell(),
beginCell().storeUint(123, 64).endCell(),
)
).endCell(),
).toEqualCell(
beginCell()
.storeMaybeRef(beginCell().storeUint(123, 64).endCell())
.endCell(),
);

expect(
(await contract.getStoreMaybeRef(beginCell(), null)).endCell(),
).toEqualCell(beginCell().storeMaybeRef(null).endCell());

const addrStd = await contract.getParseStdAddress(
beginCell()
.storeAddress(
Address.parse(
"0:4a81708d2cf7b15a1b362fbf64880451d698461f52f05f145b36c08517d76873",
),
)
.endCell()
.asSlice(),
);
expect(addrStd.workchain).toBe(0n);
expect(addrStd.address).toBe(
BigInt(
"0x4a81708d2cf7b15a1b362fbf64880451d698461f52f05f145b36c08517d76873",
),
);

const addrVar = await contract.getParseVarAddress(
beginCell()
.storeUint(6, 3)
.storeUint(123, 9)
.storeUint(234, 32)
.storeUint(345, 123)
.endCell()
.asSlice(),
);
expect(addrVar.workchain).toBe(234n);
expect(addrVar.address.asCell()).toEqualCell(
beginCell().storeUint(345, 123).endCell(),
);
});
});
2 changes: 2 additions & 0 deletions stdlib/std/cells.tact
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ asm extends fun storeBuilder(self: Builder, cell: Builder): Builder { STBR }
@name(__tact_store_address)
extends native storeAddress(self: Builder, address: Address): Builder;

asm(cell self) extends fun storeMaybeRef(self: Builder, cell: Cell?): Builder { STOPTREF }

asm extends fun endCell(self: Builder): Cell { ENDC }

asm extends fun refs(self: Builder): Int { BREFS }
Expand Down
14 changes: 14 additions & 0 deletions stdlib/std/contract.tact
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,17 @@ asm fun getOriginalFwdFee(fwd_fee: Int, is_masterchain: Bool): Int { GETORIGINAL

// Current debt for storage fee in nanotons.
asm fun myStorageDue(): Int { DUEPAYMENT }

struct StdAddress {
workchain: Int as int8;
address: Int as uint256;
}

struct VarAddress {
workchain: Int as int32;
address: Slice;
}

asm fun parseStdAddress(slice: Slice): StdAddress { REWRITESTDADDR }

asm fun parseVarAddress(slice: Slice): VarAddress { REWRITEVARADDR }

0 comments on commit 54be872

Please sign in to comment.