Understanding how fees are calculated.
There are 4 different fees the user should know about.
- 1.Inbound Fee (sourceChain: gasRate * txSize)
- 2.Affiliate Fee (affiliateFee * swapAmount)
- 3.Liquidity Fee (swapSlip * swapAmount)
- 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 a function of poolDepth
- affiliateFee: optional fee set by interface in basis points
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
fastwhere 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).
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.
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.
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.
If an affiliate's THORName has the proper preferred asset configuration set, the network will begin collecting their affiliate fees in $RUNE in the AffiliateCollector module. Once the accrued RUNE in the module is greater than
* outbound_feeof the preferred asset's chain, the network initiates a swap from $RUNE -> Preferred Asset on behalf of the affiliate. At the time of writing,
PreferredAssetOutboundFeeMultiplieris set to
100, so the preferred asset swap happens when the outbound fee is 1% of the accrued $RUNE.
Configuring a Preferred Asset for a THORName
- 2.Set your preferred asset's chain alias (the address you'll be paid out to), and your preferred asset. Note: your preferred asset must be currently supported by THORChain.
For example, if you wanted to be paid out in USDC you would:
- 2.Post a
MsgDepositto the THORChain network with the appropriate memo to register your THORName, set your preferred asset as USDC, and set your Ethereum network address alias. Assuming the following info:
The full memo would look like:
- 1.THORChain address:
- 3.ETH payout address:
You will also need a THOR alias set to collect affiliate fees. Use another MsgDeposit with memo:
~:<thorname>:THOR:<thorchain-address>to set your THOR alias. Your THOR alias address can be the same as your owner address, but won't be used for anything if a preferred asset is set.
Once you successfully post your MsgDeposit you can verify that your THORName is configured properly. View your THORName info from THORNode at the following endpoint: https://thornode.ninerealms.com/thorchain/thorname/ac-test
The response should look like:
Your THORName is now properly configured and any affiliate fees will begin accruing in the AffiliateCollector module. You can verify that fees are being collected by checking the
affiliate_collector_runevalue of the above endpoint.
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 from what nodes actually pay on-chain by an "Outbound Fee Multiplier" (OFM).
The OFM moves between a
MinOutboundFeeMultiplier(defined as Network Constants or as Mimir Values), based on the network's current outbound fee "surplus" in relation to a "target surplus". The outbound fee "surplus" is the cumulative difference (in $RUNE) between what the users are charged for outbound fees and what the nodes actually pay. As the network books a "surplus" the OFM slowly decreases from the Max to the Min. Current values for the OFM can be found on the Network Endpoint.
The minimum Outbound Layer1 Fee the network will charge is on
/thorchain/mimirand 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
Fees are taken in the following order when conducting a swap.
- 1.Inbound Fee (user wallet controlled, not THORChain controlled)
- 2.Affiliate Fee (if any) - skimmed from the input.
- 3.Swap Fee (denoted in output asset)
- 4.Outbound Fee (taken from the swap output)
To work out the total fees, fees should be converted to a common asset (e.g. RUNE or USD) then added up. Total fees should be less than the input else it is likely to result in a refund.
If a transaction fails, it is refunded, thus it will pay the
outboundFeefor the SourceChain not the DestinationChain. Thus devs should always swap an amount that is a maximum of the following, multiplier by a buffer of at least 4x to allow for sudden gas spikes:
- 1.The Destination Chain outbound_fee
- 2.The Source Chain outbound_fee
- 3.$1.00 (the minimum)
It is strongly recommended to use the
recommended_min_amount_invalue that is included on the Swap Quote endpoint, which is the calculation described above. This value is priced in the inbound asset of the quote request (in 1e8). This should be the minimum-allowed swap amount for the requested quote.
Remember, if the swap limit is not met or the swap is otherwise refunded the outbound_fee of the Source Chain will be deducted from the input amount, so give your users enough room.
gas_rateproperty can be used to estimate network fees for each chain the swap interacts with. For example, if the swap is
BTC -> ETHthe swap will incur fees on the bitcoin network and Ethereum network. The
gas_rateproperty works differently on each chain "type" (e.g. EVM, UTXO, BFT).
gas_rate_unitsexplain what the rate is for chain, as a prompt to the developer.
outbound_tx_sizeis what THORChain internally budgets as a typical transaction size for each chain.
gas_rate * outbound_tx_size * OFMand developers can use this to budget for the fee to be charged to the user. The current Outbound Fee Multiplier (OFM) can be found on the Network Endpoint.
Keep in mind the
outbound_feeis priced in the gas asset of each chain. For chains with tokens, be sure to convert the
outbound_feeto the outbound token to determine how much will be taken from the outbound amount. To do this, use the
getValueOfAsset1InAsset2formula described in the
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.
For UXTO chains link Bitcoin,
gas_rateis denoted in Satoshis. The
gas_rateis 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
For EVM chains like Ethereum,
gas_rateis denoted in GWEI. The
gas_rateis 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)