GIP-25: Senior Pool Periodic Withdrawal Requests

Author

  • Will Johnston

Summary

The Senior Pool’s system of “first come first serve” withdrawals is not serving Senior Pool liquidity providers (LPs) when utilization is high. High utilization has encouraged secondary market sales, which has created a secondary market discount that is attractive for bots to instantly arb once native liquidity is available. This has created a lot of frustration for LPs that are willing to wait for some liquidity. A new system is needed that more fairly distributes incoming capital.

We propose to replace the current system with a bi-weekly withdrawal system where LPs may submit a request to withdraw from the Senior Pool by depositing their FIDU into a withdrawal request.

If there is enough capital to honor all outstanding withdraw requests at the end of the period, all withdrawers will have 100% of the value of the FIDU they requested to withdraw allocated to them in USDC.

If there is not enough capital to honor all outstanding withdraw requests at the end of the period, all available USDC will be allocated to withdrawers pro-rata. In other words, if there is only 80% of the USDC necessary to fulfill all withdraw requests, all withdrawers will receive 80% of the value of the FIDU they’ve requested to withdraw. Withdraw requests that are partially filled will be automatically rolled over to the next period.

Withdrawers may choose to withdraw their allocated USDC at any time. The standard protocol withdraw fee of 0.5% still applies.

LPs may cancel their request to withdraw at any point for a cancellation fee. The fee will be applied to the outstanding FIDU balance of the withdraw request. Proceeds from the cancellation fee will be sent to the protocol reserve.

To prevent small withdrawal requests from receiving an infinitesimally small amount of USDC from a pro-rata allocation, withdraw requests under a certain threshold value will be fulfilled 100% — subject to capital available. This means that if the value of your withdraw request is under the threshold value, you will be able withdraw 100% of the USDC value of your position.

Specifications And Requirements

  1. The current withdrawal system will be fully replaced by the periodic withdrawal request system.
  2. LPs seeking to withdraw their FIDU position will deposit their FIDU into the Senior Pool to
    request to withdraw.
  3. At the end of the period, any amount of USDC that’s available in the Senior
    Pool will be allocated to outstanding withdraw requests.
  4. As soon as USDC has been allocated to a withdraw request it becomes
    withdrawable. This means that even if a withdraw request has been partially
    filled, whatever has been allocated to it can be withdrawn. If an LP chooses not
    to withdraw their USDC in the current period, they may do so any point going
    forward.
  5. If the amount of USDC needed to fulfill a withdraw request is below a
    threshold amount, the request will be completely filled ignoring their pro-rata
    allocation.
  6. If a withdraw request cannot be fulfilled in a single period, it will
    automatically be submitted to all following periods until it’s fulfilled.

This proposal requires the creation of the following protocol parameters:

  • Senior Pool Withdraw Period Length: The length of the withdraw request period. We are proposing two weeks, but this time period will be configurable by governance.
  • Withdraw Request Cancellation Fee Percentage: The percentage fee on outstanding FIDU when a withdraw request is cancelled.
  • Pro Rata Withdraw Threshold: The threshold USDC amount below which a withdraw request is fulfilled in full instead of being fulfilled pro-rata.

Examples

Imagine we have two LPs, Alice and Bob, who want to withdraw some FIDU in the first week of January. So they submit withdraw requests:

Name FIDU Amount % of total
Alice 100,000 25%
Bob 300,000 75%

At the time of deposit 1 FIDU is worth 0.9 USDC.

Covered Case (Requests <= Capital)

During the first week of January the Senior Pool receives 400,000 USDC from deposits, principal payments, and interest payments. Because interest payments were received the value of FIDU has appreciated to 1 USDC per FIDU.

USDC Received USDC Needed Coverage %
400,000 400,000 >100%

At the end of the two week period, the received USDC is allocated to withdrawers without their intervention:

Name FIDU Amount USDC Allocation % allocated
Alice 100,000 100,000 100%
Bob 300,000 300,000 100%

Because there was enough capital to cover all withdraw requests, Alice and Bob have 100% of their request allocated.

Some time later, Alice and Bob choose to withdraw their allocated USDC.

Shortfall Case (Requests > Capital)

During the first week of January the Senior Pool receives 200,000 USDC from deposits, principal payments, and interest payments. Because interest payments were received the value of FIDU has appreciated to 1 USDC per FIDU.

USDC Received USDC Needed Coverage %
200,000 400,000 50%

At the end of the two week period the received USDC is allocated to withdrawers without their intervention:

Name FIDU Amount USDC Allocation % allocated
Alice 100,000 50,000 50%
Bob 300,000 150,000 50%

