TL;DR Summary
- Bug found in the AAVE-forked smart contracts used for rewards emissions in Seamless Protocol
- Bug involves the use of loew precision factor for rewards calculation, this impacts all markets and reward tokens but is most notable on markets with fewer asset decimals, notably USDC (6 decimals)
- Proposed fix requires smart contract upgrade via on-chain voting
- Fix to be proposed as a PR contribution back to the aave-v3-periphery repo
- Community discussion open on potentially boosting rewards for USDC market next month
Context & Motivation
The Seamless DAO and Community have enabled rewards since the DAO was launched in December. Since then, multiple new markets and new kinds of reward tokens have been enabled for the protocol.
Recently, Native USDC rewards have been issued in an ongoing grant provided by Gauntlet Network. Community members, users and contributors have noticed slight discrepancies in reward emission rates between front-end calculations and smart contract calculations.
Upon further investigation, a bug was discovered affecting reward accrual precision, especially for reward tokens denominated with fewer decimals (USDC has 6 decimals). A fix has been identified and proposed below. This is not a unique issue to Seamless, as it affects any protocols who have forked the RewardsController smart contracts from AAVE, and so the fix will be contributed back to AAVE to benefit other users of the open source software.
If this proposal passes, this should no longer be an issue for future rewards on the Seamless protocol platform.
Specifications/Technicals
The new implementation of the RewardsController contract can be found deployed and verified here: RewardsController | Address 0x8243de25c4b8a2ff57f38f89f7c989f7d0fc2850 | BaseScan 1
The source code can also be more easily viewed in the Seamless Github repository here: aave-v3-periphery/contracts/rewards at master · seamless-protocol/aave-v3-periphery · GitHub 1
The community must vote to upgrade the current implementation to use this new rewards controller implementation. This can be done by calling the setAddressAsProxy method on the PoolAddressesProvider contract.