Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit bc2f287

Browse files
authored
feat: send step only for filled epochs (#33)
1 parent 5d6a09c commit bc2f287

File tree

7 files changed

+403
-16
lines changed

7 files changed

+403
-16
lines changed

chains/evm/config/config.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@ import (
1212

1313
type EVMConfig struct {
1414
config.BaseNetworkConfig
15-
BeaconEndpoint string `required:"true" split_words:"true"`
16-
Router string
15+
BeaconEndpoint string `required:"true" split_words:"true"`
16+
Router string `required:"true"`
1717
Spectre string `required:"true"`
1818
Spec string `default:"mainnet"`
1919
MaxGasPrice int64 `default:"500000000000" split_words:"true"`
20-
BlockInterval uint64 `default:"32" split_words:"true"`
2120
GasMultiplier float64 `default:"1" split_words:"true"`
2221
GasIncreasePercentage int64 `default:"15" split_words:"true"`
2322
RetryInterval uint64 `default:"12" split_words:"true"`

chains/evm/config/config_test.go

-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ func (s *EVMConfigTestSuite) Test_LoadEVMConfig_SuccessfulLoad_DefaultValues() {
5656
Router: "router",
5757
Spectre: "spectre",
5858
Spec: "mainnet",
59-
BlockInterval: 32,
6059
GasMultiplier: 1,
6160
GasIncreasePercentage: 15,
6261
MaxGasPrice: 500000000000,
@@ -96,7 +95,6 @@ func (s *EVMConfigTestSuite) Test_LoadEVMConfig_SuccessfulLoad() {
9695
Router: "router",
9796
Spectre: "spectre",
9897
Spec: "testnet",
99-
BlockInterval: 10,
10098
GasMultiplier: 1,
10199
GasIncreasePercentage: 20,
102100
MaxGasPrice: 1000,

chains/evm/listener/handlers/step.go

+79-7
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@ package handlers
55

66
import (
77
"context"
8+
"fmt"
89
"math/big"
910
"strings"
1011

1112
"github.com/attestantio/go-eth2-client/api"
1213
apiv1 "github.com/attestantio/go-eth2-client/api/v1"
1314
"github.com/attestantio/go-eth2-client/spec"
15+
mapset "github.com/deckarep/golang-set/v2"
1416
ethereumABI "github.com/ethereum/go-ethereum/accounts/abi"
1517
"github.com/ethereum/go-ethereum/common"
1618
"github.com/ethereum/go-ethereum/core/types"
1719
"github.com/rs/zerolog/log"
1820
"github.com/sygmaprotocol/spectre-node/chains/evm/abi"
21+
"github.com/sygmaprotocol/spectre-node/chains/evm/listener/events"
1922
evmMessage "github.com/sygmaprotocol/spectre-node/chains/evm/message"
2023
"github.com/sygmaprotocol/spectre-node/chains/evm/prover"
2124
"github.com/sygmaprotocol/sygma-core/relayer/message"
@@ -46,10 +49,11 @@ type StepEventHandler struct {
4649
prover Prover
4750

4851
domainID uint8
49-
domains []uint8
50-
blockInterval uint64
52+
allDomains []uint8
5153
routerABI ethereumABI.ABI
5254
routerAddress common.Address
55+
56+
latestBlock uint64
5357
}
5458

5559
func NewStepEventHandler(
@@ -60,19 +64,18 @@ func NewStepEventHandler(
6064
routerAddress common.Address,
6165
domainID uint8,
6266
domains []uint8,
63-
blockInterval uint64,
6467
) *StepEventHandler {
6568
routerABI, _ := ethereumABI.JSON(strings.NewReader(abi.RouterABI))
6669
return &StepEventHandler{
6770
eventFetcher: eventFetcher,
6871
blockFetcher: blockFetcher,
6972
prover: prover,
70-
domains: domains,
7173
routerAddress: routerAddress,
7274
routerABI: routerABI,
7375
msgChan: msgChan,
7476
domainID: domainID,
75-
blockInterval: blockInterval,
77+
allDomains: domains,
78+
latestBlock: 0,
7679
}
7780
}
7881

@@ -82,14 +85,22 @@ func (h *StepEventHandler) HandleEvents(checkpoint *apiv1.Finality) error {
8285
if err != nil {
8386
return err
8487
}
88+
domains, latestBlock, err := h.destinationDomains(args.Update.FinalizedHeader.Header.Slot)
89+
if err != nil {
90+
return err
91+
}
92+
if len(domains) == 0 {
93+
h.latestBlock = latestBlock
94+
log.Debug().Uint8("domainID", h.domainID).Uint64("slot", args.Update.FinalizedHeader.Header.Slot).Msgf("Skipping step...")
95+
return nil
96+
}
8597

8698
log.Info().Uint8("domainID", h.domainID).Uint64("slot", args.Update.FinalizedHeader.Header.Slot).Msgf("Executing sync step")
8799

88100
proof, err := h.prover.StepProof(args)
89101
if err != nil {
90102
return err
91103
}
92-
93104
node, err := args.Update.FinalizedHeader.Execution.GetTree()
94105
if err != nil {
95106
return err
@@ -99,7 +110,7 @@ func (h *StepEventHandler) HandleEvents(checkpoint *apiv1.Finality) error {
99110
return err
100111
}
101112

102-
for _, destDomain := range h.domains {
113+
for _, destDomain := range domains {
103114
if destDomain == h.domainID {
104115
continue
105116
}
@@ -118,5 +129,66 @@ func (h *StepEventHandler) HandleEvents(checkpoint *apiv1.Finality) error {
118129
),
119130
}
120131
}
132+
h.latestBlock = latestBlock
121133
return nil
122134
}
135+
136+
func (h *StepEventHandler) destinationDomains(slot uint64) ([]uint8, uint64, error) {
137+
domains := mapset.NewSet[uint8]()
138+
block, err := h.blockFetcher.SignedBeaconBlock(context.Background(), &api.SignedBeaconBlockOpts{
139+
Block: fmt.Sprint(slot),
140+
})
141+
if err != nil {
142+
return domains.ToSlice(), 0, err
143+
}
144+
145+
endBlock := block.Data.Capella.Message.Body.ExecutionPayload.BlockNumber
146+
if h.latestBlock == 0 {
147+
return h.allDomains, endBlock, nil
148+
}
149+
150+
deposits, err := h.fetchDeposits(big.NewInt(int64(h.latestBlock)), big.NewInt(int64(endBlock)))
151+
if err != nil {
152+
return domains.ToSlice(), endBlock, err
153+
}
154+
if len(deposits) == 0 {
155+
return domains.ToSlice(), endBlock, nil
156+
}
157+
for _, deposit := range deposits {
158+
domains.Add(deposit.DestinationDomainID)
159+
}
160+
161+
return domains.ToSlice(), endBlock, nil
162+
}
163+
164+
func (h *StepEventHandler) fetchDeposits(startBlock *big.Int, endBlock *big.Int) ([]*events.Deposit, error) {
165+
logs, err := h.eventFetcher.FetchEventLogs(context.Background(), h.routerAddress, string(events.DepositSig), startBlock, endBlock)
166+
if err != nil {
167+
return nil, err
168+
}
169+
170+
deposits := make([]*events.Deposit, 0)
171+
for _, dl := range logs {
172+
d, err := h.unpackDeposit(dl.Data)
173+
if err != nil {
174+
log.Error().Msgf("Failed unpacking deposit event log: %v", err)
175+
continue
176+
}
177+
d.SenderAddress = common.BytesToAddress(dl.Topics[1].Bytes())
178+
179+
log.Debug().Msgf("Found deposit log in block: %d, TxHash: %s, contractAddress: %s, sender: %s", dl.BlockNumber, dl.TxHash, dl.Address, d.SenderAddress)
180+
deposits = append(deposits, d)
181+
}
182+
183+
return deposits, nil
184+
}
185+
186+
func (h *StepEventHandler) unpackDeposit(data []byte) (*events.Deposit, error) {
187+
var d events.Deposit
188+
err := h.routerABI.UnpackIntoInterface(&d, "Deposit", data)
189+
if err != nil {
190+
return &events.Deposit{}, err
191+
}
192+
193+
return &d, nil
194+
}

0 commit comments

Comments
 (0)