Реалізація EIP-1559 механізму комісій у мобільному гаманці
До EIP-1559 гаманці угадували gasPrice—часто переплачували або транзакція зависала. EIP-1559, активований в Ethereum блоці 12,965,000 (август 2021), ввів передбачуваний механізм комісій. Підтримувати його правильно—не просто використовувати нові поля, але й пояснювати їх користувачу.
Структура типу транзакції 2 (EIP-1559)
Транзакція type 2 містить три ключові параметри замість одного gasPrice:
-
baseFee — автоматично розраховується протоколом, спалюється (не йде майнеру). Збільшується на 12.5% при заповненому блоці, зменшується при пустому. Отримати поточну:
eth_getBlockByNumber("pending", false)→ полеbaseFeePerGas. - maxPriorityFeePerGas (tip)—вознаграження майнеру/валідатору. Мінімальний tip для включення в блок—зазвичай 0.1–2 Gwei.
-
maxFeePerGas — абсолютний максимум, який готов заплатити користувач. Фактично списується:
min(maxFeePerGas, baseFee + maxPriorityFeePerGas). Різниця повертається.
// iOS — web3swift: побудова EIP-1559 транзакції
var transaction = CodableTransaction(
type: .eip1559,
to: recipientAddress,
value: amount,
data: Data()
)
transaction.maxFeePerGas = baseFee + maxPriorityFee + buffer
transaction.maxPriorityFeePerGas = maxPriorityFee
transaction.chainID = BigUInt(1) // Ethereum Mainnet
Чому maxFeePerGas важливіша за gasPrice
Користувач бачить maxFeePerGas = 50 Gwei, але якщо baseFee в момент майнингу дорівнює 20 Gwei, а tip—2 Gwei, заплатить 22 Gwei. Залишок 28 Gwei повернеться. Ключове відмінність від legacy-транзакцій, де вся сума йшла в дохід майнеру.
В UI краще показувати не maxFeePerGas, а очікувану комісію (baseFee + tip) та максимально можливу (maxFeePerGas * gasLimit). Це знижує тривогу користувачів, які бачать великий максимум.
Динамічні подсказки
Рекомендовані значення оновлювати щих 12 секунд (час блока Ethereum). Джерела:
-
eth_feeHistory—розрахунок percentile priority fee самостійно -
eth_maxPriorityFeePerGas—MetaMask-метод, підтримується Infura, Alchemy, QuickNode - Blocknative Gas API—платний, але дуже точний для Mainnet
// Android — отримати рекомендований priority fee
val maxPriorityFeeResponse = web3j.send(
Request("eth_maxPriorityFeePerGas", emptyList<Any>(), web3jService, EthMaxPriorityFeePerGas::class.java)
)
val priorityFeeWei = maxPriorityFeeResponse.maxPriorityFeePerGas
Мережі без EIP-1559
BNB Chain використовує legacy-формат з фіксованим gasPrice (за умовчанням 3 Gwei). Polygon підтримує EIP-1559 з версії 26.x. Arbitrum та Optimism—власні механізми поверх EIP-1559.
Програма повинна визначати тип мережі та вибирати відповідний формат транзакції автоматично. Відправка type-2 транзакції в мережу без EIP-1559 повертає помилку unsupported transaction type.
Сроки: 2–3 дні: визначення типу мережі, побудова type-2 транзакцій, динамічні подсказки комісій, відображення очікуваної та максимальної вартості, автоматичний fallback на legacy для несумісних мереж.







