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
181 changes: 114 additions & 67 deletions script/curated/DeployBase.s.sol

Large diffs are not rendered by default.

37 changes: 25 additions & 12 deletions script/curated/DeployHoodi.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

pragma solidity 0.8.33;

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

contract DeployHoodi is DeployBase {
Expand Down Expand Up @@ -65,6 +65,7 @@ contract DeployHoodi is DeployBase {
config.defaultGeneralDelayedPenaltyAdditionalFine = 0.1 ether;
config.defaultKeysLimit = 80;
config.defaultAvgPerfLeewayBP = 10000;
// Legacy ParametersRegistry compatibility value; Curated fees come from CustomFeeRegistry.
config.defaultRewardShareBP = 6250; // 62.5% of 4% = 2.5% of the total
config.defaultStrikesLifetimeFrames = 6;
config.defaultStrikesThreshold = 3;
Expand Down Expand Up @@ -201,27 +202,39 @@ contract DeployHoodi is DeployBase {
config.secondAdminAddress = 0x4AF43Ee34a6fcD1fEcA1e1F832124C763561dA53; // Dev team EOA

// CurveMultiplier
config.additionalBondRegistryConfig.curveMultiplierCooldown = 7 days;
config.additionalBondRegistryConfig.curveMultiplierReductionCooldown = 7 days;
// TODO: reconsider — placeholder initial boost steps.
config.additionalBondRegistryConfig.boostSteps.push([uint256(5_000), 2_000]);
config.additionalBondRegistryConfig.boostSteps.push([uint256(10_000), 8_000]);
config.additionalBondRegistryConfig.boostSteps.push(Step({ threshold: 5_000, value: 2_000 }));
config.additionalBondRegistryConfig.boostSteps.push(Step({ threshold: 10_000, value: 8_000 }));

// NodeOperatorStrikes
config.strikesCommittee = 0x84DffcfB232594975C608DE92544Ff239a24c9E9; // CMC on Hoodi
config.nodeOperatorStrikesConfig.committee = 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 }));
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 2, value: 2_500 }));
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 3, value: 5_000 }));
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 4, value: 7_500 }));
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 5, value: 10_000 }));

// LDO lock boost provider
config.ldoLockBoostProviderConfig.token = 0xEf2573966D009CcEA0Fc74451dee2193564198dc;
config.ldoLockBoostProviderConfig.votingContract = 0x49B3512c44891bef83F8967d075121Bd1b07a01B;
config.ldoLockBoostProviderConfig.snapshotDelegation = address(1); // TODO: Fill in before deployment
config.ldoLockBoostProviderConfig.minLockPeriod = 30 days;
config.ldoLockBoostProviderConfig.lockPeriod = 30 days;
_addLDOLockBoostStep(100_000 ether, 1_000);
_addLDOLockBoostStep(200_000 ether, 1_500);
config.ldoLockBoostProviderConfig.lockBoostSteps.push(Step({ threshold: 100_000 ether, value: 1_000 }));
config.ldoLockBoostProviderConfig.lockBoostSteps.push(Step({ threshold: 200_000 ether, value: 1_500 }));

// CustomFeeRegistry
// TODO: finalize custom fee parameters.
config.customFeeRegistryConfig.defaultMaxFeeDiscount = 6_250;
config.customFeeRegistryConfig.feeDiscountCutCooldown = 15 days;
for (uint128 i = 1; i < 35; ++i) {
config.customFeeRegistryConfig.feeDiscountWeightSteps.push(Step({ threshold: i * 250, value: i * 400 }));
}
// Professional Operator uses the default bond curve (curve 0): 8_750 - 2_500 = 6_250.
config.customFeeRegistryConfig.feeModifiers.push(
CurveFeeModifierConfig({ curveId: 0, value: 2_500, negative: true })
);

_setUp();
}
Expand Down
36 changes: 24 additions & 12 deletions script/curated/DeployLocalDevNet.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

pragma solidity 0.8.33;

