Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
e1e5767
fix: skipping test due to holesky deprecation
serichoi65 Dec 7, 2025
e168c72
feat: upgrade testnet hoodi contracts
serichoi65 Dec 5, 2025
b3fe27c
upgrade sepolia
serichoi65 Dec 5, 2025
7cd777b
feat: implement Operator Set Rewards with Unique & Total Stake
serichoi65 Oct 22, 2025
1195583
fix tests
serichoi65 Nov 20, 2025
dd4f109
fix
serichoi65 Nov 21, 2025
b44dd55
address PR comments
serichoi65 Dec 4, 2025
e69e745
update to numeric
serichoi65 Dec 11, 2025
e3d6911
update to fork sabine
serichoi65 Dec 15, 2025
cf7dd6f
simplify refund logic
serichoi65 Dec 15, 2025
90c235a
add slashable_until
serichoi65 Dec 15, 2025
ed6d8ba
add max_magnitude to operatorAllocationSnapshot
serichoi65 Dec 15, 2025
95317d2
fix max_magnitude default val, simplify query
serichoi65 Dec 17, 2025
161274d
add test to verify max_magnitude join
serichoi65 Dec 17, 2025
990d096
update queueWindow as variables
serichoi65 Jan 8, 2026
d338602
feat(rewards): add v2.2 unique and total stake rewards with pro-rata …
serichoi65 Jan 26, 2026
0b20bfc
fix: compute staker split from slashing-adjusted base in Table 16
serichoi65 Jan 16, 2026
304393f
fix(rewards): address v2.2 audit findings
serichoi65 Jan 21, 2026
e6d4143
fix: prevent reward gaming via stale allocation data in ranked_alloca…
serichoi65 Jan 23, 2026
d9bc3cd
staker AND operator distributed tokens for refund
serichoi65 Jan 27, 2026
0758ff6
Remove redundant OD rewards path from tables 16/19
serichoi65 Jan 29, 2026
94acda1
add a migration to upgrade preprod-hoodi, testnet-hoodi, testnet-sepo…
serichoi65 Jan 16, 2026
aaec3e1
fix: add missing RewardsFork_Sabine and remove PT2-only migrations
serichoi65 Feb 4, 2026
1677ad1
add operatorAllocationSnapshots and improve rewardsV2_2_test
serichoi65 Feb 5, 2026
1eb4c9b
migrations
serichoi65 Feb 5, 2026
07a7a94
fix operatorShare and stakerShare snapshots date range
serichoi65 Feb 5, 2026
5daa701
audit fix
serichoi65 Feb 5, 2026
234e747
lower strategy
serichoi65 Feb 5, 2026
ef1d76e
logs to rewardsV2_2_test
serichoi65 Feb 5, 2026
0eb6f5d
EL22-01
serichoi65 Feb 5, 2026
dc26713
EL22-16
serichoi65 Feb 5, 2026
6bfe732
rename migrations and edit config
serichoi65 Feb 5, 2026
95e7a7d
fix(rewards): simplify v2.2 reward calculations and fix double-counti…
serichoi65 Feb 9, 2026
440bb67
fix operaterAllocationsSnapshot query
serichoi65 Feb 9, 2026
cc6509b
changed alias from do to dop in table 16
serichoi65 Feb 9, 2026
4da32d9
add reward_type
serichoi65 Feb 9, 2026
c144990
clean
serichoi65 Feb 9, 2026
0e4fd9f
fix active_rewards_modified in table 15
serichoi65 Feb 10, 2026
912f1d3
fix coreContracts migration names
serichoi65 Feb 10, 2026
32b6e52
upgrade sepolia rewards coordinator
serichoi65 Feb 10, 2026
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
72 changes: 65 additions & 7 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ const (
RewardsFork_Colorado ForkName = "colorado"
RewardsFork_Red ForkName = "red"
RewardsFork_Pecos ForkName = "pecos"
RewardsFork_Sabine ForkName = "sabine"
)

