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

# Sending messages

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 a high-level function `createMessage`. In practice, it's immediately followed by `send`:

```tolk theme={null}
val reply = createMessage({
    bounce: BounceMode.NoBounce,
    value: ton("0.05"),
    dest: senderAddress,
    body: RequestedInfo { ... }
});
reply.send(SEND_MODE_REGULAR);
```

It's a **universal function for composing messages** across various cases.

1. Supports extra currencies
2. Supports workchains
3. Supports sharding (formerly `splitDepth`)
4. Integrated with auto-serialization of the `body`
5. Automatically detects, body ref or not
6. Also used for deployment (passing code+data of a contract)

<Aside type="tip">
  Deployment (e.g. creating a jetton wallet contract from a minter)
  is handled here as well — via `stateInit` with automatic address computation.
</Aside>

## The concept is based on union types

There are many ways in which contracts interact.

* sometimes, you "send to an address"
*     ... but sometimes, you have workchain + hash
* sometimes, you compose `StateInit` from code+data
*     ... but sometimes, `StateInit` is a ready cell
* sometimes, you send a message to basechain
*     ... but sometimes, you use a `MY_WORKCHAIN` constant
* sometimes, you just attach tons (msg value)
*     ... but sometimes, you also need extra currencies

How can such a wide variety of options be expressed? With [union types](/languages/tolk/types/unions)!

Let's illustrate this idea by examining how extra currencies are supported.

## Extra currencies: union

In most cases, the "message value" is just tonAmount:

```tolk theme={null}
value: someTonAmount
```

But when extra currencies are needed, attach tons AND a dict:

```tolk theme={null}
value: (someTonAmount, extraDict)
```

How does it work? Because the field `value` is a union:

```tolk theme={null}
// how it is declared in stdlib
struct CreateMessageOptions<TBody> {
    // ...
    value: coins | (coins, ExtraCurrenciesMap)
}
```

That's it! Just attach tons OR tons with extra, and the compiler takes care of composing this into a cell.

## Destination: union

The same idea of union types spreads onto **destination** of a message.

```tolk theme={null}
dest: someAddress,
dest: (workchain, hash)
```

It's either an address, OR (workchain + hash), OR ...:

```tolk theme={null}
struct CreateMessageOptions<TBody> {
    // ...
    dest: address |             // either just send a message to some address
          builder |             // ... or a manually constructed builder with a valid address
          (int8, uint256) |     // ... or to workchain + hash (also known as accountID)
          AutoDeployAddress     // ... or "send to stateInit" aka deploy (address auto-calculated)
}
```

**That's indeed the TypeScript way** — but it works at compile-time.

## Deployment, stateInit, and workchains

Consider the following example. A contract "jetton minter" deploys a "jetton wallet". The wallet's code and initial data are known:

```tolk theme={null}
val walletInitialState: ContractState = {
    code: ...,   // probably, kept in minter's storage
    data: ...,   // initial wallet's storage
};
```

A minter needs to send a message to a wallet. But since it's unknown whether the wallet already exists on-chain, a message needs wallet's code+data attached. So, where should the message be sent? What is the destination? The answer is: **destination is the wallet's `StateInit`**.

<Aside type="tip">
  In TON, "the address of a contract" == "hash of its initial state".
</Aside>

```tolk theme={null}
// address auto-calculated, code+data auto-attached
dest: {
    stateInit: walletInitialState
}
```

To serve more complex tasks, configure additional fields:

```tolk theme={null}
dest: {
    workchain: ...,     // default: 0 (basechain)
    stateInit: ...,     // either code+data OR a ready cell
    toShard:   ...,     // default: null (no sharding)
}
```

## Sharding: deploying "close to" another contract

The `createMessage` interface also supports initializing contracts in specific shards. For example, in sharded jettons, a jetton wallet must be deployed to the same shard as the owner's wallet.

In other words, the intention is:

* a jetton wallet must be **close to** the owner's wallet
* this *closeness* is determined by a shard depth (syn. *fixed prefix length*, syn. *split depth*)

Let's illustrate it with numbers for `shard depth` = 8:

