@@ -21,6 +21,15 @@ contract BackingManagerP1 is TradingP1, IBackingManager {
2121 using FixLib for uint192 ;
2222 using SafeERC20Upgradeable for IERC20Upgradeable ;
2323
24+ // Cache of peer components
25+ IAssetRegistry private assetRegistry;
26+ IBasketHandler private basketHandler;
27+ IDistributor private distributor;
28+ IRToken private rToken;
29+ IERC20 private rsr;
30+ IStRSR private stRSR;
31+ IRevenueTrader private rsrTrader;
32+ IRevenueTrader private rTokenTrader;
2433 uint48 public constant MAX_TRADING_DELAY = 31536000 ; // {s} 1 year
2534 uint192 public constant MAX_BACKING_BUFFER = 1e18 ; // {%}
2635
@@ -40,7 +49,17 @@ contract BackingManagerP1 is TradingP1, IBackingManager {
4049 uint192 minTradeVolume_
4150 ) external initializer {
4251 __Component_init (main_);
43- __Trading_init (maxTradeSlippage_, minTradeVolume_);
52+ __Trading_init (main_, maxTradeSlippage_, minTradeVolume_);
53+
54+ assetRegistry = main_.assetRegistry ();
55+ basketHandler = main_.basketHandler ();
56+ distributor = main_.distributor ();
57+ rsr = main_.rsr ();
58+ rsrTrader = main_.rsrTrader ();
59+ rTokenTrader = main_.rTokenTrader ();
60+ rToken = main_.rToken ();
61+ stRSR = main_.stRSR ();
62+
4463 setTradingDelay (tradingDelay_);
4564 setBackingBuffer (backingBuffer_);
4665 }
@@ -50,11 +69,11 @@ contract BackingManagerP1 is TradingP1, IBackingManager {
5069 // checks: erc20 in assetRegistry
5170 // action: set allowance on erc20 for rToken to UINT_MAX
5271 function grantRTokenAllowance (IERC20 erc20 ) external notPausedOrFrozen {
53- require (main. assetRegistry () .isRegistered (erc20), "erc20 unregistered " );
72+ require (assetRegistry.isRegistered (erc20), "erc20 unregistered " );
5473 // == Interaction ==
55- uint256 currAllowance = erc20.allowance (address (this ), address (main. rToken () ));
74+ uint256 currAllowance = erc20.allowance (address (this ), address (rToken));
5675 IERC20Upgradeable (address (erc20)).safeIncreaseAllowance (
57- address (main. rToken () ),
76+ address (rToken),
5877 type (uint256 ).max - currAllowance
5978 );
6079 }
@@ -86,24 +105,21 @@ contract BackingManagerP1 is TradingP1, IBackingManager {
86105 // only called internally, from manageTokens*, so erc20s has no duplicates unique
87106 // (but not necessarily all registered or valid!)
88107 function _manageTokens (IERC20 [] calldata erc20s ) private {
89- IBasketHandler bh = main.basketHandler ();
90-
91108 // == Refresh ==
92- main. assetRegistry () .refresh ();
109+ assetRegistry.refresh ();
93110
94111 if (tradesOpen > 0 ) return ;
95112 // Only trade when all the collateral assets in the basket are SOUND
96- require (bh .status () == CollateralStatus.SOUND, "basket not sound " );
113+ require (basketHandler .status () == CollateralStatus.SOUND, "basket not sound " );
97114
98- uint48 basketTimestamp = bh .timestamp ();
115+ uint48 basketTimestamp = basketHandler .timestamp ();
99116 if (block .timestamp < basketTimestamp + tradingDelay) return ;
100117
101- if (bh .fullyCollateralized ()) {
118+ if (basketHandler .fullyCollateralized ()) {
102119 // == Interaction (then return) ==
103120 handoutExcessAssets (erc20s);
104121 } else {
105- /*
106- * Recollateralization
122+ /* Recollateralization
107123 *
108124 * Strategy: iteratively move the system on a forgiving path towards capitalization
109125 * through a narrowing BU price band. The initial large spread reflects the
@@ -114,19 +130,16 @@ contract BackingManagerP1 is TradingP1, IBackingManager {
114130 *
115131 * If we run out of capital and are still undercapitalized, we compromise
116132 * rToken.basketsNeeded to the current basket holdings. Haircut time.
117- *
118- * TODO: Document our arguments for this procedure.
119- * See: https://app.asana.com/0/1202557536393044/1203043664234023/f
120133 */
121134
122135 (bool doTrade , TradeRequest memory req ) = RecollateralizationLibP1
123136 .prepareRecollateralizationTrade (this );
124137
125138 if (doTrade) {
126139 // Seize RSR if needed
127- if (req.sell.erc20 () == main. rsr () ) {
140+ if (req.sell.erc20 () == rsr) {
128141 uint256 bal = req.sell.erc20 ().balanceOf (address (this ));
129- if (req.sellAmount > bal) main. stRSR () .seizeRSR (req.sellAmount - bal);
142+ if (req.sellAmount > bal) stRSR.seizeRSR (req.sellAmount - bal);
130143 }
131144
132145 tryTrade (req);
@@ -157,28 +170,24 @@ contract BackingManagerP1 is TradingP1, IBackingManager {
157170 * RSR and RToken traders according to the distribution totals.
158171 */
159172
160- IBasketHandler basketHandler = main.basketHandler ();
161- address rsrTrader = address (main.rsrTrader ());
162- address rTokenTrader = address (main.rTokenTrader ());
163-
164173 // Forward any RSR held to StRSR pool; RSR should never be sold for RToken yield
165- if (main. rsr () .balanceOf (address (this )) > 0 ) {
174+ if (rsr.balanceOf (address (this )) > 0 ) {
166175 // For CEI, this is an interaction "within our system" even though RSR is already live
167- IERC20Upgradeable (address (main. rsr () )).safeTransfer (
168- address (main. rsrTrader () ),
169- main. rsr () .balanceOf (address (this ))
176+ IERC20Upgradeable (address (rsr)).safeTransfer (
177+ address (rsrTrader),
178+ rsr.balanceOf (address (this ))
170179 );
171180 }
172181
173182 // Mint revenue RToken and update `basketsNeeded`
174- // property across this block (DESIRED TODO) :
183+ // across this block:
175184 // where rate(R) == R.basketsNeeded / R.totalSupply,
176- // rate(rToken') >== rate(rToken)
177- // (>== is "no less than, and practically equal to")
178- // ... and rToken'.basketsNeeded <== basketHandler.basketsHeldBy(this)
185+ // rate(rToken') >= rate(rToken)
186+ // (>== is "no less than, and nearly equal to")
187+ // and rToken'.basketsNeeded <= basketHandler.basketsHeldBy(this)
188+ // and rToken'.totalSupply is maximal satisfying this.
179189 uint192 needed; // {BU}
180190 {
181- IRToken rToken = main.rToken ();
182191 needed = rToken.basketsNeeded (); // {BU}
183192 uint192 held = basketHandler.basketsHeldBy (address (this )); // {BU}
184193 if (held.gt (needed)) {
@@ -206,11 +215,11 @@ contract BackingManagerP1 is TradingP1, IBackingManager {
206215
207216 // Handout excess assets above what is needed, including any recently minted RToken
208217 uint256 length = erc20s.length ;
209- RevenueTotals memory totals = main. distributor () .totals ();
218+ RevenueTotals memory totals = distributor.totals ();
210219 uint256 [] memory toRSR = new uint256 [](length);
211220 uint256 [] memory toRToken = new uint256 [](length);
212221 for (uint256 i = 0 ; i < length; ++ i) {
213- IAsset asset = main. assetRegistry () .toAsset (erc20s[i]);
222+ IAsset asset = assetRegistry.toAsset (erc20s[i]);
214223
215224 uint192 req = needed.mul (basketHandler.quantity (erc20s[i]), CEIL);
216225 if (asset.bal (address (this )).gt (req)) {
@@ -228,17 +237,17 @@ contract BackingManagerP1 is TradingP1, IBackingManager {
228237 // == Interactions ==
229238 for (uint256 i = 0 ; i < length; ++ i) {
230239 IERC20Upgradeable erc20 = IERC20Upgradeable (address (erc20s[i]));
231- if (toRToken[i] > 0 ) erc20.safeTransfer (rTokenTrader, toRToken[i]);
232- if (toRSR[i] > 0 ) erc20.safeTransfer (rsrTrader, toRSR[i]);
240+ if (toRToken[i] > 0 ) erc20.safeTransfer (address ( rTokenTrader) , toRToken[i]);
241+ if (toRSR[i] > 0 ) erc20.safeTransfer (address ( rsrTrader) , toRSR[i]);
233242 }
234243
235244 // It's okay if there is leftover dust for RToken or a surplus asset (not RSR)
236245 }
237246
238247 /// Compromise on how many baskets are needed in order to recollateralize-by-accounting
239248 function compromiseBasketsNeeded () private {
240- assert (tradesOpen == 0 && ! main. basketHandler () .fullyCollateralized ());
241- main. rToken () .setBasketsNeeded (main. basketHandler () .basketsHeldBy (address (this )));
249+ assert (tradesOpen == 0 && ! basketHandler.fullyCollateralized ());
250+ rToken.setBasketsNeeded (basketHandler.basketsHeldBy (address (this )));
242251 }
243252
244253 // === Governance Setters ===
@@ -262,5 +271,5 @@ contract BackingManagerP1 is TradingP1, IBackingManager {
262271 * variables without shifting down storage in the inheritance chain.
263272 * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
264273 */
265- uint256 [48 ] private __gap;
274+ uint256 [41 ] private __gap;
266275}
0 commit comments