Skip to content

Commit 2999d65

Browse files
committed
Merge branch 'registrySmoothTransitionCoston' into 'main'
registry smooth transition See merge request flarenetwork/FSP/flare-system-client!79
2 parents ae4133f + 420cfef commit 2999d65

1 file changed

Lines changed: 122 additions & 46 deletions

File tree

client/epoch/registry_utils.go

Lines changed: 122 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
2730
const (
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

3153
var (
@@ -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

170212
func (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

251291
func (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

Comments
 (0)