Is the DAO happy with the current limits on the USDREG conversion oracle ?
minAnswer = 0.5 USD
(lower limit of the bracket in the smart contract/ also refered to as "the threshold")
maxAnswer = 100 USD
(upper limit of the bracket in the smart contract)
Theses values were initialized by RealT as they released the USDREG conversion vault on march 19. (it was discussed with experts over at Chainlink and based on the REG price at the time)
Theses limits can be modified and Michael encouraged the DAO on Telegram to discuss the relevance of the initial values.
This suggestion serves as a means for anyone to follow and participate in the debate:
How should the DAO manage the USDREG conversion Threshold ?
Context :
To put things into context, it's important to understand the impact of this threshold (currently at 0.5) for the USDREG oracle and why it was put in place.
On March 19 2025, a tool appeared to claim your REG. This tool allows you to convert your USDREG (the right to mint REG based on their value).
RealT has implemented a conversion threshold. Currently, it's therefore not possible to convert USDREG below 0.5 per 1 REG.
This threshold is not intended to control the price of REG, but rather to limit high inflation in case of a hack on the oracle.
For instance, if a hacker found a way to manipulate the oracle to return 1 REG = 0.0001 USDREG
, it would then be very easy to create a lot of REG and thus have uncontrolled inflation. This threshold is therefore an essential protection mechanism for the security of REG and its supply. This mechanism could potentially be adjusted over time depending on the liquidity of REG and the level of risk we are willing to take.
We must maintain a balance between a conversion that reflects market reality and a conversion that does not endanger REG and its supply. (do we really have to? Some DAO members have argued against)
Where does this threshold of 0.5 come from? This value, implemented by RealT, is based on Chainlink's recommendations. Chainlink, which is used to managing this type of oracle, recommended 0.5 to protect the REG supply as a minimum (at the time 1 REG was worth between $1.5 and $2). REG markets have especially very low liquidity. If liquidity were sufficient, this threshold would not necessarily be required
How the oracle algorithm works :
You can find the oracle smart-contract here.
Every 24h, the fulfillRegPrice(bytes32,uint256)
function updates the price the oracle (đŽ) returns to the USDREGConversionVault
with an off-chain price
(đ”). This price
(đ”) is calculated from Chainlink's server (more insights on how this price is calculated in the wiki).
Below you can find the conditions (written in english) that acts as the protective measure against hackers:
If the price
(đ”) is within the range [minAnswer
; maxAnswer
] and [regTwapPrice
* (1 - diffFactor
); regTwapPrice
* (1 + diffFactor
)] then update the oracle price (đŽ).
On march 19:
minAnswer = 50000000
(= 0.5 since 8 decimals) => the lower limit of the bracket
maxAnswer = 10000000000
(= 100 since 8 decimals) => the upper limit of the bracket
regTwapPrice
=> The on-chain TWAPOracleREGUSD
calculated price
diffFactor = 500
(= 5% since 10000 = 100%) => probably to check if the off-chain price
(đ”) returned by chainlink's server is not widely off the regTwapPrice
(since the REG pools are illiquid there can be high price variation in a split second)
The full fulfillRegPrice(bytes32,uint256 )
function:
function fulfillRegPrice(
bytes32 requestId,
uint256 price
) public recordChainlinkFulfillment(requestId) {
uint256 regTwapPrice = getRegTwapPriceInUsd();
uint256 diffFactorCache = _priceRangeDiffFactor; // cache to save gas
uint256 minAnswerCache = _minAnswer; // cache to save gas
uint256 maxAnswerCache = _maxAnswer; // cache to save gas
// If the price is within the range (minAnswer, maxAnswer) and (regTwapPrice * (1 - diffFactor), regTwapPrice * (1 + diffFactor)) then update the price
if (
price >
((regTwapPrice * (PRICE_RANGE_FACTOR - diffFactorCache)) /
PRICE_RANGE_FACTOR) &&
price <
((regTwapPrice * (PRICE_RANGE_FACTOR + diffFactorCache)) /
PRICE_RANGE_FACTOR) &&
price > minAnswerCache &&
price < maxAnswerCache
) {
// Emit the callback function event
emit RequestRegPriceFulfilled(requestId, price);
_latestAnswer = int256(price);
_latestRound += 1;
_latestTimestamp = block.timestamp;
_answers[_latestRound] = _latestAnswer;
_timestamps[_latestRound] = block.timestamp;
emit AnswerUpdated(int256(price), _latestRound, block.timestamp);
emit NewRound(_latestRound, msg.sender, block.timestamp);
} else {
// Emit the off-chain price out of range event
// Do not revert the transaction to prevent Chainlink automation from stopping
emit OffChainPriceOutOfRange(
price,
regTwapPrice,
diffFactorCache,
minAnswerCache,
maxAnswerCache,
requestId
);
}
}
SOLUTIONS:
(En français sous le résumé Anglais)
đșđž
1 · Fixed $0.50 Threshold (statusâquo)
Effect when the price freezes
Situation | Spot price | Oracle price (frozen) | REGÂ /Â USDREG | Relative inflation |
Before crash | $0.60 | $0.60 | Â 1.67 | Â â |
After crash < $0.50 | $0.30 | $0.50 |  2.00 | +20 % REG per USDREG |
As soon as the spot price drops below $0.50, the Chainlink feed stops updating and keeps the last answer.
Each coupon can mint no more than 2 REG, capping the potential impact to â 0.32 % of total supply if the remaining 800 k USDREG are all converted.
Pros & Cons
â
 Pros | â Cons |
