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

# Fift language overview

export const Image = ({src, darkSrc, alt = '', darkAlt, href, target, height = 342, width = 608, noZoom = false, center = false}) => {
  const isSVG = src.match(/\.svg(?:[#?].*?)?$/i) !== null;
  const shouldInvert = isSVG && !darkSrc;
  const shouldCreateLink = href !== undefined;
  const minPx = 9;
  const maxPx = 608;
  const expectedPx = `a number or a string with a number that is greater than ${minPx - 1} and less than or equal to ${maxPx}`;
  const createInvalidPropCallout = (title, received, expected) => {
    return <Danger>
        <span className="font-bold">
          Invalid <code>{title.toString()}</code> passed!
        </span>
        <br />
        <span className="font-bold">Received: </span>
        {received.toString()}
        <br />
        <span className="font-bold">Expected: </span>
        {expected.toString()}
        {}
      </Danger>;
  };
  const checkValidDimensionValue = value => {
    switch (typeof value) {
      case "string":
      case "number":
        const num = Number(value);
        return Number.isSafeInteger(num) && num >= minPx && num <= maxPx;
      default:
        return false;
    }
  };
  let callouts = [];
  if (height && !checkValidDimensionValue(height)) {
    callouts.push(createInvalidPropCallout("height", height, expectedPx));
  }
  if (width && !checkValidDimensionValue(width)) {
    callouts.push(createInvalidPropCallout("width", width, expectedPx));
  }
  if (callouts.length !== 0) {
    return callouts;
  }
  const heightPx = Number(height);
  const widthPx = Number(width);
  const shouldCenter = center === "true" || center === true ? true : false;
  const shouldNotZoom = noZoom === "true" || noZoom === true ? true : false;
  const images = <>
      <img className="block dark:hidden" src={src} alt={alt} {...height && ({
    height: heightPx
  })} {...width && ({
    width: widthPx
  })} {...(shouldCreateLink || shouldInvert || shouldNotZoom) && ({
    noZoom: "true"
  })} />
      <img className={`hidden dark:block ${shouldInvert ? "invert" : ""}`} src={darkSrc ?? src} alt={darkAlt ?? alt} {...height && ({
    height: heightPx
  })} {...width && ({
    width: widthPx
  })} {...(shouldCreateLink || shouldInvert || shouldNotZoom) && ({
    noZoom: "true"
  })} />
    </>;
  if (shouldCreateLink) {
    if (shouldCenter) {
      return <div style={{
        display: "flex",
        justifyContent: "center"
      }}>
          <a href={href} target={target ?? "_self"}>
            {images}
          </a>
        </div>;
    }
    return <a href={href} target={target ?? "_self"}>
        {images}
      </a>;
  }
  if (shouldCenter) {
    return <div style={{
      display: "flex",
      justifyContent: "center"
    }}>{images}</div>;
  }
  return images;
};

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

<Aside type="note">
  The official smart contract language of TON Blockchain is [Tolk](/tolk/overview). Fift is now a **legacy** language, with its compiler no longer maintained.

  Fift pages will be moved down in the sidebar in mid-April 2026. Here is the preview of a possible future placement, right between "Blockchain foundations" and "Contribute" sections:

  <Image src="/resources/images/tmp-func-fift-light.png" darkSrc="/resources/images/tmp-func-fift-dark.png" alt="Preview of a possible future placement of FunC and Fift languages in the sidebar." width={294} height={190} noZoom={true} />
</Aside>

Fift is a [stack-based](https://en.wikipedia.org/wiki/Stack-oriented_programming) general-purpose [tacit](https://en.wikipedia.org/wiki/Tacit_programming) programming language optimized for creating, debugging, and managing smart contracts on TON Blockchain.

It has been specifically designed to interact with TON Virtual Machine (TVM) and TON Blockchain. In particular, it offers native support for 257-bit integer arithmetic and cell manipulation, as well as an interface to the Ed25519-based cryptography employed by TON.

Fift also includes a macro assembler for TVM code, which is a common intermediate target of higher-level languages such as [Tolk](/tolk/overview) and [FunC](/languages/func/overview), as well as a common textual bitcode representation of smart contracts. For more examples of the latter, see [various blockchain explorers](/ecosystem/explorers/overview) and disassembled smart contracts.

## Installation

### Interpreter and libraries

Fift interpreter binaries for Windows, macOS (Intel or Arm64), and Ubuntu can be downloaded from the [latest GitHub release](https://github.com/ton-blockchain/ton/releases/latest).

Make sure to also download the necessary libraries — download and unpack the `smartcont_lib.zip`. The `lib/` folder inside contains standard libraries of Fift, which must be exposed to it when running the interpreter.

Consider the following example installation steps:

<Steps>
  <Step title="Download the latest Fift binary">
    <Tabs>
      <Tab title="Windows">
        Go to the [latest GitHub release](https://github.com/ton-blockchain/ton/releases/latest), download `fift.exe` and place it somewhere on your `PATH`. To see the current state of the `PATH` variable, run `echo $env:PATH` in the PowerShell.
      </Tab>

      <Tab title="Linux">
        Go to the [latest GitHub release](https://github.com/ton-blockchain/ton/releases/latest), download `fift-linux-x86_64` (64-bit, x86 arch) or `fift-linux-arm64` (64-bit, Arm arch), and place it somewhere on your `$PATH` as `fift`. To see the current state of the `$PATH` variable, run `echo $PATH | tr ':' '\n'` in the terminal.
      </Tab>

      <Tab title="macOS">
        Go to the [latest GitHub release](https://github.com/ton-blockchain/ton/releases/latest), download `fift-mac-x86-64` (64-bit, Intel) or `fift-mac-arm64` (64-bit, Apple Silicon), and place it somewhere on your `$PATH` as `fift`. To see the current state of the `$PATH` variable, run `echo $PATH | tr ':' '\n'` in the terminal.
      </Tab>
    </Tabs>
  </Step>

  <Step title="Download Fift's standard libraries">
    * Download `smartcont_lib.zip` from the [latest GitHub release](https://github.com/ton-blockchain/ton/releases/latest).
    * Unzip it and extract the contents.
    * Move the extracted `lib/` folder somewhere convenient. You can also place it under a different name.
      * For example, for Linux and macOS, it can be moved to `~/.local/lib/fiftlib`
      * For Windows, to `~/.fiftlib`
  </Step>

  <Step title="Run Fift">
    To invoke the Fift binary, you'll need to pass it the standard libraries as such:

    ```shell theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    fift -I /path/to/extracted/lib -i Asm.fif
    ```

    If you see errors or red-colored output lines, double-check the placement of the Fift binary and related libraries from previous steps.

    Otherwise, write the following and press "Enter":

    ```fift theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
    2 2 + .s
    ```

    If you see "4 ok", then Fift has been successfully installed on your machine!

    To learn about other launch options, add the `-h` flag by the end of the prior Fift invocation command.
  </Step>
</Steps>

<Aside type="tip">
  For Linux and macOS, it might be convenient to make an alias as such:

  ```shell theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
  # Within .bash_aliases or .zsh_aliases
  alias fift="/path/to/fift -I /path/to/extracted/lib -i Asm.fif"
  ```
</Aside>

### Additional tooling

#### Extensions and plugins

* [VS Code extension](https://marketplace.visualstudio.com/items?itemName=ton-core.vscode-ton) - powerful and feature-rich extension for Visual Studio Code (VSCode) and VSCode-based editors like VSCodium, Cursor, Windsurf, and others.
  * Get it on the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ton-core.vscode-ton).
  * Get it on the [Open VSX Registry](https://open-vsx.org/extension/ton-core/vscode-ton).
  * Or install from the [`.vsix` files in nightly releases](https://github.com/ton-blockchain/ton-language-server/releases).
* [JetBrains IDEs plugin](https://plugins.jetbrains.com/plugin/23382-ton) - provides syntax highlighting, code navigation, and more.
* [Language Server (LSP Server)](https://github.com/ton-blockchain/ton-language-server) - supports Sublime Text, (Neo)Vim, Helix, and other editors with LSP support.

#### Online utilities

* [TxTracer: Assembly playground](https://txtracer.ton.org/play/)
* [TxTracer: Code explorer with assembly output](https://txtracer.ton.org/code-explorer/)
* [TxTracer: TVM instruction table](https://txtracer.ton.org/spec/)

## Getting started

Here is a simple `Hello, World!` example written in Fift:

```fift theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
."Hello, World!"
```

When [executed with `fift` binary](#installation), it produces the following output:

```txt theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
Hello, World! ok
```

There, `ok` means successful end of execution of the given code snippet.

<Aside type="caution">
  When things go awry, there may still be an `ok` by the end, albeit prefixed with several red lines of cryptic-looking stack traces. Those are how Fift reports errors, and this is one of the major reasons why Fift is considered a legacy language.

  **Any errors encountered during execution clear the stack!**

  Hence, to actually know what happened, one needs to preemptively check stack contents. For that, use the ["printf debugging"](https://en.wikipedia.org/wiki/Debugging#printf_debugging) approach with the `.s` word — it dumps current stack contents to the console without modifying the stack.

  ```fift theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
  "Hello, " .s
  // "Hello, "

  "World!" .s
  // "Hello, " "World!"

  $+
  // "Hello, World!"

  type
  // Hello, World! ok
  // Now, the stack is clear.
  ```
</Aside>

To continue learning Fift, see the [educational materials](#educational-materials) section, or move to the follow-up references.

<Columns cols={2}>
  <Card title="Fift and TVM assembly" href="/languages/fift/fift-and-tvm-assembly" />

  <Card title="Deep dive into Fift" href="/languages/fift/deep-dive" />

  <Card title="Simple multi-signature wallet" href="/languages/fift/multisig" />

  <Card title="Whitepapers (see below)" href="#whitepapers" />
</Columns>

## Educational materials

### Whitepapers

<Aside>
  While most of the information described there holds some truth, the `fiftbase.pdf` whitepaper is still considered legacy due to a lack of updates and gradual integration of its contents into actual documentation pages.

  However, it is the most exhaustive reference manual on Fift to date, so you can still use it to learn a lot about Fift.
</Aside>

<Columns cols={2}>
  <Card title="Fift language specification, web version" href="/languages/fift/whitepaper">
    Tacit stack-based programming language with a deep connection to TVM.
  </Card>

  <Card title="Fift language specification, PDF" arrow href="/resources/pdfs/fiftbase.pdf">
    Original documentation written by Dr. Nikolai Durov, a comprehensive whitepaper.
  </Card>
</Columns>

### Articles

<Columns cols={2}>
  <Card title="Introduction to Fift" arrow="true" href="https://blog.ton.org/introduction-to-fift" />
</Columns>

### Videos and playlists

<Columns cols={2}>
  <Card title="«His majesty Fift»" arrow="true" href="https://www.youtube.com/@WikiMar/videos" cta="In Russian" />
</Columns>

### Examples

<Columns cols={2}>
  <Card title="Simple multi-signature wallet" href="/languages/fift/multisig" />

  <Card title="Multi-signature wallet v2" arrow="true" href="https://github.com/ton-blockchain/multisig-contract-v2" />
</Columns>

## See also

* [Multisignature wallet v2](https://github.com/ton-blockchain/multisig-contract-v2)
* [Forth language](https://en.wikipedia.org/wiki/Forth_\(programming_language\))
* [Factor language](https://en.wikipedia.org/wiki/Factor_\(programming_language\))
* [Uiua language](https://www.uiua.org/)
* [Concatenative languages](https://www.concatenative.org/wiki/view/Concatenative%20language)
