Как сверить комиссию транзакции Substrate без двойного учёта чаевых
Предварительная оценка показывает ожидаемую стоимость вызова. После исполнения в сети с оплатой нативным токеном специальное событие указывает плательщика и фактически начисленную комиссию.
Найдите событие оплаты нужного extrinsic
Получите recordsForExtrinsic из его фазы ApplyExtrinsic в финализированном блоке включения. Используйте типы событий соответствующего runtime в polkadot-js. Сохраните хеши транзакции и блока вместе с записью комиссии.
for (const {event} of recordsForExtrinsic) {
if (api.events.transactionPayment.TransactionFeePaid.is(event)) {
const [payer, actualFee, tip] = event.data
console.log(payer.toString(), actualFee.toString(), tip.toString())
}
}
Выделите чаевые из общей комиссии
Если actual_fee равно 130 единицам, а tip — 10, итоговая сумма комиссии составляет 130. Без чаевых остаётся 120. При сложении двух полей в журнал ошибочно попадёт 140. До отображения храните суммы в минимальных единицах сети.
Отдельно сопоставьте сумму события с предварительной оценкой paymentInfo. При поддержке оплаты иными активами возможны другие события и единицы, поэтому выбирайте декодер по механизму оплаты конкретного runtime.