Skip to content

Commit c349f5d

Browse files
committed
more validations for constructor
1 parent 8e7eda1 commit c349f5d

File tree

1 file changed

+160
-5
lines changed

1 file changed

+160
-5
lines changed

proposals/mips/mip-x37/mip-x37.sol

Lines changed: 160 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)