Because there was not enough capital to honor all outstanding withdraw requests, the USDC is allocated pro rata to the size of the withdraw request.

Alice and Bob can choose to withdraw the capital that’s been allocated to them to partially honor their withdraw request if they want to without penalty.

Without their intervention, Alice and Bob’s remaining FIDU balance is automatically rolled over into the next period’s withdraw requests.

Name FIDU Rolled Over
Alice 50,000
Bob 150,000

During the following two weeks, the Senior Pool receives 200,000 USDC in principal repayments. Because no interest was received in this time period the value of FIDU remains the same at 1 USDC per FIDU.

At the end of the two week period, the USDC is allocated:

Name FIDU Amount USDC Allocation % allocated
Alice 50,000 50,000 100%
Bob 150,000 150,000 100%

Because the USDC received was enough to cover all withdraw requests Alice and Bob both receive 100% of the remaining FIDU that they’ve requested to withdraw.

Some time later, Alice and Bob choose to withdraw their allocated USDC.

Analysis

Assuming all FIDU holders simultaneously submitted a request to withdraw 25% of their position, after 6 months they would be able to withdraw 17% of their position. This is pessimistically assuming that the Senior Pool receives no further deposits or principal payments and only receives the current ~500,000 USDC of interest payments from outstanding loans.

Below is a table that shows what a withdrawer should expect to receive after 1, 3, and 6 months given their position size:

Percentile FIDU Position 1 Month 3 Months 6 Months
50% 34.63 0.95 2.84 5.64
75% 475.43 13.09 39.04 77.46
90% 4,513.84 124.23 370.67 735.39
95% 21,363.64 587.99 1,754.33 3,480.52
99% 288,209.02 7,932.37 23,667.05 46,954.40
99.9% 2,667,448.09 73,416.07 219,0444.63 434,574.95
99.99% 10,032,068,96 276,112.23 828,810.17 1,634,403.25

We have created a model using current FIDU data to simulate how the proposal would effect LPs. The model is available for viewing here.

Benefits

  1. LPs are able to receive some percentage of their position every period.
  2. Senior Pool revenue is fairly distributed to those seeking to withdraw.

Downsides

  1. More complex withdrawal flow. LPs must submit a request and then withdraw
    allocated USDC at some point in the future.

FAQ

Will I be able to participate in staking rewards while I’m withdrawing?

No, LPs must deposit their FIDU in order to withdraw it. While their FIDU is deposited they cannot stake it to participate in staking rewards.

Staked FIDU must be unstaked before it can be withdrawn.

Will I earn interest while I’m withdrawing?

Yes, FIDU that was unable to be exchanged during a period will continue to appreciate in value. LPs will still benefit from interest payments that the Senior Pool receives. However, USDC that has been allocated to a withdraw request but the owner has not yet chosen to withdraw will not accrue interest.

Why not a queue?

In a withdraw queue system, if a large FIDU holder were to submit a large withdraw request, they could reserve 100% of the incoming capital to the Senior Pool until their withdraw request was completely filled. This would prevent other FIDU holders from withdrawing any amount of their position.

How will this solution affect bots?

Speed of withdrawal will no longer be an advantage for withdrawing capital from the Senior Pool. Bots will need to submit a request to withdraw that will be withdrawn at the end of the period and will receive their pro-rata amount like all others.

How will this impact the secondary market?

Arbitraging between the FIDU USDC Curve Pool will no longer be possible because it will become impossible to acquire and withdraw FIDU from the Senior Pool in a single transaction.

It will still be possible for individuals to trade on the price difference between the Senior Pool and Curve pools. However, those purchasing FIDU on the secondary market wishing to immediately withdraw it will only be able to withdraw at the start of each period.

It’s reasonable to assume that this proposal could lead to a larger spread between primary and secondary markets.

Voting

Yes: Replace the current withdrawal system with periodic withdrawal requests.

No: No change

4 Likes

My vote : Yes

Now i can not withdraw money from company , only sell on curve minus 15%

1 Like

Fistly, thanks a lot @will for putting this together. Totally appreciate it. I would definitely vote “YES” for this proposal as it is way better method of handling these withdrawals than the current system.
Just a small question:
For example, if someone would like to withdraw 100k, according to your table above, it takes approximately 12 months to withdraw right? (assuming all LPs have submitted to withdraw 25% of their positions which is 0.25*80,000,000 (current senior pool size) = 20,000,000). In this case, is it better for that person to submit request for withdrawal for 10,000 every month rather than the whole 100k at once? Because that way he can keep getting the GFI rewards on the left over 90k FIDU right? Is my understanding correct?

