> ## 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.

# Numbers

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 has several types for integers:

* general `int`
* signed `int32`, `int256`, etc. — any `intN` (0 \< N ≤ 257)
* unsigned `uint64`, `uint119`, etc. — any `uintN` (0 \< N ≤ 256)
* `coins` (representing nanotoncoins, 1 TON = 10^9)
* (rarely used) `varintN` and `varuintN` (N = 16/32)

<Aside type="caution">
  All these types are **257-bit integers at runtime**.
  The TVM (virtual machine) has only `INT`, and all intN are actually "just integers" while running.
  **Overflow happens only at serialization**.
</Aside>

## Syntax: decimal, hex, and binary literals

All the constants below are just `int`:

```tolk theme={null}
const TEN = 0b1010;       // binary
const MAX_UINT8 = 0xFF;   // hex

// integers up to 2^256-1 are allowed
const MAX_INT = 115792089237316195423570985008687907853269984665640564039457584007913129639935;
```

## `intN` describes serialization, `int` does not

To automatically parse binary data, the compiler must correctly load and store integers.
When a contract schema is designed, it is described in terms such as "queryID is unsigned 64-bit, counterValue is 32-bit", and similar.
This is expressed directly in Tolk:

```tolk theme={null}
struct IncMessage {
    queryID: uint64
    counterValue: int32
}
```

As a result, `IncMessage` can be serialized to a cell and decoded back.

A general-purpose type `int` is "an integer, but no information how to serialize it". Consider this struct:

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

Is it valid? Of course, it is! Creating a `Point` variable is pretty fine.
But a call `p.toCell()` gives an error:

```ansi theme={null}
error: auto-serialization via toCell() is not available for type `Point`
       because field `Point.x` of type `int` can't be serialized
       because type `int` is not serializable, it doesn't define binary width
       hint: replace `int` with `int32` / `uint64` / `coins` / etc.
```

To make it serializable, replace `int` with a specific integer type. For example:

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

## Overflow happens only at serialization

A natural question is: "What about overflow?"

```tolk theme={null}
var v: uint8 = 255;
v += 1;    // ???
```

The answer — **no runtime overflow or clamping**:

* arithmetic works as usual – `v` becomes 256
* no extra gas cost – no runtime bounds checks
* overflow only happens at serialization

```tolk theme={null}
struct Resp {
    outValue: uint8
}

fun demo(resp: Resp) {
    resp.outValue = v;     // 256 (no error yet)
    resp.toCell();         // a runtime "overflow" error
}
```

<Aside type="tip">
  Think of smart contracts as a black box:

  * inputs are encoded (int32, uint64, etc.)
  * inside the contract, arithmetic uses full 257-bit precision
  * outputs are serialized again — overflow happens only at this stage
</Aside>

Analogy: Tolk has `mulDivFloor(x,y,z)`, which uses 513-bit precision internally to prevent rounding errors.
Similarly, overflow only occurs *at the boundary between the contract and the outside world*.

## Generic `int` implicitly cast to and from any `intN`

* arithmetic operations on `intN` degrade to `int`
* numeric literals (like 0, 100) are just `int`
* direct assignment between `intN` and `intM` is disallowed (as a probable error)

```tolk theme={null}
fun takeAnyInt(a: int) { /* ... */ }
fun getAnyInt(): int { /* ... */ }

fun f(op: int32, qid: uint64) {
    op = qid;               // error
    op = qid as int32;      // ok

    op + query_id;          // ok, int
    if (op == qid)          // ok, not assignment

    takeAnyInt(op);         // ok
    op = getAnyInt();       // ok

    var amount: int32 = 1000;
    var percent: uint8 = 50;
    var new = amount * percent / 100; // ok, int
    amount = new;           // ok, int auto-casted to int32
}
```

## Type `coins` and function `ton("0.05")`

Similar to `int32`, Tolk has a dedicated `coins` type representing nanoton values.

**The purpose of `coins` is to have special serialization rules**. It's serialized as "variadic integer":
small values consume a few bits, large values consume more.

* arithmetic with `coins` degrades to `int`, similar to `intN` (except addition/subtraction)
* coins can be cast back from `int`, following the same rules as `intN`

**The `ton("0.05")` built-in function** calculates "nanotoncoins" at compile-time.
It only accepts constant values (e.g., `ton(some_var)` is invalid).

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

## All of them are first-class types

At runtime, all integers are 257-bit. But they are different from the type system's perspective.

For example, they can be nullable, combined within a union, and so on:

```tolk theme={null}
struct Demo {
    f1: int32?           // nullable
    f2: int32 | uint64   // union (yes, it's correct)
    pair: (int8, coins)
}

fun demo(d: Demo) {
    if (d.f1 != null) {
        d.f1    // smart cast to `int32`
    }
    d.pair.1    // `coins`
}
```

## No floating-point numbers

Note that only integer types (257-bit) are supported by the virtual machine. There are no floating-point numbers.

For example, monetary values are represented as nanotoncoins:

```tolk theme={null}
const MIN_BALANCE = ton("1.23")     // 1230000000
```

## Stack layout and serialization

All numeric types are backed by TVM `INT`. Serialization happens as follows:

* `int` — not serializable, use `intN` and other types
* `intN` — a fixed N-bit signed integer
* `uintN` — a fixed N-bit unsigned integer
* `coins` — alias to `varuint16`
* `varintN` — variadic N 16/32: 4/5 bits for len + `8*len`-bit number
* `varuintN` — the same, but unsigned

For details, follow [TVM representation](/languages/tolk/types/overall-tvm-stack) and [Serialization](/languages/tolk/types/overall-serialization).
