> ## Documentation Index
> Fetch the complete documentation index at: https://companyname-a7d5b98e-ton-storage.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Standard library of Tolk

export const Aside = ({type = "note", title = "", icon = "", iconType = "regular", children}) => {
  const asideVariants = ["note", "tip", "caution", "danger"];
  const asideComponents = {
    note: {
      outerStyle: "border-sky-500/20 bg-sky-50/50 dark:border-sky-500/30 dark:bg-sky-500/10",
      innerStyle: "text-sky-900 dark:text-sky-200",
      calloutType: "note",
      icon: <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="w-4 h-4 text-sky-500" aria-label="Note">
          <path fill-rule="evenodd" clip-rule="evenodd" d="M7 1.3C10.14 1.3 12.7 3.86 12.7 7C12.7 10.14 10.14 12.7 7 12.7C5.48908 12.6974 4.0408 12.096 2.97241 11.0276C1.90403 9.9592 1.30264 8.51092 1.3 7C1.3 3.86 3.86 1.3 7 1.3ZM7 0C3.14 0 0 3.14 0 7C0 10.86 3.14 14 7 14C10.86 14 14 10.86 14 7C14 3.14 10.86 0 7 0ZM8 3H6V8H8V3ZM8 9H6V11H8V9Z"></path>
        </svg>
    },
    tip: {
      outerStyle: "border-emerald-500/20 bg-emerald-50/50 dark:border-emerald-500/30 dark:bg-emerald-500/10",
      innerStyle: "text-emerald-900 dark:text-emerald-200",
      calloutType: "tip",
      icon: <svg width="11" height="14" viewBox="0 0 11 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="text-emerald-600 dark:text-emerald-400/80 w-3.5 h-auto" aria-label="Tip">
          <path d="M3.12794 12.4232C3.12794 12.5954 3.1776 12.7634 3.27244 12.907L3.74114 13.6095C3.88471 13.8248 4.21067 14 4.46964 14H6.15606C6.41415 14 6.74017 13.825 6.88373 13.6095L7.3508 12.9073C7.43114 12.7859 7.49705 12.569 7.49705 12.4232L7.50055 11.3513H3.12521L3.12794 12.4232ZM5.31288 0C2.52414 0.00875889 0.5 2.26889 0.5 4.78826C0.5 6.00188 0.949566 7.10829 1.69119 7.95492C2.14321 8.47011 2.84901 9.54727 3.11919 10.4557C3.12005 10.4625 3.12175 10.4698 3.12261 10.4771H7.50342C7.50427 10.4698 7.50598 10.463 7.50684 10.4557C7.77688 9.54727 8.48281 8.47011 8.93484 7.95492C9.67728 7.13181 10.1258 6.02703 10.1258 4.78826C10.1258 2.15486 7.9709 0.000106649 5.31288 0ZM7.94902 7.11267C7.52078 7.60079 6.99082 8.37878 6.6077 9.18794H4.02051C3.63739 8.37878 3.10743 7.60079 2.67947 7.11294C2.11997 6.47551 1.8126 5.63599 1.8126 4.78826C1.8126 3.09829 3.12794 1.31944 5.28827 1.3126C7.2435 1.3126 8.81315 2.88226 8.81315 4.78826C8.81315 5.63599 8.50688 6.47551 7.94902 7.11267ZM4.87534 2.18767C3.66939 2.18767 2.68767 3.16939 2.68767 4.37534C2.68767 4.61719 2.88336 4.81288 3.12521 4.81288C3.36705 4.81288 3.56274 4.61599 3.56274 4.37534C3.56274 3.6515 4.1515 3.06274 4.87534 3.06274C5.11719 3.06274 5.31288 2.86727 5.31288 2.62548C5.31288 2.38369 5.11599 2.18767 4.87534 2.18767Z"></path>
        </svg>
    },
    caution: {
      outerStyle: "border-amber-500/20 bg-amber-50/50 dark:border-amber-500/30 dark:bg-amber-500/10",
      innerStyle: "text-amber-900 dark:text-amber-200",
      calloutType: "warning",
      icon: <svg className="flex-none w-5 h-5 text-amber-400 dark:text-amber-300/80" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" aria-label="Warning">
          <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
        </svg>
    },
    danger: {
      outerStyle: "border-red-500/20 bg-red-50/50 dark:border-red-500/30 dark:bg-red-500/10",
      innerStyle: "text-red-900 dark:text-red-200",
      calloutType: "danger",
      icon: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" className="text-red-600 dark:text-red-400/80 w-4 h-4" aria-label="Danger">
          <path d="M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zm41.6-48c-4.3 7.4-4.3 16.6 0 24l88.3 152.9c4.3 7.4 12.2 12 20.8 12l176.6 0c8.6 0 16.5-4.6 20.8-12L453.4 268c4.3-7.4 4.3-16.6 0-24L365.1 91.1c-4.3-7.4-12.2-12-20.8-12l-176.6 0c-8.6 0-16.5 4.6-20.8 12L58.6 244zM256 128c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"></path>
        </svg>
    }
  };
  let variant = type;
  let gotInvalidVariant = false;
  if (!asideVariants.includes(type)) {
    gotInvalidVariant = true;
    variant = "danger";
  }
  const iconVariants = ["regular", "solid", "light", "thin", "sharp-solid", "duotone", "brands"];
  if (!iconVariants.includes(iconType)) {
    iconType = "regular";
  }
  return <>
      <div className={`callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border ${asideComponents[variant].outerStyle}`} data-callout-type={asideComponents[variant].calloutType}>
        <div className="mt-0.5 w-4" data-component-part="callout-icon">
          {}
          {icon === "" ? asideComponents[variant].icon : <Icon icon={icon} iconType={iconType} size={14} />}
        </div>
        <div className={`text-sm prose min-w-0 w-full ${asideComponents[variant].innerStyle}`} data-component-part="callout-content">
          {gotInvalidVariant ? <p>
              <span className="font-bold">
                Invalid <code>type</code> passed!
              </span>
              <br />
              <span className="font-bold">Received: </span>
              {type}
              <br />
              <span className="font-bold">Expected one of: </span>
              {asideVariants.join(", ")}
            </p> : <>
              {title && <p className="font-bold">{title}</p>}
              {children}
            </>}
        </div>
      </div>
    </>;
};