| Title                | Addr hash (256 bits) | Comment                              |
| -------------------- | -------------------- | ------------------------------------ |
| closeTo (owner addr) | `01010101...xxx`     | owner's wallet                       |
| shardPrefix          | `01010101`           | first 8 bits of closeTo              |
| stateInitHash        | `yyyyyyyy...yyy`     | calculated by code+data              |
| result (JW addr)     | `01010101...yyy`     | jetton wallet in same shard as owner |

Here is how this is done:

```tolk theme={null}
dest: {
    stateInit: walletInitialState,
    toShard: {
        closeTo: ownerAddress,
        fixedPrefixLength: 8
    }
}
```

<Aside type="note">
  Technically, shard depth must be a part of `StateInit` (besides code+data) — for correct initialization inside the blockchain. The compiler automatically embeds it.

  But semantically, shard depth alone makes no sense. That's why **shard depth + closeTo** is a single entity.
</Aside>

## Body ref or not: compile-time calculation

In TON Blockchain, according to the specification, a message is a cell (flags, dest address, stateInit, etc.), and its *body* can be either inlined into the same cell or can be placed into its own cell (and be a ref).

Fortunately, a developer shouldn't keep this in mind. Just pass `body`, and the compiler does all calculations:

```tolk theme={null}
createMessage({
    // ...
    body: RequestedInfo { ... }
});
```

The rules are the following:

1. if `body` is small, it's embedded directly into a message cell (cheaper, because creating cells is expensive)
2. if `body` is large or unpredictable, it is wrapped into a ref

Interestingly, the behavior is determined **at compile time** — no runtime checks are needed. How? Thanks to generics:

```tolk theme={null}
fun createMessage<TBody>(
    options: CreateMessageOptions<TBody>
): OutMessage;

struct CreateMessageOptions<TBody> {
    // ...
    body: TBody;
}
```

Hence, each `createMessage()` call has its own `TBody`, and the compiler estimates its size:

* maximum size is less than 500 bits and 2 refs — small, "no ref"
* size is potentially >= 500 bits or >= 2 refs — large, "ref"
* contains `builder` or `slice` inside — unpredictable, "ref"

**Even if body is large/unpredictable, it can be force-inlined** by wrapping into a special type:

```tolk theme={null}
// maximum 620 bits (if all coins are billions of billions)
// by default, the compiler will make a ref
struct ProbablyLarge {
    a: (coins, coins, coins, coins, coins)
}

fun demo(contents: ProbablyLarge) {
    // but you are sure: coins are small;
    // so, you take the risks and force "no ref"
    createMessage({
        body: UnsafeBodyNoRef {
            forceInline: contents,
        },
        // ...
    });
    // btw, here TBody = UnsafeBodyNoRef<ProbablyLarge>
}
```

If `body` is already a cell, it will be left as a ref, without any surprise:

```tolk theme={null}
createMessage({
    body: someCell,  // ok, just a cell, keep it as a ref
    // ...
});
```

Therefore, do not pass `body: obj.toCell()`, pass just `body: obj`, let the compiler take care of everything.

## Body is not restricted to structures

An interesting fact — this also works:

```tolk theme={null}
val excessesMsg = createMessage({
   // ...
   body: (0xd53276db as int32, input.queryId)
});
excessesMsg.send(mode);
```

It is inferred as `createMessage<(int32, uint64)>(...)` and encoded correctly.
This simply illustrates the flexibility of the type system.

## Body can be empty

If no `body` is needed, it can be omitted entirely:

```tolk theme={null}
createMessage({
    bounce: BounceMode.NoBounce,
    dest: somewhere,
    value: remainingBalance
});
```

<Aside type="note">
  A curious question: "what's the type of `body` here"? The answer is: `void`.

  A struct is declared like this: <code>{'CreateMessageOptions<' + 'TBody = void' + '>'}</code>.
  Hence, omitting `body` leads to `void`, and by convention, void fields may be omitted in object literals.
</Aside>

## SendMode

Typically, `createMessage()` is followed by `msg.send(mode)`.

