@@ -76,6 +76,9 @@ contract ControllerV1 is DelegateInterface, Adminable, ControllerInterface, Cont
76
76
lpoolPairs[token0][token1] = LPoolPair (address (pool0), address (pool1));
77
77
lpoolPairs[token1][token0] = LPoolPair (address (pool0), address (pool1));
78
78
uint16 marketId = (OpenLevInterface (openLev)).addMarket (LPoolInterface (address (pool0)), LPoolInterface (address (pool1)), pairVar.marginLimit, pairVar.dexData);
79
+ if (opBorrowing != address (0 )) {
80
+ IOPBorrowing (opBorrowing).addMarket (marketId, address (pool0), address (pool1), pairVar.dexData);
81
+ }
79
82
emit LPoolPairCreated (pairVar.token0, address (pool0), pairVar.token1, address (pool1), marketId, pairVar.marginLimit, pairVar.dexData);
80
83
}
81
84
@@ -112,7 +115,7 @@ contract ControllerV1 is DelegateInterface, Adminable, ControllerInterface, Cont
112
115
borrower;
113
116
repayAmount;
114
117
if (isEnd) {
115
- require (openLev == payer, "Operator not openLev " );
118
+ require (openLev == payer || opBorrowing == payer , "Operator not openLev " );
116
119
}
117
120
}
118
121
@@ -122,16 +125,23 @@ contract ControllerV1 is DelegateInterface, Adminable, ControllerInterface, Cont
122
125
liquidateAmount;
123
126
dexData;
124
127
require (! marketSuspend[marketId], 'Market suspended ' );
125
-
126
128
}
127
129
128
130
function marginTradeAllowed (uint marketId ) external view override onlyNotSuspended returns (bool ){
129
131
require (! marketSuspend[marketId], 'Market suspended ' );
130
132
return true ;
131
133
}
132
134
133
- function closeTradeAllowed (uint marketId ) external view override returns (bool ){
134
- require (! suspendAll, 'Suspended ' );
135
+ function marginTradeAllowedV2 (uint marketId , address trader , bool longToken ) onlyNotSuspended external view override returns (bool ){
136
+ require (! marketSuspend[marketId], 'Market suspended ' );
137
+ if (opBorrowing != address (0 )) {
138
+ require (IOPBorrowing (opBorrowing).activeCollaterals (trader, uint16 (marketId), longToken) == 0 , 'MBB ' );
139
+ }
140
+ return true ;
141
+ }
142
+
143
+ function closeTradeAllowed (uint marketId ) external view override onlyNotSuspended returns (bool ){
144
+ marketId;
135
145
return true ;
136
146
}
137
147
@@ -146,6 +156,25 @@ contract ControllerV1 is DelegateInterface, Adminable, ControllerInterface, Cont
146
156
}
147
157
148
158
159
+ function collBorrowAllowed (uint marketId , address borrower , bool collateralIndex ) external view override onlyNotSuspended onlyOpBorrowingNotSuspended (marketId) returns (bool ){
160
+ Types.Trade memory trade = IOpenLev (openLev).activeTrades (borrower, uint16 (marketId), collateralIndex);
161
+ require (trade.held == 0 , 'BMB ' );
162
+ return true ;
163
+ }
164
+
165
+ function collRepayAllowed (uint marketId ) external view override onlyNotSuspended onlyOpBorrowingNotSuspended (marketId) returns (bool ){
166
+ return true ;
167
+ }
168
+
169
+ function collRedeemAllowed (uint marketId ) external view override onlyNotSuspended onlyOpBorrowingNotSuspended (marketId) returns (bool ){
170
+ return true ;
171
+ }
172
+
173
+ function collLiquidateAllowed (uint marketId ) external view override onlyNotSuspended onlyOpBorrowingNotSuspended (marketId) returns (bool ){
174
+ return true ;
175
+ }
176
+
177
+
149
178
function setLPoolImplementation (address _lpoolImplementation ) external override onlyAdmin {
150
179
require (address (0 ) != _lpoolImplementation, '0x ' );
151
180
lpoolImplementation = _lpoolImplementation;
@@ -185,24 +214,47 @@ contract ControllerV1 is DelegateInterface, Adminable, ControllerInterface, Cont
185
214
marketSuspend[marketId] = suspend;
186
215
}
187
216
217
+ function setBorrowingSuspend (uint marketId , bool suspend ) external override onlyAdminOrDeveloper {
218
+ borrowingSuspend[marketId] = suspend;
219
+ }
220
+
188
221
function setOleWethDexData (bytes memory _oleWethDexData ) external override onlyAdminOrDeveloper {
189
222
oleWethDexData = _oleWethDexData;
190
223
}
191
224
225
+ function setOpBorrowing (address _opBorrowing ) external override onlyAdmin {
226
+ opBorrowing = _opBorrowing;
227
+ }
228
+
192
229
modifier onlyLPoolAllowed () {
193
230
require (! lpoolUnAlloweds[msg .sender ], "LPool paused " );
194
231
_;
195
232
}
196
233
197
234
modifier onlyNotSuspended () {
198
- require (! suspend, 'Suspended ' );
199
235
require (! suspendAll, 'Suspended all ' );
200
236
_;
201
237
}
202
238
239
+ modifier onlyOpBorrowingNotSuspended (uint marketId ) {
240
+ require (! borrowingSuspend[marketId], 'Suspended borrowing ' );
241
+ _;
242
+ }
203
243
modifier onlyOpenLevOperator (address operator ) {
204
- require (openLev == operator || openLev == address (0 ), "Operator not openLev " );
244
+ require (( openLev == operator || openLev == address (0 )) || (opBorrowing == operator ), "Operator not openLev " );
205
245
_;
206
246
}
247
+ }
248
+
249
+ interface IOPBorrowing {
250
+
251
+
252
+ function addMarket (uint16 marketId , address pool0 , address pool1 , bytes memory dexData ) external ;
253
+
254
+ function activeCollaterals (address borrower , uint16 marketId , bool collateralIndex ) external view returns (uint );
255
+ }
256
+
257
+ interface IOpenLev {
207
258
259
+ function activeTrades (address trader , uint16 marketId , bool longToken ) external view returns (Types.Trade memory );
208
260
}
0 commit comments