Understanding how fees are calculated.


There are 4 different fees the user should know about.
  1. 1.
    Inbound Fee (sourceChain: gasRate * txSize)
  2. 2.
    Liquidity Fee (swapSlip * swapAmount)
  3. 3.
    Affiliate Fee (affiliateFee * swapAmount)
  4. 4.
    Outbound Fee (destinationChain: gasRate * txSize)
SourceChain: the chain the user is swapping from
DestinationChain: the chain the user is swapping to
txSize: the size of the transaction in bytes (or units)
gasRate: the current gas rate of the external network
swapAmount: the amount the user is swapping
swapSlip: the slip created by the swapAmount, as function of poolDepth
affiliateFee: optional fee set by interface in basis points


Inbound Fee

This is the fee the user pays to make a transaction on the source chain, which the user pays directly themselves. The gas rate recommended to use is fast where the tx is guaranteed to be committed in the next block. Any longer and the user will be waiting a long time for their swap and their price will be invalid (thus they may get an unnecessary refund).
inboundFee=txSizegasRateinboundFee = txSize * gasRate
Always use a "fast" or "fastest" fee, if the transaction is not confirmed in time, it could be abandoned by the network or failed due to old prices. You should allow your users to cancel or re-try with higher fees.

Liquidity Fee

This is simply the slip created by the transaction multiplied by its amount. It is priced and deducted from the destination amount automatically by the protocol.
slip=swapAmountswapAmount+poolDepthslip = \frac{swapAmount}{swapAmount + poolDepth}
fee=slipswapAmountfee =slip * swapAmount

Affiliate Fee

In the swap transaction you build for your users you can include an affiliate fee for your exchange (accepted in $RUNE or a synthetic asset, so you will need a $RUNE address).
  • The affiliate fee is in basis points (0-10,000) and will be deducted from the inbound swap amount from the user.
  • If the inbound swap asset is a native THORChain asset ($RUNE or synth) the affiliate fee amount will be deducted directly from the transaction amount.
  • If the inbound swap asset is on any other chain the network will submit a swap to $RUNE with the destination address as your affiliate fee address.
  • If the affiliate is added to an ADDLP tx, then the affiliate is included in the network as an LP.
affliateFee=feeInBasisPointsswapAmount10000affliateFee = \frac{feeInBasisPoints * swapAmount}{10000}

Outbound Fee

This is the fee the Network pays on behalf of the user to send the outbound transaction. To adequately pay for network resources (TSS, compute, state storage) the fee is marked up to be 3 times the actual on-chain fee the nodes pay.
outboundFee=txSizegasRate3outboundFee = txSize * gasRate * 3
The minimum Outbound Layer1 Fee the network will charge is on /thorchain/mimir and is priced in USD (based on THORChain's USD pool prices). This means really cheap chains still pay their fair share. It is currently set to 100000000 = $1.00
See Outbound Fee for more information.

Refunds and MinSwapAmount

If a transaction fails, it is refunded, thus it will pay the outboundFee for the SourceChain not the DestinationChain. Thus devs should always swap an amount that is a minimum of:
  1. 1.
    The Destination Chain outboundFee
  2. 2.
    The Source Chain outboundFee
  3. 3.

Understanding gas_rate

THORNode keeps track of current gas prices. Access these at the /inbound_addresses endpoint of the THORNode API. The response is an array of objects like this:
"chain": "ETH",
"pub_key": "thorpub1addwnpepqdlx0avvuax3x9skwcpvmvsvhdtnw6hr5a0398vkcvn9nk2ytpdx5cpp70n",
"address": "0x74ce1c3556a6d864de82575b36c3d1fb9c303a80",
"router": "0x3624525075b88B24ecc29CE226b0CEc1fFcB6976",
"halted": false,
"gas_rate": "10"
"gas_rate_units": "satsperbyte",
"outbound_fee": "30000",
"outbound_tx_size": "1000",
The gas_rate property can be used to estimate network fees for each chain the swap interacts with. For example, if the swap is BTC -> ETH the swap will incur fees on the bitcoin network and Ethereum network. The gas_rate property works differently on each chain "type" (e.g. EVM, UTXO, BFT).
The gas_rate_units explain what the rate is for chain, as a prompt to the developer.
The outbound_tx_size is what THORChain internally budgets as a typical transaction size for each chain.
The outbound_fee is gas_rate * outbound_tx_size * 3 and developers can use this to budget for the fee to be charged to the user.

Fee Calculation by Chain

THORChain (Native Rune)

The THORChain blockchain has a set 0.02 RUNE fee. This is set within the THORChain Constants by NativeTransactionFee. As THORChain is 1e8, 2000000 TOR = 0.02 RUNE

Binance Chain

THORChain uses the gas_rate as the flat Binance Chain transaction fee.
E.g. If the gas_rate = 11250 then fee is 0.0011250 BNB.

UTXO Chains like Bitcoin

For UXTO chains link Bitcoin, gas_rateis denoted in Satoshis. The gas_rate is calculated by looking at the average previous block fee seen by the THORNodes.
All THORChain transactions use BECH32 so a standard tx size of 250 bytes can be used. The standard UTXO fee is then gas_rate* 250.

EVM Chains like Ethereum

For EVM chains like Ethereum, gas_rateis denoted in GWei. The gas_rate is calculated by looking at the average previous block fee seen by the THORNodes
An Ether Tx fee is: gasRate * 10^9 (GWEI) * 21000 (units).
An ERC20 Tx is larger: gasRate * 10^9 (GWEI) * 70000 (units)
Copy link
Refunds and MinSwapAmount
Understanding gas_rate
Fee Calculation by Chain
THORChain (Native Rune)
Binance Chain
UTXO Chains like Bitcoin
EVM Chains like Ethereum