@@ -10,10 +10,23 @@ import { IBuyBack } from "moolah/interfaces/IBuyBack.sol";
1010import { IListaAutoBuyBack } from "moolah/interfaces/IListaAutoBuyBack.sol " ;
1111import { IPublicLiquidator } from "liquidator/IPublicLiquidator.sol " ;
1212import { ISmartProvider } from "../provider/interfaces/IProvider.sol " ;
13+ import { IBroker } from "../broker/interfaces/IBroker.sol " ;
14+ import { IBrokerLiquidator } from "../liquidator/IBrokerLiquidator.sol " ;
15+ import { IRateCalculator } from "../broker/interfaces/IRateCalculator.sol " ;
1316
1417contract MarketFactory is UUPSUpgradeable , AccessControlEnumerableUpgradeable {
1518 using MarketParamsLib for MarketParams;
1619
20+ struct FixedTermMarketParams {
21+ address broker;
22+ address loanToken;
23+ address collateralToken;
24+ address irm;
25+ uint256 lltv;
26+ uint256 ratePerSecond;
27+ uint256 maxRatePerSecond;
28+ }
29+
1730 IMoolah public immutable moolah;
1831 ILiquidator public immutable liquidator;
1932 IListaRevenueDistributor public immutable revenueDistributor;
@@ -24,9 +37,15 @@ contract MarketFactory is UUPSUpgradeable, AccessControlEnumerableUpgradeable {
2437 address public immutable sliBNB;
2538 address public immutable BNBProvider;
2639 address public immutable slisBNBProvider;
40+ IRateCalculator public immutable rateCalculator;
41+ IBrokerLiquidator public immutable brokerLiquidator;
2742
2843 bytes32 public constant OPERATOR = keccak256 ("OPERATOR " );
44+ bytes32 public constant PAUSER = keccak256 ("PAUSER " );
45+ bytes32 public constant BOT = keccak256 ("BOT " );
2946
47+ event BrokerMarketDeployed (FixedTermMarketParams fixedTermMarketParams , Id marketId , address broker );
48+ event CommonMarketDeployed (MarketParams marketParams , Id marketId );
3049 /**
3150 * @dev constructor to set immutable variables
3251 * @param _moolah The address of the Moolah contract
@@ -39,6 +58,8 @@ contract MarketFactory is UUPSUpgradeable, AccessControlEnumerableUpgradeable {
3958 * @param _sliBNB The address of the sliBNB token
4059 * @param _BNBProvider The address of the BNB provider
4160 * @param _slisBNBProvider The address of the slisBNB provider
61+ * @param _rateCalculator The address of the rate calculator contract
62+ * @param _brokerLiquidator The address of the broker liquidator contract
4263 */
4364 constructor (
4465 address _moolah ,
@@ -50,7 +71,9 @@ contract MarketFactory is UUPSUpgradeable, AccessControlEnumerableUpgradeable {
5071 address _WBNB ,
5172 address _sliBNB ,
5273 address _BNBProvider ,
53- address _slisBNBProvider
74+ address _slisBNBProvider ,
75+ address _rateCalculator ,
76+ address _brokerLiquidator
5477 ) {
5578 // sanity check for constructor arguments
5679 require (_moolah != address (0 ), "ZeroAddress " );
@@ -63,6 +86,7 @@ contract MarketFactory is UUPSUpgradeable, AccessControlEnumerableUpgradeable {
6386 require (_sliBNB != address (0 ), "ZeroAddress " );
6487 require (_BNBProvider != address (0 ), "ZeroAddress " );
6588 require (_slisBNBProvider != address (0 ), "ZeroAddress " );
89+ require (_rateCalculator != address (0 ), "ZeroAddress " );
6690 // set immutable variables
6791 moolah = IMoolah (_moolah);
6892 liquidator = ILiquidator (_liquidator);
@@ -74,6 +98,8 @@ contract MarketFactory is UUPSUpgradeable, AccessControlEnumerableUpgradeable {
7498 sliBNB = _sliBNB;
7599 BNBProvider = _BNBProvider;
76100 slisBNBProvider = _slisBNBProvider;
101+ rateCalculator = IRateCalculator (_rateCalculator);
102+ brokerLiquidator = IBrokerLiquidator (_brokerLiquidator);
77103
78104 _disableInitializers ();
79105 }
@@ -85,6 +111,7 @@ contract MarketFactory is UUPSUpgradeable, AccessControlEnumerableUpgradeable {
85111 */
86112 function initialize (address admin , address operator ) public initializer {
87113 require (admin != address (0 ) && operator != address (0 ), "ZeroAddress " );
114+ require (operator != address (0 ), "ZeroAddress " );
88115 __AccessControl_init ();
89116
90117 _grantRole (DEFAULT_ADMIN_ROLE, admin);
@@ -143,6 +170,30 @@ contract MarketFactory is UUPSUpgradeable, AccessControlEnumerableUpgradeable {
143170 _createMarket (param, liquidatorWhitelist, supplyWhitelist, liquidatorMarketWhitelist, liquidatorSmartProvider);
144171 }
145172
173+ /**
174+ * @dev Creates new fixed term markets with the given parameters and configures the related contracts
175+ * @param params An array of FixedTermMarketParams for the markets to be created
176+ */
177+ function batchCreateFixedTermMarkets (
178+ FixedTermMarketParams[] calldata params
179+ ) external onlyRole (OPERATOR) returns (Id[] memory ) {
180+ require (params.length > 0 , "empty market params " );
181+
182+ Id[] memory ids = new Id [](params.length );
183+ for (uint256 i = 0 ; i < params.length ; i++ ) {
184+ ids[i] = _createFixedTermMarket (params[i]);
185+ }
186+ return ids;
187+ }
188+
189+ /**
190+ * @dev Creates a new fixed term market with the given parameters and configures the related contracts
191+ * @param param The FixedTermMarketParams for the market to be created
192+ */
193+ function createFixedTermMarket (FixedTermMarketParams calldata param ) external onlyRole (OPERATOR) returns (Id) {
194+ return _createFixedTermMarket (param);
195+ }
196+
146197 function _createMarket (
147198 MarketParams memory param ,
148199 address [] memory liquidatorWhitelist ,
@@ -209,6 +260,50 @@ contract MarketFactory is UUPSUpgradeable, AccessControlEnumerableUpgradeable {
209260 if (liquidatorSmartProvider) {
210261 _configSmartProvider (id, param.oracle, param.collateralToken);
211262 }
263+
264+ emit CommonMarketDeployed (param, id);
265+ }
266+
267+ function _createFixedTermMarket (FixedTermMarketParams memory param ) private returns (Id id ) {
268+ IBroker broker = IBroker (param.broker);
269+ require (param.broker != address (0 ), "Zero broker address " );
270+
271+ // moolah create market
272+ MarketParams memory marketParam = MarketParams ({
273+ loanToken: param.loanToken,
274+ collateralToken: param.collateralToken,
275+ oracle: param.broker,
276+ irm: param.irm,
277+ lltv: param.lltv
278+ });
279+ moolah.createMarket (marketParam);
280+ Id id = marketParam.id ();
281+
282+ // moolah set liquidation whitelist
283+ Id[] memory ids = new Id [](1 );
284+ ids[0 ] = id;
285+ address [][] memory whitelist = new address [][](1 );
286+ whitelist[0 ] = new address [](1 );
287+ whitelist[0 ][0 ] = param.broker;
288+ moolah.batchToggleLiquidationWhitelist (ids, whitelist, true );
289+
290+ // broker set market id
291+ broker.setMarketId (id);
292+
293+ // broker set liquidator whitelist
294+ broker.toggleLiquidationWhitelist (address (brokerLiquidator), true );
295+
296+ // moolah set broker
297+ moolah.setMarketBroker (id, param.broker, true );
298+
299+ // rate calculator register broker
300+ rateCalculator.registerBroker (param.broker, param.ratePerSecond, param.maxRatePerSecond);
301+
302+ // broker liquidator set market whitelist
303+ brokerLiquidator.setMarketToBroker (Id.unwrap (id), param.broker, true );
304+
305+ emit BrokerMarketDeployed (param, id, param.broker);
306+ return id;
212307 }
213308
214309 function _configSmartProvider (Id id , address provider , address collateral ) private {
0 commit comments