diff --git a/contracts/0.8.9/LidoLocator.sol b/contracts/0.8.9/LidoLocator.sol index 07392a280..31d577a9f 100644 --- a/contracts/0.8.9/LidoLocator.sol +++ b/contracts/0.8.9/LidoLocator.sol @@ -1,9 +1,10 @@ // SPDX-FileCopyrightText: 2023 Lido // SPDX-License-Identifier: GPL-3.0 -/* See contracts/COMPILERS.md */ pragma solidity 0.8.9; +// solhint-disable immutable-vars-naming + import {ILidoLocator} from "../common/interfaces/ILidoLocator.sol"; /** @@ -28,6 +29,7 @@ contract LidoLocator is ILidoLocator { address withdrawalQueue; address withdrawalVault; address oracleDaemonConfig; + address wstEth; } error ZeroAddress(); @@ -46,6 +48,7 @@ contract LidoLocator is ILidoLocator { address public immutable withdrawalQueue; address public immutable withdrawalVault; address public immutable oracleDaemonConfig; + address public immutable wstEth; /** * @notice declare service locations @@ -67,9 +70,10 @@ contract LidoLocator is ILidoLocator { withdrawalQueue = _assertNonZero(_config.withdrawalQueue); withdrawalVault = _assertNonZero(_config.withdrawalVault); oracleDaemonConfig = _assertNonZero(_config.oracleDaemonConfig); + wstEth = _assertNonZero(_config.wstEth); } - function coreComponents() external view returns( + function coreComponents() external view returns ( address, address, address, @@ -87,7 +91,7 @@ contract LidoLocator is ILidoLocator { ); } - function oracleReportComponentsForLido() external view returns( + function oracleReportComponentsForLido() external view returns ( address, address, address, diff --git a/contracts/common/interfaces/ILidoLocator.sol b/contracts/common/interfaces/ILidoLocator.sol index a2bdc764d..de4e524a6 100644 --- a/contracts/common/interfaces/ILidoLocator.sol +++ b/contracts/common/interfaces/ILidoLocator.sol @@ -1,26 +1,30 @@ // SPDX-FileCopyrightText: 2023 Lido // SPDX-License-Identifier: GPL-3.0 -// See contracts/COMPILERS.md // solhint-disable-next-line pragma solidity >=0.4.24 <0.9.0; interface ILidoLocator { - function accountingOracle() external view returns(address); - function depositSecurityModule() external view returns(address); - function elRewardsVault() external view returns(address); - function legacyOracle() external view returns(address); - function lido() external view returns(address); - function oracleReportSanityChecker() external view returns(address); - function burner() external view returns(address); - function stakingRouter() external view returns(address); - function treasury() external view returns(address); - function validatorsExitBusOracle() external view returns(address); - function withdrawalQueue() external view returns(address); - function withdrawalVault() external view returns(address); - function postTokenRebaseReceiver() external view returns(address); - function oracleDaemonConfig() external view returns(address); - function coreComponents() external view returns( + + function accountingOracle() external view returns (address); + function depositSecurityModule() external view returns (address); + function elRewardsVault() external view returns (address); + function legacyOracle() external view returns (address); + function lido() external view returns (address); + function oracleReportSanityChecker() external view returns (address); + function burner() external view returns (address); + function stakingRouter() external view returns (address); + function treasury() external view returns (address); + function validatorsExitBusOracle() external view returns (address); + function withdrawalQueue() external view returns (address); + function withdrawalVault() external view returns (address); + function postTokenRebaseReceiver() external view returns (address); + function oracleDaemonConfig() external view returns (address); + function wstEth() external view returns (address); + + /// @dev Returns a batch of core components addresses at once. + /// It's just a more gas-efficient way of calling several public getters at once. + function coreComponents() external view returns ( address elRewardsVault, address oracleReportSanityChecker, address stakingRouter, @@ -28,7 +32,10 @@ interface ILidoLocator { address withdrawalQueue, address withdrawalVault ); - function oracleReportComponentsForLido() external view returns( + + /// @dev Returns a batch of addresses that is used specifically during oracle report handling in the Lido contract. + /// It's just a more gas-efficient way of calling several public getters at once. + function oracleReportComponentsForLido() external view returns ( address accountingOracle, address elRewardsVault, address oracleReportSanityChecker, diff --git a/lib/protocol/networks.ts b/lib/protocol/networks.ts index 2642eff9e..34314ade8 100644 --- a/lib/protocol/networks.ts +++ b/lib/protocol/networks.ts @@ -45,6 +45,7 @@ const defaultEnv = { withdrawalQueue: "WITHDRAWAL_QUEUE_ADDRESS", withdrawalVault: "WITHDRAWAL_VAULT_ADDRESS", oracleDaemonConfig: "ORACLE_DAEMON_CONFIG_ADDRESS", + wstEth: "WST_ETH_ADDRESS", // aragon contracts kernel: "ARAGON_KERNEL_ADDRESS", acl: "ARAGON_ACL_ADDRESS", diff --git a/lib/protocol/types.ts b/lib/protocol/types.ts index b8dbcc1aa..7c3176169 100644 --- a/lib/protocol/types.ts +++ b/lib/protocol/types.ts @@ -20,6 +20,7 @@ import { ValidatorsExitBusOracle, WithdrawalQueueERC721, WithdrawalVault, + WstETH, } from "typechain-types"; export type ProtocolNetworkItems = { @@ -41,6 +42,7 @@ export type ProtocolNetworkItems = { withdrawalQueue: string; withdrawalVault: string; oracleDaemonConfig: string; + wstEth: string; // aragon contracts kernel: string; acl: string; @@ -65,6 +67,7 @@ export interface ContractTypes { WithdrawalQueueERC721: WithdrawalQueueERC721; WithdrawalVault: WithdrawalVault; OracleDaemonConfig: OracleDaemonConfig; + WstETH: WstETH; Kernel: Kernel; ACL: ACL; HashConsensus: HashConsensus; @@ -93,6 +96,7 @@ export type CoreContracts = { withdrawalQueue: LoadedContract; withdrawalVault: LoadedContract; oracleDaemonConfig: LoadedContract; + wstEth: LoadedContract; }; export type AragonContracts = { diff --git a/scripts/scratch/steps/09-deploy-non-aragon-contracts.ts b/scripts/scratch/steps/09-deploy-non-aragon-contracts.ts index 0407a852a..e26732357 100644 --- a/scripts/scratch/steps/09-deploy-non-aragon-contracts.ts +++ b/scripts/scratch/steps/09-deploy-non-aragon-contracts.ts @@ -301,6 +301,7 @@ async function main() { withdrawalQueueERC721.address, withdrawalVaultAddress, oracleDaemonConfig.address, + wstETH.address, ]; await updateProxyImplementation(Sk.lidoLocator, "LidoLocator", locator.address, proxyContractsOwner, [locatorConfig]); diff --git a/scripts/upgrade/deploy-locator.ts b/scripts/upgrade/deploy-locator.ts index 614bce889..25ec12e33 100644 --- a/scripts/upgrade/deploy-locator.ts +++ b/scripts/upgrade/deploy-locator.ts @@ -19,6 +19,7 @@ const VIEW_NAMES_AND_CTOR_ARGS = [ "withdrawalQueue", "withdrawalVault", "oracleDaemonConfig", + "wstEth", ]; /////////////// GLOBAL VARIABLES /////////////// @@ -52,12 +53,14 @@ async function main() { const newOrCurrent = async (name: string) => { return await getNewFromEnvOrCurrent(name, locator); }; + const ctorArgs = await Promise.all(VIEW_NAMES_AND_CTOR_ARGS.map(newOrCurrent)); if (Object.keys(g_newAddresses).length === 0) { log(`No new addresses specified: exiting doing nothing`); process.exit(0); } + log.splitter(); for (const name in g_newAddresses) { log(`(!) "${name}" new address: ${g_newAddresses[name]}`); diff --git a/test/0.8.9/contracts/LidoLocator__MockMutable.sol b/test/0.8.9/contracts/LidoLocator__MockMutable.sol index ead0d44e1..bc00f97b1 100644 --- a/test/0.8.9/contracts/LidoLocator__MockMutable.sol +++ b/test/0.8.9/contracts/LidoLocator__MockMutable.sol @@ -19,6 +19,7 @@ contract LidoLocator__MockMutable { address withdrawalQueue; address withdrawalVault; address oracleDaemonConfig; + address wstEth; } error ZeroAddress(); @@ -37,6 +38,7 @@ contract LidoLocator__MockMutable { address public immutable withdrawalQueue; address public immutable withdrawalVault; address public immutable oracleDaemonConfig; + address public immutable wstEth; /** * @notice declare service locations @@ -58,6 +60,7 @@ contract LidoLocator__MockMutable { withdrawalQueue = _assertNonZero(_config.withdrawalQueue); withdrawalVault = _assertNonZero(_config.withdrawalVault); oracleDaemonConfig = _assertNonZero(_config.oracleDaemonConfig); + wstEth = _assertNonZero(_config.wstEth); } function coreComponents() external view returns (address, address, address, address, address, address) { diff --git a/test/0.8.9/lidoLocator.test.ts b/test/0.8.9/lidoLocator.test.ts index f970de0c0..caa601c8d 100644 --- a/test/0.8.9/lidoLocator.test.ts +++ b/test/0.8.9/lidoLocator.test.ts @@ -21,6 +21,7 @@ const services = [ "withdrawalQueue", "withdrawalVault", "oracleDaemonConfig", + "wstEth", ] as const; type Service = ArrayToUnion; diff --git a/test/deploy/locator.ts b/test/deploy/locator.ts index 84e63a22e..3fbf3bdb1 100644 --- a/test/deploy/locator.ts +++ b/test/deploy/locator.ts @@ -28,6 +28,7 @@ async function deployDummyLocator(config?: Partial, de validatorsExitBusOracle: certainAddress("dummy-locator:validatorsExitBusOracle"), withdrawalQueue: certainAddress("dummy-locator:withdrawalQueue"), withdrawalVault: certainAddress("dummy-locator:withdrawalVault"), + wstEth: certainAddress("dummy-locator:wstEth"), ...config, }); @@ -102,6 +103,7 @@ async function getLocatorConfig(locatorAddress: string) { "withdrawalQueue", "withdrawalVault", "oracleDaemonConfig", + "wstEth", ] as Partial[]; const configPromises = addresses.map((name) => locator[name]());