Return data from the external call not verified during deposit and redemption
The deposit and redemption functions did not verify the return data from the external call, which might cause the contract to wrongly assume that the deposit/redemption went well although the action has actually failed in the background.\\n```\\nFile: GenericToken.sol\\n    function executeLowLevelCall(\\n        address target,\\n        uint256 msgValue,\\n        bytes memory callData\\n    ) internal {\\n        (bool status, bytes memory returnData) = target.call{value: msgValue}(callData);\\n        require(status, checkRevertMessage(returnData));\\n    }\\n```\\n\\nWhen the external call within the `GenericToken.executeLowLevelCall` function reverts, the `status` returned from the `.call` will be `false`. In this case, Line 69 above will revert.\\n```\\nFile: TreasuryAction.sol\\n            for (uint256 j; j < depositData.targets.length; ++j) {\\n                // This will revert if the individual call reverts.\\n                GenericToken.executeLowLevelCall(\\n                    depositData.targets[j], \\n                    depositData.msgValue[j], \\n                    depositData.callData[j]\\n                );\\n            }\\n```\\n\\nFor deposit and redeem, Notional assumes that all money markets will revert if the deposit/mint and redeem/burn has an error. Thus, it does not verify the return data from the external call. Refer to the comment in Line 317 above.\\nHowever, this is not always true due to the following reasons:\\nSome money markets might not revert when errors occur but instead return `false (0)`. In this case, the current codebase will wrongly assume that the deposit/redemption went well although the action has failed.\\nCompound might upgrade its contracts to return errors instead of reverting in the future.
Consider checking the `returnData` to ensure that the external money market returns a successful response after deposit and redemption.\\nNote that the successful response returned from various money markets might be different. Some protocols return `1` on a successful action, while Compound return zero (NO_ERROR).
The gist of prime cash is to integrate with multiple markets. Thus, the codebase should be written in a manner that can handle multiple markets. Otherwise, the contract will wrongly assume that the deposit/redemption went well although the action has actually failed in the background, which might potentially lead to some edge cases where assets are sent to the users even though the redemption fails.
```\\nFile: GenericToken.sol\\n    function executeLowLevelCall(\\n        address target,\\n        uint256 msgValue,\\n        bytes memory callData\\n    ) internal {\\n        (bool status, bytes memory returnData) = target.call{value: msgValue}(callData);\\n        require(status, checkRevertMessage(returnData));\\n    }\\n```\\n