Skip to content

Commit 872297f

Browse files
committed
fix: minimal conditions logic for ftso anchor feeds
1 parent 22368de commit 872297f

File tree

1 file changed

+36
-27
lines changed

1 file changed

+36
-27
lines changed

observer/validation/minimal_conditions.py

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ class Interval(Enum):
2020

2121
@frozen
2222
class MinimalConditionsConfig:
23-
lower_percentile = 0.995
24-
upper_percentile = 1.005
23+
ftso_median_band_bips = 50
24+
ftoo_median_threshold_bips = 8000
2525
threshold = 0.8
2626

2727

@@ -43,34 +43,43 @@ def calculate_ftso_anchor_feeds(
4343
) -> Sequence[Message]:
4444
mb = Message.builder()
4545
messages = []
46-
total_rounds = len(medians)
47-
if total_rounds == 0:
48-
return messages
49-
for i in range(len(medians[0])):
50-
rounds_in_interval = 0
51-
for median_list, vote_list in zip(medians, votes):
52-
if len(vote_list) < i + 1 or vote_list[i] is None:
46+
47+
total, total_hit = 0, 0
48+
49+
for median_list, vote_list in zip(medians, votes):
50+
for i in range(len(median_list)):
51+
total += 1
52+
53+
if len(vote_list) <= i or vote_list[i] is None:
5354
continue
55+
56+
median = median_list[i]
5457
vote = vote_list[i]
55-
assert vote
56-
if (
57-
MinimalConditionsConfig.lower_percentile * median_list[i].value
58-
<= vote
59-
<= MinimalConditionsConfig.upper_percentile * median_list[i].value
60-
):
61-
rounds_in_interval += 1
62-
success_rate = rounds_in_interval / total_rounds
63-
if success_rate < MinimalConditionsConfig.threshold:
64-
messages.append(
65-
mb.build(
66-
MessageLevel.WARNING,
67-
(
68-
"Not meeting minimal condition for FTSO anchor feed "
69-
f"in the latest interval, feed index: {i}, "
70-
f"success rate: {success_rate}"
71-
),
72-
)
58+
59+
assert vote is not None
60+
61+
band = MinimalConditionsConfig.ftso_median_band_bips
62+
low = median.value * (10_000 - band) / 10_000
63+
high = median.value * (10_000 + band) / 10_000
64+
65+
if low <= vote <= high:
66+
total_hit += 1
67+
68+
if not total:
69+
return messages
70+
71+
success_rate_bips = (total_hit * 10000) // total
72+
73+
if success_rate_bips < MinimalConditionsConfig.ftoo_median_threshold_bips:
74+
messages.append(
75+
mb.build(
76+
MessageLevel.WARNING,
77+
(
78+
"not meeting minimal condition for FTSO anchor feeds in past "
79+
f"two hours - success rate: {success_rate_bips / 100:.2f}%"
80+
),
7381
)
82+
)
7483

7584
return messages
7685

0 commit comments

Comments
 (0)