Increasing Discount Collateral Auction House
Auctioneer that tries to recapitalize the system by selling collateral at an increasing discount
1. Summary
Increasing discount collateral auctions are similar to fixed discount ones in that they are used to preserve the overall system health by liquidating under-collateralized SAFEs and selling off collateral at a discount. This auction type automatically calculates an amount of collateral to send back to a bidder, taking into account the amount of system coins the bidder submits as well as the current system coin redemptionPrice (and optionally its market price) and collateral market price.
2. Contract Variables & Functions
Variables
contractEnabled- settlement flag (1or0).AUCTION_HOUSE_TYPE- flag set tobytes32("COLLATERAL")AUCTION_TYPE- flag set tobytes32("INCREASING_DISCOUNT").authorizedAccounts[usr: address]- addresses allowed to callmodifyParameters()anddisableContract().safeEngine- storage of theSAFEEngine's address.bids[id: uint]- storage of all bids.collateralType- id of the collateral type for which theCollateralAuctionHouseis responsible.minimumBid- minimum amount of system coins that must be submitted by each bidder.totalAuctionLength- auction length (default:uint48(-1)).auctionsStarted- total auction count, used to track auctionids.lastReadRedemptionPrice- the last read redemption price. Can (and most probably is) be different than the latestOracleRelayer._redemptionPriceminDiscount- initial discount (compared to the collateral market price) used when calculating the amount of collateral to send to a bidder.maxDiscount- maximum discount (compared to the collateral market price) used when calculating the amount of collateral to send to a bidder.perSecondDiscountUpdateRate- the rate at which the discount will be updated in an auction.maxDiscountUpdateRateTimeline- max time over which the discount can be updated in an auction.lowerCollateralMedianDeviation- maxcollateralMediancollateral price deviation (compared to theFSMprice) used when the median price is lower than thecollateralFSMprice and the contract needs to pick which one to useupperCollateralMedianDeviation- maxcollateralMediancollateral price deviation (compared to theFSMprice) used when the median price is higher than thecollateralFSMprice and the contract needs to pick which one to uselowerSystemCoinMedianDeviation- maxsystemCoinOracleprice deviation (compared to theredemptionPrice) used when the system coin'sredemptionPriceprice is higher than its market price and the contract needs to pick which one to useupperSystemCoinMedianDeviation- maxsystemCoinOracleprice deviation (compared to theredemptionPrice) used when the system coin'sredemptionPriceprice is lower than its market price and the contract needs to pick which one to useminSystemCoinMedianDeviation- minimum deviation between the system coin's market and redemption prices that must be passed in order for the contract to use the deviated price instead of the redemption oneoracleRelayer- the address of theOracleRelayercollateralFSM- the collateral type'sFSMaddresscollateralMedian- collateral type medianizer addresssystemCoinOracle- market price oracle for the system coinliquidationEngine- the address of theLiquidationEngineRAD- number with 45 decimals (e.g asafeEngine.coinBalance)WAD- number with 18 decimals (e.g a bid submitted when someone wants to buy collateral from an auction)RAY- number with 27 decimals
Data Structures
Bid- state of a specific auctionamountToSell- quantity up for auction / remaining collateral for saleamountToRaise- total system coins still requested by the auctioncurrentDiscount- the current discount being used in the auctionmaxDiscount- the max value that thecurrentDiscountcan haveperSecondDiscountUpdateRate- the rate at which thecurrentDiscountgrowslatestDiscountUpdateTime- last time when thecurrentDiscountwas updateddiscountIncreaseDeadline- deadline after which the discount cannot increase anymoreforgoneCollateralReceiver- address of the SAFE whose collateral and debt were confiscatedauctionIncomeRecipient- recipient of auction income / receives system coin income (this is theAccountingEnginecontract)
Modifiers
isAuthorized- checks whether an address is part ofauthorizedAddresses(and thus can call authed functions).
Functions
modifyParameters(bytes32 parameter,uint256 data)- update anuint256parameter.modifyParameters(bytes32 parameter,address data)- update anaddressparameter.addAuthorization(usr: address)- add an address toauthorizedAddresses.removeAuthorization(usr: address)- remove an address fromauthorizedAddresses.getCollateralMedianPrice() public view returns (priceFeed: uint256)- get the collateral's median price fromcollateralMediangetSystemCoinFloorDeviatedPrice(redemptionPrice: uint256) public view returns(floorPrice: uint256)- get the smallest possible price that's at maxlowerSystemCoinMedianDeviationdeviated from the redemption price and at leastminSystemCoinMedianDeviationdeviatedgetSystemCoinCeilingDeviatedPrice(redemptionPrice: uint256) public view returns(ceilingPrice: uint256)- get the highest possible price that's at maxupperSystemCoinMedianDeviationdeviated from the redemption price and at leastminSystemCoinMedianDeviationdeviatedgetCollateralFSMAndFinalSystemCoinPrices(systemCoinRedemptionPrice: uint256) publicview returns (uint256, uint256)- get the collateral price from the FSM and the final system coin price that will be used when bidding in an auctiongetSystemCoinMarketPrice() public view returns (priceFeed: uint256)- get the system coin's market price fromsystemCoinOraclegetFinalTokenPrices(systemCoinRedemptionPrice: uint256) public view returns (uint256,uint256)- get the collateral and system coin prices that can be currently used to determine the amount of collateral bought by biddersgetFinalBaseCollateralPrice(collateralFsmPriceFeedValue: uint256,collateralMedianPriceFeedValue: uint256) public view returns (uint256)- get the collateral price (without the discount applied) used in bidding by picking between the raw FSM and the oracle median price and taking into account deviation limitsgetDiscountedCollateralPrice(collateralFsmPriceFeedValue: bytes32,collateralMedianPriceFeedValue: bytes32,systemCoinPriceFeedValue: uint256,customDiscount: uint256) public view returns (uint256)- get the (discounted) collateral price using either theFSMor median price for the collateral and the redemption/market price for the system coingetNextCurrentDiscount(id: uint256) public view returns (uint256)- get the upcoming discount that will be used in a specific auctiongetAdjustedBid(id: uint256,wad: uint256) public view returns (bool, uint256)- get the actual bid that will be used in an auction (taking into account the bidder input)startAuction(forgoneCollateralReceiver: address,auctionIncomeRecipient: address,amountToRaise: uint256,amountToSell: uint256,initialBid: uint256 )- function used byLiquidationEngineto start an auction / put collateral up for auctiongetApproximateCollateralBought(id: uint256,wad: uint256)- get the amount of collateral that can be bought from a specific auction by biddingwadsysem coins and assuming that the latest system coinredemptionPriceis equal tolastReadRedemptionPricegetCollateralBought(id: uint256,wad: uint256) returns (uint256,uint256)- get the amount of collateral that can be bought from a specific auction by biddingwadamount of system coins (wherewadwill be scaled byRAYto transfer the correct amount ofRADsystem coins fromsafeEngine.coinBalance)buyCollateral(id: uint256,wad: uint256)- buy collateral from an auction and offerwadamount of system coins in return (wherewadis scaled byRAYin order to transferRADamount of coins from the bidder'ssafeEngine.coinBalance)settleAuction(id: uint256)- settle an auction that has passed itsauctionDeadlineand return any unsold collateral to theforgoneCollateralReceiverterminateAuctionPrematurely(id: uint256)- normally used duringGlobalSettlementto terminate an auction early and send unsold collateral to themsg.senderas well as callLiquidationEnginein order to subtractbids[auctionId].amountToRaisefromLiquidationEngine.currentOnAuctionSystemCoinsbidAmount(id: uint256) public view returns (uint256)- always returns zero.remainingAmountToSell(id: uint256) public view returns (uint256)- return the remaining collateral amount to sell from a specific auction.forgoneCollateralReceiver(uint id) public view returns (address)- returns theforgoneCollateralReceiverfor a specific auction.raisedAmount(id: uint256)- returns zero.amountToRaise(uint id) public view returns (uint256)- returns the amount of system coins left to raise by a specific auction.
Events
AddAuthorization- emitted when a new address becomes authorized. Contains:account- the new authorized account
RemoveAuthorization- emitted when an address is de-authorized. Contains:account- the address that was de-authorized
StartAuction- emitted whenstartAuction(address,address,uint256,uint256,uint256)is successfully executed. Contains:id- auction idauctionsStarted- amount of auctions started up until nowamountToSell- amount of collateral sold in the auctioninitialBid- starting bid for the auction (usually zero).amountToRaise- amount of system coins that should be raised by the auction.startingDiscount- the initial discount offered in the auction.maxDiscount- the max discount that can be offered in the auction.perSecondDiscountUpdateRate- the pace at which the current discount in the auction is updated.discountIncreaseDeadline- the deadline after which the current discount offered in the auction cannot increase anymore.forgoneCollateralReceiver- receiver of leftover collateral (usually the SAFE whose collateral was confiscated by theLiquidationEngine).auctionIncomeRecipient- receiver of system coins (usually theAccountingEngine).
ModifyParameters- emitted when a parameter is modifiedBuyCollateral- emitted when someone buys collateral from an auction. Contains:id- the ID of the auction from which collateral was boughtwad- the bid sizeboughtCollateral- the amount of collateral that was bought
SettleAuction- emitted when someone settles an auction. Contains:id- the ID of the auction settledleftoverCollateral- the amount of collateral that hasn't been sold by the now-settled auction
TerminateAuctionPrematurely- emitted when an auction is terminated before its deadline. Contains:id- the ID of the auction that was terminatedsender- the address that terminated the auctioncollateralAmount- the amount of collateral still unauctioned
3. Walkthrough
The bidding process in an increasing discount auction is almost identical to the one in fixed discount auctions.
The only difference is that increasing discount auctions start with a smaller discount which increases at a pace of perSecondDiscountUpdateRate per second. The discount will increase until it hitsmaxDiscount or until discountIncreaseDeadline passes.
4. Gotchas
Increasing discount auctions have the same gotchas as fixed discount ones.
Last updated