import { DeployBase, CuratedGateConfig, AdditionalBondRegistryConfig } from "./DeployBase.s.sol";
import { StrikeThreshold } from "../../src/interfaces/INodeOperatorStrikes.sol";
import { DeployBase, CuratedGateConfig, CurveFeeModifierConfig } from "./DeployBase.s.sol";
import { Step } from "../../src/interfaces/IStepwiseWeightBoost.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 @@ -55,6 +55,7 @@ contract DeployLocalDevNet is DeployBase {
config.defaultGeneralDelayedPenaltyAdditionalFine = 0.1 ether;
config.defaultKeysLimit = 100;
config.defaultAvgPerfLeewayBP = 10000;
// Legacy ParametersRegistry compatibility value; Curated fees come from CustomFeeRegistry.
config.defaultRewardShareBP = 6250; // 62.5% of 4% = 2.5% of the total
config.defaultStrikesLifetimeFrames = 6;
config.defaultStrikesThreshold = 3;
Expand Down Expand Up @@ -189,26 +190,37 @@ contract DeployLocalDevNet is DeployBase {
config.secondAdminAddress = vm.envOr("CSM_SECOND_ADMIN_ADDRESS", address(0));

// CurveMultiplier
config.additionalBondRegistryConfig.curveMultiplierCooldown = 1 days;
config.additionalBondRegistryConfig.curveMultiplierReductionCooldown = 1 days;
// TODO: reconsider — placeholder initial boost steps.
config.additionalBondRegistryConfig.boostSteps.push([uint256(5_000), 2_000]);
config.additionalBondRegistryConfig.boostSteps.push([uint256(10_000), 8_000]);
config.additionalBondRegistryConfig.boostSteps.push(Step({ threshold: 5_000, value: 2_000 }));
config.additionalBondRegistryConfig.boostSteps.push(Step({ threshold: 10_000, value: 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 }));
config.nodeOperatorStrikesConfig.committee = vm.envAddress("CSM_FIRST_ADMIN_ADDRESS"); // Dev team EOA
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 2, value: 2_500 }));
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 3, value: 5_000 }));
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 4, value: 7_500 }));
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 5, value: 10_000 }));

// LDO lock boost provider
config.ldoLockBoostProviderConfig.token = vm.envAddress("CSM_LDO_TOKEN_ADDRESS");
config.ldoLockBoostProviderConfig.votingContract = vm.envAddress("CSM_LDO_VOTING_ADDRESS");
config.ldoLockBoostProviderConfig.snapshotDelegation = vm.envAddress("CSM_SNAPSHOT_DELEGATION_ADDRESS");
config.ldoLockBoostProviderConfig.minLockPeriod = 1 days;
config.ldoLockBoostProviderConfig.lockPeriod = 1 days;
_addLDOLockBoostStep(100_000 ether, 1_000);
_addLDOLockBoostStep(200_000 ether, 1_500);
config.ldoLockBoostProviderConfig.lockBoostSteps.push(Step({ threshold: 100_000 ether, value: 1_000 }));
config.ldoLockBoostProviderConfig.lockBoostSteps.push(Step({ threshold: 200_000 ether, value: 1_500 }));

// CustomFeeRegistry
config.customFeeRegistryConfig.defaultMaxFeeDiscount = 6_250;
config.customFeeRegistryConfig.feeDiscountCutCooldown = 15 days;
for (uint128 i = 1; i < 35; ++i) {
config.customFeeRegistryConfig.feeDiscountWeightSteps.push(Step({ threshold: i * 250, value: i * 400 }));
}
// Professional Operator uses the default bond curve (curve 0): 8_750 - 2_500 = 6_250.
config.customFeeRegistryConfig.feeModifiers.push(
CurveFeeModifierConfig({ curveId: 0, value: 2_500, negative: true })
);

_setUp();
}
Expand Down
37 changes: 25 additions & 12 deletions script/curated/DeployMainnet.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

pragma solidity 0.8.33;

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

