Skip to content

Commit

Permalink
Merge pull request #2 from ton-blockchain/tolk-v0.7
Browse files Browse the repository at this point in the history
Tolk v0.7 wasm and stdlib
  • Loading branch information
tolk-vm authored Jan 20, 2025
2 parents 629ece8 + c51ab7f commit e3b125b
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 80 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@ton/tolk-js",
"version": "0.6.0",
"version": "0.7.0",
"description": "Tolk Language compiler (next-generation FunC)",
"main": "dist/index.js",
"bin": "./dist/cli.js",
Expand Down
42 changes: 21 additions & 21 deletions src/tolk-stdlib/common.tolk
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Standard library for Tolk (LGPL licence).
// It contains common functions that are available out of the box, the user doesn't have to import anything.
// More specific functions are required to be imported explicitly, like "@stdlib/tvm-dicts".
tolk 0.6
tolk 0.7

/**
Tuple manipulation primitives.
Expand All @@ -17,17 +17,17 @@ fun createEmptyTuple(): tuple
/// Appends a value to tuple, resulting in `Tuple t' = (x1, ..., xn, value)`.
/// If its size exceeds 255, throws a type check exception.
@pure
fun tuplePush<X>(mutate self: tuple, value: X): void
fun tuplePush<T>(mutate self: tuple, value: T): void
asm "TPUSH";

/// Returns the first element of a non-empty tuple.
@pure
fun tupleFirst<X>(t: tuple): X
fun tupleFirst<T>(t: tuple): T
asm "FIRST";

/// Returns the [`index`]-th element of a tuple.
@pure
fun tupleAt<X>(t: tuple, index: int): X
fun tupleAt<T>(t: tuple, index: int): T
builtin;

/// Returns the size of a tuple (elements count in it).
Expand All @@ -37,7 +37,7 @@ fun tupleSize(t: tuple): int

/// Returns the last element of a non-empty tuple.
@pure
fun tupleLast(t: tuple): int
fun tupleLast<T>(t: tuple): T
asm "LAST";


Expand Down Expand Up @@ -205,7 +205,7 @@ fun stringHash(s: slice): int
/// That is, if [hash] is computed as the hash of some data, these data are hashed twice,
/// the second hashing occurring inside `CHKSIGNS`.
@pure
fun isSignatureValid(hash: int, signature: slice, publicKey: int): int
fun isSignatureValid(hash: int, signature: slice, publicKey: int): bool
asm "CHKSIGNU";

/// Checks whether [signature] is a valid Ed25519-signature of the data portion of `slice data` using `publicKey`,
Expand All @@ -214,7 +214,7 @@ fun isSignatureValid(hash: int, signature: slice, publicKey: int): int
/// The verification of Ed25519 signatures is the standard one,
/// with sha256 used to reduce [data] to the 256-bit number that is actually signed.
@pure
fun isSliceSignatureValid(data: slice, signature: slice, publicKey: int): int
fun isSliceSignatureValid(data: slice, signature: slice, publicKey: int): bool
asm "CHKSIGNS";

/// Generates a new pseudo-random unsigned 256-bit integer x.
Expand Down Expand Up @@ -259,14 +259,14 @@ fun randomizeByLogicalTime(): void
/// otherwise the computation is aborted before visiting the `(maxCells + 1)`-st cell and
/// a zero flag is returned to indicate failure. If [c] is `null`, returns `x = y = z = 0`.
@pure
fun calculateCellSize(c: cell, maxCells: int): (int, int, int, int)
fun calculateCellSize(c: cell, maxCells: int): (int, int, int, bool)
asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";

/// Similar to [calculateCellSize], but accepting a `slice` [s] instead of a `cell`.
/// The returned value of `x` does not take into account the cell that contains the `slice` [s] itself;
/// however, the data bits and the cell references of [s] are accounted for in `y` and `z`.
@pure
fun calculateSliceSize(s: slice, maxCells: int): (int, int, int, int)
fun calculateSliceSize(s: slice, maxCells: int): (int, int, int, bool)
asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";

/// A non-quiet version of [calculateCellSize] that throws a cell overflow exception (`8`) on failure.
Expand Down Expand Up @@ -306,11 +306,11 @@ fun getBuilderDepth(b: builder): int
*/

/// Dump a variable [x] to the debug log.
fun debugPrint<X>(x: X): void
fun debugPrint<T>(x: T): void
builtin;

