@@ -42,7 +42,7 @@ contract x34 is HybridProposal, Configs, Networks {
4242 return BASE_FORK_ID;
4343 }
4444
45- // Deploy new instances of ChainlinkOEVWrapper (core markets) and ChainlinkOEVMorphoWrapper (Morpho markets )
45+ // Deploy new instances of ChainlinkOEVWrapper (core markets) and ensure ChainlinkOEVMorphoWrapper implementation exists (Morpho)
4646 function deploy (Addresses addresses , address ) public override {
4747 _deployCoreWrappers (addresses);
4848 _deployMorphoWrappers (addresses);
@@ -108,16 +108,66 @@ contract x34 is HybridProposal, Configs, Networks {
108108 _pushAction (
109109 proxyAdmin,
110110 abi.encodeWithSignature (
111- "upgradeAndCall (address,address,bytes ) " ,
111+ "upgrade (address,address) " ,
112112 addresses.getAddress (wrapperName),
113- addresses.getAddress (MORPHO_IMPLEMENTATION_NAME),
114- bytes ("" )
113+ addresses.getAddress (MORPHO_IMPLEMENTATION_NAME)
115114 ),
116115 string .concat (
117- "Upgrade Morpho OEV wrapper via upgradeAndCall for " ,
116+ "Upgrade Morpho OEV wrapper via upgrade for " ,
118117 morphoConfigs[i].oracleName
119118 )
120119 );
120+
121+ // Set storage for the new wrapper
122+ _pushAction (
123+ addresses.getAddress (wrapperName),
124+ abi.encodeWithSignature (
125+ "setFeeMultiplier(uint16) " ,
126+ FEE_MULTIPLIER
127+ ),
128+ string .concat (
129+ "Set fee multiplier for " ,
130+ morphoConfigs[i].oracleName
131+ )
132+ );
133+
134+ _pushAction (
135+ addresses.getAddress (wrapperName),
136+ abi.encodeWithSignature (
137+ "setMaxRoundDelay(uint256) " ,
138+ MAX_ROUND_DELAY
139+ ),
140+ string .concat (
141+ "Set max round delay for " ,
142+ morphoConfigs[i].oracleName
143+ )
144+ );
145+
146+ _pushAction (
147+ addresses.getAddress (wrapperName),
148+ abi.encodeWithSignature (
149+ "setMaxDecrements(uint256) " ,
150+ MAX_DECREMENTS
151+ ),
152+ string .concat (
153+ "Set max decrements for " ,
154+ morphoConfigs[i].oracleName
155+ )
156+ );
157+
158+ if (addresses.isAddressSet ("OEV_WRAPPER_FEE_RECIPIENT " )) {
159+ _pushAction (
160+ addresses.getAddress (wrapperName),
161+ abi.encodeWithSignature (
162+ "setFeeRecipient(address) " ,
163+ addresses.getAddress ("OEV_WRAPPER_FEE_RECIPIENT " )
164+ ),
165+ string .concat (
166+ "Set fee recipient for " ,
167+ morphoConfigs[i].oracleName
168+ )
169+ );
170+ }
121171 }
122172 }
123173
@@ -227,80 +277,18 @@ contract x34 is HybridProposal, Configs, Networks {
227277 vm.stopBroadcast ();
228278 }
229279
230- // FIX: only deploy one implementation and use for all proxies
231280 function _deployMorphoWrappers (Addresses addresses ) internal {
232- // If there are configured Morpho markets on this chain, deploy wrappers per market.
233- // This is intentionally conservative: do nothing if core Morpho addresses are not set.
281+ // Only ensure implementation exists; do not deploy new proxies. We'll upgrade existing proxies instead.
234282 if (! addresses.isAddressSet ("MORPHO_BLUE " )) {
235283 return ;
236284 }
237285
238- address morphoBlue = addresses.getAddress ("MORPHO_BLUE " );
239-
240- MorphoMarketConfig[]
241- memory morphoConfigs = getMorphoMarketConfigurations (block .chainid );
242- if (morphoConfigs.length == 0 ) {
243- return ;
244- }
245-
246- // Deploy or get the implementation contract
247- ChainlinkOEVMorphoWrapper impl;
248286 if (! addresses.isAddressSet (MORPHO_IMPLEMENTATION_NAME)) {
249- impl = new ChainlinkOEVMorphoWrapper ();
287+ vm.startBroadcast ();
288+ ChainlinkOEVMorphoWrapper impl = new ChainlinkOEVMorphoWrapper ();
250289 addresses.addAddress (MORPHO_IMPLEMENTATION_NAME, address (impl));
251- } else {
252- impl = ChainlinkOEVMorphoWrapper (
253- addresses.getAddress (MORPHO_IMPLEMENTATION_NAME)
254- );
255- }
256-
257- vm.startBroadcast ();
258-
259- for (uint256 i = 0 ; i < morphoConfigs.length ; i++ ) {
260- string memory wrapperName = string (
261- abi.encodePacked (morphoConfigs[i].oracleName, "_ORACLE_PROXY " )
262- );
263- address proxyAdmin = addresses.getAddress (
264- "CHAINLINK_ORACLE_PROXY_ADMIN "
265- );
266- address owner = addresses.getAddress ("TEMPORAL_GOVERNOR " );
267-
268- // TODO: who should be the fee recipient?
269- address feeRecipient = addresses.isAddressSet (
270- "OEV_WRAPPER_FEE_RECIPIENT "
271- )
272- ? addresses.getAddress ("OEV_WRAPPER_FEE_RECIPIENT " )
273- : owner;
274-
275- bytes memory initData = abi.encodeWithSelector (
276- ChainlinkOEVMorphoWrapper.initialize.selector ,
277- addresses.getAddress (morphoConfigs[i].oracleName),
278- owner,
279- feeRecipient,
280- FEE_MULTIPLIER,
281- MAX_ROUND_DELAY,
282- MAX_DECREMENTS,
283- morphoBlue
284- );
285-
286- TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy (
287- address (impl),
288- proxyAdmin,
289- initData
290- );
291-
292- // Set existing proxy to deprecated and add new proxy
293- if (addresses.isAddressSet (wrapperName)) {
294- addresses.addAddress (
295- string (abi.encodePacked (wrapperName, "_DEPRECATED " )),
296- addresses.getAddress (wrapperName)
297- );
298- addresses.changeAddress (wrapperName, address (proxy), true );
299- } else {
300- addresses.addAddress (wrapperName, address (proxy));
301- }
290+ vm.stopBroadcast ();
302291 }
303- vm.stopBroadcast ();
304292 }
305293
306294 function _validateFeedsPointToWrappers (
@@ -378,23 +366,14 @@ contract x34 is HybridProposal, Configs, Networks {
378366 )
379367 );
380368 assertEq (
381- address (wrapper.morphoBlue ()),
369+ address (wrapper.MORPHO_BLUE ()),
382370 morphoBlue,
383371 string .concat (
384372 "Morpho wrapper morphoBlue mismatch for " ,
385373 wrapperName
386374 )
387375 );
388376
389- // fee configs sane
390- address feeRecipient = wrapper.feeRecipient ();
391- assertTrue (
392- feeRecipient != address (0 ),
393- string .concat (
394- "Morpho wrapper feeRecipient zero for " ,
395- wrapperName
396- )
397- );
398377 assertEq (
399378 wrapper.feeMultiplier (),
400379 FEE_MULTIPLIER,
@@ -417,17 +396,6 @@ contract x34 is HybridProposal, Configs, Networks {
417396 )
418397 );
419398
420- // cachedRoundId and latest data readable
421- assertEq (
422- wrapper.cachedRoundId (),
423- AggregatorV3Interface (
424- addresses.getAddress (morphoConfigs[i].oracleName)
425- ).latestRound (),
426- string .concat (
427- "Morpho wrapper cachedRoundId mismatch for " ,
428- wrapperName
429- )
430- );
431399 (uint80 roundId , int256 answer , , uint256 updatedAt , ) = wrapper
432400 .latestRoundData ();
433401 assertGt (
0 commit comments