Tolk provides many functions for everyday use, available out of the box.
They are called "standard library", or "stdlib".

<Aside type="tip">
  An IDE auto-completes all functions.
  With Cmd+Click or Ctrl+Click, navigate to any function/method and read detailed comments right in an editor.
</Aside>

## Compile-time calculations and embeds

Constant data can be embedded into a contract by dedicated functions.

### address("UQ...")

A function `address()` embeds a constant address:

```tolk theme={null}
const REFUND_ADDR = address("EQCRDM9h4k3UJdOePPuyX40mCgA4vxge5Dc5vjBR8djbEKC5")
```

### stringCrc32("some\_str") and other

Several functions operate on strings.
They all expect a constant literal and are evaluated to `int` at compile-time.

```tolk theme={null}
// calculates crc32 of a string
const crc32 = stringCrc32("some_str") // = 4013618352 = 0xEF3AF4B0

// calculates crc16 (XMODEM) of a string
const crc16 = stringCrc16("some_str") // = 53407 = 0xD09F

// calculates sha256 of a string and returns 256-bit integer
const hash = stringSha256("some_crypto_key")

// calculates sha256 of a string and takes the first 32 bits
const minihash = stringSha256_32("some_crypto_key")

// interprets an N-chars ascii string as a number in base 256
const base256 = stringToBase256("AB") // = 16706 (65*256 + 66)
```

### ton("0.05")

Calculates "nanotoncoins" at compile-time.

```tolk theme={null}
const ONE_TON = ton("1");     // `coins`, value: 1000000000

fun calcCost() {
    val cost = ton("0.05");   // `coins`, value: 50000000
    return ONE_TON + cost;
}
```

## Common functions, available always

All the functions in this section are visible everywhere.
Actually, they are placed in `@stdlib/common.tolk`, which is auto-imported.

### Tuples

Tuple-related functions allow interacting with [tuple types](/languages/tolk/types/tuples)
(a dynamic container up to 255 elements).

#### createEmptyTuple

Creates a tuple with zero elements.

#### tuple.push, tuple.get, etc.

An IDE suggests all methods after a dot:

```tolk theme={null}
fun demo() {
    var t = createEmptyTuple();
    t.push(123);
    return t.get<int>(0);       // 123
}
```

#### T.toTuple and T.fromTuple

Packs any object from a stack into a tuple (and back).
If a value occupies N stack slots, the resulting tuple has size N.