I also vote for this proposal.
I think it answers efficiently something that a lot of investors were complying about these last months and it is far better than a queue.

Quick question and remark on the detail though:

  • What is the motivation behind implementing a withdraw request cancellation fee ? Which situation do you try to favor or prevent with this measure ?
  • “It’s reasonable to assume that this proposal could lead to a larger spread between primary and secondary market”. The spread is already quite large today and I hardly imagine how it would get worse if investors are able to exit more efficiently than today. Also, I dont think today’ arbitrageurs reduce the spread between curve and primary market.

@velvetdoctor : in my understanding it would not be better because by requesting the withdraw of 10000$ every month, you only get $500 first month, $975 second month etc (assuming avg monthly withdraw rate is 5% and you let the remaining capital of previous months in the withdraw request) - the approx. withdraw amount is then about $27500 in ten months. However if you request day 1 a $100000 withdrawing, then you would get $50000 in ten months.

1 Like

Thanks @octavionotpunk! You are right actually. Hahaha my thought process was so stupid!! Thanks for correcting! Appreciate it.

1 Like

yes, very reasonable idea

I am not very worried about current lack of liquidity; however, I think it’s a reasonable proposal. A combination of bi-weekly withdrawals and a curve pool would work well.

Main concern from my side is additional complexity and smart contract risk.

Also, would like to hear more analysis on the potential affects to the curve pool. My first thought was that it would decrease the spread a bit due to bots being less efficient, but this statement implies the opposite.

The current liquidity situation is very bad so some action is definitely required. Cannot maintain status quo. First thing is to stop/ pause the withdrawal to prevents bots/mev draining all the liquidity. I would support this proposal as it atleast brings a change to status quo. I hope the actual implementation also takes into account the current no. Of unique depositors. And start with an absolute minimum assured withdrawal amount per unique depositor. The team should already be aware of the periodic interest payments from the borrowers. It’s no ad hoc. There are terms and conditions. Yes there can be occasional delays. This should be considered in arriving at absolute minimum assured withdrawal amount. Why? If it’s on pro rata basis, a couple of very large depositors could drain most of the liquidity. Based on no. Of unique depositors the team should try for solutions which could atleast assure a minimum base amount ( say 100 or 500 or 1000 usdc) of withdrawal within the next few months.

2 Likes

I think this proposal is great for providing existing Senior Pool investors with clarity as to when they might be able to get their capital out.

However, it does nothing to address the general unattractiveness of the Senior Pool in a rising interest rate environment or help with bringing new capital into the Senior Pool.

If rates on similar risk debt in the Senior Pool are going from 10% → 13%, then the Senior Pool can account for this by making new loans at higher rates. But those new loans won’t effect the overall interest rate unless there is enough of them to dilute the old book. In reality, the old book is now worth less at market and should trade at a discount to NAV.

If the Senior Pool interest rate is 8% on USDC and the market really wants 12%, then FIDU should trade at a discount to NAV on Curve. Capital will be deterred from going into the Senior Pool.

Having some mechanism to buy out old senior pool investors at a discount to NAV should be considered or providing an increased GFI incentive for new investors into the Senior Pool during times of low Senior Pool liquidity.

Great effort. Given that this situation mostly occurs when there is extremely high utilization, is it possible to have this new withdrawal mechanism “only” apply when utilization “is above” a certain “threshold” - say 50%. Although I concede that this might introduce some complexity, but I suppose governance can toggle the threshold amount? This solution/proposal works in a low liquidity environment, but I’d imagine that in a high liquidity environment (which ostensibly will come back at some point), LPs would not care for a delay of withdrawals, making protocol less attractive to LPs at normal DEFI steady state… thoughts @will ?

Super detailed proposal on how this helps improve liquidity and stop arb bots. I think the main question here is just the implementation timeline including:

  1. Estimated Timeline: Is this something that’s a quick fix, going to take a few months, or potentially a quarter or two?
  2. Smart Contracts: If this requires changing the smart contract, what are the risks (as @libratus asked), and how long would it take/cost for a proper audit?
  3. New Customers: How would this potentially affect new customers? While this attempts to solve current liquidity issues, would this complexity possibly deter others from depositing funds into Goldfinch?

First off, thank you all very much for your input and excellent questions.

@octavionotpunk

Thanks for responding to @velvetdoctor’s question.

What is the motivation behind implementing a withdraw request cancellation fee? Which situation do you try to favor or prevent with this measure ?

