Skip to content

Commit 3802fa4

Browse files
committed
[ARM] Deploy 042 WETH ARM Morpho market on mainnet
1 parent a9ec39c commit 3802fa4

4 files changed

Lines changed: 94 additions & 1 deletion

File tree

build/deployments-1.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,14 @@
239239
{
240240
"implementation": "0xAb98aC901B8A26636d9cf3Cf38d9aCdcD045788f",
241241
"name": "USDC_ARM_USDG_ADAPTER"
242+
},
243+
{
244+
"implementation": "0xe192824f42ae3D643ac867774b45E8d233d86c72",
245+
"name": "MORPHO_MARKET_WETH_ARM"
246+
},
247+
{
248+
"implementation": "0x4E715556Cd84926FD5EAc206a016711E38273aD4",
249+
"name": "MORPHO_MARKET_WETH_ARM_IMPL"
242250
}
243251
],
244252
"executions": [
@@ -462,7 +470,13 @@
462470
"name": "041_RedeployEtherFiAdaptersScript",
463471
"proposalId": 1,
464472
"tsDeployment": 1785134531,
473+
"tsGovernance": 1
474+
},
475+
{
476+
"name": "042_DeployWETHMorphoMarketScript",
477+
"proposalId": 1,
478+
"tsDeployment": 1785160163,
465479
"tsGovernance": 0
466480
}
467481
]
468-
}
482+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity 0.8.23;
3+
4+
// Contracts
5+
import {Proxy} from "contracts/Proxy.sol";
6+
import {Mainnet} from "contracts/utils/Addresses.sol";
7+
import {MultiAssetARM} from "contracts/MultiAssetARM.sol";
8+
import {MorphoMarket} from "contracts/markets/MorphoMarket.sol";
9+
import {Abstract4626MarketWrapper} from "contracts/markets/Abstract4626MarketWrapper.sol";
10+
11+
// Deployment
12+
import {AbstractDeployScript} from "script/deploy/helpers/AbstractDeployScript.s.sol";
13+
14+
/// @title Deploy the WETH ARM Morpho market
15+
/// @notice Deploys a MorphoMarket wrapper for the WETH ARM using the same Morpho vault as the
16+
/// LidoARM and EtherFiARM wrappers. The mainnet 2/8 multisig owns the wrapper and acts as
17+
/// its harvester. It also adds and activates the wrapper on the WETH ARM.
18+
/// @dev The multisig actions are simulated in _fork(); on mainnet they are executed separately by
19+
/// the multisig after the proxy and implementation have been deployed.
20+
contract $042_DeployWETHMorphoMarketScript is AbstractDeployScript("042_DeployWETHMorphoMarketScript") {
21+
function _execute() internal override {
22+
address wethARM = resolver.resolve("WETH_ARM");
23+
24+
// 1. Deploy the MorphoMarket proxy.
25+
Proxy morphoMarketProxy = new Proxy();
26+
_recordDeployment("MORPHO_MARKET_WETH_ARM", address(morphoMarketProxy));
27+
28+
// 2. Deploy the implementation for the WETH ARM and the shared Morpho vault.
29+
MorphoMarket morphoMarketImpl = new MorphoMarket(wethARM, Mainnet.MORPHO_WETH_VAULT);
30+
_recordDeployment("MORPHO_MARKET_WETH_ARM_IMPL", address(morphoMarketImpl));
31+
32+
// 3. Initialize the wrapper and hand ownership to the WETH ARM's 2/8 multisig.
33+
bytes memory data = abi.encodeWithSelector(
34+
Abstract4626MarketWrapper.initialize.selector, Mainnet.MULTISIG_2_OF_8, Mainnet.MERKLE_DISTRIBUTOR
35+
);
36+
morphoMarketProxy.initialize(address(morphoMarketImpl), Mainnet.MULTISIG_2_OF_8, data);
37+
}
38+
39+
function _fork() internal override {
40+
MultiAssetARM wethARM = MultiAssetARM(payable(resolver.resolve("WETH_ARM")));
41+
address morphoMarket = resolver.resolve("MORPHO_MARKET_WETH_ARM");
42+
43+
// Idempotent: the deployment runner can replay pending multisig actions on forks.
44+
if (!wethARM.supportedMarkets(morphoMarket)) {
45+
address[] memory markets = new address[](1);
46+
markets[0] = morphoMarket;
47+
48+
vm.prank(Mainnet.MULTISIG_2_OF_8);
49+
wethARM.addMarkets(markets);
50+
}
51+
52+
if (wethARM.activeMarket() != morphoMarket) {
53+
vm.prank(Mainnet.MULTISIG_2_OF_8);
54+
wethARM.setActiveMarket(morphoMarket);
55+
}
56+
}
57+
}

