Как сверить комиссию транзакции 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.

Источники