@@ -30,29 +30,29 @@ const (
30
30
31
31
// EonKeyPublisher is a service that publishes eon keys via a eon key publisher contract.
32
32
type EonKeyPublisher struct {
33
- dbpool * pgxpool.Pool
34
- client * ethclient.Client
35
- contract * bindings.EonKeyPublish
36
- privateKey * ecdsa.PrivateKey
33
+ dbpool * pgxpool.Pool
34
+ client * ethclient.Client
35
+ keyperSetManager * bindings.KeyperSetManager
36
+ privateKey * ecdsa.PrivateKey
37
37
38
38
keys chan keyper.EonPublicKey
39
39
}
40
40
41
41
func NewEonKeyPublisher (
42
42
dbpool * pgxpool.Pool ,
43
43
client * ethclient.Client ,
44
- eonKeyPublishAddress common.Address ,
44
+ keyperSetManagerAddress common.Address ,
45
45
privateKey * ecdsa.PrivateKey ,
46
46
) (* EonKeyPublisher , error ) {
47
- contract , err := bindings .NewEonKeyPublish ( eonKeyPublishAddress , client )
47
+ keyperSetManager , err := bindings .NewKeyperSetManager ( keyperSetManagerAddress , client )
48
48
if err != nil {
49
- return nil , errors .Wrap (err , "failed to instantiate eon key publisher contract" )
49
+ return nil , errors .Wrapf (err , "failed to instantiate keyper set manager contract at address %s" , keyperSetManagerAddress . Hex () )
50
50
}
51
51
return & EonKeyPublisher {
52
- dbpool : dbpool ,
53
- client : client ,
54
- contract : contract ,
55
- privateKey : privateKey ,
52
+ dbpool : dbpool ,
53
+ client : client ,
54
+ keyperSetManager : keyperSetManager ,
55
+ privateKey : privateKey ,
56
56
57
57
keys : make (chan keyper.EonPublicKey , eonKeyChannelSize ),
58
58
}, nil
@@ -83,7 +83,7 @@ func (p *EonKeyPublisher) Publish(key keyper.EonPublicKey) {
83
83
// set, unless the key is already confirmed or the keyper has already voted on it.
84
84
func (p * EonKeyPublisher ) publishIfResponsible (ctx context.Context , key keyper.EonPublicKey ) {
85
85
db := obskeyperdb .New (p .dbpool )
86
- keyperSet , err := db .GetKeyperSetByKeyperConfigIndex (ctx , int64 (key .Eon ))
86
+ keyperSet , err := db .GetKeyperSetByKeyperConfigIndex (ctx , int64 (key .KeyperConfigIndex ))
87
87
if err != nil {
88
88
log .Error ().
89
89
Err (err ).
@@ -121,11 +121,21 @@ func (p *EonKeyPublisher) publishOldKeys(ctx context.Context) {
121
121
}
122
122
dkgResult , err := shdb .DecodePureDKGResult (dkgResultDB .PureResult )
123
123
if err != nil {
124
- err := errors .Wrapf (err , "failed to decode DKG result of eon %d" , dkgResultDB .Eon )
125
- log .Error ().Err (err ).Msg ("failed to publish old eon keys" )
124
+ log .Error ().
125
+ Err (err ).
126
+ Int64 ("eon" , dkgResultDB .Eon ).
127
+ Msg ("failed to decode DKG result to publish old eon key" )
126
128
continue
127
129
}
128
- p .publish (ctx , dkgResult .PublicKey .Marshal (), dkgResult .Eon , dkgResult .Keyper )
130
+ eon , err := db .GetEon (ctx , dkgResultDB .Eon )
131
+ if err != nil {
132
+ log .Error ().
133
+ Err (err ).
134
+ Int64 ("eon" , dkgResultDB .Eon ).
135
+ Msg ("failed to fetch eon to publish old eon public key" )
136
+ continue
137
+ }
138
+ p .publish (ctx , dkgResult .PublicKey .Marshal (), uint64 (eon .KeyperConfigIndex ), dkgResult .Keyper )
129
139
}
130
140
}
131
141
@@ -145,8 +155,12 @@ func (p *EonKeyPublisher) publish(ctx context.Context, key []byte, keyperSetInde
145
155
}
146
156
147
157
func (p * EonKeyPublisher ) tryPublish (ctx context.Context , key []byte , keyperSetIndex uint64 , keyperIndex uint64 ) error {
158
+ contract , err := p .getEonKeyPublisherContract (keyperSetIndex )
159
+ if err != nil {
160
+ return err
161
+ }
148
162
keyperAddress := ethcrypto .PubkeyToAddress (p .privateKey .PublicKey )
149
- hasAlreadyVoted , err := p . contract .HasKeyperVoted (& bind.CallOpts {}, keyperAddress )
163
+ hasAlreadyVoted , err := contract .HasKeyperVoted (& bind.CallOpts {}, keyperAddress )
150
164
if err != nil {
151
165
return errors .Wrap (err , "failed to query eon key publisher contract if keyper has already voted" )
152
166
}
@@ -158,7 +172,7 @@ func (p *EonKeyPublisher) tryPublish(ctx context.Context, key []byte, keyperSetI
158
172
Msg ("not publishing eon key as keyper has already voted" )
159
173
return nil
160
174
}
161
- isAlreadyConfirmed , err := p . contract .EonKeyConfirmed (& bind.CallOpts {}, key )
175
+ isAlreadyConfirmed , err := contract .EonKeyConfirmed (& bind.CallOpts {}, key )
162
176
if err != nil {
163
177
return errors .Wrap (err , "failed to query eon key publisher contract if eon key is confirmed" )
164
178
}
@@ -178,7 +192,7 @@ func (p *EonKeyPublisher) tryPublish(ctx context.Context, key []byte, keyperSetI
178
192
if err != nil {
179
193
return errors .Wrap (err , "failed to construct tx opts" )
180
194
}
181
- tx , err := p . contract .PublishEonKey (opts , key , keyperIndex )
195
+ tx , err := contract .PublishEonKey (opts , key , keyperIndex )
182
196
if err != nil {
183
197
return errors .Wrap (err , "failed to send publish eon key tx" )
184
198
}
@@ -206,3 +220,24 @@ func (p *EonKeyPublisher) tryPublish(ctx context.Context, key []byte, keyperSetI
206
220
Msg ("successfully published eon key" )
207
221
return nil
208
222
}
223
+
224
+ func (p * EonKeyPublisher ) getEonKeyPublisherContract (keyperSetIndex uint64 ) (* bindings.EonKeyPublish , error ) {
225
+ opts := & bind.CallOpts {}
226
+ keyperSetAddress , err := p .keyperSetManager .GetKeyperSetAddress (opts , keyperSetIndex )
227
+ if err != nil {
228
+ return nil , errors .Wrapf (err , "failed to get keyper set address from manager for index %d" , keyperSetIndex )
229
+ }
230
+ keyperSet , err := bindings .NewKeyperSet (keyperSetAddress , p .client )
231
+ if err != nil {
232
+ return nil , errors .Wrapf (err , "failed to instantiate keyper set contract at address %s" , keyperSetAddress .Hex ())
233
+ }
234
+ eonKeyPublisherAddress , err := keyperSet .GetPublisher (opts )
235
+ if err != nil {
236
+ return nil , errors .Wrapf (err , "failed to get eon key publisher contract from keyper set at address %s" , keyperSetAddress .Hex ())
237
+ }
238
+ eonKeyPublisher , err := bindings .NewEonKeyPublish (eonKeyPublisherAddress , p .client )
239
+ if err != nil {
240
+ return nil , errors .Wrapf (err , "failed to instantiate eon key publisher contract at address %s" , eonKeyPublisherAddress .Hex ())
241
+ }
242
+ return eonKeyPublisher , nil
243
+ }
0 commit comments