Open 9oelM opened 3 weeks ago
Transaction has multiple phases (storage, compute, action). Gas is compute phase only. totalFees is sum of fees of all phases in the specified transaction. (not series of transactions).
@Trinketer22 thanks for the reply. Then could you break the fees in the first transaction down for me?: How are they supposed to add up or make sense mathematically?
Well, the totalFees should be compute+action_fees+storage+external import(in case of transaction triggered by external message). If we're talking tx with index 0, then the import fee is there, because it's external triggered. As you can see, storage+import are not part of the table and action fees is in fact lower.
In order to get to the bottom of what is happening, you can print the blockchainLogs of this transaction. Because for whatever reason, the import fee is not part of transaction description.
In case of transactions, triggered by external message, the fees are deducted from contract balance, so (valueIn - valueOut) is not valid logic here.
There is also a gotcha in the fact that totalFees represent the amount of fees collected at this point. But the tricky part is that the forward fee is collected in two parts in/out. One part for the sending shard and the other for the receiving shard. the fwdOut goes to the action fees and accounted in totalFees on the sender part, while inFwd part is accounted for totalFees on receiver. I think it would be better to display action fees separately.
What printTransaction displays as outForwardFee is in fact the totalForwardFee, and that's likely a bug.
@Trinketer22 wow thank you so much for the explanation. Now I kinda get the hang of it. Appreciate the help.
@9oelM, you can also go through this attempt to explain fees in detail, if you haven't already.
Bare in mind that there is slight naming confusion when reading about fwd_fees. fwd_in/fwd_out vs fwd_mine/fwd_remain. What printTransaction atempts to show as fwd_in/out is mine/remain and fwd_in supposed to be used for the external import fee.
I have a question about
tx.totalFees.coins
. I genuinely cannot understand what this value is supposed to represent. In my case, I want to write a test on how much gas is spent for a series of transactions.I've provided an example at https://github.com/9oelM/ton-sandbox-totalfees-bug.git. The test setup is simple:
In code, it is as simple as:
printTransactionFees(increaseResult.transactions);
prints:But I couldn't wrap my head around these numbers. I thought totalFees is supposed to be the sum of all total fees for a tx. In other words, $valueIn - valueOut = totalFees$. But this simply isn't the case:
valueIn = 0.05 TON
(we started with 0.05 TON) andvalueOut = 0.0496 TON
.valueIn - valueOut = 0.0004
. ButtotalFees = 0.001613
???valueIn = 0.0496 TON
andvalueOut = 0.046978 TON
.valueIn - valueOut = 0.002622
. ButtotalFees = 0.002296
???If totalFees were correctly calculated as total gas for the tx,
toNano('0.05') - allFees
would simply match the TON balance transferred to a contract, which iscontractBTONBalanceAfter - contractBTONBalanceBefore
. But this is not the case. In fact,lastTx.value - lastTx.totalFees == contractBTONBalanceAfter - contractBTONBalanceBefore != toNano('0.05') - allFees
:lastTx.value! - lastTx.totalFees!
=45904800n
contractBTONBalanceAfter - contractBTONBalanceBefore
=45904800n
toNano('0.05') - allFees
=45020139n
cc @krigga