@@ -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+
2731var (
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
85110type 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
97123func 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