Bulls that are unable to receive NFTs will not be able to claim them later
A lot of care has been taken to ensure that, if a bull has a contract address that doesn't accept ERC721s, the NFT is saved to `withdrawableCollectionTokenId` for later withdrawal. However, because there is no way to withdraw this token to a different address (and the original address doesn't accept NFTs), it will never be able to be claimed.\\nTo settle a contract, the bear calls `settleContract()`, which sends their NFT to the bull, and withdraws the collateral and premium to the bear.\\n```\\ntry IERC721(order.collection).safeTransferFrom(bear, bull, tokenId) {}\\ncatch (bytes memory) {\\n    // Transfer NFT to BvbProtocol\\n    IERC721(order.collection).safeTransferFrom(bear, address(this), tokenId);\\n    // Store that the bull has to retrieve it\\n    withdrawableCollectionTokenId[order.collection][tokenId] = bull;\\n}\\n\\nuint bearAssetAmount = order.premium + order.collateral;\\nif (bearAssetAmount > 0) {\\n    // Transfer payment tokens to the Bear\\n    IERC20(order.asset).safeTransfer(bear, bearAssetAmount);\\n}\\n```\\n\\nIn order to address the case that the bull is a contract that can't accept NFTs, the protocol uses a try-catch setup. If the transfer doesn't succeed, it transfers the NFT into the contract, and sets `withdrawableCollectionTokenId` so that the specific NFT is attributed to the bull for later withdrawal.\\nHowever, assuming the bull isn't an upgradeable contract, this withdrawal will never be possible, because their only option is to call the same function `safeTransferFrom` to the same contract address, which will fail in the same way.\\n```\\nfunction withdrawToken(bytes32 orderHash, uint tokenId) public {\\n    address collection = matchedOrders[uint(orderHash)].collection;\\n\\n    address recipient = withdrawableCollectionTokenId[collection][tokenId];\\n\\n    // Transfer NFT to recipient\\n    IERC721(collection).safeTransferFrom(address(this), recipient, tokenId);\\n\\n    // This token is not withdrawable anymore\\n    withdrawableCollectionTokenId[collection][tokenId] = address(0);\\n\\n    emit WithdrawnToken(orderHash, tokenId, recipient);\\n}\\n```\\n
There are a few possible solutions:\\nAdd a `to` field in the `withdrawToken` function, which allows the bull `to` withdraw the NFT `to` another address\\nCreate a function similar `to` `transferPosition` that can be used `to` transfer owners of a withdrawable NFT\\nDecide that you want `to` punish bulls who aren't able `to` receive NFTs, in which case there is no need `to` save their address or implement a `withdrawToken` function
If a bull is a contract that can't receive NFTs, their orders will be matched, the bear will be able to withdraw their assets, but the bull's NFT will remain stuck in the BVB protocol contract.
```\\ntry IERC721(order.collection).safeTransferFrom(bear, bull, tokenId) {}\\ncatch (bytes memory) {\\n    // Transfer NFT to BvbProtocol\\n    IERC721(order.collection).safeTransferFrom(bear, address(this), tokenId);\\n    // Store that the bull has to retrieve it\\n    withdrawableCollectionTokenId[order.collection][tokenId] = bull;\\n}\\n\\nuint bearAssetAmount = order.premium + order.collateral;\\nif (bearAssetAmount > 0) {\\n    // Transfer payment tokens to the Bear\\n    IERC20(order.asset).safeTransfer(bear, bearAssetAmount);\\n}\\n```\\n