Open c4-bot-5 opened 11 months ago
0xleastwood marked the issue as primary issue
Oh this is very interesting and careful point! So instead of the current check, we can do
params.marginTo > collateralTo - cache.amountToBorrowed ? 0 : collateralTo - cache.amountToBorrowed - params.marginTo
we still need marginTo to make the minimum amount for the swap right, happy to go back to the figures in https://excalidraw.com/#json=TcmwLn2W4K9H_UlCExFXa,J_yKjXNaowF0gYL8uvPruA for further discussion
0xleastwood marked the issue as selected for report
confirm with the issue but our intended fix is slightly different from suggested.
wukong-particle (sponsor) confirmed
Good catch 👍
Lines of code
https://github.com/code-423n4/2023-12-particle/blob/main/contracts/protocol/ParticlePositionManager.sol#L212
Vulnerability details
Description
marginTo/From
is a way to both cover your position and increase your premium when opening a position. There is however a unintended limit on how muchmarginTo
you can provide when opening a position.When doing the swap to increase leverage, the
amountToMinimum
(minimum received amount) is calculated:ParticlePositionManager::openPosition
:As you see here, a
marginTo > collateralTo - cache.amountToBorrowed
will underflow this calculation. Thus there is no way to provide a bigger margin than this.Impact
A user cannot supply more margin than
collateralTo - amountToBorrowed
before the opening of the position reverts.There is a workaround to supply no
marginTo
and then useaddPremium
to increase the premium but I believe this issue still breaks the intended purpose ofmarginTo
in theopenPosition
call.Proof of Concept
Test in
OpenPosition.t.sol
:Tools Used
Manual audit
Recommended Mitigation Steps
Consider not counting
marginTo
towards expected output from the swap. As shown in another issue, there are further problems with this.marginTo
is the premium for the "to"-side of the position. Hence should not be part of the expected output of the swap as it is the safety for the position.Assessed type
Under/Overflow