From 51677cb23c6f6d96ac869709c802f8a7d71b4f9e Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Sun, 1 Jun 2025 15:49:08 -0400 Subject: [PATCH 1/4] Add chainID call to ec-interface and ec-manager --- bindings/rocketpool/ec-interface.go | 3 +++ shared/services/ec-manager.go | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/bindings/rocketpool/ec-interface.go b/bindings/rocketpool/ec-interface.go index 5e44a2377..82ac57d98 100644 --- a/bindings/rocketpool/ec-interface.go +++ b/bindings/rocketpool/ec-interface.go @@ -102,4 +102,7 @@ type ExecutionClient interface { // SyncProgress retrieves the current progress of the sync algorithm. If there's // no sync currently running, it returns nil. SyncProgress(ctx context.Context) (*ethereum.SyncProgress, error) + + // ChainID retrieves the current chain ID + ChainID(ctx context.Context) (*big.Int, error) } diff --git a/shared/services/ec-manager.go b/shared/services/ec-manager.go index be358eb1b..96b15b22f 100644 --- a/shared/services/ec-manager.go +++ b/shared/services/ec-manager.go @@ -328,6 +328,17 @@ func (p *ExecutionClientManager) SyncProgress(ctx context.Context) (*ethereum.Sy return result.(*ethereum.SyncProgress), err } +// BlockNumber returns the most recent block number +func (p *ExecutionClientManager) ChainID(ctx context.Context) (*big.Int, error) { + result, err := p.runFunction(func(client *ethclient.Client) (interface{}, error) { + return client.ChainID(ctx) + }) + if err != nil { + return nil, err + } + return result.(*big.Int), err +} + /// ================== /// Internal functions /// ================== From 6101a52b6e4ab20941d5691585cec294294f83cf Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Sun, 1 Jun 2025 19:04:38 -0400 Subject: [PATCH 2/4] Return harcoded mainnet interval 0 RewardsEvent --- bindings/rewards/rewards.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/bindings/rewards/rewards.go b/bindings/rewards/rewards.go index e4d9e9b32..10871bd81 100644 --- a/bindings/rewards/rewards.go +++ b/bindings/rewards/rewards.go @@ -1,6 +1,7 @@ package rewards import ( + "context" "fmt" "math/big" "sync" @@ -230,6 +231,42 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission // Get the event info for a rewards snapshot using the Atlas getter func GetRewardsEvent(rp *rocketpool.RocketPool, index uint64, rocketRewardsPoolAddresses []common.Address, opts *bind.CallOpts) (bool, RewardsEvent, error) { + + // Check if ec is synced to mainnet + chainID, err := rp.Client.ChainID(context.Background()) + if err != nil { + return false, RewardsEvent{}, fmt.Errorf("Error getting chainID: %w", err) + } + isMainnet := chainID.Cmp(big.NewInt(1)) == 0 + + // Return hardcoded RewardsEvent for index 0, the only pre-merge interval on mainnet + if index == 0 && isMainnet { + treasuryRPL := new(big.Int) + treasuryRPL.SetString("10633670478560109530497", 10) + trustedNodeRPL := new(big.Int) + trustedNodeRPL.SetString("10633670478560109529794", 10) + nodeRPL := new(big.Int) + nodeRPL.SetString("49623795566613844471758", 10) + + eventDataInterval_0 := RewardsEvent{ + Index: big.NewInt(0), + ExecutionBlock: big.NewInt(15451078), + ConsensusBlock: big.NewInt(4598879), + IntervalsPassed: big.NewInt(1), + TreasuryRPL: treasuryRPL, + TrustedNodeRPL: []*big.Int{trustedNodeRPL}, + NodeRPL: []*big.Int{nodeRPL}, + NodeETH: []*big.Int{big.NewInt(0)}, + UserETH: big.NewInt(0), + MerkleRoot: common.HexToHash("0xb839fa0f5842bf3c8f19091361889fb0f1cb399d64b8da476d372b7de7a93463"), + MerkleTreeCID: "bafybeidrck3sz24acv32h56xdb7ruarxq52oci32del7moxqtief3do73y", + IntervalStartTime: time.Unix(1659591339, 0), + IntervalEndTime: time.Unix(1662010539, 0), + SubmissionTime: time.Unix(1662011717, 0), + } + return true, eventDataInterval_0, nil + } + // Get contracts rocketRewardsPool, err := getRocketRewardsPool(rp, opts) if err != nil { From 6dff04587130922fbade5d60c68f7ad08db00d9e Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Tue, 3 Jun 2025 16:34:50 -0400 Subject: [PATCH 3/4] Extract hardcoded interval 0 logic into a helper function --- bindings/rewards/rewards.go | 79 ++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/bindings/rewards/rewards.go b/bindings/rewards/rewards.go index 10871bd81..632ee6291 100644 --- a/bindings/rewards/rewards.go +++ b/bindings/rewards/rewards.go @@ -231,39 +231,12 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission // Get the event info for a rewards snapshot using the Atlas getter func GetRewardsEvent(rp *rocketpool.RocketPool, index uint64, rocketRewardsPoolAddresses []common.Address, opts *bind.CallOpts) (bool, RewardsEvent, error) { - - // Check if ec is synced to mainnet - chainID, err := rp.Client.ChainID(context.Background()) + // Check if the client is requesting interval 0 on mainnet, then return the hardcoded RewardsEvent + ok, eventDataInterval_0, err := getMainnetInterval0RewardsEvent(rp, index) if err != nil { - return false, RewardsEvent{}, fmt.Errorf("Error getting chainID: %w", err) - } - isMainnet := chainID.Cmp(big.NewInt(1)) == 0 - - // Return hardcoded RewardsEvent for index 0, the only pre-merge interval on mainnet - if index == 0 && isMainnet { - treasuryRPL := new(big.Int) - treasuryRPL.SetString("10633670478560109530497", 10) - trustedNodeRPL := new(big.Int) - trustedNodeRPL.SetString("10633670478560109529794", 10) - nodeRPL := new(big.Int) - nodeRPL.SetString("49623795566613844471758", 10) - - eventDataInterval_0 := RewardsEvent{ - Index: big.NewInt(0), - ExecutionBlock: big.NewInt(15451078), - ConsensusBlock: big.NewInt(4598879), - IntervalsPassed: big.NewInt(1), - TreasuryRPL: treasuryRPL, - TrustedNodeRPL: []*big.Int{trustedNodeRPL}, - NodeRPL: []*big.Int{nodeRPL}, - NodeETH: []*big.Int{big.NewInt(0)}, - UserETH: big.NewInt(0), - MerkleRoot: common.HexToHash("0xb839fa0f5842bf3c8f19091361889fb0f1cb399d64b8da476d372b7de7a93463"), - MerkleTreeCID: "bafybeidrck3sz24acv32h56xdb7ruarxq52oci32del7moxqtief3do73y", - IntervalStartTime: time.Unix(1659591339, 0), - IntervalEndTime: time.Unix(1662010539, 0), - SubmissionTime: time.Unix(1662011717, 0), - } + return false, RewardsEvent{}, err + } + if ok { return true, eventDataInterval_0, nil } @@ -354,6 +327,48 @@ func GetRewardsEvent(rp *rocketpool.RocketPool, index uint64, rocketRewardsPoolA return true, eventData, nil } +// Check if the client is requesting interval 0 on mainnet, then return the hardcoded RewardsEvent +func getMainnetInterval0RewardsEvent(rp *rocketpool.RocketPool, index uint64) (bool, RewardsEvent, error) { + if index != 0 { + return false, RewardsEvent{}, nil + } + // Check if the ec is synced to mainnet + chainID, err := rp.Client.ChainID(context.Background()) + if err != nil { + return false, RewardsEvent{}, fmt.Errorf("error getting chainID: %w", err) + } + if chainID.Cmp(big.NewInt(1)) != 0 { + return false, RewardsEvent{}, nil + } + + // Hardcoded RewardsEvent for interval 0 on mainnet + treasuryRPL := new(big.Int) + treasuryRPL.SetString("10633670478560109530497", 10) + trustedNodeRPL := new(big.Int) + trustedNodeRPL.SetString("10633670478560109529794", 10) + nodeRPL := new(big.Int) + nodeRPL.SetString("49623795566613844471758", 10) + + eventDataInterval_0 := RewardsEvent{ + Index: big.NewInt(0), + ExecutionBlock: big.NewInt(15451078), + ConsensusBlock: big.NewInt(4598879), + IntervalsPassed: big.NewInt(1), + TreasuryRPL: treasuryRPL, + TrustedNodeRPL: []*big.Int{trustedNodeRPL}, + NodeRPL: []*big.Int{nodeRPL}, + NodeETH: []*big.Int{big.NewInt(0)}, + UserETH: big.NewInt(0), + MerkleRoot: common.HexToHash("0xb839fa0f5842bf3c8f19091361889fb0f1cb399d64b8da476d372b7de7a93463"), + MerkleTreeCID: "bafybeidrck3sz24acv32h56xdb7ruarxq52oci32del7moxqtief3do73y", + IntervalStartTime: time.Unix(1659591339, 0), + IntervalEndTime: time.Unix(1662010539, 0), + SubmissionTime: time.Unix(1662011717, 0), + } + + return true, eventDataInterval_0, nil +} + // Get contracts var rocketRewardsPoolLock sync.Mutex From 4db122b3e7a6c5a3ceae2f13014c11c27965936c Mon Sep 17 00:00:00 2001 From: thomaspanf Date: Wed, 4 Jun 2025 14:25:40 -0400 Subject: [PATCH 4/4] Adjust function signature --- bindings/rewards/rewards.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bindings/rewards/rewards.go b/bindings/rewards/rewards.go index 632ee6291..15de165c8 100644 --- a/bindings/rewards/rewards.go +++ b/bindings/rewards/rewards.go @@ -232,12 +232,12 @@ func SubmitRewardSnapshot(rp *rocketpool.RocketPool, submission RewardSubmission // Get the event info for a rewards snapshot using the Atlas getter func GetRewardsEvent(rp *rocketpool.RocketPool, index uint64, rocketRewardsPoolAddresses []common.Address, opts *bind.CallOpts) (bool, RewardsEvent, error) { // Check if the client is requesting interval 0 on mainnet, then return the hardcoded RewardsEvent - ok, eventDataInterval_0, err := getMainnetInterval0RewardsEvent(rp, index) + data, ok, err := getMainnetInterval0RewardsEvent(rp, index) if err != nil { return false, RewardsEvent{}, err } if ok { - return true, eventDataInterval_0, nil + return true, data, nil } // Get contracts @@ -328,17 +328,17 @@ func GetRewardsEvent(rp *rocketpool.RocketPool, index uint64, rocketRewardsPoolA } // Check if the client is requesting interval 0 on mainnet, then return the hardcoded RewardsEvent -func getMainnetInterval0RewardsEvent(rp *rocketpool.RocketPool, index uint64) (bool, RewardsEvent, error) { +func getMainnetInterval0RewardsEvent(rp *rocketpool.RocketPool, index uint64) (RewardsEvent, bool, error) { if index != 0 { - return false, RewardsEvent{}, nil + return RewardsEvent{}, false, nil } // Check if the ec is synced to mainnet chainID, err := rp.Client.ChainID(context.Background()) if err != nil { - return false, RewardsEvent{}, fmt.Errorf("error getting chainID: %w", err) + return RewardsEvent{}, false, fmt.Errorf("error getting chainID: %w", err) } if chainID.Cmp(big.NewInt(1)) != 0 { - return false, RewardsEvent{}, nil + return RewardsEvent{}, false, nil } // Hardcoded RewardsEvent for interval 0 on mainnet @@ -366,7 +366,7 @@ func getMainnetInterval0RewardsEvent(rp *rocketpool.RocketPool, index uint64) (b SubmissionTime: time.Unix(1662011717, 0), } - return true, eventDataInterval_0, nil + return eventDataInterval_0, true, nil } // Get contracts