How fee reclamation / rebates work
In last month’s Achernar release, we added a new mechanism: Fee Reclamation and Rebates. Published as a Synthetix Improvement Proposal (SIP-37), it is intended to prevent traders from front-running the latency of Ethereum block processing. This article will provide a quick guide to the update and how it impacts trading.
For all synthetic assets issued by the Synthetix protocol, we need regular prices pushed on-chain. The more regularly you publish new prices, the more gas it costs. We’ve integrated with Chainlink to use their decentralised price feeds for our forex and commodities, and will soon be transitioning our other assets to Chainlink (SIP-36). When a price change occurs in the spot market it must be updated on-chain but there is a delay between this being observed by market participants and the new price being confirmed in an oracle update, this is oracle latency. Fee Reclamation provides a solution.
How it works
Whenever a trade occurs on Synthetix.Exchange, there is a waiting period (currently 3 minutes). During this waiting period, users cannot exchange, transfer, or burn the Synth they have just traded into. This waiting period gives the oracles enough time to check the difference between the initial price and the new price — in other words, they check to see if a trade was affected by a lag in price updates.
If a trade was affected, then the trader either owes Synths (reclamation) or is owed Synths (rebate), and must either pay or be paid these Synths. Therefore, the next time they exchange, transfer, or burn that Synth, the
settle function is called, which settles this debt. If they’re owed a rebate, they receive extra Synths from the feePool to cover what was lost from the price update lag. If they owe a reclamation, it is paid to the feePool from their Synths next time they exchange, transfer, or burn. The
settle function can also be called directly on the Synthetix smart contract to settle without needing to perform another function. Note however that unlike exchanging, the
transfer function on a Synth will never settle automatically, either settle must first be called explicitly, or
transferAndSettle can be used to combine the actions. The 'Transfer' option in Mintr has been updated to call
Here’s a visual guide to how it works:
We plan to improve the user experience for fee reclamation/rebates in Synthetix.Exchange for traders, so it’s clearer in the interface how much they owe or are owed. If you have any questions about how it works, come join us in Discord!