Automatic protection â no governance action, no room for human error. | USDREG holders are penalised while spot < $0.50, receiving fewer REG than the real price would allow. |
Limited arbitrage pressure â converters receive fewer REG, so fewer tokens hit the market. | When REG climbs back above $0.50, the oracle âcatches upâ, creating temporal inequality between early and late converters. |
2 · Parameterised Periodic FloorâCut (variables X, Y, YâČ, Z)
How it works
Every XÂ days the Security Committee compares the current antiâhack floor with the Zâday TWAP:
Calculate the TimeâWeighted Average Price (TWAP) over ZÂ days.
Measure the gap:
Gap = (CurrentFloor â TWAP) ÷ TWAP
If the gap is greater than or equal to YâČ percent, lower the floor by Y percent:
NewFloor = CurrentFloor Ă (CurrentFloor â Y percent)
The multisig calls setMinAnswer()
. Once mined, the oracle either follows the live price (if spot â„ NewFloor) or stays frozen at the new value.
When the spot price leaves the minAnswer / maxAnswer
range, the Chainlink feed keeps returning the last valid answer.
DAOâset variables
Symbol | Purpose | Current example | Main effect |
X | Execution frequency | 7 days | Shorter â more reactive, higher cost |
Y | Cut applied to the floor | 35 % | Higher â bigger oneâshot inflation |
YâČ | Trigger margin | 10 % | Lower â cuts fire more often |
Z | TWAP window | 3 days | Shorter â more sensitive to spikes |
Example
Parameters: X = 7, Y = 35 %, YâČ = 10 %, Z = 3
- 3-days TWAP : 0,3725Â USD
- Current Floor: 0,5Â USD
- Gap =Â
(CurrentFloor â TWAP) Ă· TWAP
= (0.5 - 0.3725) / 0.3725 = 34.28 % (above 10Â %) â condition met
- New floor =Â
CurrentFloor à (CurrentFloor â Y %)
= 0.5 - 0.5 Ă 0.35 = 0.325Â USD
While the spot price stays below 0.325 USD, conversion uses the frozen rate (â 3.08 REG per USDREG). As soon as spot rises back above the floor, the oracle resumes live updates.
Pros & Cons
â
 Pros | â Cons |
Clear parameters, adjustable by vote. | Manual executions: any delay opens an arbitrage window. |
Gradually reduces USDREG discount without sacrificing the circuit breaker. | Oneâoff inflation peaks proportional to YÂ percent and the coupon volume converted right after the cut. |
Guarantees no minting below the active floor (antiâhack stays intact). | Hyper inflation risk |
3 · InflationâCap Threshold
Mechanics under freeze
minAnswer = USDREG_remaining / (REG_supply Ă InflCap)
.
If spot falls below this value, the price freezes at minAnswer
.
Total REG minted can never exceed InflCap Ă REG_supply
, regardless of how deep the crash is îciteîturn0search1î.
Example
- Inputs: 800 k USDREG left, 500 M REG supply, InflCap 0.25 % â
minAnswer = $0.64
.
- If REG â $0.30, oracle stays at $0.64 â 1Â USDREGÂ =Â 1.56Â REG.
- Maximum inflation = 0.25Â % of supply even in total market collapse.
Pros & Cons
â
 Pros | â Cons |
