There is no deadline when swapping tokens using EvolvingProteus. Swaps that are done through low gas transactions may be stuck in the mempool for a long time, resulting in unfavourable swap.
Proof of Concept
Evolving prometeus seems like an upgrade to uniswapv3 and its primarily for dutch auctions and dynamic pools. This means that they have a swap feature as well, but the swap feature doesn't have a deadline check attached. When transactions are performed using the shell protocol, if there is a huge inflow of transactions in the blockchain, the transaction might stay dormant in the mempool for awhile, and will result in unfavourable swap.
function swapGivenInputAmount(
uint256 xBalance,
uint256 yBalance,
uint256 inputAmount,
SpecifiedToken inputToken
) external view returns (uint256 outputAmount) {
//@audit there is no instance of checking the deadline here
// input amount validations against the current balance
require(
inputAmount < INT_MAX && xBalance < INT_MAX && yBalance < INT_MAX
);
_checkAmountWithBalance(
(inputToken == SpecifiedToken.X) ? xBalance : yBalance,
inputAmount
);
int256 result = _swap(
FEE_DOWN,
int256(inputAmount),
int256(xBalance),
int256(yBalance),
inputToken
);
// amount cannot be less than 0
require(result < 0);
// output amount validations against the current balance
outputAmount = uint256(-result);
_checkAmountWithBalance(
(inputToken == SpecifiedToken.X) ? yBalance : xBalance,
outputAmount
);
}
Tools Used
Manual Review
Recommended Mitigation Steps
UniswapV3 has the checkDeadline function to make sure that transactions will auto revert after passing a certain deadline to prevent unfavourable swaps.
Lines of code
https://github.com/code-423n4/2023-08-shell/blob/c61cf0e01bada04c3d6055acb81f61955ed600aa/src/proteus/EvolvingProteus.sol#L272-L304
Vulnerability details
Impact
There is no deadline when swapping tokens using EvolvingProteus. Swaps that are done through low gas transactions may be stuck in the mempool for a long time, resulting in unfavourable swap.
Proof of Concept
Evolving prometeus seems like an upgrade to uniswapv3 and its primarily for dutch auctions and dynamic pools. This means that they have a swap feature as well, but the swap feature doesn't have a deadline check attached. When transactions are performed using the shell protocol, if there is a huge inflow of transactions in the blockchain, the transaction might stay dormant in the mempool for awhile, and will result in unfavourable swap.
Tools Used
Manual Review
Recommended Mitigation Steps
UniswapV3 has the checkDeadline function to make sure that transactions will auto revert after passing a certain deadline to prevent unfavourable swaps.
https://etherscan.io/address/0xe592427a0aece92de3edee1f18e0157c05861564#code
Assessed type
Timing