[Read about send modes](/foundations/messages/modes#sending-modes).

## Low-level terminology: `StateInit` != `code+data`

<Aside type="caution">
  This section is intended for experienced users; it discusses terminology.
</Aside>

It's incorrect to say that `StateInit = code+data`, because in TON, a full `StateInit` cell contents is richer (consider `block.tlb`):
it also contains fixed\_prefix\_length (automatically set by the compiler if `toShard`), ticktock info, and a library cell.

Therefore, the structure **code + data** is named `ContractState`:

```tolk theme={null}
// in stdlib
struct ContractState {
    code: cell
    data: cell
}
```

And that's why a field `stateInit: ContractState | cell` is named **stateInit**, emphasizing that `StateInit` can be initialized automatically from `ContractState` (or can be a well-formed rich cell).

## Q: Why not send, but createMessage?

Typically, yes — a message is sent immediately after being composed. However, certain scenarios require separating composition from sending:

* not just send, but send and estimate fees,
* or estimate fees without sending,
* or get a message hash,
* or save a message cell to storage for later sending,
* or even push it to an action phase.

So, composing a message cell and THEN doing some action with it is a more flexible pattern.

Moreover, following this pattern requires to give **a name** to a variable. It is advisable not to name it "m" or "msg", but to give a descriptive name like "excessesMsg" or "transferMsg":

```tolk theme={null}
val excessesMsg = createMessage({
    // ...
});
excessesMsg.send(mode);
// also possible
excessesMsg.sendAndEstimateFee(mode);
```

This strategy makes the code **easier to read** later. While scanning the code, a reader sees: this is about excesses, this one is about burn notification, etc. As opposed to a potential `send(...)` function, hard to identify what *meaning* is intended by the exact call.

## Q: Why not provide a dedicated deploy function?

In other words: why `stateInit` is a **destination**? Why not make a `deploy()` function that accepts code+data, and drop stateInit from a regular createMessage?

The answer lies in terminology. Yes, **attaching stateInit** is often referred to as **deployment**, but it's an inaccurate term. **TON Blockchain doesn't have a dedicated deployment mechanism.** A message is sent to some *void*  — and if this *void* doesn't exist, but a way to initialize it (code+data) is provided — it's initialized immediately and accepts the message.

To emphasize deployment intent, give it *a name*:

```tolk theme={null}
val deployMsg = createMessage({
    ...
});
deployMsg.send(mode);
```

## Universal createExternalLogMessage

The philosophy mirrors that of `createMessage`. But **external outs** don't have bounce, attached tons, etc. So, the options for creating are different.

**Currently, external messages are used only for emitting logs** (for viewing them in indexers). But theoretically, they can be extended to send messages to off-chain.

Example:

```tolk theme={null}
val emitMsg = createExternalLogMessage({
    dest: createAddressNone(),
    body: DepositEvent { ... }
});
emitMsg.send(SEND_MODE_REGULAR);
```

**Available options for external-out messages** are only `dest` and `body`, actually:

```tolk theme={null}
struct CreateExternalLogMessageOptions<TBody = void> {
    /// destination is either an external address or a pattern to calculate it
    dest: any_address |     // either some valid external/none address (not internal!)
          builder |         // ... or a manually constructed builder with a valid external address
          ExtOutLogBucket;  // ... or encode topic/eventID in destination

    /// body is any serializable object (or just miss this field for empty body)
    body: TBody;
}
```

Similarly, the compiler automatically decides whether `body` it fits into the same cell or needs to be a ref. `UnsafeBodyNoRef` is also applicable.

**Emitting external logs, example 1**:

```tolk theme={null}
struct DepositData {
    amount: coins;
    ...
}

val emitMsg = createExternalLogMessage({
    dest: ExtOutLogBucket { topic: 123 },   // for indexers
    body: DepositData { ... }
});
emitMsg.send(SEND_MODE_REGULAR);
```

**Emitting external logs, example 2**:

```tolk theme={null}
struct (0x12345678) DepositEvent {
    amount: coins;
    ...
}

createExternalLogMessage({
    dest: createAddressNone(),
    body: DepositEvent { ... }   // 0x12345678 for indexers
});
```

`ExtOutLogBucket` is a variant of a custom external address for emitting logs **to the outer world.**
It includes some **topic** (arbitrary number), that determines the format of the message body.
In the example above, a deposit event is emitted (reserving topic `deposit = 123`), and the resulting logs will be indexed by destination address without requiring body parsing.
