@@ -14,6 +14,7 @@ import (
1414 "github.com/ethereum/go-ethereum/accounts/abi"
1515 "github.com/ethereum/go-ethereum/accounts/abi/bind"
1616 "github.com/ethereum/go-ethereum/common"
17+ "github.com/ethereum/go-ethereum/core/types"
1718 "github.com/ethereum/go-ethereum/crypto"
1819 "github.com/ethereum/go-ethereum/ethclient"
1920 "github.com/pkg/errors"
@@ -24,8 +25,29 @@ import (
2425 "github.com/flare-foundation/go-flare-common/pkg/contracts/registry"
2526)
2627
28+ // TODO configure addresses and breaking change
29+
2730const (
31+ chainIDCoston = 16
2832 chainIDCoston2 = 114
33+
34+ breakingEpochCoston = 5451
35+ )
36+
37+ const (
38+ newRegistryCostonAddr = "0x42F4526BFC6f892DB515a832a52eFc9edFADf6c0"
39+ oldRegistryCostonAddr = "0xB4B93a3A3ADa93a574E6efeb5f295bf882934cB6"
40+
41+ newPreRegistryCostonAddr = "0x4A5538e86bc09cc1b02BAE720CCc39548e10dB28"
42+ oldPreRegistryCostonAddr = "0xF660984B8597e31437cA4b7dEa0A41677982563b"
43+ )
44+
45+ var (
46+ newRegistryCoston = common .HexToAddress (newRegistryCostonAddr )
47+ oldRegistryCoston = common .HexToAddress (oldRegistryCostonAddr )
48+
49+ newPreRegistryCoston = common .HexToAddress (newPreRegistryCostonAddr )
50+ oldPreRegistryCoston = common .HexToAddress (oldPreRegistryCostonAddr )
2951)
3052
3153var (
@@ -112,7 +134,9 @@ type registryContractClientImpl struct {
112134 registryAddress common.Address
113135 preregistryAddress common.Address
114136 registry * registry.Registry
137+ oldRegistry * registry.Registry
115138 preregistry * preregistry.Preregistry
139+ oldPreregistry * preregistry.Preregistry
116140 senderTxOpts * bind.TransactOpts
117141 gasCfg * config.Gas
118142 txVerifier * chain.TxVerifier
@@ -131,19 +155,37 @@ func NewRegistryContractClient(
131155) (* registryContractClientImpl , error ) {
132156 registryBinding , err := registry .NewRegistry (registryAddress , ethClient )
133157 if err != nil {
134- return nil , fmt . Errorf ( "registry binding: %w" , err )
158+ return nil , err
135159 }
136160 preregistryBinding , err := preregistry .NewPreregistry (preregistryAddress , ethClient )
137161 if err != nil {
138- return nil , fmt .Errorf ("pre registry binding: %w" , err )
162+ return nil , err
163+ }
164+
165+ var oldRegistryBinding * registry.Registry
166+ if registryAddress == newRegistryCoston {
167+ oldRegistryBinding , err = registry .NewRegistry (oldRegistryCoston , ethClient )
168+ if err != nil {
169+ return nil , err
170+ }
171+ }
172+
173+ var oldPreRegistryBinding * preregistry.Preregistry
174+ if preregistryAddress == newPreRegistryCoston {
175+ oldPreRegistryBinding , err = preregistry .NewPreregistry (oldPreRegistryCoston , ethClient )
176+ if err != nil {
177+ return nil , err
178+ }
139179 }
140180
141181 return & registryContractClientImpl {
142182 ethClient : ethClient ,
143183 registryAddress : registryAddress ,
144184 preregistryAddress : preregistryAddress ,
145185 registry : registryBinding ,
186+ oldRegistry : oldRegistryBinding ,
146187 preregistry : preregistryBinding ,
188+ oldPreregistry : oldPreRegistryBinding ,
147189 senderTxOpts : senderTxOpts ,
148190 gasCfg : gasCfg ,
149191 txVerifier : chain .NewTxVerifier (ethClient ),
@@ -169,22 +211,9 @@ func (r *registryContractClientImpl) RegisterVoter(ctx context.Context, nextRewa
169211
170212func (r * registryContractClientImpl ) sendRegisterVoter (ctx context.Context , nextRewardEpochID * big.Int , address common.Address ) error {
171213 epochID := uint32 (nextRewardEpochID .Uint64 ())
172-
173- var (
174- signature []byte
175- err error
176- )
177-
178- if r .chainID != chainIDCoston2 {
179- signature , err = r .createSignature (epochID , address )
180- if err != nil {
181- return fmt .Errorf ("creating registry signature old: %w" , err )
182- }
183- } else {
184- signature , err = r .createSignatureNew (r .chainID , epochID , address )
185- if err != nil {
186- return fmt .Errorf ("creating registry signature new: %w" , err )
187- }
214+ signature , err := r .signature (epochID , address )
215+ if err != nil {
216+ return fmt .Errorf ("signature: %w" , err )
188217 }
189218
190219 vrsSignature := registry.IVoterRegistrySignature {
@@ -195,23 +224,25 @@ func (r *registryContractClientImpl) sendRegisterVoter(ctx context.Context, next
195224
196225 err = SetGas (ctx , r .senderTxOpts , r .ethClient , r .gasCfg )
197226 if err != nil {
198- return err
227+ return fmt . Errorf ( "setting gas: %w" , err )
199228 }
200229
230+ useOldAddress , contractAddress := shouldUseOldRegistry (epochID , r .registryAddress )
231+
201232 estimatedGasLimit , err := chain .DryRunTxAbi (
202233 ctx ,
203234 r .ethClient ,
204235 chain .DefaultTxTimeout ,
205236 r .senderTxOpts .From ,
206- r . registryAddress ,
237+ contractAddress ,
207238 common .Big0 ,
208239 registryAbi ,
209240 "registerVoter" ,
210241 address ,
211242 vrsSignature ,
212243 )
213244 if err != nil {
214- return errors . Wrap ( err , "Dry run failed" )
245+ return fmt . Errorf ( "dry run failed: %w" , err )
215246 }
216247
217248 if r .gasCfg .GasLimit != 0 {
@@ -220,9 +251,18 @@ func (r *registryContractClientImpl) sendRegisterVoter(ctx context.Context, next
220251 r .senderTxOpts .GasLimit = estimatedGasLimit
221252 }
222253
223- tx , err := r .registry .RegisterVoter (r .senderTxOpts , address , vrsSignature )
224- if err != nil {
225- return fmt .Errorf ("sending registry tx: %w" , err )
254+ var tx * types.Transaction
255+
256+ if useOldAddress {
257+ tx , err = r .oldRegistry .RegisterVoter (r .senderTxOpts , address , vrsSignature )
258+ if err != nil {
259+ return fmt .Errorf ("sending registry old tx: %w" , err )
260+ }
261+ } else {
262+ tx , err = r .registry .RegisterVoter (r .senderTxOpts , address , vrsSignature )
263+ if err != nil {
264+ return fmt .Errorf ("sending registry tx: %w" , err )
265+ }
226266 }
227267
228268 err = r .txVerifier .WaitUntilMined (ctx , r .senderTxOpts .From , tx , chain .DefaultTxTimeout )
@@ -250,22 +290,9 @@ func (r *registryContractClientImpl) PreregisterVoter(ctx context.Context, nextR
250290
251291func (r * registryContractClientImpl ) sendPreRegisterVoter (ctx context.Context , nextRewardEpochID * big.Int , address common.Address ) error {
252292 epochID := uint32 (nextRewardEpochID .Uint64 ())
253-
254- var (
255- signature []byte
256- err error
257- )
258-
259- if r .chainID != chainIDCoston2 {
260- signature , err = r .createSignature (epochID , address )
261- if err != nil {
262- return fmt .Errorf ("creating pre registry signature old: %w" , err )
263- }
264- } else {
265- signature , err = r .createSignatureNew (r .chainID , epochID , address )
266- if err != nil {
267- return fmt .Errorf ("creating pre registry signature new: %w" , err )
268- }
293+ signature , err := r .signature (epochID , address )
294+ if err != nil {
295+ return fmt .Errorf ("signature: %w" , err )
269296 }
270297
271298 vrsSignature := preregistry.IVoterRegistrySignature {
@@ -276,23 +303,25 @@ func (r *registryContractClientImpl) sendPreRegisterVoter(ctx context.Context, n
276303
277304 err = SetGas (ctx , r .senderTxOpts , r .ethClient , r .gasCfg )
278305 if err != nil {
279- return fmt .Errorf ("setting gas pre registry:%w" , err )
306+ return fmt .Errorf ("setting gas pre registry: %w" , err )
280307 }
281308
309+ useOldAddress , contractAddress := shouldUseOldPreRegistry (epochID , r .preregistryAddress )
310+
282311 estimatedGasLimit , err := chain .DryRunTxAbi (
283312 ctx ,
284313 r .ethClient ,
285314 chain .DefaultTxTimeout ,
286315 r .senderTxOpts .From ,
287- r . preregistryAddress ,
316+ contractAddress ,
288317 common .Big0 ,
289318 preregistryAbi ,
290319 "preRegisterVoter" ,
291320 address ,
292321 vrsSignature ,
293322 )
294323 if err != nil {
295- return errors . Wrap ( err , "Dry run failed" )
324+ return fmt . Errorf ( "dry run failed: %w" , err )
296325 }
297326
298327 if r .gasCfg .GasLimit != 0 {
@@ -301,9 +330,18 @@ func (r *registryContractClientImpl) sendPreRegisterVoter(ctx context.Context, n
301330 r .senderTxOpts .GasLimit = estimatedGasLimit
302331 }
303332
304- tx , err := r .preregistry .PreRegisterVoter (r .senderTxOpts , address , vrsSignature )
305- if err != nil {
306- return fmt .Errorf ("sending preregistry tx: %w" , err )
333+ var tx * types.Transaction
334+
335+ if useOldAddress {
336+ tx , err = r .oldPreregistry .PreRegisterVoter (r .senderTxOpts , address , vrsSignature )
337+ if err != nil {
338+ return fmt .Errorf ("sending preregistry tx: %w" , err )
339+ }
340+ } else {
341+ tx , err = r .preregistry .PreRegisterVoter (r .senderTxOpts , address , vrsSignature )
342+ if err != nil {
343+ return fmt .Errorf ("sending preregistry tx: %w" , err )
344+ }
307345 }
308346
309347 err = r .txVerifier .WaitUntilMined (ctx , r .senderTxOpts .From , tx , chain .DefaultTxTimeout )
@@ -384,3 +422,41 @@ func SetGas(ctx context.Context, txOptions *bind.TransactOpts, client *ethclient
384422 return fmt .Errorf ("unsupported tx type: %d" , gasConfig .TxType )
385423 }
386424}
425+
426+ func shouldUseOldRegistry (epochID uint32 , address common.Address ) (bool , common.Address ) {
427+ if address == newRegistryCoston && epochID < breakingEpochCoston {
428+ return true , oldRegistryCoston
429+ }
430+
431+ return false , address
432+ }
433+
434+ func shouldUseOldPreRegistry (epochID uint32 , address common.Address ) (bool , common.Address ) {
435+ if address == newPreRegistryCoston && epochID < breakingEpochCoston {
436+ return true , oldPreRegistryCoston
437+ }
438+
439+ return false , address
440+ }
441+
442+ func (r * registryContractClientImpl ) signature (epochID uint32 , address common.Address ) ([]byte , error ) {
443+ var (
444+ signature []byte
445+ err error
446+ )
447+ switch {
448+ case r .chainID == chainIDCoston2 ,
449+ r .chainID == chainIDCoston && epochID >= breakingEpochCoston :
450+ signature , err = r .createSignatureNew (r .chainID , epochID , address )
451+ if err != nil {
452+ return nil , fmt .Errorf ("creating new: %w" , err )
453+ }
454+ default :
455+ signature , err = r .createSignature (epochID , address )
456+ if err != nil {
457+ return nil , fmt .Errorf ("creating old: %w" , err )
458+ }
459+ }
460+
461+ return signature , nil
462+ }
0 commit comments