Automatic & predictable â no vote until âUSDREG_remainingâ or supply move beyond a threshold. | - |
Security scales with future allocations: a large Merkle update immediately raises minAnswer . | - |
Comparative snapshot
Criterion / Option | Fixed floor 0.50 USD | Parameterised periodic cut | InflationâCap |
Behaviour when REG < floor | Conversion at 2 REG / USDREG | Price frozen; once the YâČ % gap is met, floor is cut and conversion happens at a higher rate | Conversion at a capped rate (â€Â InflCap) |
Complexity | âââ | â
ââ | â
ââ |
Inflation risk | 0.32Â % of supply (current data) | Risk of hyper inflation | Chosen InflCap (e.g., 0.25Â %) |
Alignment with antiâhack goal | đą | đą | đą |
Key Takeâaways for the DAO
- The threshold never stops conversion; it only caps how many REG each USDREG can mint.
- A low threshold restores USD parity but weakens protection; a high threshold shields supply but deepens coupon discount.
- InflationâCap offers the same antiâhack guarantee as a fixed floor while tracking the real USDREG stock.
- Whatever the model, keep a pauseVault() emergency switch in case the oracle is compromised above
minAnswer
.
đ«đ·
1 · Seuil fixe 0,50 USD (statu quo)
Effet avec gel du prix
Situation | Prix spot | Prix oracle (gelé) | REG/ USDREG | Inflation relative |
Avant krach | 0,60 | 0,60 | 1Â ,67 | â |
AprĂšs krach <0,50 | 0,30 | 0,50 | 2Â ,00 | +20Â % REG / USDREG |
Le gel maintient une inflation bornĂ©e : tant que le marchĂ© reste sous 0,50, chaque coupon ne peut Ă©mettre plus de 2 REG, ce qui limite lâimpact Ă Â 0,32 % du supply si les 800 k USDREG restants sont tous convertis.
Avantages & Limites
â
 Avantages | â Limites |
Protection automatique : aucun update â aucune erreur de gouvernance. | Les dĂ©tenteurs dâUSDREG sont pĂ©nalisĂ©s quand le prix spot < 0,50, car ils frappent moins de REG quâau prix rĂ©el. |
DĂ©cote maĂźtrisĂ©e pour le REG : la demande dâarbitrage (revendre REG) est moindre car les convertisseurs reçoivent moins de REG que si le prix suivait le marchĂ©. | Sâil remonte > 0,50, lâoracle rattrape le marchĂ© et rĂ©duit encore le nombre de REG/ USDREG, crĂ©ant une diffĂ©rence de ratio entre convertisseurs prĂ©coces et tardifs. |
2 · RĂ©vision manuelle pĂ©riodique paramĂ©trĂ©e (variables X, Y, YâČ, Z)
Principe
Tous les X jours, le ComitĂ© de sĂ©curitĂ© compare le seuil antiâhack actuel au TWAP calculĂ© sur Z jours :
Calculer le TimeâWeighted Average Price (TWAP) sur ZÂ jours.
Mesurer lâĂ©cart :
Ăcart = (SeuilActuel â TWAP) Ă· TWAP
Si lâĂ©cart est supĂ©rieur ou Ă©gal Ă YâČ %, baisser le seuil de Y % :
NouveauSeuil = SeuilActuel Ă (SeuilActuel â YÂ %)
Le multisig exécute setMinAnswer()
. Une fois la transaction minĂ©e, lâoracle continue soit au nouveau prix (si le spot est â„ NouveauSeuil), soit reste figĂ© sur cette valeur.
Quand le spot sort de la plage minAnswer / maxAnswer
, le feed Chainlink conserve la derniĂšre valeur valide.
Variables fixées par la DAO
Symbole | RĂŽle | Exemple actuel | Effet principal |
X | FrĂ©quence dâexĂ©cution | 7 jours | Plus court â rĂ©activitĂ© accrue, frais plus frĂ©quents |
Y | Pourcentage de rĂ©duction | 35 % | Plus Ă©levé â inflation ponctuelle plus forte |
YâČ | Ăcart dĂ©clencheur | 10 % | Plus bas â coupes plus rĂ©guliĂšres |
Z | FenĂȘtre TWAP | 3 jours | Plus courte â plus sensible aux pics |
Exemple
ParamĂštres : X = 7, Y = 35 %, YâČ = 10 %, Z = 3
- TWAP (3Â jours) : 0,3725Â USD
- Seuil actuel: 0,5Â USD
- Ăcart :
(SeuilActuel â TWAP) Ă· TWAP
= (0.5 - 0.3725) / 0.3725 = 34,28 % (supĂ©rieur Ă 10 %) â condition remplie
- Nouveau seuil :
SeuilActuel Ă (SeuilActuel â YÂ %)
= 0.5 - 0.5 Ă 0.35 = 0,325Â USD
Tant que le spot reste infĂ©rieur Ă 0,325 USD, la conversion se fait au taux figĂ© (â 3,08 REG par USDREG). DĂšs que le spot repasse auâdessus, lâoracle se remet Ă jour.
Avantages & Limites
â
 Avantages | â Limites |
