Burners
Description
Symbiotic protocol allows the use of any asset to provide economic security. However, one condition is that the assets must be represented as ERC-20 tokens. Such possible assets are:
- Governance tokens
- ETH LSTs
- DEX LP tokens
- Wrappers for tokens from networks other than Ethereum
- RWA tokens
- ...
Let’s assume a standard staking design - the operator misbehaves, and its collateral is burnt. Therefore, for each ERC-20 token used as collateral, it should be possible to burn its underlying asset. In general, there are 2 ways how to handle such behavior from the protocol side:
- 🔴 Create a new standard interface for the slashing, which the collateral tokens should support. However, this solution is inconvenient for the existing tokens as it adds an obligatory wrapper over them.
- 🟢 Allow the creation of external contracts, whose responsibility is to process the slashing using the received slashed tokens. This solution leaves much more flexibility over the slashing process without any add-ons for the existing tokens. And such contracts are named - burners.
Technical overview
Symbiotic core contracts don’t force the use of some specific burners. Therefore, anyone can create their own implementation of it.
The burners can be created by anyone. However, only the Vault curators are able to set the burners for their Vaults.
The burner is set in the Vault during its initialization and cannot be changed later.
Considering the assets listed above, let’s see how to actually process them in case of slashing using the burners:
- Governance tokens - Just burn (or, similarly, send to some dead address).
- ETH LSTs - They represent staked ETH on the Beacon Chain. Therefore, it is necessary to withdraw this ETH first and then burn it.
- DEX LP tokens - They represent a set of tokens that provides liquidity for exchanges. Hence, each of these tokens should be unwrapped and burnt.
- Wrappers for tokens from networks other than Ethereum - This case is similar to the ETH LSTs’ one. Need to unwrap the wrapper on Ethereum and burn the token on the other network.
- RWA tokens - They represent some assets from the real world and, therefore, some real assets should be destroyed. (?)
Other processing mechanics
As mentioned above, in a standard staking and burning mechanic, the RWA should be destroyed (a.k.a. burned). Let’s assume that the RWA token is represented by real estate; then, destroying the real estate object is necessary. However, it doesn’t seem practical. Hence, there could be some other possible processing mechanics of the slashed collateral:
- Redistribution to good operators
- Redistribution to victims (in case of using the staking more as a security deposit)
- Lock as LP
- ...
In general, burning the slashed funds is one of the safest ways to go. Any other methodology for processing the slashed funds may create incentives for different parties to trigger the slashing, depending on many factors.
From the examples above, it can be seen that the burner is only a single address that receives the slashed collateral tokens. As a consequence, e.g., in case of redistribution needs, it is impossible for networks to have separate distribution contracts for each network directly. Therefore, we allow burners to receive an onSlash()
call on each slashing event, which makes it possible to account for the amounts of slashed funds by each network.
To turn on the on-slash callback mechanic, set Slasher.BaseParams.isBurnerHook
equal to true on initialization.
Burner Router
Code can be found here
Using the on-slash callback functionality mentioned above, we provide a ready-to-go BurnerRouter
contract, allowing Vault curators and networks to configure a needed granular and updatable configuration of slashed collateral receivers depending on the slashing networks and the slashed operators.
Its workflow is the following:
- Set (or update with delay) the configuration of receivers (which can be represented, e.g., by burners or by treasury addresses)
- During the slashing event, the contract is called via
onSlash()
function, which determines the needed receiver given the slashing networks and the slashed operators, and increases its balance - The transfer of the collateral tokens to the receiver is triggered via
triggerTransfer()
Only a single vault should use the same BurnerRouter
contract simultaneously.
Default Burners
Code can be found here
We provide default implementations of simple burners for several ETH LSTs we collect pre-deposits. These are immutable pure contracts that can be used within the router and whose flow, in general, is:
- Create a withdrawal request
- Complete a withdrawal request receiving the underlying ETH
- Burn ETH
An unlimited number of vaults can use the same DefaultBurner
contracts.
LST | Code link |
---|---|
wstETH | wstETH_Burner.sol |
rETH | rETH_Burner.sol |
mETH | wstETH_Burner.sol |
swETH | swETH_Burner.sol |
sfrxETH | sfrxETH_Burner.sol |
ETHx | ETHx_Burner.sol |