```tolk theme={null}
struct Point {
    x: int
    y: int
}

fun demo() {
    var p: Point = { x: 1, y: 2 };
    var t = p.toTuple();     // [ 1 2 ]
    p = Point.fromTuple(t);  // restored
    t.get<int>(0);           // 1
}
```

### Mathematical primitives

These functions accept and return integers unless stated otherwise.
All integers are 257-bit, see [numbers](/languages/tolk/types/numbers).

#### min(x, y)

Computes the minimum of two integers.

#### max(x, y)

Computes the maximum of two integers.

#### minMax(x, y)

Returns `(int, int)` — a tensor `(smallest, largest)`.

#### abs(x)

Computes the absolute value of an integer.

#### sign(x)

Returns the sign of an integer value:

* `-1` if x \< 0
* `0` if x == 0
* `1` if x > 0

#### divMod(x, y)

Returns `(int, int)` — the quotient and remainder of `x / y`.

Example: `divMod(112, 3)` = `(37, 1)`.

#### modDiv(x, y)

Returns `(int, int)` — the remainder and quotient of `x / y`.

Example: `modDiv(112, 3)` = `(1, 37)`.

#### mulDivFloor(x, y, z)

Computes multiple-then-divide: `floor(x * y / z)`. The intermediate result is stored in a 513-bit integer to prevent precision loss.

#### mulDivRound(x, y, z)

Similar to `mulDivFloor`, but rounds the result: `round(x * y / z)`.

#### mulDivCeil(x, y, z)

Similar to `mulDivFloor`, but ceils the result: `ceil(x * y / z)`.

#### mulDivMod(x, y, z)

Returns `(int, int)` — the quotient and remainder of `(x * y / z)`.

Example: `mulDivMod(112, 3, 10)` = `(33, 6)`.

### Global getters and setters of current contract state

All these functions are actually methods of the empty struct `contract`.

#### contract.getAddress

Returns `address` — the internal address of the current smart contract.
It can be parsed further using `address.getWorkchain` and others.

#### contract.getOriginalBalance

Returns `coins` — the balance (in nanotoncoins) of the smart contract at the start of Computation Phase.

#### contract.getOriginalBalanceWithExtraCurrencies

Returns `[coins, ExtraCurrenciesMap]` — similar to `contract.getOriginalBalance`, but also returns extra currencies.

#### contract.getData

Returns `cell` — the persistent contract storage cell. Typically, its result is used as `Storage.fromCell()`.
See [contract storage](/languages/tolk/features/contract-storage).

#### contract.setData(cell)

Sets the persistent contract storage. Typically, the argument is `storageObject.toCell()`.
See [contract storage](/languages/tolk/features/contract-storage).

#### contract.getCode

Returns `cell` — the code of the smart contract from a TVM register `c7`.

#### contract.setCodePostponed(newCodeCell)

Creates an output action that would change this smart contract code after successful termination of the current run.

### Global getters of the blockchain (environment) state

Most of these functions are methods of the empty struct `blockchain`.

#### blockchain.now

Returns `int` — current Unix timestamp (in seconds).

#### blockchain.logicalTime

Returns `int` — the logical time of the current transaction.

#### blockchain.currentBlockLogicalTime

Returns `int` — the starting logical time of the current block.

#### blockchain.configParam(i)

Returns `cell?` — the value of the global configuration parameter with integer index `i`, or `null` if not exists.

#### commitContractDataAndActions

Commits current state of TVM registers `c4` (persistent data) and `c5` (actions),
so that the current execution is considered "successful" with the saved values even if an exception
in Computation Phase is thrown later.

### Signature checks, hashing, cryptography

Functions and methods for hashing, verifying, and randomization.

#### cell.hash

Returns `uint256` — the representation hash of a cell. Useful for signing and checking signatures of arbitrary entities represented by a tree of cells.

#### slice.hash

Returns `uint256` — the hash of data in a slice. The same as `cell.hash` for a cell containing data and references from this slice.

#### builder.hash

Returns `uint256` — the hash of data in a builder. The same as "transform builder to cell + calc hash of that cell", but without cell creation.

#### slice.bitsHash

Returns `uint256` — sha256 of the data bits of a slice (without refs). If the bit length is not divisible by eight, throws a cell underflow exception.

#### isSignatureValid(hash, signatureSlice, publicKey)

Checks the Ed25519 - `signatureSlice` of a `hash` (an integer, usually computed as the hash of some data) using `publicKey` (also `uint256`). The signature must contain at least 512 data bits; only the first 512 bits are used. Returns `bool`.

