Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions script/curated/DeployBase.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { ParametersRegistry } from "../../src/ParametersRegistry.sol";
import { ExitPenalties } from "../../src/ExitPenalties.sol";
import { MetaRegistry } from "../../src/MetaRegistry.sol";
import { AdditionalBondRegistry } from "../../src/AdditionalBondRegistry.sol";
import { NodeOperatorStrikes } from "../../src/NodeOperatorStrikes.sol";
import { BoostStep } from "../../src/interfaces/IAdditionalBondRegistry.sol";
import { CuratedGate } from "../../src/CuratedGate.sol";
import { MerkleGateFactory } from "../../src/MerkleGateFactory.sol";
Expand All @@ -30,6 +31,7 @@ import { IParametersRegistry } from "../../src/interfaces/IParametersRegistry.so
import { IBondCurve } from "../../src/interfaces/IBondCurve.sol";
import { IMetaRegistry } from "../../src/interfaces/IMetaRegistry.sol";
import { IWeightBoostProvider } from "../../src/interfaces/IWeightBoostProvider.sol";
import { StrikeThreshold } from "../../src/interfaces/INodeOperatorStrikes.sol";

import { JsonObj, Json } from "../utils/Json.sol";
import { Dummy } from "../utils/Dummy.sol";
Expand Down Expand Up @@ -133,6 +135,9 @@ struct CuratedDeployParams {
address secondAdminAddress;
// AdditionalBondRegistry
AdditionalBondRegistryConfig additionalBondRegistryConfig;
// NodeOperatorStrikes
address strikesCommittee;
StrikeThreshold[] strikesThresholds;
Comment on lines +139 to +140

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve ABI compatibility with existing deployment artifacts

Appending these fields changes the ABI tuple head for CuratedDeployParams, but the tracked artifacts/hoodi/curated/deploy-hoodi.json was produced with the prior layout and is not updated here. Fixtures.parseCommonDeployParams and updateCuratedDeployParams decode that artifact directly as the new struct (test/helpers/Fixtures.sol:457,462,559); its first dynamic payload words are therefore interpreted as the new strikesCommittee/strikesThresholds head entries, causing ABI decoding to revert. This blocks the existing Hoodi fork/deployment workflows until the artifact is migrated or the decoder supports the legacy layout.

Useful? React with 👍 / 👎.

}

