Early Access. The per-wallet fee breakdown described on this page (
feeInfo.sender, feeInfo.recipient and blockchainInfo.feeBreakdowns) is in Early Access and is enabled per workspace. To join, contact your Customer Success Manager. Fields may be added during Early Access. The existing networkFee field does not change.Overview
On The Open Network (TON), a single transfer is carried out by several on-chain transactions, and each of them charges a fee to the account that runs it. A transfer of a Jetton (a fungible token on TON, such as USDT) involves more accounts than a native TON transfer, and the sender also attaches TON to pay for the steps that happen in other accounts. Fireblocks reports a singlenetworkFee per transaction. For TON, that number does not always match what your own wallet paid. The Early Access fee breakdown adds, for each of your wallets that took part in the transfer, the TON that was deducted from it and what that amount is made of.
This page explains how fees work on TON, what each new field means, and how to reconcile your TON balances with them.
Why several accounts pay fees on TON
Every account on TON is a smart contract, and accounts communicate only by sending messages to each other. Each message is processed in a separate transaction of the receiving account, and each transaction charges fees to that account.Native TON transfer
A native TON transfer involves two transactions:- The sender’s wallet receives your signed request from outside the blockchain (an external message), runs its code and sends an internal message carrying the TON to the recipient. The sender pays for this transaction and for forwarding the message.
- The recipient’s wallet receives the message. Its own fees for processing it are taken from its balance, so it is credited slightly less than the amount sent.
Jetton transfer
Jettons are not held in your wallet itself. Each owner of a Jetton has a separate Jetton wallet (a token wallet) contract that holds the balance. A Jetton transfer follows the flow defined in the Jetton standard:- The sender’s wallet sends a
transfermessage to its own Jetton wallet. Fireblocks attaches TON to this message to pay for the next steps. By default this is the transaction’s fee value (0.1 TON unless you set another fee). - The sender’s Jetton wallet sends an
internal_transfermessage with the tokens to the recipient’s Jetton wallet. Its fees are paid from the attached TON. - The recipient’s Jetton wallet credits the tokens and pays its fees from the attached TON. If this transfer creates the recipient’s Jetton wallet, part of the attached TON stays in that new wallet as its minimum balance for storage.
- The recipient’s wallet receives a
transfer_notificationmessage carrying a small amount of TON (the forward amount) when the sender sets one. Processing this notification charges the recipient’s wallet a fee. When the forward amount is too small to pay for running the wallet’s code, which is common, the wallet pays only its storage fee, often a few nanoTON (1 TON is 1,000,000,000 nanoTON). - The unused TON (the excess) goes back in an
excessesmessage to the response destination, which is normally the sender’s wallet. Receiving it costs that wallet a small fee. You can send the excess to another wallet withextraParameters.feeExcessDestination.
Fee types
Each transaction’s fee is made of the following TON fee types:
For the official definitions, see Transaction fees and Execution phases in the TON documentation.
What networkFee contains on TON
networkFee keeps its current meaning. On TON it is calculated from the transaction that started the transfer and the last message of the transfer, so it describes the transfer, not necessarily your wallet:
To know what your own wallets paid, use
feeInfo.sender and feeInfo.recipient, and the entries in blockchainInfo.feeBreakdowns.
Where the breakdown is reported
The breakdown is reported in two places:feeInfo.senderandfeeInfo.recipient: a short summary in TON, with nine decimals likenetworkFee, for each wallet of your workspace in the transfer:feesDeductedand, for a Jetton recipient,valueCredited. When both the sender and the recipient are wallets of your workspace, Fireblocks records a single transaction that has both. These objects are only in the top-levelfeeInfo, not insideblockchainInfo. See feeInfo for the fields.blockchainInfo.feeBreakdowns: the full detail, one entry for each of your wallets that took part in the transfer, with amounts as integer strings in nanoTON. See TonFeeBreakdown for the fields.
fundingSpent.
How the amounts add up
The amounts relate to each other as follows:totalFees=storageFees+importFee+gasFees+actionFees+bounceFees.- For each entry, the TON deducted from that wallet is
totalFees+totalOutMsgsForwardFees+fundingSpent(fundingSpentis 0 when absent). Converted from nanoTON to TON, this equals thefeesDeductedof the matching role infeeInfo(feeInfo.senderfor theSENDERentry,feeInfo.recipientfor theRECIPIENTentry). forwardFeesis the total forwarding charge as the blockchain reports it, and it already includesactionFees. Do not addforwardFeestototalFees; usetotalOutMsgsForwardFeesinstead.importFeeis not recorded by the blockchain. Fireblocks derives it as the part oftotalFeesthat the other components do not explain, so it appears only on the transaction that received your signed request.
What feesDeducted means for each wallet
For a Jetton sender,
fundingSpent is everything in feesDeducted that was not the sending wallet’s own transaction fee. It covers the fees of both Jetton wallets, the TON kept by the recipient’s Jetton wallet when the transfer creates it, the forward amount delivered to the recipient and, when the excess returns to the sender, the fee to receive it. These parts are not reported separately.
When an entry is missing
Fireblocks reports an amount only when it can be proven from the completed on-chain transactions. If it cannot, that wallet’s entry and its object infeeInfo are left out rather than reported with an estimated value. The other wallet’s figures are still reported.
A wallet that paid nothing is reported as zero, never left out. For example, an incoming Jetton transfer with no forward amount sends no notification to your wallet. Your wallet then gets a RECIPIENT entry with no txHash and every figure "0", and feeInfo.recipient.feesDeducted is "0.000000000".
The breakdown is not reported for:
- Transfers processed before the feature was enabled for your workspace.
- Jetton transfers that bounced.
feeBreakdowns, messageContent or both may be left out. tonTransferType, the hashes, isFeeExcess and the top-level feeInfo are always included.
Worked examples
All amounts below come from completed mainnet transfers. Addresses and hashes are placeholders.Native TON transfer between two of your vault accounts
You send 0.468899688 TON from one vault account to another. Both wallets belong to your workspace, so Fireblocks records one transaction that carries both entries, andfeeInfo has both sender and recipient.
- Sender:
feesDeducted=totalFees+totalOutMsgsForwardFees= 418,076 + 57,424 = 475,500 nanoTON. For an outgoing native transfer this equalsnetworkFee. forwardFees(86,134) isactionFees(28,710) plustotalOutMsgsForwardFees(57,424). Adding it tototalFeeswould countactionFeestwice.- Recipient: the receiving wallet paid 66,069 nanoTON, so it was credited 0.468899688 - 0.000066069 = 0.468833619 TON.
- The workspace’s total cost is 475,500 + 66,069 = 541,569 nanoTON (0.000541569 TON).
networkFeecovers the sending wallet only.
SENDER entry and feeInfo.sender.
Outgoing Jetton transfer with the excess returned
You send 2.24 USDT to an external address. Fireblocks attaches 0.14 TON, and 0.138533961 TON comes back to your wallet as the excess. The transfer creates the recipient’s Jetton wallet.- The last four rows add up to
fundingSpent(0.001504507 TON): the attached 0.14 TON, minus the 0.138533961 TON excess, plus the 0.000038468 TON fee to receive it. networkFeeis 0.002638983 TON because it does not include the fee to receive the excess and it adds the forward amount once more.- The sender’s Jetton wallet also paid 0.000000005 TON of storage from its own balance. Fees that a Jetton wallet pays from its own balance are not part of the breakdown.
Incoming native TON transfer
An external wallet sends 1 TON to your vault account.- Your wallet paid 0.000051706 TON, almost all of it gas, and its balance increased by 1 - 0.000051706 = 0.999948294 TON.
networkFee(0.000388277 TON) is the sending wallet’s cost, not yours.
networkFee was 0.002074288 TON, the cost of the account that started the distribution. The receiving wallet’s feesDeducted was 0.000009936 TON (storageFees 2 and gasFees 9,934 nanoTON), so it was credited 0.000000064 TON.
Incoming Jetton transfer
Another Fireblocks workspace sends you 53,661 USDT with a forward amount of 1 nanoTON. Your wallet’s only cost is processing the token notification. The forward amount is too small to pay for running the wallet’s code, so the wallet pays only its storage fee.- The net change of your wallet’s TON balance is
valueCreditedminusfeesDeducted: 1 - 56 = -55 nanoTON. networkFee(0.001035344 TON) is the sending workspace’s cost. That workspace sees its own figure in its own transaction:feeInfo.sender.feesDeductedis0.001101411.- The fees of your Jetton wallet were paid from the TON the sender attached.
Excess sent to another wallet
You send 1,000 USDT between two of your vault accounts with 0.158895 TON attached, andextraParameters.feeExcessDestination sends the excess to a third vault account. When reporting the excess as its own transaction is enabled for your workspace, Fireblocks records two transactions with the same transaction hash.
The Jetton transfer:
feesDeducted counts the full attached TON (fundingSpent is 158895000 nanoTON) on top of the wallet’s own fees (579,512 nanoTON). The transaction also carries the RECIPIENT entry, and feeInfo.recipient shows the recipient’s 1 nanoTON fee and the 1 nanoTON forward amount it received.
The excess, recorded as an incoming native TON transfer of 0.158363394 TON to the third vault account:
feesDeducted, minus the amount of the excess transaction, plus the excess transaction’s feesDeducted. Here that is 0.159474512 - 0.158363394 + 0.000038470 = 0.001149588 TON. The recipient’s 1 nanoTON fee and 1 nanoTON forward amount cancel out.
Learn more
- Transaction fees in the TON documentation: storage, gas, action, forward and import fees.
- Execution phases in the TON documentation: the order in which fees are charged, and when the compute phase is skipped.
- Jetton: how it works in the TON documentation: the transfer, notification and excess messages.
- TEP-74 Jetton standard, the TON Enhancement Proposal that defines Jettons.
- feeInfo and BlockchainInfo in the API reference.