The main thing we are trying to prevent with a cancellation fee is LPs submitting dishonest withdrawal requests. Because the system distributes capital proportionally to the size of a withdraw request, if an LP submits a larger than they expect to be fulfilled withdraw request they can receive more capital than they would receive in the fair system. We view this as bad as it means that LPs expressing their honest withdraw demand will not receive their fair share of available capital.

As an example, imagine an LP with 10 million worth of FIDU looking to liquidate 1 million USDC worth of FIDU. They know that there is only 500k USDC incoming into the Senior Pool and currently 250k of other withdraw requests outstanding.

If they were to submit the 1 million USDC of FIDU they actually wanted to liquidate they would receive 400k USDC. There was 40% (500k / 1.25m) of the capital necessary to honor all outstanding requests, and so everyone receives 40% of their request. 40% of this LPs request is 400k USDC.

If they dishonestly submitted their entire 10m USDC FIDU position for withdrawal they would receive 487k USDC. There is only ~4% of capital necessary to honor all outstanding withdraw requests and so everyone receives 4% of their request. 4% of this LPs request is 487k USDC. While the LP receives a smaller percentage of their withdrawal request, the amount of the request is much larger and so they receive more USDC overall.

Once the LP receives the amount of capital they were honestly seeking to withdraw (1 million), they cancel their withdraw request. By acting dishonestly they received more capital than they otherwise would have. In this case ~22% more.

An alternative solution that we considered was to make withdraw requests non-cancellable. Once a request has been submitted it cannot be cancelled until the request has been fulfilled entirely. We initially considered this option, but viewed it as bad UX for LPs and also bad for the protocol because if an LP changes their mind about wanting to withdraw, they should be able to cancel the request.

We view cancellation with a fee as a better approach.

@tcsmate

I think this section of the proposal may address your comment.

If the amount of USDC needed to fulfill a withdraw request is below a threshold amount, the request will be completely filled ignoring their pro rata allocation.

@wallesplace

We considered making this a system that is only active during periods of low liquidity but think that for simplicity it would be best to keep it always on.

On top of that, the senior pool generally wants to maintain a small cash buffer for withdrawals, as any cash not being utilized productively dilutes the returns of the Senior Pool. Even in times of high liquidity this can be true. Because of the unpredictable nature of withdraws (both in frequency and size) and the incentives to maintain a small cash buffer, it makes more sense to keep this always on so LPs seeking to withdraw can always have a path to do so. If the withdraw period is too long, governance can vote to decrease the withdraw period length at will.

@kagami

  1. If this governance proposal passes we’ll have a better understanding of how long it will take to deliver the final product.
  2. This proposal would effect the senior pool and carries the same risk as any other smart contract changes. However, Warbler does everything in its power to minimize smart contract risk.
  3. While the mechanics are more complicated for withdrawal, they are far less frustrating as a new LP can feel some assurance they will be able to get some amount of their capital out every period. I think those seeking to become LPs would find the Senior Pool more attractive after these changes.

Secondary markets

In the governance post I said

It’s reasonable to assume that this proposal could lead to a larger spread between primary and secondary markets.

However a number of raised valid criticisms of this assumption.

There are a number of dynamics at work here that I think make it difficult for me to reason about what will happen in secondary markets.

  1. The ability to arbitrage between primary and secondary markets will no longer possible. This could lead to a decrease in buy pressure.
  2. LPs can more easily withdraw, leading to increased confidence and making it less likely for LPs to accept a dramatic discount on Curve. This could lead to a decrease in sell pressure.

Proposal Updates

We are proposing concrete values for the protocol parameters that are being created.

  1. Cancellation fee: we propose a fee of 1%. We want this fee to be as low as possible while still discouraging the behavior I described in my response to @octavianotpunk
  2. Pro Rata Withdraw Threshold: We propose a threshold of 500 USDC. This means that those submitting a withdraw request with a value less than or equal to 500 USDC will have their request honored immediately, ignoring their pro-rata allocation.

Additionally, I’m removing language discussing how the spread between primary and secondary markets may change.

1 Like

Very fair point as it relates to the attractiveness of fixed-rate instruments in a rising rate environment. Variabe rates instruments could certainly be a mechanism, especially in a rising rate environment, be a future path to solving for said concern.

Broadly speaking though, this proposal is specifically focused on addressing protocol participants expressed desire to:

  1. Create more predictability related to expected exit liquidity; and

  2. A fairer mechanism to allow the benefits of #1 to be realized by the entire protocol, not just whales

As it relates to :point_down:

