Skip to content

Commit d44de77

Browse files
committed
Merge branch 'coston2' into 'main'
registry change for coston2 See merge request flarenetwork/FSP/flare-system-client!76
2 parents cc9e6d1 + 107457b commit d44de77

3 files changed

Lines changed: 112 additions & 34 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
# Changelog
22

3-
## [v.1.0.10](https://github.com/flare-foundation/flare-system-client/tree/v1.0.10) - 2026-3-?
3+
## [v.1.0.11](https://github.com/flare-foundation/flare-system-client/tree/v1.0.11) - 2026-3-?
4+
5+
### Added
6+
7+
- Changed registry and preregistry smart contracts with updated message for signing.
8+
9+
## [v.1.0.10](https://github.com/flare-foundation/flare-system-client/tree/v1.0.10) - 2026-3-2
410

511
### Added
612

client/epoch/epoch_client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ func NewClient(ctx flarectx.ClientContext) (*client, error) {
9999
cfg.ContractAddresses.VoterPreRegistry,
100100
senderTxOpts,
101101
signerPk,
102+
chainCfg.ChainID,
102103
)
103104
if err != nil {
104105
return nil, err

client/epoch/registry_utils.go

Lines changed: 104 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,16 @@ import (
2424
"github.com/flare-foundation/go-flare-common/pkg/contracts/registry"
2525
)
2626

27+
const (
28+
chainIDCoston2 = 114
29+
)
30+
2731
var (
28-
registratorArguments abi.Arguments
29-
registryAbi *abi.ABI
30-
preregistryAbi *abi.ABI
32+
registratorArguments abi.Arguments
33+
registratorArgumentsNew abi.Arguments
34+
35+
registryAbi *abi.ABI
36+
preregistryAbi *abi.ABI
3137

3238
fallbackGasPrice = big.NewInt(50 * 1e9) // 50 GWei
3339
)
@@ -56,8 +62,27 @@ func init() {
5662
// panic, this error is fatal
5763
panic(err)
5864
}
65+
66+
uint256Ty, err := abi.NewType("uint256", "uint256", nil)
67+
if err != nil {
68+
// panic, this error is fatal
69+
panic(err)
70+
}
71+
5972
registratorArguments = abi.Arguments{
60-
{ // nextRewardEpochId
73+
{ // nextRewardEpochIDs
74+
Type: uint32Ty,
75+
},
76+
{ // address
77+
Type: addressTy,
78+
},
79+
}
80+
81+
registratorArgumentsNew = abi.Arguments{
82+
{ // chainID
83+
Type: uint256Ty,
84+
},
85+
{ // nextRewardEpochID
6186
Type: uint32Ty,
6287
},
6388
{ // address
@@ -84,14 +109,15 @@ type registryContractClient interface {
84109

85110
type registryContractClientImpl struct {
86111
ethClient *ethclient.Client
87-
address common.Address
112+
registryAddress common.Address
88113
preregistryAddress common.Address
89114
registry *registry.Registry
90115
preregistry *preregistry.Preregistry
91116
senderTxOpts *bind.TransactOpts
92117
gasCfg *config.Gas
93118
txVerifier *chain.TxVerifier
94119
signerPrivateKey *ecdsa.PrivateKey
120+
chainID int
95121
}
96122

97123
func NewRegistryContractClient(
@@ -101,32 +127,35 @@ func NewRegistryContractClient(
101127
preregistryAddress common.Address,
102128
senderTxOpts *bind.TransactOpts,
103129
signerPk *ecdsa.PrivateKey,
130+
chainID int,
104131
) (*registryContractClientImpl, error) {
105-
registry, err := registry.NewRegistry(registryAddress, ethClient)
132+
registryBinding, err := registry.NewRegistry(registryAddress, ethClient)
106133
if err != nil {
107-
return nil, err
134+
return nil, fmt.Errorf("registry binding: %w", err)
108135
}
109-
preregistry, err := preregistry.NewPreregistry(preregistryAddress, ethClient)
136+
preregistryBinding, err := preregistry.NewPreregistry(preregistryAddress, ethClient)
110137
if err != nil {
111-
return nil, err
138+
return nil, fmt.Errorf("pre registry binding: %w", err)
112139
}
140+
113141
return &registryContractClientImpl{
114142
ethClient: ethClient,
115-
address: registryAddress,
143+
registryAddress: registryAddress,
116144
preregistryAddress: preregistryAddress,
117-
registry: registry,
118-
preregistry: preregistry,
145+
registry: registryBinding,
146+
preregistry: preregistryBinding,
119147
senderTxOpts: senderTxOpts,
120148
gasCfg: gasCfg,
121149
txVerifier: chain.NewTxVerifier(ethClient),
122150
signerPrivateKey: signerPk,
151+
chainID: chainID,
123152
}, nil
124153
}
125154

126155
// RegisterVoter tries to register voter on VoterRegistry smart contract.
127-
func (r *registryContractClientImpl) RegisterVoter(nextRewardEpochId *big.Int, address common.Address) <-chan shared.ExecuteStatus[any] {
156+
func (r *registryContractClientImpl) RegisterVoter(nextRewardEpochID *big.Int, address common.Address) <-chan shared.ExecuteStatus[any] {
128157
return shared.ExecuteWithRetryChan(func() (any, error) {
129-
err := r.sendRegisterVoter(nextRewardEpochId, address)
158+
err := r.sendRegisterVoter(nextRewardEpochID, address)
130159
if err != nil {
131160
if shared.ExistsAsSubstring(nonFatalRegisterErrors, err.Error()) {
132161
logger.Debugf("Non fatal error sending register voter: %v", err)
@@ -138,12 +167,26 @@ func (r *registryContractClientImpl) RegisterVoter(nextRewardEpochId *big.Int, a
138167
}, shared.MaxTxSendRetriesLong, shared.TxRetryIntervalLong)
139168
}
140169

141-
func (r *registryContractClientImpl) sendRegisterVoter(nextRewardEpochId *big.Int, address common.Address) error {
142-
epochId := uint32(nextRewardEpochId.Uint64())
143-
signature, err := r.createSignature(epochId, address)
144-
if err != nil {
145-
return err
170+
func (r *registryContractClientImpl) sendRegisterVoter(nextRewardEpochID *big.Int, address common.Address) error {
171+
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+
}
146188
}
189+
147190
vrsSignature := registry.IVoterRegistrySignature{
148191
R: [32]byte(signature[0:32]),
149192
S: [32]byte(signature[32:64]),
@@ -159,7 +202,7 @@ func (r *registryContractClientImpl) sendRegisterVoter(nextRewardEpochId *big.In
159202
r.ethClient,
160203
chain.DefaultTxTimeout,
161204
r.senderTxOpts.From,
162-
r.address,
205+
r.registryAddress,
163206
common.Big0,
164207
registryAbi,
165208
"registerVoter",
@@ -178,13 +221,14 @@ func (r *registryContractClientImpl) sendRegisterVoter(nextRewardEpochId *big.In
178221

179222
tx, err := r.registry.RegisterVoter(r.senderTxOpts, address, vrsSignature)
180223
if err != nil {
181-
return err
224+
return fmt.Errorf("sending registry tx: %w", err)
182225
}
226+
183227
err = r.txVerifier.WaitUntilMined(r.senderTxOpts.From, tx, chain.DefaultTxTimeout)
184228
if err != nil {
185229
return err
186230
}
187-
logger.Infof("Voter %s registered for epoch %v", address, nextRewardEpochId)
231+
logger.Infof("Voter %s registered for epoch %v", address, nextRewardEpochID)
188232
return nil
189233
}
190234

@@ -203,12 +247,26 @@ func (r *registryContractClientImpl) PreregisterVoter(nextRewardEpochId *big.Int
203247
}, shared.MaxTxSendRetries, shared.TxRetryInterval)
204248
}
205249

206-
func (r *registryContractClientImpl) sendPreRegisterVoter(nextRewardEpochId *big.Int, address common.Address) error {
207-
epochId := uint32(nextRewardEpochId.Uint64())
208-
signature, err := r.createSignature(epochId, address)
209-
if err != nil {
210-
return err
250+
func (r *registryContractClientImpl) sendPreRegisterVoter(nextRewardEpochID *big.Int, address common.Address) error {
251+
epochID := uint32(nextRewardEpochID.Uint64())
252+
253+
var (
254+
signature []byte
255+
err error
256+
)
257+
258+
if r.chainID != chainIDCoston2 {
259+
signature, err = r.createSignature(epochID, address)
260+
if err != nil {
261+
return fmt.Errorf("creating pre registry signature old: %w", err)
262+
}
263+
} else {
264+
signature, err = r.createSignatureNew(r.chainID, epochID, address)
265+
if err != nil {
266+
return fmt.Errorf("creating pre registry signature new: %w", err)
267+
}
211268
}
269+
212270
vrsSignature := preregistry.IVoterRegistrySignature{
213271
R: [32]byte(signature[0:32]),
214272
S: [32]byte(signature[32:64]),
@@ -217,7 +275,7 @@ func (r *registryContractClientImpl) sendPreRegisterVoter(nextRewardEpochId *big
217275

218276
err = SetGas(r.senderTxOpts, r.ethClient, r.gasCfg)
219277
if err != nil {
220-
return err
278+
return fmt.Errorf("setting gas pre registry:%w", err)
221279
}
222280

223281
estimatedGasLimit, err := chain.DryRunTxAbi(
@@ -243,19 +301,32 @@ func (r *registryContractClientImpl) sendPreRegisterVoter(nextRewardEpochId *big
243301

244302
tx, err := r.preregistry.PreRegisterVoter(r.senderTxOpts, address, vrsSignature)
245303
if err != nil {
246-
return err
304+
return fmt.Errorf("sending preregistry tx: %w", err)
247305
}
306+
248307
err = r.txVerifier.WaitUntilMined(r.senderTxOpts.From, tx, chain.DefaultTxTimeout)
249308
if err != nil {
250309
return err
251310
}
252-
logger.Infof("Voter %s pre-registered for epoch %v", address, nextRewardEpochId)
311+
logger.Infof("Voter %s pre-registered for epoch %v", address, nextRewardEpochID)
253312
return nil
254313
}
255314

256-
// createSignature creates ECDSA message signature keccak256(abi.encode(nextRewardEpochId, address)) with signerPrivateKey
257-
func (r *registryContractClientImpl) createSignature(nextRewardEpochId uint32, address common.Address) ([]byte, error) {
258-
message, err := registratorArguments.Pack(nextRewardEpochId, address)
315+
// createSignature creates ECDSA message signature keccak256(abi.encode(nextRewardEpochID, address)) with signerPrivateKey
316+
func (r *registryContractClientImpl) createSignature(nextRewardEpochID uint32, address common.Address) ([]byte, error) {
317+
message, err := registratorArguments.Pack(nextRewardEpochID, address)
318+
if err != nil {
319+
return nil, err
320+
}
321+
messageHash := crypto.Keccak256(message)
322+
return crypto.Sign(accounts.TextHash(messageHash), r.signerPrivateKey)
323+
}
324+
325+
// createSignatureNew creates ECDSA message signature keccak256(abi.encode(chainID, nextRewardEpochID, address)) with signerPrivateKey
326+
func (r *registryContractClientImpl) createSignatureNew(chainID int, nextRewardEpochID uint32, address common.Address) ([]byte, error) {
327+
chainIDB := big.NewInt(int64(chainID))
328+
329+
message, err := registratorArgumentsNew.Pack(chainIDB, nextRewardEpochID, address)
259330
if err != nil {
260331
return nil, err
261332
}

0 commit comments

Comments
 (0)