ParamÚtres clairs, ajustables par vote. | Exécutions manuelles : tout retard ouvre un décalage avant mise à jour. |
RĂ©duit progressivement la dĂ©cote des USDREG sans sacrifier le « circuitâbreaker ». | Pics dâinflation ponctuels proportionnels Ă Y % et au volume converti juste aprĂšs la coupe. |
Garantit quâaucun mint ne se fait sous le seuil actif (protection antiâhack intacte). | Risque d'hyper inflation |
3 · Seuil InflationâCap
Mécanique sous freeze
minAnswer = USDREG_dispo / (REG_supply Ă InflCap)
. Si le cours spot tombe sous cette valeur, lâoracle gĂšle Ă minAnswer
. Le nombre de REG frappĂ©s ne peut pas dĂ©passer InflCap Ă REG_supply
, quelle que soit la profondeur du krach.
Exemple
- DonnĂ©es : 800 k USDREG restants, supply 500 M, InflCap 0,25 % â
minAnswer =Â 0,64Â USD
.
- Si REG â 0,30 USD, lâoracle reste Ă Â 0,64 â 1 USDREG = 1,56 REG.
- Inflation maximale thĂ©orique : 0,25 % du supply, atteinte mĂȘme si le marchĂ© se dĂ©lite totalement.
Avantages & Limites
â
 Avantages | â Limites |
Automatique et prĂ©visible : aucun vote tant que les variables âUSDREG_dispoâ et âsupplyâ nâont pas bougĂ© auâdelĂ dâun seuil. | - |
Aligne la sĂ©curitĂ© sur le risque dâallocation future : une grosse mise Ă jour du Merkle tree augmente immĂ©diatement minAnswer . | - |
SynthĂšse comparative
CritĂšre / Piste | Seuil fixe 0,50 USD | Baisse pĂ©riodique paramĂ©trĂ©e | InflationâCap |
Comportement si REG < seuil | Conversion Ă 2 REG / USDREG | AprĂšs dĂ©clenchement (Ă©cart YâČ %), abaissement du seuil et conversion Ă un taux plus Ă©levĂ© | Conversion Ă un taux plafonnĂ© (â€Â InflCap) |
ComplexitĂ© | âââ | â
ââ | â
ââ |
Risque d'inflation | 0,32 % du supply (données actuelles) | Risque d'hyper inflation | InflCap choisi (ex. 0,25 %) |
Alignement avec lâobjectif antiâhack | đą | đą | đą |
Points clefs pour la DAO
- Comprendre que le seuil nâarrĂȘte jamais la conversion, il borne seulement la quantitĂ© de REG que chaque USDREG peut crĂ©er.
- Un seuil trop bas protÚge moins mais rétablit la parité USD ; un seuil trop haut protÚge mieux mais creuse la décote des coupons.
- Lâoption InflationâCap apporte la mĂȘme garantie antiâhack quâun seuil fixe, tout en suivant la croissance du stock dâUSDREG.
- Quel que soit le modĂšle retenu, prĂ©voir une pauseVault() de secours si lâoracle est compromis auâdessus de
minAnswer
.