codehawks-2023-08-sparkn-l05
[L-05] Precision loss/Rounding to Zero in _distribute()
Summary
리워드 계산 시 나눗셈 계산에서 0으로 버림되어 불공정하거나 불완전한 리워드를 받게 된다.
Keyword
arithmetic error, rounding error, precision, loss of precision
Vulnerability
amount = totalAmount * percentages[i] / BASIS_POINTS에서 totalAmount(전체 토큰 수)가 작거나 percentages[i](토큰을 받는 비율)이 작은 경우 amount가 0이 되어 정밀도가 손실될 수 있다.
이러한 부정확성으로 인해 토큰 금액이 0으로 버림되어 수상자에게 불공정하거나 불완전한 리워드가 지급될 수 있다.
Impact
상금이 매우 작거나 비율이 낮다면 부정확하거나 무시할 수 있는 만큼의 리워드를 지급하게 될 것이다. 잠재적으로 사용자 불만과 참여 감소로 이어질 수 있다.
Mitigation
토큰 분배 계산에 미리 정의된 최소 임계값을 설정한다. 이 접근 방식은 낮은 비율을 처리하는 경우에도 합리적이고 공평한 값을 유지하도록 보장한다. (리워드의 최소값을 설정하라는 의미인 것 같다)
또는 분배 금액을 가장 가까운 정수값으로 일관되게 반올림한다. (무조건 버림하지 않도록)
tags: bughunting, sparkn, smart contract, solidity, arithmetic error, rounding error, loss of precision, severity low