# M-1 ## Title Possible DOS in `wrap`, `unwrap`, `_validateTokenIds` and methods that calls them because the number of tokenIds is not limited ## Links to affected code https://github.com/code-423n4/2022-12-caviar/blob/main/src/Pair.sol#L238 https://github.com/code-423n4/2022-12-caviar/blob/main/src/Pair.sol#L258 https://github.com/code-423n4/2022-12-caviar/blob/main/src/Pair.sol#L468 ## Impact `wrap`, `unwrap`, `_validateTokenIds` methods takes tokenIds as a parameter but they don't hava a upper bound and this may lead to the gas limit and transactions will be failed or reverted. Same issuse goes with `nftAdd`, `nftRemove`, `nftBuy` and `nftSell` because they call `wrap`, `unwrap` or `_validateTokenIds`. ## Proof of Concept There are no upper bound for tokenIds and too many number of tokenIds might cause transactions to reach the gas limit. ```solidity // Pair.sol L238-L240 for (uint256 i = 0; i < tokenIds.length; i++) { ERC721(nft).safeTransferFrom(msg.sender, address(this), tokenIds[i]); } ``` ```solidity // Pair.sol L258-L260 for (uint256 i = 0; i < tokenIds.length; i++) { ERC721(nft).safeTransferFrom(address(this), msg.sender, tokenIds[i]); } ``` ```solidity // Pair.sol L468-L471 for (uint256 i = 0; i < tokenIds.length; i++) { bool isValid = MerkleProofLib.verify(proofs[i], merkleRoot, keccak256(abi.encodePacked(tokenIds[i]))); require(isValid, "Invalid merkle proof"); } ``` ## Tools Used Manual Review ## Recommended Mitigation Steps Set an upper bound for the length of `tokenIds`. # L-1 Mediumか迷ってLowで出そうとしていますが、一旦載せておきます。 unchainとして提出しない場合は個人でlowとして提出しようと思います。 ## Title [L-AH-01] BaseToken cannot be withdrawn if LP token is lost. ## Summary The baseToken sent to Pair contract by the `add` method can only be retrieved by calling the `remove` method; if the LP token is sent to a zero address, for example, the baseToken cannot be retrieved. This is a valid issue because [the doc](https://github.com/code-423n4/2022-12-caviar/blob/main/docs/SECURITY.md#stuck-tokensnfts) does't say about LP token is stuck.