IntersectMBO / IntersectMBO/cardano-ledger
Fix `Ord` instance for `Reward` type
Open
: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
Assessment
This issue has not been assessed yet.