abstract contract DeployBase is Script {
Expand All @@ -156,6 +161,7 @@ abstract contract DeployBase is Script {
ParametersRegistry public parametersRegistry;
MetaRegistry public metaRegistry;
AdditionalBondRegistry public additionalBondRegistry;
NodeOperatorStrikes public nodeOperatorStrikes;
MerkleGateFactory public curatedGateFactory;
address[] public curatedGateInstances;
address internal curatedGateImpl;
Expand Down Expand Up @@ -245,6 +251,7 @@ abstract contract DeployBase is Script {
oracle = FeeOracle(_deployProxy(deployer, address(dummyImpl)));
metaRegistry = MetaRegistry(_deployProxy(deployer, address(dummyImpl)));
additionalBondRegistry = AdditionalBondRegistry(_deployProxy(deployer, address(dummyImpl)));
nodeOperatorStrikes = NodeOperatorStrikes(_deployProxy(deployer, address(dummyImpl)));

FeeDistributor feeDistributorImpl = new FeeDistributor({
stETH: locator.lido(),
Expand Down Expand Up @@ -354,12 +361,28 @@ abstract contract DeployBase is Script {
additionalBondRegistryProxy.proxy__changeAdmin(config.proxyAdmin);
}

NodeOperatorStrikes nodeOperatorStrikesImpl = new NodeOperatorStrikes({ module: address(curatedModule) });

{
OssifiableProxy nodeOperatorStrikesProxy = OssifiableProxy(payable(address(nodeOperatorStrikes)));
nodeOperatorStrikesProxy.proxy__upgradeToAndCall(
address(nodeOperatorStrikesImpl),
abi.encodeCall(NodeOperatorStrikes.initialize, (deployer, config.strikesThresholds))
);
nodeOperatorStrikesProxy.proxy__changeAdmin(config.proxyAdmin);
}

accounting.grantRole(accounting.MANAGE_BOND_CURVES_ROLE(), address(deployer));
accounting.grantRole(accounting.SET_BOND_CURVE_MULTIPLIER_ROLE(), address(additionalBondRegistry));
metaRegistry.addWeightBoostProvider(
IWeightBoostProvider(address(additionalBondRegistry)),
IMetaRegistry.WeightBoostProviderMode.NodeOperator
);
metaRegistry.addWeightBoostProvider(
IWeightBoostProvider(address(nodeOperatorStrikes)),
IMetaRegistry.WeightBoostProviderMode.NodeOperator
);
nodeOperatorStrikes.grantRole(nodeOperatorStrikes.STRIKES_COMMITTEE_ROLE(), config.strikesCommittee);
metaRegistry.grantRole(metaRegistry.SET_BOND_CURVE_WEIGHT_ROLE(), deployer);

for (uint256 i = 0; i < gatesCount; i++) {
Expand Down Expand Up @@ -560,6 +583,9 @@ abstract contract DeployBase is Script {
additionalBondRegistry.grantRole(additionalBondRegistry.DEFAULT_ADMIN_ROLE(), config.aragonAgent);
additionalBondRegistry.revokeRole(additionalBondRegistry.DEFAULT_ADMIN_ROLE(), deployer);

nodeOperatorStrikes.grantRole(nodeOperatorStrikes.DEFAULT_ADMIN_ROLE(), config.aragonAgent);
nodeOperatorStrikes.revokeRole(nodeOperatorStrikes.DEFAULT_ADMIN_ROLE(), deployer);

verifier.grantRole(verifier.DEFAULT_ADMIN_ROLE(), config.aragonAgent);
verifier.revokeRole(verifier.DEFAULT_ADMIN_ROLE(), deployer);

Expand All @@ -586,6 +612,8 @@ abstract contract DeployBase is Script {
deployJson.set("MetaRegistryImpl", address(metaRegistryImpl));
deployJson.set("AdditionalBondRegistry", address(additionalBondRegistry));
deployJson.set("AdditionalBondRegistryImpl", address(additionalBondRegistryImpl));
deployJson.set("NodeOperatorStrikes", address(nodeOperatorStrikes));
deployJson.set("NodeOperatorStrikesImpl", address(nodeOperatorStrikesImpl));
deployJson.set("ParametersRegistry", address(parametersRegistry));
deployJson.set("ParametersRegistryImpl", address(parametersRegistryImpl));
deployJson.set("Accounting", address(accounting));
Expand Down Expand Up @@ -682,6 +710,7 @@ abstract contract DeployBase is Script {
parametersRegistry.grantRole(parametersRegistry.DEFAULT_ADMIN_ROLE(), config.secondAdminAddress);
metaRegistry.grantRole(metaRegistry.DEFAULT_ADMIN_ROLE(), config.secondAdminAddress);
additionalBondRegistry.grantRole(additionalBondRegistry.DEFAULT_ADMIN_ROLE(), config.secondAdminAddress);
nodeOperatorStrikes.grantRole(nodeOperatorStrikes.DEFAULT_ADMIN_ROLE(), config.secondAdminAddress);
for (uint256 i = 0; i < curatedGateInstances.length; i++) {
CuratedGate gate = CuratedGate(curatedGateInstances[i]);
gate.grantRole(gate.DEFAULT_ADMIN_ROLE(), config.secondAdminAddress);
Expand Down
9 changes: 9 additions & 0 deletions script/curated/DeployHoodi.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
pragma solidity 0.8.33;

import { DeployBase, CuratedGateConfig, AdditionalBondRegistryConfig } from "./DeployBase.s.sol";
import { StrikeThreshold } from "../../src/interfaces/INodeOperatorStrikes.sol";
import { GIndices } from "../constants/GIndices.sol";

contract DeployHoodi is DeployBase {
Expand Down Expand Up @@ -205,6 +206,14 @@ contract DeployHoodi is DeployBase {
config.additionalBondRegistryConfig.boostSteps.push([uint256(5_000), 2_000]);
config.additionalBondRegistryConfig.boostSteps.push([uint256(10_000), 8_000]);

// NodeOperatorStrikes
config.strikesCommittee = 0x84DffcfB232594975C608DE92544Ff239a24c9E9; // CMC on Hoodi
// TODO: finalize strike weight-reduction thresholds
config.strikesThresholds.push(StrikeThreshold({ minCount: 2, reductionBP: 2_500 }));
config.strikesThresholds.push(StrikeThreshold({ minCount: 3, reductionBP: 5_000 }));
config.strikesThresholds.push(StrikeThreshold({ minCount: 4, reductionBP: 7_500 }));
config.strikesThresholds.push(StrikeThreshold({ minCount: 5, reductionBP: 10_000 }));

_setUp();
}
}
8 changes: 8 additions & 0 deletions script/curated/DeployLocalDevNet.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
pragma solidity 0.8.33;

import { DeployBase, CuratedGateConfig, AdditionalBondRegistryConfig } from "./DeployBase.s.sol";
import { StrikeThreshold } from "../../src/interfaces/INodeOperatorStrikes.sol";
import { GIndices } from "../constants/GIndices.sol";
import { BaseOracle } from "../../src/lib/base-oracle/BaseOracle.sol";
import { HashConsensus } from "../../src/lib/base-oracle/HashConsensus.sol";
Expand Down Expand Up @@ -193,6 +194,13 @@ contract DeployLocalDevNet is DeployBase {
config.additionalBondRegistryConfig.boostSteps.push([uint256(5_000), 2_000]);
config.additionalBondRegistryConfig.boostSteps.push([uint256(10_000), 8_000]);

// NodeOperatorStrikes
config.strikesCommittee = vm.envAddress("CSM_FIRST_ADMIN_ADDRESS"); // Dev team EOA
config.strikesThresholds.push(StrikeThreshold({ minCount: 2, reductionBP: 2_500 }));
config.strikesThresholds.push(StrikeThreshold({ minCount: 3, reductionBP: 5_000 }));
config.strikesThresholds.push(StrikeThreshold({ minCount: 4, reductionBP: 7_500 }));
config.strikesThresholds.push(StrikeThreshold({ minCount: 5, reductionBP: 10_000 }));

_setUp();
}

Expand Down
9 changes: 9 additions & 0 deletions script/curated/DeployMainnet.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
pragma solidity 0.8.33;

import { DeployBase, CuratedGateConfig, AdditionalBondRegistryConfig } from "./DeployBase.s.sol";
import { StrikeThreshold } from "../../src/interfaces/INodeOperatorStrikes.sol";
import { GIndices } from "../constants/GIndices.sol";

contract DeployMainnet is DeployBase {
Expand Down Expand Up @@ -204,6 +205,14 @@ contract DeployMainnet is DeployBase {
config.additionalBondRegistryConfig.boostSteps.push([uint256(5_000), 2_000]);
config.additionalBondRegistryConfig.boostSteps.push([uint256(10_000), 8_000]);

// NodeOperatorStrikes
config.strikesCommittee = 0x2570e0b22AD904501dfB0d49575991ACB801dD91; // CMC https://docs.lido.fi/multisigs/committees#220-curated-module-committee-cmc
// TODO: finalize strike weight-reduction thresholds
config.strikesThresholds.push(StrikeThreshold({ minCount: 2, reductionBP: 2_500 }));
config.strikesThresholds.push(StrikeThreshold({ minCount: 3, reductionBP: 5_000 }));
config.strikesThresholds.push(StrikeThreshold({ minCount: 4, reductionBP: 7_500 }));
config.strikesThresholds.push(StrikeThreshold({ minCount: 5, reductionBP: 10_000 }));

_setUp();
}
}
Loading
Loading