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

# Tolk vs FunC: standard library

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>
    </>;
};

FunC includes a low-level [standard library](/languages/tolk/from-func/stdlib) in the `stdlib.fc` file, containing `asm` functions closely tied to [TVM instructions](/tvm/instructions).

Tolk provides a standard library based on FunC’s with three main differences.

1. It is split into multiple files: `common.tolk`, `tvm-dicts.tolk`, and others. Functions from `common.tolk` are available, while functions from other files require an import:

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

   beginCell()          // always available
   createEmptyDict()    // available due to import
   ```

2. No separate download from GitHub; is required; the library is included in the Tolk distribution.

3. Tolk has functions and methods which are called using the dot operator. Many global FunC functions became methods of builders, slices, and other types, and can no longer be called as functions.

## Functions vs methods

In FunC, there are no methods. All functions are globally scoped.
Any function can be called using the dot operator:

```func theme={null}
;; FunC
cell config_param(int x) asm "CONFIGOPTPARAM";

config_param(16);   ;; ok
16.config_param();  ;; also ok
```

Calling `b.end_cell()` invokes the global function `end_cell`.
Since all functions are global, there are no "short methods":

```func theme={null}
someTuple.tuple_size();
;; why not someTuple.size()? because it's a global function:
;; int tuple_size(tuple t)
```

**Tolk separates functions and methods**, as in most languages:

1. Functions cannot be called with the dot operator; only methods can.
2. Methods can have short names without conflicts.

```tolk theme={null}
// FunC
someCell.cell_hash();     // or cell_hash(someCell)
someSlice.slice_hash();