#### isSliceSignatureValid(dataSlice, signatureSlice, publicKey)

Similar to the above, but accepts a `slice` instead of an already-calculated integer hash. If the bit length of `data` is not divisible by eight, throws a cell underflow exception.

#### random.uint256

Returns `uint256` — a new pseudo-random number.

Ensure you've called `random.initialize` to make it unpredictable!

#### random.range(limit)

Returns `int` — a new pseudo-random integer z in the range `0..limit−1` (or `limit..−1` if negative).
More precisely, an unsigned random value `x` is generated, then `z := x * limit / 2^256` is computed.

Ensure you've called `random.initialize` to make it unpredictable!

#### random.getSeed

Returns `uint256` — the current random seed used to generate pseudo-random numbers.

#### random.setSeed(newSeed)

Sets the random seed to the provided value.

#### random.initializeBy(mixSeedWith)

Initializes (mixes) the random seed with the provided value.

#### random.initialize

Initializes the seed with current time to make randomization unpredictable.

Call this function once before using `random.uint256` or `random.range`.

### Size computation primitives

May be useful for computing storage fees of user-provided data.

#### cell.calculateSize(maxCells)

Returns `(x, y, z, -1)` or `(null, null, null, 0)`. Recursively computes the count of distinct cells `x`, data bits `y`, and cell references `z` in a tree of cells. The total count of visited cells `x` cannot exceed non-negative `maxCells`; otherwise a zero flag is returned to indicate failure.

#### slice.calculateSize(maxCells)

Similar to `cell.calculateSize`, but accepting a slice instead of a cell.
The returned value `x` does count the cell that contains the slice itself.

#### cell.calculateSizeStrict(maxCells)

A non-quiet version of `cell.calculateSize` that throws a cell overflow exception on failure.

#### slice.calculateSizeStrict(maxCells)

A non-quiet version of `slice.calculateSize` that throws a cell overflow exception on failure.

#### cell.depth

Returns `int` — the depth of a cell: 0 if no references, otherwise 1 + maximum of depths of all references.

#### slice.depth

Returns `int` — the depth of a slice, like `cell.depth`.

#### builder.depth

Returns `int` — the depth of a builder, like `cell.depth`.

#### sizeof\<T>(anyVariable)

Returns `int` — the number of stack slots `anyVariable` occupies (works at compile-time).

### Debug primitives

Only work for local TVM execution with debug level verbosity.

#### debug.print\<T>(anyVariable)

Dump a variable to the debug log.

#### debug.printString(str)

Dump a string to the debug log.

#### debug.dumpStack

Dump the stack (at most the top 255 values) and show its depth.

### Slice primitives: parsing cells

`cell.beginParse()` converts a cell into a slice.

`slice.loadAddress` and other `loadXXX` methods are automatically suggested after a dot.

Prefer [automatic serialization](/languages/tolk/features/auto-serialization) to manual working with slices.

### Builder primitives: constructing cells

`beginCell()` creates a builder.

`builder.storeAddress` and other `storeXXX` methods are automatically suggested after a dot.

`builder.endCell()` composes a cell from the data written.

Prefer [automatic serialization](/languages/tolk/features/auto-serialization) to manual working with builders.

### Address manipulation primitives

Methods for `address` and `any_address` (see [address types](/languages/tolk/types/address)) are suggested after a dot.

#### address.fromWorkchainAndHash(wc, hash)

A static method of `address` — constructs an internal address (267 bits) from arguments.

```tolk theme={null}
fun demo() {
    val a = address.fromWorkchainAndHash(0, somehash);
    a.getWorkchain() == BASECHAIN;   // true
}
```

#### address.getWorkchain

Returns `int8` — workchain from a standard (internal) address.

#### address.getWorkchainAndHash

Returns `(int8, uint256)` — workchain and hash from a standard (internal) address.

#### address.calculateSameAddressInAnotherShard(options)

Given an internal address A="aaaa...a" returns "bbaa...a" (D bits from address B, 256-D from A).

#### createAddressNone

Returns `any_address` — holding a slice '00' (two zero bits) at runtime.
It means "none address".

```tolk theme={null}
fun demo() {
    val none = createAddressNone();  // it's `any_address`
    none.isInternal();      // false
    none.isNone();          // true
}
```