func normalizeFlagName(name string) string {
Expand Down Expand Up @@ -104,6 +105,7 @@ type RewardsConfig struct {
ValidateRewardsRoot bool
GenerateStakerOperatorsTable bool
CalculateRewardsDaily bool
RewardsV2_2Enabled bool
}

type StatsdConfig struct {
Expand Down Expand Up @@ -212,6 +214,7 @@ var (
RewardsValidateRewardsRoot = "rewards.validate_rewards_root"
RewardsGenerateStakerOperatorsTable = "rewards.generate_staker_operators_table"
RewardsCalculateRewardsDaily = "rewards.calculate_rewards_daily"
RewardsV2_2Enabled = "rewards.v2_2_enabled"

EthereumRpcBaseUrl = "ethereum.rpc_url"
EthereumRpcContractCallBatchSize = "ethereum.contract_call_batch_size"
Expand Down Expand Up @@ -246,6 +249,13 @@ var (
CoingeckoApiKey = "coingecko.api-key"
)

func FloatWithDefault(value, defaultValue float64) float64 {
if value == 0.0 {
return defaultValue
}
return value
}

func NewConfig() *Config {
return &Config{
Debug: viper.GetBool(normalizeFlagName("debug")),
Expand Down Expand Up @@ -297,6 +307,7 @@ func NewConfig() *Config {
ValidateRewardsRoot: viper.GetBool(normalizeFlagName(RewardsValidateRewardsRoot)),
GenerateStakerOperatorsTable: viper.GetBool(normalizeFlagName(RewardsGenerateStakerOperatorsTable)),
CalculateRewardsDaily: viper.GetBool(normalizeFlagName(RewardsCalculateRewardsDaily)),
RewardsV2_2Enabled: viper.GetBool(normalizeFlagName(RewardsV2_2Enabled)),
},

DataDogConfig: DataDogConfig{
Expand Down Expand Up @@ -419,13 +430,19 @@ func (c *Config) GetContractsMapForChain() *ContractAddresses {
}
} else if c.Chain == Chain_Hoodi {
return &ContractAddresses{
AllocationManager: "0x95a7431400f362f3647a69535c5666ca0133caa0",
AvsDirectory: "0xd58f6844f79eb1fbd9f7091d05f7cb30d3363926",
DelegationManager: "0x867837a9722c512e0862d8c2e15b8be220e8b87d",
EigenpodManager: "0xcd1442415fc5c29aa848a49d2e232720be07976c",
RewardsCoordinator: "0x29e8572678e0c272350aa0b4b8f304e47ebcd5e7",
StrategyManager: "0xee45e76ddbedda2918b8c7e3035cd37eab3b5d41",
KeyRegistrar: "0x5737e38a260545d8feccb4cae2cfd984da4130ed",
AllocationManager: "0x95a7431400f362f3647a69535c5666ca0133caa0",
AvsDirectory: "0xd58f6844f79eb1fbd9f7091d05f7cb30d3363926",
DelegationManager: "0x867837a9722c512e0862d8c2e15b8be220e8b87d",
EigenpodManager: "0xcd1442415fc5c29aa848a49d2e232720be07976c",
RewardsCoordinator: "0x29e8572678e0c272350aa0b4b8f304e47ebcd5e7",
StrategyManager: "0xee45e76ddbedda2918b8c7e3035cd37eab3b5d41",
KeyRegistrar: "0x5737e38a260545d8feccb4cae2cfd984da4130ed",
ReleaseManager: "0xe863060013cb95473b96f7c3e1444e3e3df65671",
CrossChainRegistry: "0x9269432451965996be7796582c062cb0795d3e8b",
OperatorTableUpdater: "0xb02a15c6bd0882b35e9936a9579f35fb26e11476",
ECDSACertificateVerifier: "0xb3cd1a457dea9a9a6f6406c6419b1c326670a96f",
BN254CertificateVerifier: "0xff58a373c18268f483c1f5ca03cf885c0c43373a",
TaskMailbox: "0xb99cc53e8db7018f557606c2a5b066527bf96b26",
}
} else if c.Chain == Chain_PreprodHoodi {
return &ContractAddresses{
Expand Down Expand Up @@ -552,6 +569,10 @@ func (c *Config) GetRewardsSqlForkDates() (ForkMap, error) {
Date: "2025-05-14",
BlockNumber: 3840004,
},
RewardsFork_Sabine: Fork{
Date: "1970-01-01",
BlockNumber: 0,
},
}, nil
case Chain_Holesky:
return ForkMap{
Expand Down Expand Up @@ -590,6 +611,10 @@ func (c *Config) GetRewardsSqlForkDates() (ForkMap, error) {
Date: "2025-05-14",
BlockNumber: 3840004,
},
RewardsFork_Sabine: Fork{
Date: "1970-01-01",
BlockNumber: 0,
},
}, nil
case Chain_Sepolia:
return ForkMap{
Expand Down Expand Up @@ -618,6 +643,10 @@ func (c *Config) GetRewardsSqlForkDates() (ForkMap, error) {
Date: "2025-05-14",
BlockNumber: 8327038,
},
RewardsFork_Sabine: Fork{
Date: "2026-02-09",
BlockNumber: 10225000,
},
}, nil
case Chain_Hoodi:
return ForkMap{
Expand Down Expand Up @@ -646,6 +675,10 @@ func (c *Config) GetRewardsSqlForkDates() (ForkMap, error) {
Date: "1970-01-01",
BlockNumber: 0,
},
RewardsFork_Sabine: Fork{
Date: "2026-02-09",
BlockNumber: 1990000,
},
}, nil
case Chain_PreprodHoodi:
return ForkMap{
Expand Down Expand Up @@ -674,6 +707,10 @@ func (c *Config) GetRewardsSqlForkDates() (ForkMap, error) {
Date: "1970-01-01",
BlockNumber: 0,
},
RewardsFork_Sabine: Fork{
Date: "1970-01-01",
BlockNumber: 0,
},
}, nil
case Chain_Mainnet:
return ForkMap{
Expand Down Expand Up @@ -716,6 +753,10 @@ func (c *Config) GetRewardsSqlForkDates() (ForkMap, error) {
Date: "2025-05-14",
BlockNumber: 22483225,
},
RewardsFork_Sabine: Fork{
Date: "2026-02-16",
BlockNumber: 24274311,
},
}, nil
}
return nil, errors.New("unsupported chain")
Expand Down Expand Up @@ -841,6 +882,23 @@ func (c *Config) IsRewardsV2_1EnabledForCutoffDate(cutoffDate string) (bool, err
return cutoffDateTime.Compare(mississippiForkDateTime) >= 0, nil
}

func (c *Config) IsRewardsV2_2EnabledForCutoffDate(cutoffDate string) (bool, error) {
forks, err := c.GetRewardsSqlForkDates()
if err != nil {
return false, err
}
cutoffDateTime, err := time.Parse(time.DateOnly, cutoffDate)
if err != nil {
return false, errors.Join(fmt.Errorf("failed to parse cutoff date %s", cutoffDate), err)
}
sabineForkDateTime, err := time.Parse(time.DateOnly, forks[RewardsFork_Sabine].Date)
if err != nil {
return false, errors.Join(fmt.Errorf("failed to parse Sabine fork date %s", forks[RewardsFork_Sabine].Date), err)
}

return cutoffDateTime.Compare(sabineForkDateTime) >= 0, nil
}

// CanIgnoreIncorrectRewardsRoot returns true if the rewards root can be ignored for the given block number
//
// Due to inconsistencies in the rewards root calculation on testnet, we know that some roots
Expand Down
Loading
Loading