1
+ import json
1
2
import logging
2
3
import time
3
4
from collections import Counter
16
17
from oracle .networks import NETWORKS
17
18
from oracle .oracle .distributor .types import DistributorVote
18
19
from oracle .oracle .rewards .types import RewardVote
19
- from oracle .oracle .validators .types import ValidatorVote
20
+ from oracle .oracle .validators .types import ValidatorsVote
20
21
from oracle .settings import (
21
22
CONFIRMATION_BLOCKS ,
22
23
DISTRIBUTOR_VOTE_FILENAME ,
@@ -140,16 +141,26 @@ def check_distributor_vote(
140
141
141
142
142
143
def check_validator_vote (
143
- web3_client : Web3 , vote : ValidatorVote , oracle : ChecksumAddress
144
+ web3_client : Web3 , vote : ValidatorsVote , oracle : ChecksumAddress
144
145
) -> bool :
145
146
"""Checks whether oracle's validator vote is correct."""
146
147
try :
148
+ deposit_data_payloads = []
149
+ for deposit_data in vote ["deposit_data" ]:
150
+ deposit_data_payloads .append (
151
+ (
152
+ deposit_data ["operator" ],
153
+ deposit_data ["withdrawal_credentials" ],
154
+ deposit_data ["deposit_data_root" ],
155
+ deposit_data ["public_key" ],
156
+ deposit_data ["deposit_data_signature" ],
157
+ )
158
+ )
147
159
encoded_data : bytes = web3_client .codec .encode_abi (
148
- ["uint256" , "bytes" , "address " , "bytes32" ],
160
+ ["uint256" , "(address,bytes32,bytes32, bytes,bytes)[] " , "bytes32" ],
149
161
[
150
162
int (vote ["nonce" ]),
151
- vote ["public_key" ],
152
- vote ["operator" ],
163
+ deposit_data_payloads ,
153
164
vote ["validators_deposit_root" ],
154
165
],
155
166
)
@@ -168,7 +179,7 @@ def get_oracles_votes(
168
179
oracles : List [ChecksumAddress ],
169
180
) -> OraclesVotes :
170
181
"""Fetches oracle votes that match current nonces."""
171
- votes = OraclesVotes (rewards = [], distributor = [], validator = [])
182
+ votes = OraclesVotes (rewards = [], distributor = [], validators = [])
172
183
network_config = NETWORKS [network ]
173
184
aws_bucket_name = network_config ["AWS_BUCKET_NAME" ]
174
185
aws_region = network_config ["AWS_REGION" ]
@@ -183,7 +194,7 @@ def get_oracles_votes(
183
194
check_distributor_vote ,
184
195
),
185
196
(
186
- votes .validator ,
197
+ votes .validators ,
187
198
VALIDATOR_VOTE_FILENAME ,
188
199
validators_nonce ,
189
200
check_validator_vote ,
@@ -349,57 +360,67 @@ def submit_votes(
349
360
350
361
counter = Counter (
351
362
[
352
- (vote ["public_key" ], vote ["operator" ], vote ["validators_deposit_root" ])
353
- for vote in votes .validator
363
+ (
364
+ json .dumps (vote ["deposit_data" ], sort_keys = True ),
365
+ vote ["validators_deposit_root" ],
366
+ )
367
+ for vote in votes .validators
354
368
]
355
369
)
356
370
most_voted = counter .most_common (1 )
357
371
if most_voted and can_submit (most_voted [0 ][1 ], total_oracles ):
358
- public_key , operator , validators_deposit_root = most_voted [0 ][0 ]
372
+ deposit_data , validators_deposit_root = most_voted [0 ][0 ]
373
+ deposit_data = json .loads (deposit_data )
374
+
359
375
signatures = []
360
376
i = 0
361
377
while not can_submit (len (signatures ), total_oracles ):
362
- vote = votes .validator [i ]
363
- if (public_key , operator , validators_deposit_root ) == (
364
- vote ["public_key" ],
365
- vote ["operator" ],
378
+ vote = votes .validators [i ]
379
+ if (deposit_data , validators_deposit_root ) == (
380
+ vote ["deposit_data" ],
366
381
vote ["validators_deposit_root" ],
367
382
):
368
383
signatures .append (vote ["signature" ])
369
384
i += 1
370
385
371
- validator_vote : ValidatorVote = next (
386
+ validators_vote : ValidatorsVote = next (
372
387
vote
373
- for vote in votes .validator
374
- if (public_key , operator , validators_deposit_root )
388
+ for vote in votes .validators
389
+ if (deposit_data , validators_deposit_root )
375
390
== (
376
- vote ["public_key" ],
377
- vote ["operator" ],
391
+ vote ["deposit_data" ],
378
392
vote ["validators_deposit_root" ],
379
393
)
380
394
)
381
395
logger .info (
382
- f"[{ network } ] Submitting validator registration: "
383
- f"operator={ operator } , "
384
- f"public key={ public_key } , "
385
- f"validator deposit root={ validators_deposit_root } "
396
+ f"[{ network } ] Submitting validator(s) registration: "
397
+ f"count={ len (validators_vote ['deposit_data' ])} , "
398
+ f"deposit root={ validators_deposit_root } "
386
399
)
400
+ submit_deposit_data = []
401
+ submit_merkle_proofs = []
402
+ for deposit in deposit_data :
403
+ submit_deposit_data .append (
404
+ dict (
405
+ operator = deposit ["operator" ],
406
+ withdrawalCredentials = deposit ["withdrawal_credentials" ],
407
+ depositDataRoot = deposit ["deposit_data_root" ],
408
+ publicKey = deposit ["public_key" ],
409
+ signature = deposit ["deposit_data_signature" ],
410
+ )
411
+ )
412
+ submit_merkle_proofs .append (deposit ["proof" ])
413
+
387
414
submit_update (
388
415
network ,
389
416
web3_client ,
390
- oracles_contract .functions .registerValidator (
391
- dict (
392
- operator = validator_vote ["operator" ],
393
- withdrawalCredentials = validator_vote ["withdrawal_credentials" ],
394
- depositDataRoot = validator_vote ["deposit_data_root" ],
395
- publicKey = validator_vote ["public_key" ],
396
- signature = validator_vote ["deposit_data_signature" ],
397
- ),
398
- validator_vote ["proof" ],
417
+ oracles_contract .functions .registerValidators (
418
+ submit_deposit_data ,
419
+ submit_merkle_proofs ,
399
420
validators_deposit_root ,
400
421
signatures ,
401
422
),
402
423
)
403
424
logger .info (
404
- f"[{ network } ] Validator registration has been successfully submitted"
425
+ f"[{ network } ] Validator(s) registration has been successfully submitted"
405
426
)
0 commit comments