// Tolk
someCell.hash();          // the only possible
someSlice.hash();
```

## Renamed functions

In the table below, if the **Required import** column is empty, the function is available without imports.

Some functions were removed because they can be expressed syntactically or are rarely used in practice.

<Aside>
  FunC uses **snake\_case**, for example, `begin_cell`, while Tolk methods use **camelCase**, for example, `beginCell`.
</Aside>

The table follows the order in which functions appear in `stdlib.fc`.

| FunC name                    | Tolk name                            | Required import |
| ---------------------------- | ------------------------------------ | --------------- |
| `empty_tuple`                | `createEmptyTuple`                   |                 |
| `t~tpush`                    | `t.push(v)`                          |                 |
| `first(t)` or `t.first()`    | `t.first()`                          |                 |
| `at(t,i)` or `t.at(i)`       | `t.get(i)`, `t.0`, etc.              |                 |
| `touch(v)`                   | `v.stackMoveToTop()`                 | TVM low-level   |
| `impure_touch`               | *(deleted)*                          |                 |
| `single`                     | *(deleted)*                          |                 |
| `unsingle`                   | *(deleted)*                          |                 |
| `pair`                       | *(deleted)*                          |                 |
| `unpair`                     | *(deleted)*                          |                 |
| `triple`                     | *(deleted)*                          |                 |
| `untriple`                   | *(deleted)*                          |                 |
| `tuple4`                     | *(deleted)*                          |                 |
| `untuple4`                   | *(deleted)*                          |                 |
| `second`                     | *(deleted)*                          |                 |
| `third`                      | *(deleted)*                          |                 |
| `fourth`                     | *(deleted)*                          |                 |
| `pair_first`                 | *(deleted)*                          |                 |
| `pair_second`                | *(deleted)*                          |                 |
| `triple_first`               | *(deleted)*                          |                 |
| `triple_second`              | *(deleted)*                          |                 |
| `triple_third`               | *(deleted)*                          |                 |
| `minmax`                     | `minMax`                             |                 |
| `now`                        | `blockchain.now`                     |                 |
| `my_address`                 | `contract.getAddress`                |                 |
| `get_balance + pair_first`   | `contract.getOriginalBalance`        |                 |
| `cur_lt`                     | `blockchain.logicalTime`             |                 |
| `block_lt`                   | `blockchain.currentBlockLogicalTime` |                 |
| `cell_hash(c)`               | `c.hash()`                           |                 |
| `slice_hash(s)`              | `s.hash()`                           |                 |
| `string_hash(s)`             | `s.bitsHash()`                       |                 |
| `check_signature`            | `isSignatureValid`                   |                 |
| `check_data_signature`       | `isSliceSignatureValid`              |                 |
| `compute_data_size(c)`       | `c.calculateSizeStrict()`            |                 |
| `slice_compute_data_size(s)` | `s.calculateSizeStrict()`            |                 |
| `c.compute_data_size?()`     | `c.calculateSize()`                  |                 |
| `slice_compute_data_size?()` | `s.calculateSize()`                  |                 |
| `~dump`                      | `debug.print`                        |                 |
| `~strdump`                   | `debug.printString`                  |                 |
| `dump_stack`                 | `debug.dumpStack`                    |                 |
| `get_data`                   | `contract.getData`                   |                 |
| `set_data`                   | `contract.setData`                   |                 |
| `get_c3`                     | `getTvmRegisterC3`                   | TVM low-level   |
| `set_c3`                     | `setTvmRegisterC3`                   | TVM low-level   |
| `bless`                      | `transformSliceToContinuation`       | TVM low-level   |
| `accept_message`             | `acceptExternalMessage`              |                 |
| `set_gas_limit`              | `setGasLimit`                        |                 |
| `buy_gas`                    | *(deleted)*                          |                 |
| `commit`                     | `commitContractDataAndActions`       |                 |
| `divmod`                     | `divMod`                             |                 |
| `moddiv`                     | `modDiv`                             |                 |
| `muldiv`                     | `mulDivFloor`                        |                 |
| `muldivr`                    | `mulDivRound`                        |                 |
| `muldivc`                    | `mulDivCeil`                         |                 |
| `muldivmod`                  | `mulDivMod`                          |                 |
| `begin_parse`                | `beginParse`                         |                 |
| `end_parse(s)`               | `s.assertEnd()`                      |                 |
| `load_ref`                   | `loadRef`                            |                 |
| `preload_ref`                | `preloadRef`                         |                 |
| `load_int`                   | `loadInt`                            |                 |
| `load_uint`                  | `loadUint`                           |                 |
| `preload_int`                | `preloadInt`                         |                 |
| `preload_uint`               | `preloadUint`                        |                 |
| `load_bits`                  | `loadBits`                           |                 |
| `preload_bits`               | `preloadBits`                        |                 |
| `load_grams`                 | `loadCoins`                          |                 |
| `load_coins`                 | `loadCoins`                          |                 |
| `skip_bits`                  | `s.skipBits`                         |                 |
| `first_bits`                 | `getFirstBits`                       |                 |
| `skip_last_bits`             | `removeLastBits`                     |                 |
| `slice_last`                 | `getLastBits`                        |                 |
| `load_dict`                  | `loadDict`                           |                 |
| `preload_dict`               | `preloadDict`                        |                 |
| `skip_dict`                  | `skipDict`                           |                 |
| `load_maybe_ref`             | `loadMaybeRef`                       |                 |
| `preload_maybe_ref`          | `preloadMaybeRef`                    |                 |
| `cell_depth(c)`              | `c.depth()`                          |                 |
| `slice_refs(s)`              | `s.remainingRefsCount()`             |                 |
| `slice_bits(s)`              | `s.remainingBitsCount()`             |                 |
| `slice_bits_refs(s)`         | `s.remainingBitsAndRefsCount()`      |                 |
| `slice_empty?(s)`            | `s.isEmpty()`                        |                 |
| `slice_data_empty?(s)`       | `s.isEndOfBits()`                    |                 |
| `slice_refs_empty?(s)`       | `s.isEndOfRefs()`                    |                 |
| `slice_depth(s)`             | `s.depth()`                          |                 |
| `equal_slice_bits(a,b)`      | `a.bitsEqual(b)`                     |                 |
| `builder_refs(b)`            | `b.refsCount()`                      |                 |
| `builder_bits(b)`            | `b.bitsCount()`                      |                 |
| `builder_depth(b)`           | `b.depth()`                          |                 |
| `begin_cell`                 | `beginCell`                          |                 |
| `end_cell`                   | `endCell`                            |                 |
| `store_ref`                  | `storeRef`                           |                 |
| `store_uint`                 | `storeUint`                          |                 |
| `store_int`                  | `storeInt`                           |                 |
| `store_slice`                | `storeSlice`                         |                 |
| `store_grams`                | `storeCoins`                         |                 |
| `store_coins`                | `storeCoins`                         |                 |
| `store_dict`                 | `storeDict`                          |                 |
| `store_maybe_ref`            | `storeMaybeRef`                      |                 |
| `store_builder`              | `storeBuilder`                       |                 |
| `load_msg_addr`              | `loadAddress`                        |                 |
| `parse_addr`                 | *(deleted)*                          |                 |
| `parse_std_addr`             | `parseStandardAddress`               |                 |
| `parse_var_addr`             | *(deleted)*                          |                 |
| `config_param`               | `blockchain.configParam`             |                 |
| `raw_reserve`                | `reserveToncoinsOnBalance`           |                 |
| `raw_reserve_extra`          | `reserveExtraCurrenciesOnBalance`    |                 |
| `send_raw_message`           | `sendRawMessage`                     |                 |
| `set_code`                   | `contract.setCodePostponed`          |                 |
| `random`                     | `random.uint256`                     |                 |
| `rand`                       | `random.range`                       |                 |
| `get_seed`                   | `random.getSeed`                     |                 |
| `set_seed`                   | `random.setSeed`                     |                 |
| `randomize`                  | `random.initializeBy`                |                 |
| `randomize_lt`               | `random.initialize`                  |                 |
| `dump`                       | `debug.print`                        |                 |
| `strdump`                    | `debug.printString`                  |                 |
| `dump_stk`                   | `debug.dumpStack`                    |                 |
| `empty_list`                 | `createEmptyList`                    | lisp-lists      |
| `cons`                       | `listPrepend`                        | lisp-lists      |
| `uncons`                     | `listSplit`                          | lisp-lists      |
| `list_next`                  | `listNext`                           | lisp-lists      |
| `car`                        | `listGetHead`                        | lisp-lists      |
| `cdr`                        | `listGetTail`                        | lisp-lists      |
| `new_dict`                   | `createEmptyMap`                     |                 |
| `dict_empty?(d)`             | `m.isEmpty`                          |                 |
| `pfxdict_get?`               | `prefixDictGet`                      | TVM dicts       |
| `pfxdict_set?`               | `prefixDictSet`                      | TVM dicts       |
| `pfxdict_delete?`            | `prefixDictDelete`                   | TVM dicts       |
| `idict_set_ref`              | use native maps                      |                 |
| `udict_set_ref`              | use native maps                      |                 |
| `idict_get_ref`              | use native maps                      |                 |
| `idict_get_ref?`             | use native maps                      |                 |
| `udict_get_ref?`             | use native maps                      |                 |
| `idict_set_get_ref`          | use native maps                      |                 |
| `udict_set_get_ref`          | use native maps                      |                 |
| `idict_delete?`              | use native maps                      |                 |
| `udict_delete?`              | use native maps                      |                 |
| `idict_get?`                 | use native maps                      |                 |
| `udict_get?`                 | use native maps                      |                 |
| `idict_delete_get?`          | use native maps                      |                 |
| `udict_delete_get?`          | use native maps                      |                 |
| `udict_set`                  | use native maps                      |                 |
| `idict_set`                  | use native maps                      |                 |
| `dict_set`                   | use native maps                      |                 |
| `udict_add?`                 | use native maps                      |                 |
| `udict_replace?`             | use native maps                      |                 |
| `idict_add?`                 | use native maps                      |                 |
| `idict_replace?`             | use native maps                      |                 |
| `udict_set_builder`          | use native maps                      |                 |
| `idict_set_builder`          | use native maps                      |                 |
| `dict_set_builder`           | use native maps                      |                 |
| `udict_add_builder?`         | use native maps                      |                 |
| `udict_replace_builder?`     | use native maps                      |                 |
| `idict_add_builder?`         | use native maps                      |                 |
| `idict_replace_builder?`     | use native maps                      |                 |
| `udict_delete_get_min`       | use native maps                      |                 |
| `idict_delete_get_min`       | use native maps                      |                 |
| `dict_delete_get_min`        | use native maps                      |                 |
| `udict_delete_get_max`       | use native maps                      |                 |
| `idict_delete_get_max`       | use native maps                      |                 |
| `dict_delete_get_max`        | use native maps                      |                 |
| `udict_get_min?`             | use native maps                      |                 |
| `udict_get_max?`             | use native maps                      |                 |
| `udict_get_min_ref?`         | use native maps                      |                 |
| `udict_get_max_ref?`         | use native maps                      |                 |
| `idict_get_min?`             | use native maps                      |                 |
| `idict_get_max?`             | use native maps                      |                 |
| `idict_get_min_ref?`         | use native maps                      |                 |
| `idict_get_max_ref?`         | use native maps                      |                 |
| `udict_get_next?`            | use native maps                      |                 |
| `udict_get_nexteq?`          | use native maps                      |                 |
| `udict_get_prev?`            | use native maps                      |                 |
| `udict_get_preveq?`          | use native maps                      |                 |
| `idict_get_next?`            | use native maps                      |                 |
| `idict_get_nexteq?`          | use native maps                      |                 |
| `idict_get_prev?`            | use native maps                      |                 |
| `idict_get_preveq?`          | use native maps                      |                 |
| `udict::delete_get_min`      | use native maps                      |                 |
| `idict::delete_get_min`      | use native maps                      |                 |
| `dict::delete_get_min`       | use native maps                      |                 |
| `udict::delete_get_max`      | use native maps                      |                 |
| `idict::delete_get_max`      | use native maps                      |                 |
| `dict::delete_get_max`       | use native maps                      |                 |

## Added functions

Some functions from FunC are missing in Tolk's standard library, but it works well for everyday tasks.

Tolk is evolving, and its standard library is continually updated over time. Check the `tolk-stdlib/` folder in the [source code](https://github.com/ton-blockchain/ton/tree/master/crypto/smartcont/tolk-stdlib). In addition to functions, some constants are added, such as `SEND_MODE_*` and `RESERVE_MODE_*`.

All of these functions are wrappers over TVM assembler instructions. Missing functionality can be implemented by manually wrapping any TVM instruction.

## Mutating functions

Many FunC functions that used the `~` tilde now mutate the object in Tolk rather than returning a copy.

| FunC                            | Tolk                           |
| ------------------------------- | ------------------------------ |
| `int flags = cs~load_uint(32);` | `var flags = cs.loadUint(32);` |
| ...                             | ...                            |

* If `cs~load_uint(…)` was used, use `cs.loadUint(…)` and everything works.
* If `cs.load_uint(…)` was used to get a **copy**, a different approach is needed. [Read about mutability](/languages/tolk/from-func/mutability).

## How the embedded stdlib works

All standard library functions are available out of the box. Non-common functions require an `import`, but no external downloads are needed.

Here’s how it works:

1. The Tolk compiler locates the stdlib folder by searching predefined paths relative to an executable binary.

   For example, when the Tolk compiler is 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 all stdlib functions are available out of the box when using tolk-js directly or through blueprint.

3. JetBrains and VS Code IDE plugins automatically locate the stdlib to provide auto-completion.

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

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