@@ -24,6 +24,7 @@ import { ISetToken } from "@setprotocol/set-protocol-v2/contracts/interfaces/ISe
2424
2525import { AddressArrayUtils } from "../lib/AddressArrayUtils.sol " ;
2626import { DelegatedManager } from "../manager/DelegatedManager.sol " ;
27+ import { IController } from "../interfaces/IController.sol " ;
2728import { IDelegatedManager } from "../interfaces/IDelegatedManager.sol " ;
2829import { IManagerCore } from "../interfaces/IManagerCore.sol " ;
2930import { ISetTokenCreator } from "../interfaces/ISetTokenCreator.sol " ;
@@ -46,6 +47,7 @@ contract DelegatedManagerFactory {
4647 struct InitializeParams {
4748 address deployer;
4849 address owner;
50+ address methodologist;
4951 IDelegatedManager manager;
5052 bool isPending;
5153 }
@@ -79,8 +81,11 @@ contract DelegatedManagerFactory {
7981 // ManagerCore address
8082 IManagerCore public immutable managerCore;
8183
84+ // Controller address
85+ IController public immutable controller;
86+
8287 // SetTokenFactory address
83- ISetTokenCreator public setTokenFactory;
88+ ISetTokenCreator public immutable setTokenFactory;
8489
8590 // Mapping which stores manager creation metadata between creation and initialization steps
8691 mapping (ISetToken=> InitializeParams) public initializeState;
@@ -90,15 +95,18 @@ contract DelegatedManagerFactory {
9095 /**
9196 * @dev Sets managerCore and setTokenFactory address.
9297 * @param _managerCore Address of ManagerCore protocol contract
98+ * @param _controller Address of Controller protocol contract
9399 * @param _setTokenFactory Address of SetTokenFactory protocol contract
94100 */
95101 constructor (
96102 IManagerCore _managerCore ,
103+ IController _controller ,
97104 ISetTokenCreator _setTokenFactory
98- )
99- public
105+ )
106+ public
100107 {
101108 managerCore = _managerCore;
109+ controller = _controller;
102110 setTokenFactory = _setTokenFactory;
103111 }
104112
@@ -149,13 +157,12 @@ contract DelegatedManagerFactory {
149157
150158 DelegatedManager manager = _deployManager (
151159 setToken,
152- _methodologist,
153160 _extensions,
154161 _operators,
155162 _assets
156163 );
157164
158- _setInitializationState (setToken, address (manager), _owner);
165+ _setInitializationState (setToken, address (manager), _owner, _methodologist );
159166
160167 return (setToken, address (manager));
161168 }
@@ -189,19 +196,19 @@ contract DelegatedManagerFactory {
189196 external
190197 returns (address )
191198 {
199+ require (controller.isSet (address (_setToken)), "Must be controller-enabled SetToken " );
192200 require (msg .sender == _setToken.manager (), "Must be manager " );
193201
194202 _validateManagerParameters (_setToken.getComponents (), _extensions, _assets);
195203
196204 DelegatedManager manager = _deployManager (
197205 _setToken,
198- _methodologist,
199206 _extensions,
200207 _operators,
201208 _assets
202209 );
203210
204- _setInitializationState (_setToken, address (manager), _owner);
211+ _setInitializationState (_setToken, address (manager), _owner, _methodologist );
205212
206213 return address (manager);
207214 }
@@ -234,23 +241,27 @@ contract DelegatedManagerFactory {
234241 require (msg .sender == initializeState[_setToken].deployer, "Only deployer can initialize manager " );
235242 _initializeTargets.validatePairsWithArray (_initializeBytecode);
236243
237- IDelegatedManager manager = initializeState[_setToken].manager;
238- manager.updateOwnerFeeSplit (_ownerFeeSplit);
239- manager.updateOwnerFeeRecipient (_ownerFeeRecipient);
240-
241244 for (uint256 i = 0 ; i < _initializeTargets.length ; i++ ) {
245+ address target = _initializeTargets[i];
246+ require (! controller.isSet (target), "Target must not be SetToken " );
247+
242248 // Because we validate uniqueness of _initializeTargets only one transaction can be sent to each module or extension during this
243249 // transaction. Due to this no modules/extension can be used for any SetToken transactions other than initializing these contracts
244- _initializeTargets[i] .functionCallWithValue (_initializeBytecode[i], 0 );
250+ target .functionCallWithValue (_initializeBytecode[i], 0 );
245251 }
246252
253+ IDelegatedManager manager = initializeState[_setToken].manager;
254+ manager.updateOwnerFeeSplit (_ownerFeeSplit);
255+ manager.updateOwnerFeeRecipient (_ownerFeeRecipient);
256+
247257 // If the SetToken was factory-deployed & factory is its current `manager`, transfer
248258 // managership to the new DelegatedManager
249259 if (_setToken.manager () == address (this )) {
250260 _setToken.setManager (address (manager));
251261 }
252262
253263 manager.transferOwnership (initializeState[_setToken].owner);
264+ manager.setMethodologist (initializeState[_setToken].methodologist);
254265
255266 delete initializeState[_setToken];
256267
@@ -297,7 +308,6 @@ contract DelegatedManagerFactory {
297308 * Deploys a DelegatedManager
298309 *
299310 * @param _setToken Instance of SetToken to migrate to the DelegatedManager system
300- * @param _methodologist Address to set as the DelegateManager's methodologist role
301311 * @param _extensions List of extensions authorized for the DelegateManager
302312 * @param _operators List of operators authorized for the DelegateManager
303313 * @param _assets List of assets DelegateManager can trade. When empty, asset allow list is not enforced
@@ -306,7 +316,6 @@ contract DelegatedManagerFactory {
306316 */
307317 function _deployManager (
308318 ISetToken _setToken ,
309- address _methodologist ,
310319 address [] memory _extensions ,
311320 address [] memory _operators ,
312321 address [] memory _assets
@@ -321,7 +330,7 @@ contract DelegatedManagerFactory {
321330 DelegatedManager newManager = new DelegatedManager (
322331 _setToken,
323332 address (this ),
324- _methodologist ,
333+ address ( this ) ,
325334 _extensions,
326335 _operators,
327336 _assets,
@@ -347,15 +356,18 @@ contract DelegatedManagerFactory {
347356 * @param _setToken Instance of SetToken
348357 * @param _manager Address of DelegatedManager created for SetToken
349358 * @param _owner Address that will be given the `owner` DelegatedManager's role on initialization
359+ * @param _methodologist Address that will be given the `methodologist` DelegatedManager's role on initialization
350360 */
351361 function _setInitializationState (
352362 ISetToken _setToken ,
353363 address _manager ,
354- address _owner
364+ address _owner ,
365+ address _methodologist
355366 ) internal {
356367 initializeState[_setToken] = InitializeParams ({
357368 deployer: msg .sender ,
358369 owner: _owner,
370+ methodologist: _methodologist,
359371 manager: IDelegatedManager (_manager),
360372 isPending: true
361373 });
0 commit comments