However, it does nothing to address the general unattractiveness of the Senior Pool in a rising interest rate environment or help with bringing new capital into the Senior Pool.

This is a separate obstacle for the protocol to address which broadly has three practical levers to addressing them:

1. Existing Borrowers agree to increase their interest rates - A prospect that’s very unlikely for any rational Borrower to agree to without significant concessions made to them.

2. New Pools Reflect Updated Macro Realities - A much more likely prospect as Backers can express their view directly to Borrowers as it relates to finding new normal market clearing rates.

3. Buy Into Existing Senior Pool at a Discount - Curve as you mention, effectively provides investors a path to express the view that FIDU should be priced at a discount. In addition to that, the community could move on its own, or surface as a proposal, that FIDU effectively be listed on various aggregators (e.g. 1inch) which would allow limit orders to be set, which would more directly allow investors to specify the price they want to buy in at (vs being a price takers from Curve).

2 Likes

I support the suggestion in general but have a specific question.
Why are you messing with FIDU/USDC price?
You are saying it was 0.9 at first, then it goes up to 1. I do not get it at all.
All of us who deposit USDC into the SeniorPool via goldfinch site have ratio of ~1.08 USDC to 1 FIDU, so we want the same rate to be the same during withdrawal. If I deposited 1000 USDC and got 925 FIDU I want to convert my 925 FIDU back into 1000 USDC (not considering interest and fees).

T​​he proposed withdraw ​system, as described, is a step in the right direction!

The current situation is similar to locked staking, whereas LPs were expecting the Senior Pool to remain liquid at most times. Warbler has recognized that reinstating trust in the LPs ability to withdraw, at least partially, is the top priority.

While I agree with ​@​ICXCNIKA about the current macro environment demanding increased yields for this asset class (e.g. for the future borrower pools), I think it’s important to point out that Goldfinch’s Senior Pool 14-17% yield remains the highest compared to its peers (Tinlake, TrueFi, Maple Finance).

I would also suggest that some efforts be deployed to incentivize current LPs to remain invested in the Senior Pool. The cancellation fee could be redistributed in the form of boosted GFI rewards.

2 Likes

I’ll say my intuition here is that this new withdrawal mechanic would tend to reduce spreads between primary and secondary markets. My reasoning is that there are many people who are currently selling on secondaries that would be willing to wait a little while and not pay the fee. This new mechanic would give them a way to do that. Hence they would no longer sell on the secondaries, and so there would be overall less sell pressure on the secondaries.
Of course some people will still want that instant liquidity, so they will use the secondaries for that. So this would not eliminate a delta, but I think it would reduce it.

1 Like

@will this is a great proposal and very thoughtful.

I think a solution to discouraging dishonest withdrawal requests is to have the fee scale with the withdrawal request, as you suggested in the update.

Although, 1% could be too low - it could be viewed as ~1 month of yield (including GFI rewards), which is worth paying to game the mechanism. But could watch and see what happens.

A question I have is whether you could request to withdrawal more FIDU than you have? This is another avenue for gaming, and also could be used by arbitrageurs to pre-sell FIDU that they don’t have yet and then purchase FIDU on the secondary in anticipation of having their withdrawal met.

@blakewest I agree it may reduce the spread on Curve. As the discount relative to the yield on FIDU increases, the time period an LP is willing to wait to be redeemed also increases. So 2 weeks is fairly short and should encourage most LPs to utilize the redemption mechanism.

@rennick_stratos, having the fee scale with size is interesting. Do you mean like, “1% if < $100k, 2% if < $1M, 3% if < $2M, etc.”? Regardless, I am inclined to keep things simple in the beginning, and see what behaviors result. Changing the fee is a fairly trivial matter.

To your other question, no you would not be able to request more FIDU than you own.

Hey @X2plag, welcome to the discussion! Great to see you make your first post!
To your question. The FIDU/USDC price in the example that @will used was just made up for the purposes of the example.

Also, I think you may have a misunderstanding of how the pricing works? You said “all of us who deposit USDC into the SeniorPool via goldfinch site have ratio of ~1.08 USDC to 1 FIDU, so we want the same rate to be the same during withdrawal”. This isn’t quite true as the exchange rate increases over time as interest payments come back into the protocol. So in reality, not “all of us” got a 1.08 rate. Anyone who invested early would have some lower rate < 1.08 but > 1.0 (which is what it started at). Also, when you withdraw, you would expect interest to make the rate higher. I see you also wrote "not considering interest and fees). So you may totally understand the whole thing, but just thought I’d clarify to be sure!

1 Like

Thank you for personal touch.
Pleased with your clarification!