# Газ і комісії

> Як працюють комісії в NeuroChain — одиниці uNRO, газ на операцію, базова комісія в стилі EIP-1559, спалення 50%, газовий бюджет блоку і правила mempool з точними константами ноди.

Source: https://docs.nro.world/uk/learn/gas

Кожна сума в мережі — ціле число в **uNRO**: `1 NRO = 1 000 000 uNRO`.

Комісія — це **одиниці газу × ціна газу**, де ціна газу задається в uNRO за одиницю:

```
комісія (uNRO) = gas_units × gas_price
```

## Газ на операцію

| Операція | Одиниці газу | Константа |
|----------|--------------|-----------|
| Переказ | 21 | `GAS_BASE_TRANSFER` |
| Виклик контракту (адреса `.app` з даними виклику) | 50 наперед, потім перерахунок за фактом — див. нижче | `GAS_CONTRACT_CALL` |
| Розгортання контракту | 10 000, фіксовано | `DEPLOY_GAS_UNITS` |
| Передача платного імені (`.node`, `.vault`, `.agent`) | фіксовано **100 uNRO** | `NFT_TRANSFER_FEE` |
| Системні операції (стейкінг, реєстрації, кран, маркери управління) | 0 | — |

За мінімальної ціни газу 1 uNRO переказ коштує **21 uNRO = 0,000021 NRO**.

### Виклики контрактів

За виклик наперед списується 50 одиниць газу. Потім контракт виконується в WASM-інтерпретаторі з бюджетом **1 000 000 fuel** (`MAX_CONTRACT_GAS`). Після завершення нода переводить фактично витрачений fuel в одиниці газу — `ceil(fuel / 20 000)`, щонайменше 1 — і повертає або доплачує різницю.

Курс задає `NEUROCHAIN_FUEL_PER_GAS_UNIT` (за замовчуванням 20 000) — так, щоб виклик, який вичерпав увесь fuel, коштував рівно сплачені наперед 50 одиниць. Host-функції, як-от читання і запис сховища, витрачають додатковий fuel; див. [Газ і ліміти NeuroWASM](/uk/neurowasm/gas-limits).

Якщо контракт перервався або вичерпав fuel, зміни його сховища відкочуються і сума не переказується — але **nonce і комісія все одно витрачені**, тож невдалий виклик не можна безкоштовно повторювати.

## Базова комісія

Протокол підтримує **базову комісію**, що рухається за попитом, у стилі EIP-1559 з Ethereum:

- Починається з 1 uNRO за одиницю газу і ніколи не падає нижче цієї межі (`MIN_GAS_PRICE`).
- Після кожного блоку рухається до цілі — половини газового бюджету блоку (5 000 одиниць): вгору, якщо блок використав більше, вниз, якщо менше, щонайбільше на 12,5% за блок. Якщо рухається, то щонайменше на 1 uNRO, тож після навантаження повертається аж до мінімуму.
- **Транзакцію з `gas_price` нижче поточної базової комісії відхиляє кожен валідатор.** Це перевіряється в консенсусі, а не лише в mempool, тож пропозер не протягне занадто дешеву транзакцію повз інших.

Перед відправленням дізнайтеся поточне значення:

```bash
curl -s "$NODE_RPC/api/v1/gas/estimate"
```

```json
{
  "base_fee": 1,
  "gas_base_transfer": 21,
  "gas_contract_call": 50,
  "estimated_transfer": 21,
  "estimated_contract": 50,
  "estimated_transfer_human": "0.000021",
  "estimated_contract_human": "0.00005",
  "total_burned": 0,
  "nft_transfer_fee": 100,
  "nft_transfer_fee_human": "0.0001"
}
```

Gateway віддає те саме за адресою `$GATEWAY/api/v1/gas/estimate`. Вебгаманець надсилає `gas_price = base_fee × 1,5`, щоб випереджати зростання базової комісії.

## Куди йдуть комісії

![Рух комісії: комісія кожної транзакції ділиться — 50% спалюється, 50% отримує пропозер блоку; базова комісія задає мінімальну ціну газу](/diagrams/uk/fee-flow.svg)

Після кожного блоку сума його комісій ділиться:

- **50% спалюється** (`BURN_RATE_BPS = 5000`) і додається до лічильника `total_burned`.
- **50% отримує пропозер блоку.**

Плата за реєстрацію імен `.app` і `.vault` спалюється повністю; реєстрація `.node` натомість стає стейком. Див. [Адреси](./addresses).

## Бюджет блоку і mempool

| Правило | За замовчуванням | Зміна | Примітки |
|---------|------------------|-------|----------|
| Газ на блок | 10 000 одиниць | параметр управління `max_block_gas` | від 1 до 1 000 000 000; зчитується під час старту ноди |
| Транзакцій на блок | 500 | — | `MAX_BLOCK_TXS` |
| Розмір mempool | 10 000 | `NEUROCHAIN_MAX_MEMPOOL` | Коли заповнено, нова транзакція витісняє найдешевшу очікувану — лише якщо платить більше |
| Час у mempool | 60 секунд | — | Очікувана транзакція, що не потрапила в блок, відкидається |
| Очікуваних від відправника | 64 | `NEUROCHAIN_MAX_PENDING_PER_ACCOUNT` | Наступні транзакції з тієї ж адреси відхиляються |
| Заміна за комісією | +10% | `NEUROCHAIN_RBF_MIN_BUMP_PCT` | Повторне надсилання тих самих `(from, nonce)` замінює очікувану лише з ціною газу, вищою щонайменше на стільки |
| Мінімальна ціна в mempool | 0 (вимкнено) | `NEUROCHAIN_MIN_FEE_PER_GAS` | Необов'язковий вхідний поріг понад базову комісію |

Пропозер бере очікувані транзакції за спаданням комісії (транзакції одного відправника — у порядку nonce), пропускає нижчі за базову комісію і зупиняється, коли бюджет блоку вичерпано. Під час вибору кожен переказ рахує як 21 одиницю, а кожен виклик `.app` — як 50.

## Константи

| Константа | За замовчуванням | Значення |
|-----------|------------------|----------|
| `UNRO_PER_NRO` | 1 000 000 | uNRO в одному NRO |
| `GAS_BASE_TRANSFER` | 21 | Одиниць газу на переказ |
| `GAS_CONTRACT_CALL` | 50 | Одиниць газу наперед за виклик контракту |
| `DEPLOY_GAS_UNITS` | 10 000 | Одиниць газу на розгортання |
| `MAX_CONTRACT_GAS` | 1 000 000 | Бюджет fuel на виклик контракту |
| `NEUROCHAIN_FUEL_PER_GAS_UNIT` | 20 000 | Fuel на одиницю газу під час перерахунку |
| `MIN_GAS_PRICE` | 1 | Мінімум базової комісії, uNRO за одиницю |
| `MAX_BLOCK_GAS` | 10 000 | Одиниць газу на блок |
| `BURN_RATE_BPS` | 5 000 | Частка комісій, що спалюється, у базисних пунктах (50%) |
| `NFT_TRANSFER_FEE` | 100 | Фіксована плата за передачу платного імені, uNRO |
