Реализация расчёта и настройки Gas Fee в мобильном криптокошельке
Gas fee — не просто цифра в интерфейсе. Это баланс между скоростью подтверждения и стоимостью. Мобильный кошелёк должен предлагать разумные значения по умолчанию и одновременно давать контроль тем, кто его хочет.
Откуда брать актуальный gasPrice
Для legacy-транзакций (до EIP-1559) или сетей без поддержки EIP-1559 (BNB Chain по умолчанию): eth_gasPrice возвращает медианный gasPrice из последних блоков. Это отправная точка.
Для Ethereum Mainnet и сетей с EIP-1559 — eth_feeHistory(10, "latest", [10,50,90]) даёт percentile-распределение priority fee за последние 10 блоков. Это основа для расчёта slow/average/fast.
// Android — web3j: получить feeHistory
val feeHistory = web3j.ethFeeHistory(10, DefaultBlockParameterName.LATEST, listOf(10.0, 50.0, 90.0)).send()
val baseFee = feeHistory.feeHistory.baseFeePerGas.last() // в wei
val slowPriorityFee = feeHistory.feeHistory.reward[0][0] // 10-й percentile
val avgPriorityFee = feeHistory.feeHistory.reward[0][1] // 50-й percentile
val fastPriorityFee = feeHistory.feeHistory.reward[0][2] // 90-й percentile
Для Polygon с его спайками gasPrice рекомендую использовать Gas Station API: https://gasstation.polygon.technology/v2 — он учитывает локальную специфику сети.
Три режима: Slow / Average / Fast
Стандартная схема:
| Режим | Base Fee | Priority Fee | Ожидаемое время |
|---|---|---|---|
| Медленно | base + 0% | 10-й percentile | 3–5 минут |
| Среднее | base + 10% | 50-й percentile | ~30 секунд |
| Быстро | base + 20% | 90-й percentile | ~15 секунд |
maxFeePerGas = baseFee * multiplier + priorityFee. Пользователь выбирает режим — приложение автоматически пересчитывает итоговую стоимость в USD.
Ручная настройка для продвинутых пользователей
Режим «Кастом» — поля для ввода maxFeePerGas и maxPriorityFeePerGas в Gwei. Обязательная валидация:
-
maxPriorityFeePerGas <= maxFeePerGas -
maxFeePerGas >= текущий baseFee(иначе транзакция зависнет) - Предупреждение, если значения слишком занижены: «Транзакция может не подтвердиться несколько часов»
Вводить значения в Gwei удобнее, чем в Wei. Конвертация: 1 Gwei = 10^9 Wei.
Estimation gasLimit
eth_estimateGas обязателен для ERC-20 transfers и контрактных вызовов. Возвращает ориентировочный gasLimit — рекомендуется умножить на 1.2 для запаса. Для ETH transfer — фиксированный 21000 gas.
Если eth_estimateGas возвращает ошибку execution reverted — транзакция гарантированно провалится. Показать пользователю ошибку до отправки, не давать подтверждать.
Сроки: 2–3 дня: polling feeHistory, расчёт трёх режимов, UI выбора скорости с отображением стоимости в USD, кастомный режим с валидацией, estimation gasLimit.







