[Formal Review ๐ŸŒฟ] Transfer the remaining RAD/USDC balances of the Radicle LBP to the Radicle Treasury and add liquidity to Uniswap

Transfer the remaining RAD/USDC balances of the Radicle LBP to the Radicle Treasury and add liquidity to Uniswap

โ†’ Snapshot Poll โ†

Functional Description

This is a proposal to complete the LBP event by closing the pool and transferring the remaining RAD/USDC balances to the Radicle Treasury. To maintain a liquid market, it is also being proposed that 4M USDC and 400K RAD are added to a Uniswap trading pair.

Purpose

To officially end the Radicle LBP event, return the remaining balances to the community-owned Treasury, and support the growth of the network by adding liquidity to the popular decentralized exchange, Uniswap.

Background

The Radicle LBP was a 48h event that allowed anyone to acquire RAD for USDC by swapping on a Balancer Liquidity Bootstrapping Pool.

The event successfully concluded on February 27th, with over 24M USDC raised for the community treasury. After pausing the trading on the LBP, there was still a lot of interest in trading RAD. This interest was discussed on community.radworks.org (see here and here). In response to this sentiment, the core team created a Snapshot poll to unpause swapping on the Balancer LBP.

Since the Balancer pool weights converged to 50/50, the pool effectively functioned as a regular DEX, providing an immediate, short term solution, as the liquidity in the pool cannot be transfered anywhere else without a formal governance proposal. The Snapshot poll passed with a strong majority.

Since then, the volume of the community-started RAD/USDC pool has surpassed the volume of the Radicle LBP pool, seeing over $750k in liquidity.

Reasoning & Analysis

Transferring the remaining balances of the Radicle LBP to the Radicle Treasury is the cleanest way to end the LBP event. Radicleโ€™s Liquidity Bootstrapping pool was always meant to be closed. The original event was only meant to last 48hrs (See LBP FAQ). The pool was unpaused to support liquidity for RAD.

Additionally, transferring the balances is a necessary step that needs to be taken before evaluating the community proposals for what to do with the remaining balances of the LBP event. There are open discussions for redistributing the unsold tokens to participants in the LBP and/or using the remaining balances to provide liquidity in numerous decentralized exchanges.

This proposal will successfully close the Balancer pool and move itโ€™s volume to the RAD/USDC pair on Uniswap.

Impact

Closing the Balancer pool and moving itโ€™s liquidity to Uniswap will ensure an accessible and liquid market for RAD token holders. This will support the health of the network by reducing price volatility and cultivating deep liquidity for RAD.

Open Questions

:exclamation: Weโ€™d like to reduce the time required for formal review from 5 days โ†’ 2 days to move this proposal forward. The reasoning behind this decision is that this proposal has always been planned but was delayed due to the communityโ€™s desire for immediate liquidity. Since this proposal is also blocking the formal evaluation of other community proposals regarding the use of these balances (i.e. this discussion), we believe moving this proposal through a quicker formal review is appropriate.

Technical Implementation

A proposal has already been created by @cloudhead. Please refer to the details below.

If executed, this proposal will:

  1. Remove liquidity from the LBP, by swapping the RADP pool tokens for the underlying assets (RAD and USDC)
  2. Return the 3.5M USDC loan to the Radicle Foundation
  3. Approve Uniswap router for 4M USDC
  4. Approve Uniswap router for 400K RAD
  5. Add liquidity to Uniswap RAD/USDC pair via the Uniswap router

After execution, the Timelock holds all Uniswap LP tokens for the RAD/USDC pair.

Notes

  • For this proposal to go through, the LBP must have at least 2M RAD and 22M USDC.
  • 0x750dD34Fb165bE682fAe445793AB9ab9729CDAa3 is the CRP Pool.
  • 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 is the USDC contract.
  • 0x31c8EAcBFFdD875c74b94b077895Bd78CF1E64A3 is the RAD contract.
  • 0x055E29502153aEDcFDaE8Fc15a710FF6fb5e10C9 is the Radicle Foundation address.
  • 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D is the UniswapV2Router02 contract.
  • 0x8dA8f82d2BbDd896822de723F55D6EdF416130ba is the Timelock contract.

