File tree Expand file tree Collapse file tree 2 files changed +33
-9
lines changed Expand file tree Collapse file tree 2 files changed +33
-9
lines changed Original file line number Diff line number Diff line change 1
1
from datetime import datetime
2
+ from collections import Counter
2
3
from typing import List , Any , Optional , Dict
3
4
import uuid
4
5
import logging
@@ -44,6 +45,13 @@ class DublicateClaimantError(Exception):
44
45
pass
45
46
46
47
48
+ class DuplicateLeaderboardAddressError (Exception ):
49
+ def __init__ (self , message , duplicates ):
50
+ super (DuplicateLeaderboardAddressError , self ).__init__ (message )
51
+ self .message = message
52
+ self .duplicates = duplicates
53
+
54
+
47
55
BATCH_SIGNATURE_PAGE_SIZE = 500
48
56
49
57
logger = logging .getLogger (__name__ )
@@ -1150,7 +1158,15 @@ def add_scores(
1150
1158
1151
1159
normalizer_fn = Web3 .toChecksumAddress
1152
1160
if not normalize_addresses :
1153
- normalizer_fn = lambda x : x
1161
+ normalizer_fn = lambda x : x # type: ignore
1162
+
1163
+ addresses = [score .address for score in scores ]
1164
+
1165
+ if len (addresses ) != len (set (addresses )):
1166
+
1167
+ duplicates = [key for key , value in Counter (addresses ).items () if value > 1 ]
1168
+
1169
+ raise DuplicateLeaderboardAddressError ("Dublicated addresses" , duplicates )
1154
1170
1155
1171
if overwrite :
1156
1172
db_session .query (LeaderboardScores ).filter (
Original file line number Diff line number Diff line change @@ -218,13 +218,21 @@ async def leaderboard(
218
218
raise EngineHTTPException (
219
219
status_code = 403 , detail = "You don't have access to this leaderboard."
220
220
)
221
-
222
- leaderboard_points = actions .add_scores (
223
- db_session = db_session ,
224
- leaderboard_id = leaderboard_id ,
225
- scores = scores ,
226
- overwrite = overwrite ,
227
- normalize_addresses = normalize_addresses ,
228
- )
221
+ try :
222
+ leaderboard_points = actions .add_scores (
223
+ db_session = db_session ,
224
+ leaderboard_id = leaderboard_id ,
225
+ scores = scores ,
226
+ overwrite = overwrite ,
227
+ normalize_addresses = normalize_addresses ,
228
+ )
229
+ except actions .DuplicateLeaderboardAddressError as e :
230
+ raise EngineHTTPException (
231
+ status_code = 409 ,
232
+ detail = f"Duplicates in push to database is disallowed.\n List of duplicates:{ e .duplicates } .\n Please handle duplicates manualy." ,
233
+ )
234
+ except Exception as e :
235
+ logger .error (f"Score update failed with error: { e } " )
236
+ raise EngineHTTPException (status_code = 500 , detail = "Score update failed." )
229
237
230
238
return leaderboard_points
You can’t perform that action at this time.
0 commit comments