/// Dump a string [x] to the debug log.
fun debugPrintString<X>(x: X): void
fun debugPrintString<T>(x: T): void
builtin;

/// Dumps the stack (at most the top 255 values) and shows the total stack depth.
Expand Down Expand Up @@ -382,7 +382,7 @@ fun loadCoins(mutate self: slice): int

/// Loads bool (-1 or 0) from a slice
@pure
fun loadBool(mutate self: slice): int
fun loadBool(mutate self: slice): bool
asm( -> 1 0) "1 LDI";

/// Shifts a slice pointer to [len] bits forward, mutating the slice.
Expand Down Expand Up @@ -482,7 +482,7 @@ fun storeCoins(mutate self: builder, x: int): self
/// Stores bool (-1 or 0) into a builder.
/// Attention: true value is `-1`, not 1! If you pass `1` here, TVM will throw an exception.
@pure
fun storeBool(mutate self: builder, x: int): self
fun storeBool(mutate self: builder, x: bool): self
asm(x self) "1 STI";

/// Stores dictionary (represented by TVM `cell` or `null`) into a builder.
Expand Down Expand Up @@ -529,22 +529,22 @@ fun getRemainingBitsAndRefsCount(self: slice): (int, int)

/// Checks whether a slice is empty (i.e., contains no bits of data and no cell references).
@pure
fun isEndOfSlice(self: slice): int
fun isEndOfSlice(self: slice): bool
asm "SEMPTY";

/// Checks whether a slice has no bits of data.
@pure
fun isEndOfSliceBits(self: slice): int
fun isEndOfSliceBits(self: slice): bool
asm "SDEMPTY";

/// Checks whether a slice has no references.
@pure
fun isEndOfSliceRefs(self: slice): int
fun isEndOfSliceRefs(self: slice): bool
asm "SREMPTY";

/// Checks whether data parts of two slices coinside.
@pure
fun isSliceBitsEqual(self: slice, b: slice): int
fun isSliceBitsEqual(self: slice, b: slice): bool
asm "SDEQ";

/// Returns the number of cell references already stored in a builder.
Expand Down Expand Up @@ -621,10 +621,10 @@ fun parseStandardAddress(s: slice): (int, int)
fun createAddressNone(): slice
asm "b{00} PUSHSLICE";

/// Returns if a slice pointer contains an empty address (`-1` for true, `0` for false, as always).
/// Returns if a slice pointer contains an empty address.
/// In other words, a slice starts with two `0` bits (TL addr_none$00).
@pure
fun addressIsNone(s: slice): int
fun addressIsNone(s: slice): bool
asm "2 PLDU" "0 EQINT";


Expand Down Expand Up @@ -677,8 +677,8 @@ fun loadMessageFlags(mutate self: slice): int
/// Having msgFlags (4 bits), check that a message is bounced.
/// Effectively, it's `msgFlags & 1` (the lowest bit present).
@pure
fun isMessageBounced(msgFlags: int): int
asm "1 PUSHINT" "AND";
fun isMessageBounced(msgFlags: int): bool
asm "2 PUSHINT" "MODR";

/// Skip 0xFFFFFFFF prefix (when a message is bounced).
@pure
Expand Down
8 changes: 7 additions & 1 deletion src/tolk-stdlib/gas-payments.tolk
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// A part of standard library for Tolk
tolk 0.6
tolk 0.7

/**
Gas and payment related primitives.
Expand Down Expand Up @@ -61,3 +61,9 @@ fun calculateOriginalMessageFee(workchain: int, incomingFwdFee: int): int
/// If it has no debt, `0` is returned.
fun getMyStorageDuePayment(): int
asm "DUEPAYMENT";

/// Returns the amount of nanotoncoins charged for storage.
/// (during storage phase preceeding to current computation phase)
@pure
fun getMyStoragePaidPayment(): int
asm "STORAGEFEES";
2 changes: 1 addition & 1 deletion src/tolk-stdlib/lisp-lists.tolk
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// A part of standard library for Tolk
tolk 0.6
tolk 0.7

/**
Lisp-style lists are nested 2-elements tuples: `(1, (2, (3, null)))` represents list `[1, 2, 3]`.
Expand Down
Loading

0 comments on commit e3b125b

Please sign in to comment.