@@ -5,17 +5,20 @@ package handlers
5
5
6
6
import (
7
7
"context"
8
+ "fmt"
8
9
"math/big"
9
10
"strings"
10
11
11
12
"github.com/attestantio/go-eth2-client/api"
12
13
apiv1 "github.com/attestantio/go-eth2-client/api/v1"
13
14
"github.com/attestantio/go-eth2-client/spec"
15
+ mapset "github.com/deckarep/golang-set/v2"
14
16
ethereumABI "github.com/ethereum/go-ethereum/accounts/abi"
15
17
"github.com/ethereum/go-ethereum/common"
16
18
"github.com/ethereum/go-ethereum/core/types"
17
19
"github.com/rs/zerolog/log"
18
20
"github.com/sygmaprotocol/spectre-node/chains/evm/abi"
21
+ "github.com/sygmaprotocol/spectre-node/chains/evm/listener/events"
19
22
evmMessage "github.com/sygmaprotocol/spectre-node/chains/evm/message"
20
23
"github.com/sygmaprotocol/spectre-node/chains/evm/prover"
21
24
"github.com/sygmaprotocol/sygma-core/relayer/message"
@@ -46,10 +49,11 @@ type StepEventHandler struct {
46
49
prover Prover
47
50
48
51
domainID uint8
49
- domains []uint8
50
- blockInterval uint64
52
+ allDomains []uint8
51
53
routerABI ethereumABI.ABI
52
54
routerAddress common.Address
55
+
56
+ latestBlock uint64
53
57
}
54
58
55
59
func NewStepEventHandler (
@@ -60,19 +64,18 @@ func NewStepEventHandler(
60
64
routerAddress common.Address ,
61
65
domainID uint8 ,
62
66
domains []uint8 ,
63
- blockInterval uint64 ,
64
67
) * StepEventHandler {
65
68
routerABI , _ := ethereumABI .JSON (strings .NewReader (abi .RouterABI ))
66
69
return & StepEventHandler {
67
70
eventFetcher : eventFetcher ,
68
71
blockFetcher : blockFetcher ,
69
72
prover : prover ,
70
- domains : domains ,
71
73
routerAddress : routerAddress ,
72
74
routerABI : routerABI ,
73
75
msgChan : msgChan ,
74
76
domainID : domainID ,
75
- blockInterval : blockInterval ,
77
+ allDomains : domains ,
78
+ latestBlock : 0 ,
76
79
}
77
80
}
78
81
@@ -82,14 +85,22 @@ func (h *StepEventHandler) HandleEvents(checkpoint *apiv1.Finality) error {
82
85
if err != nil {
83
86
return err
84
87
}
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
+ }
85
97
86
98
log .Info ().Uint8 ("domainID" , h .domainID ).Uint64 ("slot" , args .Update .FinalizedHeader .Header .Slot ).Msgf ("Executing sync step" )
87
99
88
100
proof , err := h .prover .StepProof (args )
89
101
if err != nil {
90
102
return err
91
103
}
92
-
93
104
node , err := args .Update .FinalizedHeader .Execution .GetTree ()
94
105
if err != nil {
95
106
return err
@@ -99,7 +110,7 @@ func (h *StepEventHandler) HandleEvents(checkpoint *apiv1.Finality) error {
99
110
return err
100
111
}
101
112
102
- for _ , destDomain := range h . domains {
113
+ for _ , destDomain := range domains {
103
114
if destDomain == h .domainID {
104
115
continue
105
116
}
@@ -118,5 +129,66 @@ func (h *StepEventHandler) HandleEvents(checkpoint *apiv1.Finality) error {
118
129
),
119
130
}
120
131
}
132
+ h .latestBlock = latestBlock
121
133
return nil
122
134
}
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