Platform: Code4rena
Start Date: 04/01/2022
Pot Size: $75,000 USDC
Total HM: 17
Participants: 33
Period: 7 days
Judge: 0xean
Total Solo HM: 14
Id: 74
League: ETH
Rank: 7/33
Findings: 1
Award: $1,703.85
🌟 Selected for report: 1
🚀 Solo Findings: 1
🌟 Selected for report: egjlmn1
1703.8454 USDC - $1,703.85
egjlmn1
in the pay()
function users repay their debt and in line 364:
https://github.com/code-423n4/2022-01-timeswap/blob/main/Timeswap/Timeswap-V1-Core/contracts/TimeswapPair.sol#L364
it decreases their debt.
lets say a user wants to repay all his debt, he calls the pay()
function with his full debt.
an attacker can see it and frontrun to repay a single token for his debt (since it's likely the token uses 18 decimals, a single token is worth almost nothing)
and since your solidity version is above 0.8.0 the line:
due.debt -= assetsIn[i];
will revert due to underflow
The attacker can keep doing it everytime the user is going to pay and since 1 token is baisicly 0$ (18 decimals) the attacker doesn't lose real money
A DoS on every user that repay his full debt (or enough that the difference between his total debt to what he pays his negligible)
From solidity docs
Since Solidity 0.8.0, all arithmetic operations revert on over- and underflow by default, thus making the use of these libraries unnecessary.
manual code review
if assetsIn[i]
is bigger than due.debt
set assetsIn[i]=due.debt
and due.debt=0
#0 - Mathepreneur
2022-01-17T17:28:10Z
The convenience contract will implement how much asset to pay in.