Skip to content

Комиссии (Fee)

Что такое Fee

Fee (комиссия) — это процент от суммы трансфера, который удерживается бриджом при переводе токенов между сетями.

Зачем нужна fee?

Комиссия (fee) взимается бриджом при кросс-чейн трансферах токенов для покрытия операционных расходов и обеспечения экономической устойчивости протокола.

Важно

Комиссия взимается только на стороне EVM сети. На стороне TVM комиссия не применяется.

Кто получает fee?

  • Комиссия накапливается на контракте MultiVault
  • Получатель: адрес governance (администратор контракта)
  • Вывод комиссий: функция skim() переводит накопленные комиссии на адрес governance

Типы комиссий

Deposit Fee

Комиссия взимается при депозите токенов из EVM в TVM сеть.

Пользователь отправляет 1000 USDT → Fee 10 USDT (1%) → В TVM уходит 990 USDT

Когда применяется:

  • При вызове deposit() на контракте MultiVault
  • При вызове depositByNativeToken() для нативных токенов (ETH, BNB и т.д.)

Withdraw Fee

Комиссия взимается при выводе токенов из TVM в EVM сеть.

Пользователь выводит 1000 USDT из TVM → Fee 10 USDT (1%) → Получает 990 USDT в EVM

Когда применяется:

  • При вызове saveWithdrawNative() / saveWithdrawAlien() на контракте MultiVault
  • После подтверждения события релеями

Схема взимания комиссии

┌─────────────────────────────────────────────────────────────────┐
│                      EVM → TVM (Deposit)                        │
├─────────────────────────────────────────────────────────────────┤
│  User sends 1000 tokens                                         │
│       ↓                                                         │
│  MultiVault.deposit()                                           │
│       ↓                                                         │
│  Calculate fee: 1000 × depositFee / 10000                       │
│       ↓                                                         │
│  Fee (e.g. 10) stays on MultiVault                              │
│       ↓                                                         │
│  990 tokens transferred to TVM                                  │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                      TVM → EVM (Withdraw)                       │
├─────────────────────────────────────────────────────────────────┤
│  User initiates withdraw of 1000 tokens in TVM                  │
│       ↓                                                         │
│  Event created, relays confirm                                  │
│       ↓                                                         │
│  User calls saveWithdraw*() on MultiVault                       │
│       ↓                                                         │
│  Calculate fee: 1000 × withdrawFee / 10000                      │
│       ↓                                                         │
│  Fee (e.g. 10) stays on MultiVault                              │
│       ↓                                                         │
│  User receives 990 tokens                                       │
└─────────────────────────────────────────────────────────────────┘

Default и Token-specific Fee

Два уровня настройки

Комиссии настраиваются на двух уровнях:

УровеньОписаниеКогда используется
Default FeeГлобальные значения по умолчаниюПри активации нового токена
Token-specific FeeИндивидуальные настройки для токенаПосле активации токена

Default Fee

Глобальные настройки комиссий, разделённые по типу токена:

ПараметрОписание
defaultNativeDepositFeeDefault deposit fee для Native токенов (изначально выпущены в TVM)
defaultNativeWithdrawFeeDefault withdraw fee для Native токенов
defaultAlienDepositFeeDefault deposit fee для Alien токенов (изначально выпущены в EVM)
defaultAlienWithdrawFeeDefault withdraw fee для Alien токенов

Token-specific Fee

Индивидуальные настройки для каждого токена:

ПараметрОписание
tokens_[token].depositFeeDeposit fee для конкретного токена
tokens_[token].withdrawFeeWithdraw fee для конкретного токена

Как применяется fee

┌─────────────────────────────────────────────────────────────────┐
│              Схема применения fee при активации токена          │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  Первое использование токена                                    │
│       ↓                                                         │
│  Вызывается _activateToken()                                    │
│       ↓                                                         │
│  Определяется тип токена (Native или Alien относительно TVM)    │
│       ↓                                                         │
│  ┌─────────────────┐     ┌─────────────────┐                    │
│  │  Native токен   │     │  Alien токен    │                    │
│  │   (из TVM)      │     │   (из EVM)      │                    │
│  └────────┬────────┘     └────────┬────────┘                    │
│           ↓                       ↓                             │
│  defaultNativeDepositFee   defaultAlienDepositFee               │
│  defaultNativeWithdrawFee  defaultAlienWithdrawFee              │
│           ↓                       ↓                             │
│           └───────────┬───────────┘                             │
│                       ↓                                         │
│  Копируются в tokens_[token].depositFee / withdrawFee           │
│                       ↓                                         │
│  Все последующие операции используют token-specific fee         │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Важно

После активации токена изменение default fee НЕ влияет на этот токен. Для изменения fee уже активированного токена нужно явно вызвать setTokenDepositFee() / setTokenWithdrawFee().

Настройка комиссий

Установка default fee (для новых токенов):

solidity
setDefaultNativeDepositFee(100);   // 1% для Native токенов (из TVM) deposit
setDefaultNativeWithdrawFee(50);   // 0.5% для Native токенов withdraw
setDefaultAlienDepositFee(100);    // 1% для Alien токенов (из EVM) deposit
setDefaultAlienWithdrawFee(50);    // 0.5% для Alien токенов withdraw

Установка token-specific fee (для существующих токенов):

solidity
setTokenDepositFee(tokenAddress, 200);  // 2% deposit для конкретного токена
setTokenWithdrawFee(tokenAddress, 100); // 1% withdraw для конкретного токена

Структура данных

Константы

КонстантаЗначениеОписание
MAX_BPS10,000100% в basis points (1 BPS = 0.01%)
FEE_LIMIT5,000Максимально допустимая fee = 50%

Token структура

