># Protocol Due Diligence: LooksRare (LOOKS) [ToC] ## LOOKS Overview - [Site](https://looksrare.org/) - Gov: Does not seem to be existing governance - [Docs](https://docs.looksrare.org/) - Audits: Team states 2 audits complete, 3rd underway, none released yet. General overview of product: https://docs.looksrare.org/guides/welcome How Rewards Work: https://looksrare.org/rewards ## Rug-ability **Multi-sig:** Yes - Looks multisig is https://gnosis-safe.io/app/#/safes/0xbfb6669ef4c4c71ae6e722526b1b8d7d9ff9a019. Only needs 2/3 sigs. - Addresses are all fresh, owners are not doxxed. - Multisig owns staking contract. - Multisig can use `adminRewardWithdraw()` to remove the current rewards amount from contract. - Multisig can use `pause()` to pause rewards contract, but `emergencyWithdraw()` is still allowed. - Multisig can use `updateRewardPerblockAndEndBlock()` to change reward pace. - Checked that `emergencyWithdraw()` is not blocked by any action admin can use. - TokenDistributor.sol controls flow of rewards into contract, but is unowned. - $LOOKS token is owned by TokenDistributor contract. The `mint()` can only be run by owner, there are no other owners, and the mint is capped by a `_SUPPLY_CAP` variable. **Conclusion:** Multisig can at worst, pause or remove rewards. User tokens do not seem touchable and cannot be held hostage by a `pause()` **Upgradable Contracts:** No - All contracts for the rewards seem static and would require a migration action from the user. **Decentralization:** - The main product is a closed source marketplace. - The token, token distribution and rewards staking contract are solidity contracts, with limited control by owners/admins. - The protocol itself does not have any governance existing yet. - Owners of the product technically control the feeSharing unilaterally. ## Audit Reports Audits are not yet disclosed. ## Strategy Details ### Summary The `LooksRewardsStaking` strategy deposits users $LOOKS tokens into the LooksRare `FeeSharing System` at `0xBcD7254A1D759EFA08eC7c3291B2E85c5dCC12ce`. This contract earns: - $WETH from trade fees collected on LooksRare. - $LOOKS emissions from their farming incentive program. The strategy sells WETH rewards and uses it to buy and lock further $LOOKS. ### Strategy current APR Currently the strategy yields 344% not accounting for compounding. Pickle.finance has a similar strategy and estimates their current rates to be around 2600% The APY is likely to change signifigantly based on continued use of the platform and further LOOKS dilution. #### LooksRare Fees The WETH fees are taken from a fee cut of transactions that happen on the LooksRare marketplace. 100% of this fee goes to LooksRare stakers and is applied to all transactions, except for private listings. It currently represents around 2/3rds of the APY earnings, which is why the rate hasn't dropped as quickly. #### Looks Emissions Similar to standard farming, LOOKS staking also gives LOOKS emissions. LOOKS has just entered its second stage of emissions (https://docs.looksrare.org/blog/looks-emission-phase-2) and provides detailed tokenomics on the timing of release (https://docs.looksrare.org/about/looks-tokenomics) The emissions roughly take 2 years to play out. ### Vault/Strategy Pitfalls Here are a couple of things which are out of the ordinary and might be of a surprise when reading the code. #### LOOKS compounds in the contract. Unlike most farming contracts, we never need to claim or harvest the LOOKS. Instead our position is tracked by shares. Just like a Yearn vault position is. Our rewards compound in the contract, meaning that when we call `estimatedTotalAssets()` the value in `want()` can rise without any harvest action having been called. This is different than many other strategies. #### Asset value is estimated through a swap. When we call `estimatedTotalAssets()` we're also estimating the value of currently pending WETH into its $LOOKS equivelent by using Uniswaps V2 router `getAmountsOut()`, but we do not make the swap at this time. This liquidity is incentivized and robust today, but this method could lead to variance or slippage between the estimate and actual reconciliation of balances. #### Deposit Minimum LOOKS enforces a 1 $LOOKS minimum on deposit (although not on withdrawal), so additional checks are needed when making deposits. #### Reward Periods & Harvest Frequency WETH rewards are currently tracked in reward periods. With the way that `updateRewards()` and rewards tracking go, a users pending WETH rewards are technically only accurate if they claim the rewards within the same reward period. (Reward periods are roughly 18-24 hours) and based on block distance. If a user has not locked in their rewards by the time that was called the update takes the total `reward` amount passed in and updates the `currentRewardPerBlock` A users rewards are calculated as `((userInfo[user].shares * (_rewardPerToken() - (userInfo[user].userRewardPerTokenPaid))) / PRECISION_FACTOR) + userInfo[user].rewards;` The only time rewards are saved into `.rewards` for a user is if they make a deposit/withdraw that in that time period that sets the harvest bool to `false`. Most of the time this will work out to a negligible difference for the user because most stakers will retain roughly the same number of shares and other non-compounding users will also be diluted against the total pool, *however*, if in that 18-24 hour time window, a new user was to acquire a large amount of $LOOKS and stake it for the first time, this would dramatically dilute any uncalimed rewards from past reward periods. This edgecase doesn't impact the $LOOKS token, and only the reward $WETH, but could result in a stark difference between `estimateTotalAssets()` and actual balances in a 24 hour period. To solve this, the strategy should likely aim to harvest daily and if that isn't economical due to gas, then it should aim to harvest whenever there is a large pending WETH balance. ## Path-to-Prod #### Does Strategy delegate assets? No [I don't think so? Unless we count staking.] #### Target Prod Vault Would require a new vault. Experimental $LOOKS vault is deployed at `0x98E230B2eE9c99B23D96153E37EA536eBBcBD0f2` #### BaseStrategy Version 0.4.3 #### Target Prod Vault Version 0.4.3 ### Testing Plan Strategy currently passes basic tests. First time strategist could use support from an experienced strategist coming up with a more extensive testing plan. Current goal is to implement on ApeTax and monitor from there. #### Ape.tax ##### Will Ape.tax be used? Yes ##### Will Ape.tax vault be same version # as prod vault? Yes ##### What conditions are needed to graduate? (e.g. number of harvest cycles, min funds, etc) - Be profitable - See atleast 7 profitable reward period returns without issue. - Ensure slippage is a non-issue with converting funds of at least $100k. #### Prod Deployment Plan ##### Suggested position in withdrawQueue? Only LOOKS strategy. ##### Does strategy have any deposit/withdraw fees? No, but the method of internal asset valuation being live time could expose weird risks in how deposits/withdraws result in calculate amount of shares to reward. To avoid an attack on the basis of rounding, a withdraw fee may be advisable. ##### Suggested debtRatio? 100% only LOOKS strategy. #### Checklist - [ ] Get additional support from experienced strategist on testing - [ ] Run extended tests - [ ] Deploy vault version to Ape.tax - [ ] Deploy a new LOOKS vault - [ ] Add strategy - [ ] Endorse to prod