MidnightMempool

Validate a mempool payload

Use this endpoint before submitting an encoded payload to the mempool. It checks whether the router would accept the payload for indexing; it does not prove a later on-chain transaction will succeed. data.issues is empty when the payload passes. When issues are returned, each rule appears once for the whole payload, not once per offer.

Issue names you may see:

Payload format

  • payload_version: payload uses an unsupported version.
  • payload_frame: payload is not valid hex or is missing required framing bytes.
  • payload_gzip_length: declared compressed length does not match the payload bytes.
  • payload_suffix_too_large: trailing attribution or suffix bytes exceed the allowed size.
  • payload_decompression: compressed bytes cannot be decompressed or exceed size limits.
  • payload_abi_decode: decompressed bytes are not a valid offer list.
  • empty_payload: payload contains no offers.
  • max_offers_per_tree: payload contains more offers than the chain allows.
  • duplicate_offer_hash: the same offer appears more than once.

Chain and market support

  • unsupported_chain: chain_id is not supported.
  • zero_morpho_offer_config: an offer embeds the zero Morpho V2 deployment address.
  • maturity: market maturity is outside the allowed maturity windows.
  • market_triplet: loan token, collateral token, and oracle combination is not supported.
  • collateral_lltv: collateral loan-to-value tier is not enabled.
  • max_lif: liquidation incentive setting is not enabled.
  • max_collaterals: an offer uses too many collateral entries.

Offer terms

  • amount_missing: neither max_units nor max_assets is set.
  • amount_conflict: both max_units and max_assets are set; choose one.
  • min_offer_assets_usd: the loan token has no configured minimum, or offer size is below the chain's minimum value floor.
  • min_tick: price tick is below the allowed range.
  • max_tick: price tick is above the allowed range.
  • tick_spacing: price tick is not on the allowed tick grid.
  • min_duration: offer start/expiry window is too short.
  • ratifier: ratifier contract is not accepted for the chain.

Batch consistency

  • mixed_maker: offers in one payload use different makers.
  • mixed_ratifier: offers in one payload use different ratifiers.
  • group_identity: group id does not match the offers in that group.
  • group_consistency: offers sharing a group have conflicting terms or overlapping active windows.

Callbacks

  • non_empty_callback: callbacks with custom address or data are not accepted.
POST
/v0/midnight/mempool/validate

Query Parameters

timestamp?string

Optional ISO-8601 UTC timestamp. Uses the policy snapshot active at the latest 15:00 UTC boundary at or before this timestamp; omitted uses the current time.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://api.morpho.org/v0/midnight/mempool/validate?timestamp=2026-06-01T16%3A00%3A00Z" \  -H "Content-Type: application/json" \  -d '{    "chain_id": 1,    "payload": "0x01000000..."  }'
{
  "data": {
    "issues": [
      {
        "rule": "amount_conflict"
      },
      {
        "rule": "tick_spacing"
      }
    ]
  }
}
{
  "error": {
    "code": "VALIDATION_ERROR",
    "details": [
      {
        "field": "limit",
        "issue": "Limit must be greater than 0."
      }
    ],
    "message": "Limit must be greater than 0.",
    "request_id": "req-123"
  }
}
{
  "error": {
    "code": "VALIDATION_ERROR",
    "details": [
      {
        "field": "limit",
        "issue": "Limit must be greater than 0."
      }
    ],
    "message": "Limit must be greater than 0.",
    "request_id": "req-123"
  }
}
{
  "error": {
    "code": "VALIDATION_ERROR",
    "details": [
      {
        "field": "limit",
        "issue": "Limit must be greater than 0."
      }
    ],
    "message": "Limit must be greater than 0.",
    "request_id": "req-123"
  }
}