contract DeployMainnet is DeployBase {
Expand Down Expand Up @@ -62,6 +62,7 @@ contract DeployMainnet is DeployBase {
config.defaultGeneralDelayedPenaltyAdditionalFine = 0.1 ether;
config.defaultKeysLimit = 100;
config.defaultAvgPerfLeewayBP = 10000;
// Legacy ParametersRegistry compatibility value; Curated fees come from CustomFeeRegistry.
config.defaultRewardShareBP = 6250; // 62.5% of 4% = 2.5% of the total
config.defaultStrikesLifetimeFrames = 6;
config.defaultStrikesThreshold = 3;
Expand Down Expand Up @@ -200,27 +201,39 @@ contract DeployMainnet is DeployBase {
config.resealManager = 0x7914b5a1539b97Bd0bbd155757F25FD79A522d24;

// CurveMultiplier
config.additionalBondRegistryConfig.curveMultiplierCooldown = 7 days;
config.additionalBondRegistryConfig.curveMultiplierReductionCooldown = 7 days;
// TODO: reconsider — placeholder initial boost steps.
config.additionalBondRegistryConfig.boostSteps.push([uint256(5_000), 2_000]);
config.additionalBondRegistryConfig.boostSteps.push([uint256(10_000), 8_000]);
config.additionalBondRegistryConfig.boostSteps.push(Step({ threshold: 5_000, value: 2_000 }));
config.additionalBondRegistryConfig.boostSteps.push(Step({ threshold: 10_000, value: 8_000 }));

// NodeOperatorStrikes
config.strikesCommittee = 0x2570e0b22AD904501dfB0d49575991ACB801dD91; // CMC https://docs.lido.fi/multisigs/committees#220-curated-module-committee-cmc
config.nodeOperatorStrikesConfig.committee = 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 }));
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 2, value: 2_500 }));
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 3, value: 5_000 }));
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 4, value: 7_500 }));
config.nodeOperatorStrikesConfig.thresholds.push(Step({ threshold: 5, value: 10_000 }));

// LDO lock boost provider
config.ldoLockBoostProviderConfig.token = 0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32;
config.ldoLockBoostProviderConfig.votingContract = 0x2e59A20f205bB85a89C53f1936454680651E618e;
config.ldoLockBoostProviderConfig.snapshotDelegation = 0x469788fE6E9E9681C6ebF3bF78e7Fd26Fc015446;
config.ldoLockBoostProviderConfig.minLockPeriod = 30 days;
config.ldoLockBoostProviderConfig.lockPeriod = 30 days;
_addLDOLockBoostStep(100_000 ether, 1_000);
_addLDOLockBoostStep(200_000 ether, 1_500);
config.ldoLockBoostProviderConfig.lockBoostSteps.push(Step({ threshold: 100_000 ether, value: 1_000 }));
config.ldoLockBoostProviderConfig.lockBoostSteps.push(Step({ threshold: 200_000 ether, value: 1_500 }));

// CustomFeeRegistry
// TODO: finalize custom fee parameters.
config.customFeeRegistryConfig.defaultMaxFeeDiscount = 6_250;
config.customFeeRegistryConfig.feeDiscountCutCooldown = 15 days;
for (uint128 i = 1; i < 35; ++i) {
config.customFeeRegistryConfig.feeDiscountWeightSteps.push(Step({ threshold: i * 250, value: i * 400 }));
}
// Professional Operator uses the default bond curve (curve 0): 8_750 - 2_500 = 6_250.
config.customFeeRegistryConfig.feeModifiers.push(
CurveFeeModifierConfig({ curveId: 0, value: 2_500, negative: true })
);
Comment thread
vgorkavenko marked this conversation as resolved.

_setUp();
}
Expand Down
12 changes: 0 additions & 12 deletions script/utils/Common.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ pragma solidity 0.8.33;

import { IParametersRegistry } from "../../src/interfaces/IParametersRegistry.sol";
import { IBondCurve } from "../../src/interfaces/IBondCurve.sol";
import { BoostStep } from "../../src/interfaces/IAdditionalBondRegistry.sol";

library CommonScriptUtils {
function arraysToKeyIndexValueIntervals(
Expand Down Expand Up @@ -33,15 +32,4 @@ library CommonScriptUtils {
}
return bondCurveInputs;
}

function arraysToBoostSteps(uint256[2][] memory data) internal pure returns (BoostStep[] memory) {
BoostStep[] memory boostSteps = new BoostStep[](data.length);
for (uint256 i = 0; i < data.length; i++) {
boostSteps[i] = BoostStep({
minCurveMultiplier: uint128(data[i][0]),
weightMultiplier: uint128(data[i][1])
});
}
return boostSteps;
}
}
Loading
Loading