src/contracts/utils/Addresses.sol

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ library Mainnet {
3636
// Tokens
3737
address public constant MORPHO = 0x58D97B57BB95320F9a05dC918Aef65434969c2B2;
3838

39+
// Morpho Vaults
40+
address public constant MORPHO_WETH_VAULT = 0x3Dfe70B05657949A5dB340754aD664810ac63b21;
41+
3942
// Origin
4043
address public constant OETH_VAULT = 0x39254033945AA2E4809Cc2977E7087BEE48bd7Ab;
4144

test/smoke/WETHARMSmokeTest.t.sol

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {MultiAssetARM} from "contracts/MultiAssetARM.sol";
77
import {CapManager} from "contracts/CapManager.sol";
88
import {Proxy} from "contracts/Proxy.sol";
99
import {Mainnet} from "contracts/utils/Addresses.sol";
10+
import {Abstract4626MarketWrapper} from "contracts/markets/Abstract4626MarketWrapper.sol";
1011

1112
contract Fork_WETHARM_Smoke_Test is AbstractSmokeTest {
1213
MultiAssetARM internal wethARM;
@@ -67,6 +68,24 @@ contract Fork_WETHARM_Smoke_Test is AbstractSmokeTest {
6768
);
6869
}
6970

71+
function test_MorphoMarketConfig() external view {
72+
Abstract4626MarketWrapper morphoMarket = Abstract4626MarketWrapper(resolver.resolve("MORPHO_MARKET_WETH_ARM"));
73+
Abstract4626MarketWrapper lidoMarket = Abstract4626MarketWrapper(resolver.resolve("MORPHO_MARKET_LIDO"));
74+
address etherFiActiveMarket = MultiAssetARM(payable(resolver.resolve("ETHER_FI_ARM"))).activeMarket();
75+
Abstract4626MarketWrapper etherFiMarket = Abstract4626MarketWrapper(etherFiActiveMarket);
76+
77+
assertEq(morphoMarket.arm(), address(wethARM), "market arm");
78+
assertEq(morphoMarket.asset(), Mainnet.WETH, "market asset");
79+
assertEq(morphoMarket.market(), Mainnet.MORPHO_WETH_VAULT, "configured Morpho vault");
80+
assertEq(morphoMarket.market(), lidoMarket.market(), "Lido Morpho vault");
81+
assertEq(morphoMarket.market(), etherFiMarket.market(), "EtherFi Morpho vault");
82+
assertEq(morphoMarket.owner(), Mainnet.MULTISIG_2_OF_8, "market owner");
83+
assertEq(morphoMarket.harvester(), Mainnet.MULTISIG_2_OF_8, "market harvester");
84+
assertEq(address(morphoMarket.merkleDistributor()), Mainnet.MERKLE_DISTRIBUTOR, "Merkle distributor");
85+
assertTrue(wethARM.supportedMarkets(address(morphoMarket)), "market supported");
86+
assertEq(wethARM.activeMarket(), address(morphoMarket), "active market");
87+
}
88+
7089
function _assertBaseAssetConfig(address baseAsset, string memory adapterName, bool pegged) internal view {
7190
(
7291
uint128 buyPrice,

0 commit comments

Comments
 (0)