Pot
The Pot is the core of theDai Savings Rate. It allows users to deposit dai and activate the Dai Savings Rate and earning savings on their dai. The DSR is set by Sky Governance, and will typically be less than the base stability fee to remain sustainable. The purpose of Pot is to offer another incentive for holding Dai.
Contract Details
Section titled “Contract Details”mul(uint, uint),rmul(uint, uint),add(uint, uint)&sub(uint, uint)- will revert on overflow or underflowrpow(uint x, uint n, uint base), used for exponentiation indrip, is a fixed-point arithmetic function that raisesxto the powern. It is implemented in assembly as a repeated squaring algorithm.x(and the result) are to be interpreted as fixed-point integers with scaling factorbase. For example, ifbase == 100, this specifies two decimal digits of precision and the normal decimal value 2.1 would be represented as 210;rpow(210, 2, 100)should return 441 (the two-decimal digit fixed-point representation of 2.1^2 = 4.41). In the current implementation, 10^27 is passed forbase, makingxand therpowresult both of typerayin standard MCD fixed-point terminology.rpow’s formal invariants include “no overflow” as well as constraints on gas usage.
wardsare allowed to call protected functions (Administration)
Storage
Section titled “Storage”pie- stores the address’Potbalance.Pie- stores the total balance in thePot.dsr- thedai savings rate. It starts as1(ONE = 10^27), but can be updated by governance.chi- the rate accumulator. This is the always increasing value which decides how muchdai- given whendrip()is called.vat- an address that conforms to aVatLikeinterface. It is set during the constructor and cannot be changed.vow- an address that conforms to aVowLikeinterface. Not set in constructor. Must be set by governance.rho- the last time that drip is called.
The values of dsr and vow can be changed by an authorized address in the contract (i.e. Sky Governance). The values of chi, pie, Pie, and rho are updated internally in the contract and cannot be changed manually.
Key Mechanisms & Concepts
Section titled “Key Mechanisms & Concepts”drip()
Section titled “drip()”- Calculates the most recent
chiand pullsdaifrom thevow(by increasing theVow’sSin). - A user should always make sure that this has been called before calling the
exit()function. - drip has to be called before a user
joins and it is in their interest to call it again before theyexit, but there isn’t a set rule for how often drip is called.
join(uint wad)
Section titled “join(uint wad)”uint wadthis parameter is based on the amount of dai (sincewad=dai/chi) that you want tojointo thepot. Thewad * chimust be present in thevatand owned by themsg.sender.- the
msg.sender’spieamount is updated to include thewad. - the total
Pieamount is also updated to include thewad.
exit(uint wad)
Section titled “exit(uint wad)”exit()essentially functions as the exact opposite ofjoin().uint wadthis parameter is based on the amount of dai that you want toexitthepot. Thewad * chimust be present in thevatand owned by thepotand must be less thanmsg.sender’spiebalance.- The
msg.senderspieamount is updated by subtracting thewad. - The total
Pieamount is also updated by subtracting thewad.
Administration
Section titled “Administration”Various file function signatures for administering Pot:
- Setting new dsr (
file(bytes32, uint256)) - Setting new vow (
file(bytes32, address))
The primary usage will be for addresses to store their dai in the pot to accumulate interest over time
Gotchas / Integration Concerns
Section titled “Gotchas / Integration Concerns”- The
dsris set (globally) through the governance system. It can be set to any number > 0%. This includes the possibility of it being set to a number that would cause the DSR to accumulate faster than the collective Stability Fees, thereby accruing system debt and eventually causing SKY to be minted. - If
drip()has not been called recently before an address callsexit()they will not get the full amount they have earned over the time of their deposit. - If a user wants to
joinorexit1 DAI into/from the Pot, they should send awad= to1 / chias the amount moved from their balance will be1 * chi(for an example of this, see DSS-Proxy-Actions
Failure Modes and Impact
Section titled “Failure Modes and Impact”Coding Error
Section titled “Coding Error”A bug in the Pot could lead to locking of dai if the exit() function or the underlying vat.suck() or vat.move() functions were to have bugs.
Governance
Section titled “Governance”The dsr rate initially can be set through the Chief. Governance will be able to change the DSR based on the rules that the DS-Chief employs (which would include a Pause for actions).
One serious risk is if governance chooses to set the dsr to an extremely high rate, this could cause the system’s fees to be far too high. Furthermore, if governance allows the dsr to (significantly) exceed the system fees, it would cause debt to accrue and increase the Flop auctions.
Released into the public domain (CC0 1.0 Universal) – trademarks remain with their owners; no warranty. See full license.