IntersectMBO / IntersectMBO/cardano-ledger

Fix `Ord` instance for `Reward` type

Open
#3,060 0 comments 0 reactions 1 assignee Claimed by @lehins View on GitHub
:credit_card: technical-debt
Dominant language
Haskell
Stars
295
Forks
179
Avg merge
4d 7h
Merged PRs (30d)
29

Description

Current `Ord` instance for `Reward` violates the law `compare r1 r2 == EQ ==> r1 == r2`

```haskell
instance Ord (Reward c) where
compare (Reward MemberReward _ _) (Reward LeaderReward _ _) = GT
compare (Reward LeaderReward _ _) (Reward MemberReward _ _) = LT
compare (Reward _ pool1 _) (Reward _ pool2 _) = compare pool1 pool2
```

This violates referential transparency and prevents libraries like `containers` that depend on `Ord` instance to function properly

In fact this bug is intentionally being abused in `aggregateRewards` and `filterReward` where `Set Reward` is being used.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.