Хранит информацию о токене, включая комиссии. Каждый токен имеет индивидуальные настройки fee.

АтрибутТипОписание
activationuintНомер блока активации токена
blacklistedboolФлаг блокировки токена
depositFeeuintКомиссия при депозите (в BPS)
withdrawFeeuintКомиссия при выводе (в BPS)
isNativebooltrue = Native токен (из TVM), false = Alien токен (из EVM)
customaddressКастомный адрес токена

Storage переменные

ПеременнаяТипОписание
tokens_mapping(address => Token)Маппинг адрес токена → конфигурация
defaultNativeDepositFeeuintDefault fee для депозита Native токенов (из TVM)
defaultNativeWithdrawFeeuintDefault fee для вывода Native токенов
defaultAlienDepositFeeuintDefault fee для депозита Alien токенов (из EVM)
defaultAlienWithdrawFeeuintDefault fee для вывода Alien токенов

Fee enum

ЗначениеОписание
DepositКомиссия при депозите
WithdrawКомиссия при выводе

Расчёт комиссии

Формула

fee = amount × feeRate / MAX_BPS

Где:

  • amount — сумма трансфера
  • feeRate — ставка комиссии в BPS (basis points)
  • MAX_BPS = 10,000 (100%)

Функция расчёта

ФункцияОписание
_calculateMovementFee()Рассчитывает fee на основе типа операции (Deposit/Withdraw) и ставки токена

Примеры расчёта

СуммаFee Rate (BPS)Fee Rate (%)Комиссия
1,000,000100.1%1,000
1,000,0001001%10,000
1,000,0005005%50,000
1,000,0005,00050%500,000 (максимум)

Управление комиссиями

Функции установки default fee

ФункцияПараметрыОписание
setDefaultNativeDepositFee()fee: uintУстанавливает default deposit fee для Native токенов (из TVM)
setDefaultNativeWithdrawFee()fee: uintУстанавливает default withdraw fee для Native токенов
setDefaultAlienDepositFee()fee: uintУстанавливает default deposit fee для Alien токенов (из EVM)
setDefaultAlienWithdrawFee()fee: uintУстанавливает default withdraw fee для Alien токенов

Функции установки token fee

ФункцияПараметрыОписание
setTokenDepositFee()token: address, fee: uintУстанавливает deposit fee для конкретного токена
setTokenWithdrawFee()token: address, fee: uintУстанавливает withdraw fee для конкретного токена

Вывод комиссий

ФункцияПараметрыОписание
skim()token: addressПереводит накопленные комиссии токена на адрес governance

Функция рассчитывает накопленную fee как разницу между балансом контракта и заблокированной ликвидностью (liquidity[token]).

Права доступа

ДействиеТребуемая рольКонтракт
Установить default feegovernanceMultiVaultFacetFees
Установить token feegovernanceMultiVaultFacetFees
Вывести комиссии (skim)governanceMultiVaultFacetFees

Events

EventПараметрыОписание
UpdateDefaultNativeDepositFeefeeИзменение default deposit fee для Native токенов
UpdateDefaultNativeWithdrawFeefeeИзменение default withdraw fee для Native токенов
UpdateDefaultAlienDepositFeefeeИзменение default deposit fee для Alien токенов
UpdateDefaultAlienWithdrawFeefeeИзменение default withdraw fee для Alien токенов
UpdateTokenDepositFeetoken, feeИзменение deposit fee для токена
UpdateTokenWithdrawFeetoken, feeИзменение withdraw fee для токена
SkimFeetoken, skim_to_everscale, amountВывод накопленных комиссий

Лимиты

ПараметрЗначениеОписание
MAX_BPS10,000100% в basis points
FEE_LIMIT5,000Максимальная fee = 50%

При попытке установить fee > FEE_LIMIT транзакция будет отклонена.

Fee в разных потоках

EVM → TVM (deposit)

  1. Пользователь вызывает deposit() на MultiVault
  2. Рассчитывается depositFee через _calculateMovementFee()
  3. Fee вычитается из суммы трансфера
  4. Fee остаётся на контракте MultiVault (накапливается)
  5. В TVM сеть передаётся сумма за вычетом fee

TVM → EVM (withdraw)

  1. Пользователь инициирует withdraw в TVM сети (комиссия не взимается)
  2. Event контракт создаётся с информацией о трансфере
  3. Relay ноды подтверждают событие
  4. Пользователь вызывает saveWithdraw*() на MultiVault в EVM
  5. Рассчитывается withdrawFee через _calculateMovementFee()
  6. Fee вычитается, пользователь получает сумму за вычетом fee

API Reference

POST /payload/build

Возвращает информацию о комиссии в ответе:

ПолеТипОписание
feeAmountstringРассчитанная комиссия в минимальных единицах токена
tokenAmountstringСумма токенов после вычета комиссии

Риски и Edge Cases

Риск/ОшибкаПричинаЗащита/Решение
Fee > AmountКомиссия больше суммы трансфераТранзакция revert (underflow)
Fee = 50%+Попытка установить fee выше лимитаПроверка fee <= FEE_LIMIT
Zero governanceНе задан получатель feegovernance устанавливается при инициализации
Token не активированFee не задана для токенаТокен активируется автоматически при первом использовании
Изменение default feeНе влияет на существующие токеныНужно явно вызвать setTokenFee для каждого токена

Коды ошибок

Код ошибкиОписание
"Fee: limit exceeded"Попытка установить fee > FEE_LIMIT (5000 BPS = 50%)
"Fees: no fees to skim"Вызов skim() когда накопленная комиссия = 0
"Actors: only governance"Вызов setDefaultFee не от адреса governance
"Actors: only governance or management"Вызов skim() не от governance/management

ChainConnect Bridge Documentation