<Aside type="caution" title={"It's a rarely used `any_address`, NOT `address`"}>
  Use it in combination with **external** addresses only. E.g., pass "none" to
  `createExternalLogMessage`, which accepts `any_address`.

  To represent "internal or none", use `address?` (nullable) and `null` accordingly.
  See [address](/languages/tolk/types/address).
</Aside>

#### any\_address.isNone / isInternal / isExternal

Tests which specific blockchain address is contained in "any".

#### any\_address.castToInternal

Casts `any_address` to `address` checking that "any" is actually "internal".
To skip the runtime check, use an [unsafe cast](/languages/tolk/types/type-checks-and-casts): `addr = myAny as address`.

### Reserving Toncoins on contract's balance

Stdlib contains several constants `RESERVE_MODE_XXX` for [reserve modes](/foundations/actions/reserve).
As well as a couple of functions:

#### reserveToncoinsOnBalance

Creates an output action which would reserve Toncoins on balance.

#### reserveExtraCurrenciesOnBalance

Similar to `reserveToncoinsOnBalance`, but also accepts a dictionary `extraAmount`.

### Creating and sending messages

Stdlib contains several constants `SEND_MODE_XXX` for [sending modes](/foundations/messages/modes).

Composing message cells is encapsulated with a power function `createMessage`, see [message sending](/languages/tolk/features/message-sending).

For externals (`createExternalLogMessage`), follow the same link.

A low-level function `sendRawMessage` also exists, but its use is not recommended.

***

## Modules requiring explicit imports

Besides "always-available" functions from `common.tolk`, Tolk has separate files that must be imported in order to be used.

```tolk theme={null}
import "@stdlib/gas-payments"
```

Gas- and payment-related primitives. All these functions have detailed comments, see them in an IDE.

* `getGasConsumedAtTheMoment`
* `acceptExternalMessage`
* `setGasLimitToMaximum`
* `setGasLimit`
* `calculateGasFee`
* `calculateGasFeeWithoutFlatPrice`
* `calculateStorageFee`
* `calculateForwardFee`
* `calculateForwardFeeWithoutLumpPrice`
* `contract.getStorageDuePayment`
* `contract.getStoragePaidPayment`

```tolk theme={null}
import "@stdlib/exotic-cells"
```

Functions for loading and parsing [exotic cells](/foundations/serialization/cells) and particularly library references.

```tolk theme={null}
import "@stdlib/lisp-lists"
```

Lisp-style lists are nested two-element tuples: `[1, [2, [3, null]]]` represents the list `[1, 2, 3]`.
They are used rarely nowadays.

```tolk theme={null}
import "@stdlib/tvm-dicts"
```

Low-level API for working with TVM dictionaries. Not recommended to use — enjoy [built-in maps](/languages/tolk/types/maps) instead.

```tolk theme={null}
import "@stdlib/tvm-lowlevel"
```

Functions for working with TVM registers and the stack.

## Q: Why are some functions `builtin`?

Many functions in `common.tolk` don't provide `asm` instructions:

```tolk theme={null}
@pure
fun slice.loadInt(mutate self, len: int): int
    builtin
```

This is done for optimization — the compiler generates different assembler code depending on arguments.
For example, if `len` is constant (say, 32), `loadUint` is translated to `32 LDU`, but if it's a variable,
it's taken from a stack, and the `LDUX` instruction is emitted.

Another example — `builder.storeUint(1, 32).storeUint(2, 64)` is not translated to `32 STU` and `64 STU`.
Instead, these calls are merged into a single `STSLICECONST`.

See [compiler optimizations](/languages/tolk/features/compiler-optimizations) for details.

## Appendix: How the embedded stdlib works

The stdlib is bundled with the compiler — it's a folder `tolk-stdlib/`, automatically discovered.
An import `@stdlib/xxx` actually loads `{STLIB_PATH}/xxx.tolk`.

Here is how the folder is discovered:

1. The compiler searches in predefined and relative paths.

   For example, when launched from a system-installed package, e.g., `/usr/bin/tolk`, the stdlib is located in `/usr/share/ton/smartcont`.

   For custom installations, the `TOLK_STDLIB` environment variable can be set. This is standard practice for compilers.

2. The WASM wrapper [tolk-js](https://github.com/ton-blockchain/tolk-js) also includes the stdlib, so it's already installed when using blueprint.

3. IDE plugins automatically locate the stdlib to provide auto-completion.

   Blueprint installs tolk-js, creating the `node_modules/@ton/tolk-js/` folder in the project structure.

   It contains `common.tolk`, `tvm-dicts.tolk`, and other files.
