{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "mode",
    "window",
    "inventory",
    "execution",
    "data",
    "costs"
  ],
  "properties": {
    "mode": {
      "const": "economic"
    },
    "window": {
      "$ref": "uniswap-economic.schema.json#/properties/window"
    },
    "inventory": {
      "$ref": "uniswap-economic.schema.json#/properties/inventory"
    },
    "execution": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "latency",
        "models"
      ],
      "properties": {
        "latency": {
          "$ref": "strategy.schema.json#/$defs/Duration"
        },
        "decision_interval": {
          "$ref": "strategy.schema.json#/$defs/Duration"
        },
        "models": {
          "type": "object",
          "additionalProperties": false,
          "minProperties": 1,
          "properties": {
            "aave_v3": {
              "$ref": "aave-v3-economic.schema.json#/properties/execution/properties/models"
            },
            "uniswap_v3": {
              "$ref": "uniswap-v3-economic.schema.json#/properties/execution/properties/models"
            },
            "morpho_blue": {
              "$ref": "morpho-blue-economic.schema.json#/properties/execution/properties/models"
            },
            "compound_v3": {
              "$ref": "compound-v3-economic.schema.json#/properties/execution/properties/models"
            },
            "curve": {
              "$ref": "curve-economic.schema.json#/properties/execution/properties/models"
            },
            "uniswap_v4": {
              "$ref": "uniswap-economic.schema.json#/properties/execution/properties/models"
            },
            "sparklend": {
              "$ref": "sparklend-economic.schema.json#/properties/execution/properties/models"
            },
            "gmx_v2": {
              "$ref": "gmx-v2-economic.schema.json#/$defs/Models"
            },
            "pancakeswap_v3": {
              "$ref": "pancakeswap-v3-economic.schema.json#/properties/execution/properties/models"
            },
            "aerodrome": {
              "$ref": "aerodrome-economic.schema.json#/properties/execution/properties/models"
            },
            "aerodrome_slipstream": {
              "$ref": "aerodrome-slipstream-economic.schema.json#/properties/execution/properties/models"
            },
            "aave_v4": {
              "$ref": "aave-backtest.schema.json#/oneOf/1/properties/execution/properties/models"
            }
          }
        }
      }
    },
    "data": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "connectors"
      ],
      "properties": {
        "connectors": {
          "type": "object",
          "additionalProperties": false,
          "minProperties": 1,
          "properties": {
            "aave_v3": {
              "additionalProperties": false,
              "properties": {
                "source": {
                  "const": "aave_v3_archive",
                  "title": "Source",
                  "type": "string"
                },
                "risk_model": {
                  "const": "pool_oracle_each_block",
                  "title": "Risk Model",
                  "type": "string"
                },
                "sample_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_age_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_accounting_samples": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Accounting Samples",
                  "type": "integer"
                },
                "max_risk_blocks": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Risk Blocks",
                  "type": "integer"
                },
                "max_risk_samples": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Risk Samples",
                  "type": "integer"
                },
                "max_liquidations_per_event": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Liquidations Per Event",
                  "type": "integer"
                }
              },
              "required": [
                "source",
                "risk_model",
                "sample_seconds",
                "max_age_seconds",
                "max_accounting_samples",
                "max_risk_blocks",
                "max_risk_samples",
                "max_liquidations_per_event"
              ],
              "title": "DataPolicy",
              "type": "object"
            },
            "uniswap_v3": {
              "additionalProperties": false,
              "properties": {
                "sample_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_age_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_samples": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Samples",
                  "type": "integer"
                },
                "max_bitmap_words": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Bitmap Words",
                  "type": "integer"
                },
                "max_initialized_ticks": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Initialized Ticks",
                  "type": "integer"
                },
                "coverage": {
                  "items": {
                    "$ref": "uniswap-v3-economic.schema.json#/$defs/Coverage"
                  },
                  "minItems": 1,
                  "title": "Coverage",
                  "type": "array"
                },
                "source": {
                  "const": "uniswap_v3_archive",
                  "title": "Source",
                  "type": "string"
                },
                "max_liquidity_events": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Liquidity Events",
                  "type": "integer"
                },
                "max_liquidity_log_requests": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Liquidity Log Requests",
                  "type": "integer"
                }
              },
              "required": [
                "sample_seconds",
                "max_age_seconds",
                "max_samples",
                "max_bitmap_words",
                "max_initialized_ticks",
                "coverage",
                "source",
                "max_liquidity_events",
                "max_liquidity_log_requests"
              ],
              "title": "DataPolicy",
              "type": "object"
            },
            "morpho_blue": {
              "additionalProperties": false,
              "properties": {
                "source": {
                  "const": "morpho_blue_archive",
                  "title": "Source",
                  "type": "string"
                },
                "risk_model": {
                  "const": "morpho_oracle_each_block",
                  "title": "Risk Model",
                  "type": "string"
                },
                "sample_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_age_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_accounting_samples": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Accounting Samples",
                  "type": "integer"
                },
                "max_risk_blocks": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Risk Blocks",
                  "type": "integer"
                },
                "max_risk_samples": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Risk Samples",
                  "type": "integer"
                },
                "max_liquidations_per_event": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Liquidations Per Event",
                  "type": "integer"
                }
              },
              "required": [
                "source",
                "risk_model",
                "sample_seconds",
                "max_age_seconds",
                "max_accounting_samples",
                "max_risk_blocks",
                "max_risk_samples",
                "max_liquidations_per_event"
              ],
              "title": "DataPolicy",
              "type": "object"
            },
            "compound_v3": {
              "additionalProperties": false,
              "properties": {
                "source": {
                  "const": "compound_v3_archive",
                  "title": "Source",
                  "type": "string"
                },
                "risk_model": {
                  "const": "comet_oracle_each_block",
                  "title": "Risk Model",
                  "type": "string"
                },
                "sample_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_age_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_accounting_samples": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Accounting Samples",
                  "type": "integer"
                },
                "max_risk_blocks": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Risk Blocks",
                  "type": "integer"
                },
                "max_risk_samples": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Risk Samples",
                  "type": "integer"
                },
                "max_liquidations_per_event": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Liquidations Per Event",
                  "type": "integer"
                }
              },
              "required": [
                "source",
                "risk_model",
                "sample_seconds",
                "max_age_seconds",
                "max_accounting_samples",
                "max_risk_blocks",
                "max_risk_samples",
                "max_liquidations_per_event"
              ],
              "title": "DataPolicy",
              "type": "object"
            },
            "curve": {
              "additionalProperties": false,
              "properties": {
                "sample_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_age_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_samples": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Samples",
                  "type": "integer",
                  "description": "Maximum samples per configured pool across the run and cleanup window."
                },
                "source": {
                  "const": "curve_archive",
                  "title": "Source",
                  "type": "string"
                },
                "max_parameter_events": {
                  "type": "integer",
                  "minimum": 1
                },
                "max_parameter_log_requests": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "sample_seconds",
                "max_age_seconds",
                "max_samples",
                "source",
                "max_parameter_events",
                "max_parameter_log_requests"
              ],
              "title": "DataPolicy",
              "type": "object"
            },
            "uniswap_v4": {
              "additionalProperties": false,
              "properties": {
                "sample_seconds": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 0
                    },
                    {
                      "type": "string",
                      "pattern": "^(0|[1-9][0-9]*)(s|m|h|d)$"
                    }
                  ]
                },
                "max_age_seconds": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 0
                    },
                    {
                      "type": "string",
                      "pattern": "^(0|[1-9][0-9]*)(s|m|h|d)$"
                    }
                  ]
                },
                "max_samples": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Samples",
                  "type": "integer"
                },
                "max_bitmap_words": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Bitmap Words",
                  "type": "integer"
                },
                "max_initialized_ticks": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Initialized Ticks",
                  "type": "integer"
                },
                "coverage": {
                  "items": {
                    "$ref": "uniswap-economic.schema.json#/$defs/Coverage"
                  },
                  "minItems": 1,
                  "title": "Coverage",
                  "type": "array"
                }
              },
              "required": [
                "sample_seconds",
                "max_age_seconds",
                "max_samples",
                "max_bitmap_words",
                "max_initialized_ticks",
                "coverage"
              ],
              "title": "PoolDataPolicy",
              "type": "object"
            },
            "sparklend": {
              "additionalProperties": false,
              "properties": {
                "source": {
                  "const": "sparklend_archive",
                  "title": "Source",
                  "type": "string"
                },
                "risk_model": {
                  "const": "pool_oracle_each_block",
                  "title": "Risk Model",
                  "type": "string"
                },
                "sample_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_age_seconds": {
                  "$ref": "strategy.schema.json#/$defs/Duration"
                },
                "max_accounting_samples": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Accounting Samples",
                  "type": "integer"
                },
                "max_risk_blocks": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Risk Blocks",
                  "type": "integer"
                },
                "max_risk_samples": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Risk Samples",
                  "type": "integer"
                },
                "max_liquidations_per_event": {
                  "exclusiveMinimum": 0,
                  "minimum": 0,
                  "title": "Max Liquidations Per Event",
                  "type": "integer"
                }
              },
              "required": [
                "source",
                "risk_model",
                "sample_seconds",
                "max_age_seconds",
                "max_accounting_samples",
                "max_risk_blocks",
                "max_risk_samples",
                "max_liquidations_per_event"
              ],
              "title": "DataPolicy",
              "type": "object"
            },
            "gmx_v2": {
              "additionalProperties": false,
              "properties": {
                "source": {
                  "$ref": "gmx-v2-economic.schema.json#/$defs/DataPolicy/properties/source"
                },
                "publications": {
                  "$ref": "gmx-v2-economic.schema.json#/$defs/DataPolicy/properties/publications"
                },
                "max_age_seconds": {
                  "$ref": "gmx-v2-economic.schema.json#/$defs/DataPolicy/properties/max_age_seconds"
                },
                "maximum_risk_blocks": {
                  "$ref": "gmx-v2-economic.schema.json#/$defs/DataPolicy/properties/maximum_risk_blocks"
                },
                "maximum_report_age_seconds": {
                  "$ref": "gmx-v2-economic.schema.json#/$defs/DataPolicy/properties/maximum_report_age_seconds"
                },
                "publication_limits": {
                  "$ref": "gmx-v2-economic.schema.json#/$defs/DataPolicy/properties/publication_limits"
                }
              },
              "required": [
                "source",
                "publications",
                "max_age_seconds",
                "maximum_risk_blocks",
                "maximum_report_age_seconds",
                "publication_limits"
              ],
              "type": "object"
            },
            "pancakeswap_v3": {
              "additionalProperties": false,
              "properties": {
                "sample_seconds": {
                  "$ref": "pancakeswap-v3-economic.schema.json#/properties/data/properties/sample_seconds"
                },
                "max_age_seconds": {
                  "$ref": "pancakeswap-v3-economic.schema.json#/properties/data/properties/max_age_seconds"
                },
                "max_samples": {
                  "$ref": "pancakeswap-v3-economic.schema.json#/properties/data/properties/max_samples"
                },
                "max_bitmap_words": {
                  "$ref": "pancakeswap-v3-economic.schema.json#/properties/data/properties/max_bitmap_words"
                },
                "max_initialized_ticks": {
                  "$ref": "pancakeswap-v3-economic.schema.json#/properties/data/properties/max_initialized_ticks"
                },
                "coverage": {
                  "$ref": "pancakeswap-v3-economic.schema.json#/properties/data/properties/coverage"
                },
                "source": {
                  "$ref": "pancakeswap-v3-economic.schema.json#/properties/data/properties/source"
                },
                "max_liquidity_events": {
                  "$ref": "pancakeswap-v3-economic.schema.json#/properties/data/properties/max_liquidity_events"
                },
                "max_liquidity_log_requests": {
                  "$ref": "pancakeswap-v3-economic.schema.json#/properties/data/properties/max_liquidity_log_requests"
                }
              },
              "required": [
                "sample_seconds",
                "max_age_seconds",
                "max_samples",
                "max_bitmap_words",
                "max_initialized_ticks",
                "coverage",
                "source",
                "max_liquidity_events",
                "max_liquidity_log_requests"
              ],
              "type": "object"
            },
            "aerodrome": {
              "additionalProperties": false,
              "properties": {
                "sample_seconds": {
                  "$ref": "aerodrome-economic.schema.json#/properties/data/properties/sample_seconds"
                },
                "max_age_seconds": {
                  "$ref": "aerodrome-economic.schema.json#/properties/data/properties/max_age_seconds"
                },
                "max_samples": {
                  "$ref": "aerodrome-economic.schema.json#/properties/data/properties/max_samples"
                },
                "source": {
                  "$ref": "aerodrome-economic.schema.json#/properties/data/properties/source"
                }
              },
              "required": [
                "sample_seconds",
                "max_age_seconds",
                "max_samples",
                "source"
              ],
              "type": "object"
            },
            "aerodrome_slipstream": {
              "additionalProperties": false,
              "properties": {
                "sample_seconds": {
                  "$ref": "aerodrome-slipstream-economic.schema.json#/properties/data/properties/sample_seconds"
                },
                "max_age_seconds": {
                  "$ref": "aerodrome-slipstream-economic.schema.json#/properties/data/properties/max_age_seconds"
                },
                "max_samples": {
                  "$ref": "aerodrome-slipstream-economic.schema.json#/properties/data/properties/max_samples"
                },
                "max_bitmap_words": {
                  "$ref": "aerodrome-slipstream-economic.schema.json#/properties/data/properties/max_bitmap_words"
                },
                "max_initialized_ticks": {
                  "$ref": "aerodrome-slipstream-economic.schema.json#/properties/data/properties/max_initialized_ticks"
                },
                "coverage": {
                  "$ref": "aerodrome-slipstream-economic.schema.json#/properties/data/properties/coverage"
                },
                "source": {
                  "$ref": "aerodrome-slipstream-economic.schema.json#/properties/data/properties/source"
                },
                "max_liquidity_events": {
                  "$ref": "aerodrome-slipstream-economic.schema.json#/properties/data/properties/max_liquidity_events"
                },
                "max_liquidity_log_requests": {
                  "$ref": "aerodrome-slipstream-economic.schema.json#/properties/data/properties/max_liquidity_log_requests"
                }
              },
              "required": [
                "sample_seconds",
                "max_age_seconds",
                "max_samples",
                "max_bitmap_words",
                "max_initialized_ticks",
                "coverage",
                "source",
                "max_liquidity_events",
                "max_liquidity_log_requests"
              ],
              "type": "object"
            },
            "aave_v4": {
              "additionalProperties": false,
              "properties": {
                "source": {
                  "$ref": "aave-backtest.schema.json#/oneOf/1/properties/data/properties/source"
                },
                "rate_sample_seconds": {
                  "$ref": "aave-backtest.schema.json#/oneOf/1/properties/data/properties/rate_sample_seconds"
                },
                "risk_prices": {
                  "$ref": "aave-backtest.schema.json#/oneOf/1/properties/data/properties/risk_prices"
                },
                "prices": {
                  "$ref": "aave-backtest.schema.json#/oneOf/1/properties/data/properties/prices"
                },
                "vendors": {
                  "$ref": "aave-backtest.schema.json#/oneOf/1/properties/data/properties/vendors"
                },
                "sampling_overrides": {
                  "$ref": "aave-backtest.schema.json#/oneOf/1/properties/data/properties/sampling_overrides"
                }
              },
              "required": [
                "source",
                "rate_sample_seconds",
                "risk_prices"
              ],
              "type": "object"
            }
          }
        }
      }
    },
    "costs": {
      "type": "object",
      "additionalProperties": false,
      "minProperties": 1,
      "properties": {
        "aave_v3": {
          "$ref": "aave-v3-economic.schema.json#/properties/costs"
        },
        "uniswap_v3": {
          "$ref": "uniswap-v3-economic.schema.json#/properties/costs"
        },
        "morpho_blue": {
          "$ref": "morpho-blue-economic.schema.json#/properties/costs"
        },
        "compound_v3": {
          "$ref": "compound-v3-economic.schema.json#/properties/costs"
        },
        "curve": {
          "$ref": "curve-economic.schema.json#/properties/costs"
        },
        "uniswap_v4": {
          "$ref": "uniswap-economic.schema.json#/properties/costs"
        },
        "sparklend": {
          "$ref": "sparklend-economic.schema.json#/properties/costs"
        },
        "gmx_v2": {
          "$ref": "gmx-v2-economic.schema.json#/properties/costs"
        },
        "pancakeswap_v3": {
          "$ref": "pancakeswap-v3-economic.schema.json#/properties/costs"
        },
        "aerodrome": {
          "$ref": "aerodrome-economic.schema.json#/properties/costs"
        },
        "aerodrome_slipstream": {
          "$ref": "aerodrome-slipstream-economic.schema.json#/properties/costs"
        },
        "aave_v4": {
          "$ref": "aave-backtest.schema.json#/oneOf/1/properties/costs"
        }
      }
    }
  }
}
