The implementation of the LSTRewardsSplitter contract utilizes a burn function on the lst token to remove tokens from circulation as a form of transaction fee during the reward distribution process. However, the lst token does not include an implemented burn function, which will result in transaction reverts and disrupt the intended economic mechanisms within the contract. This report outlines the critical issues related to this missing functionality.
The line IStakingPool(address(lst)).burn(amount); in _splitRewards as shown below assumes that the lst token conforms to the implementation of the burn function. However, the lst token does not directly implement a burn function and also does not inherit one from any of its parent classes. Also the deployed stLink contract that it represents does not define an implementation for the burn function as well, here is a quick link to verify https://etherscan.io/address/0xb8b295df2cd735b15be5eb419517aa626fc43cd5#writeProxyContract.
The performUpkeep and splitRewards functions of the splitter will revert whenever _splitRewards tries to call the non-existent burn function which will affect the intended functionality of burning the liquid staking tokens when the fee.receiver == address(lst). Burning tokens serves a dual purpose of facilitating transaction fees and managing token supply. Without a functioning burn method, the contract's economic model is compromised, preventing the intended deflationary pressure on the token supply that could increase the value of remaining tokens.
Manual Code Review
To add burning functionality, you can extend it with ERC20Burnable extension in OpenZeppelin Libraries.
Create a custom implementation for the burn function.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.