Dampened Security Module
1. Summary
The DSM (Dampened Security Module) is an OSM-like contract that, apart from emposing a delay between prices coming from a medianizer and them being added into the system, it bounds the maximum price change between the currentFeed and the nextFeed. This ensures that in case of an oracle attack or extreme market volatility, governance has more time to react and defend the system.
2. Contract Variables & Functions
Variables
authorizedAccounts[usr: address]- addresses allowed to call authed functions.stopped- flag that disables price feed updates if non-zeropriceSource- address of the medianizer that the OSM will read fromONE_HOUR- 3600 secondsupdateDelay- time delay betweenupdateResultcalls; defaults toONE_HOURlastUpdateTime- time of last update (rounded down to nearest multiple ofupdateDelay)newPriceDeviation- max deviation accepted between the current and the next feedcurrentFeed-Feedstruct that holds the current price valuenextFeed-Feedstruct that holds the next price value
Modifiers
isAuthorized**** - checks whether an address is part ofauthorizedAddresses(and thus can call authed functions).
Functions
addAuthorization/removeAuthorization- add or remove authorized users (via modifications to theauthorizedAccountsmapping)stop/start- toggle whether the OSM price feed can be updated (by changing the value ofstopped)changePriceSource(source: address)- change data source for prices (by settingpriceSource)changeDelay(delay: uint16)- change interval between price updates (by settingupdateDelay)changeNextPriceDeviation(deviation: uint256)- change thenewPriceDeviationrestartValue- similar tostop, except it also setscurrentFeedandnextFeedto aFeedstruct with zero valuesgetResultWithValidity- returns the current feed value and a boolean indicating whether it is validgetNextResultWithValidity- returns the next feed value (i.e. the one that will become the current value upon the nextupdateResultcall), and a boolean indicating whether it is validgetNextBoundedPrice- get the nextcurrentFeedprice according to the currentnewPriceDeviationgetNextPriceLowerBound- get the lower bound of the nextcurrentFeedupdategetNextPriceUpperBound- get the upper bound of the nextcurrentFeedupdateread- returns the current feed value; reverts if it was not set by some valid mechanismupdateResult- updates the current feed value and reads the next one
Data Structures
Feed- struct used to store price feed data. Contains:value- the feed valueisValid- whether the price feed value is valid
3. Walkthrough
In order for the DSM to work properly, an external actor must regularly call updateResult() to update the current price and read the next one. The contract stores the timestamp of the last updateResult() and will not allow another update until block.timestamp is at least lastUpdateTime + updateDelay. Values are read from the priceSource. The next price accepted in the DSM can be at max newPriceDeviation deviated from the current price stored in the contract. In case of an oracle attack, governance can call stop() orrestartValue()
4. DSM Variations
SelfFundedDSM
This contract pulls funds from the StabilityFeeTreasury so it can reward addresses for callingupdateResult.
ExternallyFundedDSM
This contract calls an FSMWrapper in order to reward addresses that call updateResult.