LOW severity: Missing zero output validation in `SecuritizeAmmNavProvider` quote and buy functions. **Description:** `SecuritizeAmmNavProvider::quoteBuyBase, quoteSellBase, executeBuyBase, executeSellBase` lack validation that output values are non-zero. Apart from issues already mentioned where rounding down to zero can occur, there are multiple other calculation points which can result in the...

Vulnerable code:
uint256 scaleDown = 10 ** (18 - d);
execPrice = rawExecPriceWad / scaleDown;

baseReserves = newBase;
   quoteReserves = newQuote;
   k = newBase * newQuote;

function executeBuyBase(
    uint256 amountInQuote,
    uint256 anchorPriceWad,
    uint8 marketStatus
) external onlyRole(EXECUTOR_ROLE) returns (uint256 baseOut, uint256 execPrice) {
    // ... existing logic ...
    if (marketStatus == CLOSED_MARKET) {
        (baseOut, rawExecPriceWad) = _pricingFromCurveBuy(amountInQuote, curvePriceWad, anchorPriceWad);
    } else if (marketStatus == OPEN_MARKET) {
        rawExecPriceWad = anchorPriceWad;
        baseOut = (amountInQuote * WAD) / rawExecPriceWad;
    } else {
        revert("invalid market status");
    }

+   require(baseOut > 0, "baseOut=0");

    baseReserves = newBase;
    quoteReserves = newQuote;
    k = newBase * newQuote;

    _recordTrade(marketStatus, anchorPriceWad);

    uint8 d = asset.decimals();
    require(d <= 18, "decimals > 18");
    uint256 scaleDown = 10 ** (18 - d);

    execPrice = rawExecPriceWad / scaleDown;

+   require(execPrice > 0, "execPrice=0");

    emit ExecuteBuy(msg.sender, amountInQuote, baseOut, rawExecPriceWad);
}

function executeSellBase(
    uint256 amountInBase,
    uint256 anchorPriceWad,
    uint8 marketStatus
) external onlyRole(EXECUTOR_ROLE) returns (uint256 quoteOut, uint256 execPrice) {
    // ... existing logic ...
    if (marketStatus == CLOSED_MARKET) {
        (quoteOut, rawExecPriceWad) = _pricingFromCurveSell(amountInBase, curvePriceWad, anchorPriceWad);
    } else if (marketStatus == OPEN_MARKET) {
        rawExecPriceWad = anchorPriceWad;
        quoteOut = (amountInBase * rawExecPriceWad) / WAD;
    } else {
        revert("invalid market status");
    }

+   require(quoteOut > 0, "quoteOut=0");

    baseReserves = newBase;
    quoteReserves = newQuote;
    k = newBase * newQuote;

    _recordTrade(marketStatus, anchorPriceWad);

    uint8 d = asset.decimals();
    require(d <= 18, "decimals > 18");
    uint256 scaleDown = 10 ** (18 - d);

    execPrice = rawExecPriceWad / scaleDown;

+   require(execPrice > 0, "execPrice=0");

    emit ExecuteSell(msg.sender, amountInBase, quoteOut, rawExecPriceWad);
}

function quoteBuyBase(
    uint256 amountInQuote,
    uint256 anchorPriceWad,
    uint8 marketStatus
) external view returns (uint256 baseOut, uint256 execPrice) {
    // ... existing logic ...
+   require(baseOut > 0, "baseOut=0");

    execPrice = rawExecPriceWad / scaleDown;
+   require(execPrice > 0, "execPrice=0");
}

function quoteSellBase(
    uint256 amountInBase,
    uint256 anchorPriceWad,
    uint8 marketStatus
) external view returns (uint256 quoteOut, uint256 execPrice) {
    // ... existing logic ...
+   require(quoteOut > 0, "quoteOut=0");

    execPrice = rawExecPriceWad / scaleDown;
+   require(execPrice > 0, "execPrice=0");
}