Actions

0x750dD34Fb165bE682fAe445793AB9ab9729CDAa3 0 "exitPool(uint256,uint256[])" 99999900000000000000 [2000000000000000000000000,22000000000000]
0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 0 "transfer(address,uint256)" 0x055E29502153aEDcFDaE8Fc15a710FF6fb5e10C9 3500000000000
0x31c8EAcBFFdD875c74b94b077895Bd78CF1E64A3 0 "approve(address,uint256)" 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D 400000000000000000000000
0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 0 "approve(address,uint256)" 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D 4000000000000
0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D 0 "addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256)" 0x31c8EAcBFFdD875c74b94b077895Bd78CF1E64A3 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 400000000000000000000000 4000000000000 0 0 0x8dA8f82d2BbDd896822de723F55D6EdF416130ba 1815284486
3 Likes

Iโ€™m supportive. The increasing liquidity on Uniswap (RAD/ETH pair) had a positive impact recently. The Balancer LP was configured to a 0.5% fee while Uniswap has a default of 0.3%. Was that taken into account with regards to compensating for impermanent losses?

While the proposal talks about closing the LBP as an event, it doesnโ€™t talk about considerations on why to add back to Uniswap and not Balancer. It would be great to get more context around that detail too.

1 Like

Iโ€™m 100% supportive and ready to vote :slight_smile:

1 Like

I support this idea, LBP remind RAD transfer to Treasury,.then , another proposal can go ahead

While I support the proposal to move back funds to the treasury, I fill there has been a lack of discussion on the decision to go to Uniswap versus staying on Balancer. I think itโ€™s not very fair to use Balancer to bootstrap and then switch all to another exchange.

A more appropriate move in my opinion would have been to keep some liquidity on the Balancer pool (say 2M USDC + 200k RAD, and maybe aligning the swap fee from 0.5% to 0.3%), then add new liquidity (say 2M USDC + 200k RAD) on Uniswap. Probably these are two decisions that would have been better to split in two votes.

Nevertheless I an planning to vote FOR as I understand the urgency to get the funds back in the treasury to start building the team and product.

2 Likes

The primary reason for Uniswap is that more people use it and know about it. We are more likely to get volume on Uniswap, all else being equal, than Balancer.

The last proposed action:

0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D 0 "addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256)" 0x31c8EAcBFFdD875c74b94b077895Bd78CF1E64A3 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 400000000000000000000000 4000000000000 0 0 0x8dA8f82d2BbDd896822de723F55D6EdF416130ba 1815284486

is vulnerable to fronrunning, as both amountAMin and amountBMin are set to 0.
A malicious party can skew the balances of the uniswap pool in either direction before the proposal is executed, and then arbitrage the price back, effectively stealing a portion of the liquidity.

Read more about this at Uniswap V2 Audit Report.

This can be mitigated by setting amountAMin and amountBMin more conservatively, for example to admit at most 5% slippage, or adding the liquidity in smaller chunks.

7 Likes

Good catch! The tricky thing of course is that the price cannot be known in advance, so arbitragers can take advantage of this even after the pool is created/supplied. And setting the values too tight would cause the transaction to revert if a RAD/USDC pair was created in the meantime, with a very different price.

The proposal is now live: https://gov.radicle.network/#/proposals/radicle/4

3 Likes

Do I understand correctly that after the transfer of liquidity to Uniswap there will be the following indicators:

  1. 4,900,000m tokens in circulation (that already we have) + 500,000k new tokens to increase liquidity

2.On the other hand, to the existing liquidity on Uniswap, which is $ 1,000,000, another $ 5,000,000 will be added, which will total 6 000 000 usdc

Thus, we get a pool:

5,400,000m tokens โ†” $ 6,000,000 usdc

Itโ€™s right?