Problem
The functions scoreOpportunity, clamp, hashOpportunity/opportunityID, sortYield, and riskOrder are copy-pasted identically across three packages:
internal/providers/aave/client.go
internal/providers/morpho/client.go
internal/providers/defillama/client.go
This violates DRY and makes it easy for the implementations to drift. If the scoring formula or sort tiebreakers are updated in one provider but not the others, yield rankings will be inconsistent.
Suggested Fix
Extract shared yield scoring, sorting, and risk utilities into a common package (e.g., internal/providers/scoring/ or internal/yield/) and have all three adapters import from there.
Files Affected
internal/providers/aave/client.go — scoreOpportunity, clamp, hashOpportunity, sortYield, riskOrder
internal/providers/morpho/client.go — same functions
internal/providers/defillama/client.go — same functions (named opportunityID instead of hashOpportunity)
Problem
The functions
scoreOpportunity,clamp,hashOpportunity/opportunityID,sortYield, andriskOrderare copy-pasted identically across three packages:internal/providers/aave/client.gointernal/providers/morpho/client.gointernal/providers/defillama/client.goThis violates DRY and makes it easy for the implementations to drift. If the scoring formula or sort tiebreakers are updated in one provider but not the others, yield rankings will be inconsistent.
Suggested Fix
Extract shared yield scoring, sorting, and risk utilities into a common package (e.g.,
internal/providers/scoring/orinternal/yield/) and have all three adapters import from there.Files Affected
internal/providers/aave/client.go—scoreOpportunity,clamp,hashOpportunity,sortYield,riskOrderinternal/providers/morpho/client.go— same functionsinternal/providers/defillama/client.go— same functions (namedopportunityIDinstead ofhashOpportunity)