# Експорти контракту

> Точки входу, які експортує контракт NeuroWASM, — call, init і заплановані query, migrate, sudo і reply — як VM їх викликає і де в пам'яті розміщуються вхідні дані виклику.

Source: https://docs.nro.world/uk/neurowasm/exports

Функції, які контракт **експортує**, щоб VM їх викликала. (Функції, які контракт *імпортує* з хоста, описано на інших сторінках цього розділу.)

Кожен контракт також має експортувати свою лінійну **`memory`**.

## `call` <Badge type="tip" text="працює" /> {#call}

```text
call(input_ptr: i32, input_len: i32)
```

Точка входу для кожного виклику контракту, читання чи запису.

- VM записує дані виклику (вміст JSON, див. [ABI і дані виклику](/uk/build/abi)) у пам'ять контракту **зі зміщенням 64**, а потім викликає `call(64, len)`.
- Контракт без параметрів, `call()`, теж приймається; тоді він не може прочитати вхідні дані.
- Результат — те, що контракт востаннє передав у `set_return`.
- Усе дерево викликів фіксується, лише якщо нічого не перервалося.

::: warning Залиште зміщення 64 вільним
Оскільки вхідні дані копіюються в `memory[64 .. 64 + len]`, контракт не повинен тримати там потрібні йому дані. За стандартного розташування інструментарію Rust (спершу стек, що росте вниз від верху першого мегабайта) це виконується для вхідних даних звичайного розміру.
:::

**Аналоги:** `execute` і `query` у CosmWasm, `@call` / `@view` у NEAR.

## `init` <Badge type="tip" text="працює" />

```text
init()
```

Конструктор, виконується один раз під час розгортання контракту — якщо модуль його експортує; відсутність `init` не є помилкою. Він може писати в сховище і створювати події.

`init` не отримує вхідних даних, і **`get_caller()` у ньому нічого не повертає**. Щоб записати власника чи прийняти параметри, обробляйте функцію `initialize` у `call`: транзакція розгортання викликає її з тим, хто розгортає, як викликачем, коли задано `init_args` (див. [Розгортання](/uk/build/deploy#_4-what-every-validator-does)). Захистіть її, щоб вона виконувалася лише раз.

**Аналоги:** `instantiate` у CosmWasm, `#[init]` у NEAR.

## `query` <Badge type="info" text="заплановано" />

Точка входу лише для читання, якій середовище заборонятиме писати. До того читайте через `call` з `dry_run: true` (`POST /api/v1/contracts/:address/call`).

## `migrate` <Badge type="info" text="заплановано" />

Виконується після заміни байткоду за тією самою адресою `.app`; дозвіл дає власник або управління.

## `sudo` <Badge type="info" text="заплановано" />

Лише дії протоколу й управління (пауза, задання параметрів) — ніколи не доступна з транзакції користувача.

## `reply` <Badge type="info" text="заплановано" />

Отримує результат `(id, result)` асинхронного підповідомлення. Потребує асинхронних міжконтрактних викликів, яких ще немає.

**Аналоги:** `reply` у CosmWasm, зворотні виклики обіцянок у NEAR.
