Return assets drained from FFF, CC10, DEFI5 (Pt. 2)
NOTE This proposal will only return assets to users who held FFF, CC10 or DEFI5 at the time Proposal 16 was executed. It does not return any assets other than those drained from those index pools and their associated Uniswap pairs to the Indexed treasury.
Context
In November, the Indexed DAO passed Proposal 16 to drain the assets in DEFI5, CC10, FFF and their respective market pairs. After the October hack, these pools were no longer functioning and were losing value. Proposal 16 was intended to prevent further losses by transferring the assets underlying the affected pools to the DAO, where they would be used to fund a compensation plan.
It has since become clear that this compensation plan would unfairly affect holders of these assets, as their tokens would be distributed amongst a larger pool of users who had already redeemed the value of their tokens. The DAO previously passed a Snapshot proposal to return these assets to users via a merkle distribution. For more context, see that proposal: https://gov.indexed.finance/#/proposal/0xee15c98c58c2cbb8dc29b0143ab75c8ce65eed6e31fd478e6a2d7a07041e762f
After building a database of token holders at the time of the proposal, we’ve realized that the merkle distribution plan could negatively affect some users, particularly those who held assets in smart contracts which can only interact with the index pools according to their expected behavior. Because many holders of the tokens are unverified smart contracts, we can not guarantee that this merkle distribution wouldn’t result in some tokens being locked / unredeemable.
Solution
To ensure the fairest redistribution of assets, we think the drained tokens should simply be returned to the index pools, which still have their original balance records because the pool contracts have been locked since the proposal was executed. The pool contracts would then have their implementations set to a contract which disables all non-view pool functions aside from basic ERC20 transfers and exitPool, which burns pool tokens for all underlying assets. This will prevent any arbitrage which might affect the value of extracted underlying assets for users but should maintain interoperability with smart contracts holding tokens on behalf of users so long as they can at least be made to perform an ERC20 transfer of the pool tokens.
This restricted pool implementation has been written and its code can be viewed here: https://github.com/d1ll0n/drain-reversal/blob/main/contracts/RestrictedIndexPool.sol
For Uniswap LP tokens, we have verified that all contracts which hold more than dust are capable of being made to execute arbitrary transactions, and so should have no issue with locked tokens. We don’t think it would make sense to return pool tokens / eth directly to the pairs, as then LP holders could be affected by arbitrage; instead, the restricted index pool will block all transfers to/from the pair contracts, and users will be able to redeem their drained tokens via a second contract called UniBurn, which will receive the balance in underlying tokens held by the Uniswap pairs. UniBurn will allow users to “burn” (transfer) their Uniswap LP tokens in order to redeem the index tokens and ETH their LP tokens were previously worth.
Reason for 2 proposals
There are three index pools which must receive tokens from the treasury for this proposal to be executed, with a total of 21 individual transfers including WETH. Because of the overlap between CC10 and DEFI5, we can reduce this to 14 transfers using an intermediate Redistributor contract. Each proposal to Indexed governance can execute a maximum of 10 transactions, so this proposal must be split into two.
We have structured this proposal so that either piece may only have any effect if both are executed. The first will give ERC20 approval for 10 tokens to the Redistributor. The second will give the remaining approvals, update the pool implementations and execute an initialization transaction on the Redistributor to execute all the token transfers and move pair balances to UniBurn.
If both pieces of this proposal are executed, users will be able to redeem their tokens as noted below; if either proposal fails, no assets will be transferred out of the treasury.
Index Pools
Call one of the following functions on the appropriate pool contract:
function exitPool(uint256 poolAmountIn, uint256[] calldata minAmountsOut)function exitPoolTo(address to, uint256 poolAmountIn)function redeemAll()
LP Tokens
Call the appropriate function on the UniBurn contract for the index pool whose LP tokens you held:
function redeemFFFLP()function redeemDEFI5LP()function redeemCC10LP()
Proposal #1 Actions
- Approve Redistributor to spend 24.51133902686067268 WETH
- Approve Redistributor to spend 6558.043534141821704793 UNI
- Approve Redistributor to spend 242.969521553963029458 AAVE
- Approve Redistributor to spend 151.734388687236707223 COMP
- Approve Redistributor to spend 562.7488494101103946 SNX
- Approve Redistributor to spend 11594.900216754992505371 CRV
- Approve Redistributor to spend 11.094471289438530485 MKR
- Approve Redistributor to spend 112967.732688466399021387 SUSHI
- Approve Redistributor to spend 0.002548769490053096 YFI
- Approve Redistributor to spend 8.027975305505807303 UMA
Proposal #2 Actions
- Approve Redistributor to spend 88.900666814888137214 BAT
- Approve Redistributor to spend 523.085971072278439194 OMG
- Approve Redistributor to spend 0.47902696 WBTC
- Approve Redistributor to spend 4944.681286065833316986 DEGEN
- Set sigma pool implementation to SigmaFallThrough
- Set core pool implementation to CoreFallThrough
- Call
restoreBalances()on Redistributor
| Voter | Cast Power | Vote & Rationale |
|---|---|---|
0xdB60...B91a32 | 200,002 | FOR |
0xef76...E3F8dB | 145,398 | FOR |
0xF159...b5affb | 100,000 | FOR |
0x9d91...1D5242 | 54,014 | FOR |
0x6836...236fB0 | 2,000 | FOR |
VOTE POWER
Proposal Status
- Published Onchain
0xdB60...B91a32
- Sun June 19 2022, 02:29 pmVoting Period Starts
- Wed June 22 2022, 04:28 pmEnd Voting Period
- Wed June 22 2022, 04:45 pmQueue Proposal
- Fri June 24 2022, 07:27 pmExecute Proposal
Current Results
1-FOR
503,874.28
2-AGAINST
N/A Tokens
