@@ -72,10 +72,12 @@ contract mipx37 is HybridProposal, ChainlinkOracleConfigs, Networks {
7272 // Validate Optimism
7373 vm.selectFork (OPTIMISM_FORK_ID);
7474 _validateFeedsPointToWrappers (addresses, OPTIMISM_CHAIN_ID);
75+ _validateCoreWrappersConstructor (addresses, OPTIMISM_CHAIN_ID);
7576
7677 // Validate Base
7778 vm.selectFork (BASE_FORK_ID);
7879 _validateFeedsPointToWrappers (addresses, BASE_CHAIN_ID);
80+ _validateCoreWrappersConstructor (addresses, BASE_CHAIN_ID);
7981 _validateMorphoWrappersImplementations (addresses, BASE_CHAIN_ID);
8082 _validateMorphoWrappersState (addresses, BASE_CHAIN_ID);
8183 }
@@ -251,7 +253,6 @@ contract mipx37 is HybridProposal, ChainlinkOracleConfigs, Networks {
251253 vm.stopBroadcast ();
252254 }
253255
254- // FIX: test the contructor setting
255256 function _validateFeedsPointToWrappers (
256257 Addresses addresses ,
257258 uint256 chainId
@@ -277,6 +278,95 @@ contract mipx37 is HybridProposal, ChainlinkOracleConfigs, Networks {
277278 }
278279 }
279280
281+ function _validateCoreWrappersConstructor (
282+ Addresses addresses ,
283+ uint256 chainId
284+ ) internal view {
285+ OracleConfig[] memory oracleConfigs = getOracleConfigurations (chainId);
286+ address expectedOwner = addresses.getAddress ("TEMPORAL_GOVERNOR " );
287+ address expectedChainlinkOracle = addresses.getAddress (
288+ "CHAINLINK_ORACLE "
289+ );
290+
291+ for (uint256 i = 0 ; i < oracleConfigs.length ; i++ ) {
292+ OracleConfig memory config = oracleConfigs[i];
293+ string memory wrapperName = string (
294+ abi.encodePacked (config.oracleName, "_OEV_WRAPPER " )
295+ );
296+
297+ ChainlinkOEVWrapper wrapper = ChainlinkOEVWrapper (
298+ payable (addresses.getAddress (wrapperName))
299+ );
300+
301+ // Validate priceFeed
302+ assertEq (
303+ address (wrapper.priceFeed ()),
304+ addresses.getAddress (config.oracleName),
305+ string .concat (
306+ "Core wrapper priceFeed mismatch for " ,
307+ wrapperName
308+ )
309+ );
310+
311+ // Validate feeMultiplier
312+ assertEq (
313+ wrapper.feeMultiplier (),
314+ FEE_MULTIPLIER,
315+ string .concat (
316+ "Core wrapper feeMultiplier mismatch for " ,
317+ wrapperName
318+ )
319+ );
320+
321+ // Validate cachedRoundId (should be > 0 as it's set to priceFeed.latestRound())
322+ assertGt (
323+ wrapper.cachedRoundId (),
324+ 0 ,
325+ string .concat (
326+ "Core wrapper cachedRoundId should be > 0 for " ,
327+ wrapperName
328+ )
329+ );
330+
331+ // Validate maxRoundDelay
332+ assertEq (
333+ wrapper.maxRoundDelay (),
334+ MAX_ROUND_DELAY,
335+ string .concat (
336+ "Core wrapper maxRoundDelay mismatch for " ,
337+ wrapperName
338+ )
339+ );
340+
341+ // Validate maxDecrements
342+ assertEq (
343+ wrapper.maxDecrements (),
344+ MAX_DECREMENTS,
345+ string .concat (
346+ "Core wrapper maxDecrements mismatch for " ,
347+ wrapperName
348+ )
349+ );
350+
351+ // Validate chainlinkOracle
352+ assertEq (
353+ address (wrapper.chainlinkOracle ()),
354+ expectedChainlinkOracle,
355+ string .concat (
356+ "Core wrapper chainlinkOracle mismatch for " ,
357+ wrapperName
358+ )
359+ );
360+
361+ // Validate owner
362+ assertEq (
363+ wrapper.owner (),
364+ expectedOwner,
365+ string .concat ("Core wrapper owner mismatch for " , wrapperName)
366+ );
367+ }
368+ }
369+
280370 function _validateMorphoWrappersImplementations (
281371 Addresses addresses ,
282372 uint256 chainId
@@ -309,6 +399,11 @@ contract mipx37 is HybridProposal, ChainlinkOracleConfigs, Networks {
309399 if (morphoConfigs.length == 0 ) return ;
310400
311401 address morphoBlue = addresses.getAddress ("MORPHO_BLUE " );
402+ address expectedOwner = addresses.getAddress ("TEMPORAL_GOVERNOR " );
403+ address expectedChainlinkOracle = addresses.getAddress (
404+ "CHAINLINK_ORACLE "
405+ );
406+
312407 for (uint256 i = 0 ; i < morphoConfigs.length ; i++ ) {
313408 string memory wrapperName = string (
314409 abi.encodePacked (morphoConfigs[i].proxyName, "_ORACLE_PROXY " )
@@ -317,7 +412,7 @@ contract mipx37 is HybridProposal, ChainlinkOracleConfigs, Networks {
317412 addresses.getAddress (wrapperName)
318413 );
319414
320- // priceFeed and morphoBlue wiring preserved
415+ // Validate priceFeed
321416 assertEq (
322417 address (wrapper.priceFeed ()),
323418 addresses.getAddress (morphoConfigs[i].priceFeedName),
@@ -326,6 +421,8 @@ contract mipx37 is HybridProposal, ChainlinkOracleConfigs, Networks {
326421 wrapperName
327422 )
328423 );
424+
425+ // Validate morphoBlue
329426 assertEq (
330427 address (wrapper.morphoBlue ()),
331428 morphoBlue,
@@ -335,16 +432,74 @@ contract mipx37 is HybridProposal, ChainlinkOracleConfigs, Networks {
335432 )
336433 );
337434
435+ // Validate chainlinkOracle
436+ assertEq (
437+ address (wrapper.chainlinkOracle ()),
438+ expectedChainlinkOracle,
439+ string .concat (
440+ "Morpho wrapper chainlinkOracle mismatch for " ,
441+ wrapperName
442+ )
443+ );
444+
445+ // Validate feeRecipient
446+ assertEq (
447+ wrapper.feeRecipient (),
448+ addresses.getAddress (morphoConfigs[i].coreMarketAsFeeRecipient),
449+ string .concat (
450+ "Morpho wrapper feeRecipient mismatch for " ,
451+ wrapperName
452+ )
453+ );
454+
455+ // Validate feeMultiplier
338456 assertEq (
339457 wrapper.feeMultiplier (),
340458 FEE_MULTIPLIER,
341459 string .concat (
342- "Morpho wrapper not using expected fee multiplier for " ,
460+ "Morpho wrapper feeMultiplier mismatch for " ,
461+ wrapperName
462+ )
463+ );
464+
465+ // Validate cachedRoundId (should be > 0 as it's set to priceFeed.latestRound())
466+ assertGt (
467+ wrapper.cachedRoundId (),
468+ 0 ,
469+ string .concat (
470+ "Morpho wrapper cachedRoundId should be > 0 for " ,
471+ wrapperName
472+ )
473+ );
474+
475+ // Validate maxRoundDelay
476+ assertEq (
477+ wrapper.maxRoundDelay (),
478+ MAX_ROUND_DELAY,
479+ string .concat (
480+ "Morpho wrapper maxRoundDelay mismatch for " ,
481+ wrapperName
482+ )
483+ );
484+
485+ // Validate maxDecrements
486+ assertEq (
487+ wrapper.maxDecrements (),
488+ MAX_DECREMENTS,
489+ string .concat (
490+ "Morpho wrapper maxDecrements mismatch for " ,
343491 wrapperName
344492 )
345493 );
346494
347- // interface/decimals behavior intact
495+ // Validate owner
496+ assertEq (
497+ wrapper.owner (),
498+ expectedOwner,
499+ string .concat ("Morpho wrapper owner mismatch for " , wrapperName)
500+ );
501+
502+ // Validate decimals behavior
348503 uint8 d = wrapper.decimals ();
349504 assertEq (
350505 d,
@@ -357,7 +512,7 @@ contract mipx37 is HybridProposal, ChainlinkOracleConfigs, Networks {
357512 )
358513 );
359514
360- // this should be the same as the priceFeed.latestRound()
515+ // Validate latestRoundData behavior
361516 (uint80 roundId , int256 answer , , uint256 updatedAt , ) = wrapper
362517 .latestRoundData ();
363518 assertGt (
0 commit comments