PI-11: Update Convert Down Penalty Gauge and Dewhitelist Pools
Executed on July 31, 2025 at 15:34 UTC.
Summary
- Convert Down Penalty Gauge V1.1: Update the Convert Down Penalty such that the Convert Down Penalty ratio is 100% during positive-TWAΔP Seasons while a minimum number of Pinto has not yet been minted.
- Pro-Rata Convert Down Penalty: Fix the application of the Convert Down Penalty in instances where the penalty should apply to only a portion of the Deposits Converted.
- Dewhitelist Pools: Dewhitelist the PINTO:WSOL and PINTO:WETH pools from the Deposit Whitelist.
- Optimal Deposited PDV: Set the optimal percentage of Deposited PDV of PINTO:cbETH, PINTO:cbBTC and PINTO:USDC to 33.333333% each.
Links
- Implementation Commit: e08a5ea1a5aeb8ed5ae883b56c955da8035da20e
Problems
1. Convert Down Penalty Gauge V1.1
The Dynamic Convert Down Penalty had not resulted in the protocol spending significant time above its value target.
2. Pro-Rata Convert Down Penalty
If a Pinto -> LP Convert started with a price above the Excessively High Price threshold and resulted in a price below the Excessively High Price threshold, the protocol applied the penalty to all of the value Converted instead of only the portion below the threshold.
3. Dewhitelist Pools
Whitelisted LP tokens that contain an asset without liquidity on Base that is external to the Well were unable to be Converted into other LP tokens on the Deposit Whitelist without incurring large slippage costs, creating friction for Farmers to optimize their Seeds. There was no external liquidity on Base for WSOL.
Fragmenting the ETH exposure of the protocol across two pools leads to greater slippage when interacting with the pools than if the liquidity were concentrated in a single pool.
4. Optimal Deposited PDV
The removal of the two assets from the Deposit Whitelist required resetting the optimal distribution for the remaining tokens.
Solutions
1. Convert Down Penalty Gauge V1.1
- Introduce a new price,
penalty price, and supply threshold , where Pinto -> LP Converts face a penalty if the price after the Conversion is below thepenalty price. The minting threshold delays normal penalty decay until tracked mints reach .
- Increase the supply threshold as a function of the number of consecutive Seasons the protocol spends below the value target. Once the number of Pinto minted reaches the threshold, clear the threshold before decreasing the Convert Down Penalty dynamically in the same fashion as before the update. While positive TWAΔP Seasons remain below the minting threshold, the Blight Factor (rolling counter) does not increase. Nonpositive TWAΔP Seasons can still decrease it. The clearing Season retains the previous penalty ratio and counter, with decay beginning in subsequent Seasons.
- Set the Convert Down Penalty ratio during positive-TWAΔP Seasons while tracked mints remain below the outstanding minting threshold to 100%.
Every Season, update the Convert Down Penalty Minting Threshold based on TWAΔP. Each Season with TWAΔP < 0 adds current supply × to the main threshold while unlocked, or to a running threshold while locked. The running threshold replaces the main threshold only when it exceeds it, then resets. Above-target Seasons reset the running threshold. Reaching the minting threshold clears the main threshold and tracked mints. At zero TWAΔP these thresholds remain unchanged.
For TWAΔP < 0, add to the main threshold if unlocked, or to the running threshold if locked.
If the running threshold exceeds the main threshold, replace the main threshold with it, reset the running threshold to zero and unlock the threshold. Tracked mints are not reset by this replacement.
Where:
- = supply scalar = 0.000416666666666667 (1%/24)
- = current supply
2. Pro-Rata Convert Down Penalty
- Apply the Convert Down Penalty ratio only to the proportion of Converted PDV below the $1.005 penalty price, subject to integer rounding. Retain the minimum Grown Stalk required for a non-germinating Deposit. Converts ending above the penalty price incur no Convert Down Penalty.
3. Dewhitelist Pools
- Remove PINTO:WSOL and PINTO:WETH from the Deposit Whitelist, which
1) sets the Seed Gauge Points for these assets to 0,
2) disables Depositing these LP tokens and Converts into these pools. Retain the ability to Convert out of these previously whitelisted Wells. ReducestalkEarnedPerSeasonto its minimum nonzero raw value of 1 and retainisSoppablefor claims on prior Flood rewards.
4. Optimal Deposited PDV
- Update the optimal percent of Deposited PDV for the remaining Whitelisted pools as follows:
- 33.333333% PINTO:cbBTC
- 33.333333% PINTO:cbETH
- 33.333333% PINTO:USDC
Rationale
1. Convert Down Penalty Gauge V1.1
The Dynamic Convert Down Penalty started to decrease after the first Season in which the protocol logged a TWA∆P > 0. Particularly after longer periods where the protocol has failed to log a TWA∆P > 0, the protocol should highly discourage Pinto -> LP Converts until either the protocol mints some number of Pinto or the price is significantly above the value target.
By increasing the number of Pinto minted required before the penalty can decrease the longer TWAΔP remains negative the protocol aims to ensure that it mints a healthy number of Pinto before Pinto -> LP Converts return the price to its value target, where longer extended periods below the value target justify more minting once it returns to the value target. Once the minting threshold is cleared, subsequent positive-TWAΔP Seasons increase the Blight Factor so the protocol can gradually decrease the penalty until it reaches a level at which the protocol is able to oscillate across its value target.
2. Pro-Rata Convert Down Penalty
Applying the penalty only to the portion below the penalty price avoids penalizing the part of a Convert that maintains the price above that threshold.
3. Dewhitelist Pools
There was no WSOL or SOL on Base other than in the PINTO:WSOL Well. The result was that any LP -> LP Converts to and from the pool experienced a very high amount of slippage. This resulted in a loss of value for Convertors and the protocol, and created a high degree of friction for the Seed Gauge System to work effectively.
By reducing the number of pools with ETH exposure and concentrating the exposure in cbETH, the protocol minimizes the slippage experienced by Convertors and traders in the system and increases the amount of yield received on its liquidity. The downside is that all remaining paired assets carry censorship risk from Circle/Coinbase.
4. Optimal Deposited PDV
Setting the optimal ratios of the remaining pools to be approximately 1/3 each is a reasonable distribution of liquidity, with approximately 2/3 of the target Deposited PDV exposed to the crypto market and 1/3 exposed to stablecoins.
Contract Changes
Initialization
Executed InitPI11.init() at 0x35c229daa5e9028672137854b6342b57e058fb00. Reset the Convert Down Penalty ratio and rolling counter to 0. Initialized the locked minting threshold to 15,007,159.669041 Pinto, tracked mints and running threshold to 0, and the supply scalar to 0.000416666666666667 per negative-TWAΔP Season. Retained the counter rate of 1 and cap of 12. Set the independent penalty price to $1.005, dewhitelisted PINTO:WSOL and PINTO:WETH, and set the three remaining optimal Deposited PDV percentages to 33.333333% each.
Facet Changes
The cut replaced 179 selectors, removed downPenalizedGrownStalk(address,uint256,uint256) (0x527ec6ba), and added its four-argument replacement and getMaxAmountInAtRate(address,address,uint256). The seven supporting facets were redeployed without changes to their own source files. Replacement alone does not imply every getter changed.
Other Contract / Parameter Changes
The following externally linked libraries were redeployed. Only LibConvert and LibPipelineConvert changed their own source files relative to their previous deployments. Other library source files were unchanged, although some compiled dependencies changed.
The old penalty used the $1.025 Excessively High Price threshold. PI-11 used a separate $1.005 convertDownPenaltyRate without changing the existing evaluation parameters. The new minting-threshold fields had no prior equivalents. Dewhitelisting set Gauge Points and optimal Deposited PDV percentages to 0, set stalkEarnedPerSeason to the minimum raw value of 1, and preserved isSoppable for previous Flood claims. Optimal Deposited PDV changed from 12.5% to 33.333333% for PINTO:cbETH, from 25% to 33.333333% each for PINTO:cbBTC and PINTO:USDC, from 12.5% to 0 for PINTO:WETH, and from 25% to 0 for PINTO:WSOL. The three remaining raw percentages sum to 99.999999%, with normalization in the Seed Gauge calculation.
Function Changes
- Updated
convertDownPenaltyGauge()to track minted Pinto and main/running thresholds. It retains thebytes/bytesreturn shape and two-field value, while its data expands from two fields to eight. The existing engagement path stores both returned values. For TWAΔP > 0 with an outstanding threshold, it reset the running threshold and added TWAΔP to tracked mints. Below the minting threshold it returned a 100% ratio without changing the counter. Equality or excess cleared the threshold and tracked mints while retaining the prior ratio and counter for that Season. For TWAΔP < 0 it added floor(current supply × scalar) to the unlocked main threshold or locked running threshold. A strictly greater running threshold replaced the main threshold and unlocked it. It preserved tracked mints when replacing the threshold. Nonpositive TWAΔP reduced the counter toward its lower bound of 0. Zero TWAΔP left the threshold fields unchanged. A zero L2SR retained the previous ratio after the counter update.
- Updated
convert()andpipelineConvert()to pass the number of Pinto Converted intoLibConvert.downPenalizedGrownStalk(). The shared helper calculated the penalized portion using instantaneous Pump reserves andcalcReserveAtRatioLiquidity()at the configured rate. It prorated PDV, then Grown Stalk, then the penalty using floor division at each step, while retaining the non-germinating minimum. Deposits already below that minimum bypassed the penalty. The helper rejected zero PDV/input before bypass checks, rejected ratios above 100% after those checks, and checked the penalized-input bound when the ratio was nonzero. USD oracle failure reverted the call. A failed instantaneous Pump read also reverted when the returned empty reserve array was indexed.
- Replaced
downPenalizedGrownStalk(address,uint256,uint256)withdownPenalizedGrownStalk(address,uint256,uint256,uint256)(0x01c74ef1), addingamountConverted. It returns remaining and lost Grown Stalk from the revised helper.
- Added
getMaxAmountInAtRate(address,address,uint256)(0x9fb36a2b) for Pinto → currently whitelisted Well LP quotes at a six-decimal rate. This quote uses current Well reserves and returns 0 when no Pinto can be added at the requested rate. A zero rate or failed USD oracle reverts. Other token directions revert. Rounding can leave the resulting price slightly below the requested rate. Added the shared internalLibWell.getRatiosAndBeanIndexAtRate()and generalizedLibWellConvert._beansToPegAtRate(). Existing default-rate callers retained the $1 rate.
- Updated
pipelineConvert(), the LP → Pinto conversion paths,getMaxAmountIn()andgetAmountOut()to allow inputs from previously whitelisted Wells throughwellIsOrWasSoppable(). Output Wells still had to be currently whitelisted. No new deposit path into dewhitelisted Wells was added.
Event Changes
- Emitted
UpdatedGaugeduring initialization with the expanded Convert Down Penalty data and reset value. The event signature was unchanged. Normal gauge engagement retainsEngagedandEngagedData, withEngagedDatanow carrying the expanded eight-field data and updated thresholds. Their signatures are unchanged.
- Retained
ConvertDownPenaltyin both conversion paths, with lost and remaining Grown Stalk reflecting the revised pro-rata calculation. Its signature was unchanged.
- Emitted
UpdateWhitelistStatus,UpdatedStalkPerBdvPerSeasonandDewhitelistTokenfor PINTO:WSOL and PINTO:WETH, andUpdatedOptimalPercentDepositedBdvForTokenfor the three remaining pools during initialization.