{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://xcim.invalid/ietf/nb01/schemas/bootstrap.schema.json",
  "title": "NB01-F01 bootstrap",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "artifact_version",
    "receiver_id",
    "node_id",
    "policy_epoch",
    "bootstrap_epoch",
    "bor_chain_id",
    "bor_genesis_block_hash",
    "heimdall_chain_id",
    "parent_chain_id",
    "software",
    "expected_bor_client_version",
    "expected_heimdall_app_version",
    "linkage",
    "endpoints",
    "checkpoint",
    "valid_from",
    "valid_until",
    "limits"
  ],
  "properties": {
    "artifact_version": {
      "const": "nb-01"
    },
    "receiver_id": {
      "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/id"
    },
    "node_id": {
      "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/id"
    },
    "policy_epoch": {
      "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/positive"
    },
    "bootstrap_epoch": {
      "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/positive"
    },
    "bor_chain_id": {
      "const": 80002
    },
    "bor_genesis_block_hash": {
      "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/hex32"
    },
    "heimdall_chain_id": {
      "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/id"
    },
    "parent_chain_id": {
      "const": 11155111
    },
    "software": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "bor",
        "heimdall"
      ],
      "properties": {
        "bor": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "release",
            "source_commit",
            "binary_sha256",
            "config_sha256",
            "genesis_file_sha256"
          ],
          "properties": {
            "release": {
              "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/id"
            },
            "source_commit": {
              "type": "string",
              "pattern": "^[0-9a-f]{40}$"
            },
            "binary_sha256": {
              "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/hex32"
            },
            "config_sha256": {
              "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/hex32"
            },
            "genesis_file_sha256": {
              "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/hex32"
            }
          }
        },
        "heimdall": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "release",
            "source_commit",
            "binary_sha256",
            "config_sha256",
            "genesis_file_sha256"
          ],
          "properties": {
            "release": {
              "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/id"
            },
            "source_commit": {
              "type": "string",
              "pattern": "^[0-9a-f]{40}$"
            },
            "binary_sha256": {
              "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/hex32"
            },
            "config_sha256": {
              "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/hex32"
            },
            "genesis_file_sha256": {
              "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/hex32"
            }
          }
        }
      }
    },
    "expected_bor_client_version": {
      "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/id"
    },
    "expected_heimdall_app_version": {
      "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/id"
    },
    "linkage": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "bor_uses_admitted_heimdall",
        "heimdall_uses_admitted_bor",
        "consensus_validation_enabled",
        "state_sync_bootstrap_reviewed"
      ],
      "properties": {
        "bor_uses_admitted_heimdall": {
          "const": true
        },
        "heimdall_uses_admitted_bor": {
          "const": true
        },
        "consensus_validation_enabled": {
          "const": true
        },
        "state_sync_bootstrap_reviewed": {
          "const": true
        }
      }
    },
    "endpoints": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "bor",
        "comet",
        "heimdall"
      ],
      "properties": {
        "bor": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "url",
            "certificate_sha256"
          ],
          "properties": {
            "url": {
              "type": "string",
              "pattern": "^https://(?:127\\.0\\.0\\.1|\\[::1\\]):[0-9]{1,5}(?:/[A-Za-z0-9_-]+)*$",
              "maxLength": 256
            },
            "certificate_sha256": {
              "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/hex32"
            }
          }
        },
        "comet": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "url",
            "certificate_sha256"
          ],
          "properties": {
            "url": {
              "type": "string",
              "pattern": "^https://(?:127\\.0\\.0\\.1|\\[::1\\]):[0-9]{1,5}(?:/[A-Za-z0-9_-]+)*$",
              "maxLength": 256
            },
            "certificate_sha256": {
              "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/hex32"
            }
          }
        },
        "heimdall": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "url",
            "certificate_sha256"
          ],
          "properties": {
            "url": {
              "type": "string",
              "pattern": "^https://(?:127\\.0\\.0\\.1|\\[::1\\]):[0-9]{1,5}(?:/[A-Za-z0-9_-]+)*$",
              "maxLength": 256
            },
            "certificate_sha256": {
              "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/hex32"
            }
          }
        }
      }
    },
    "checkpoint": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "bor",
        "heimdall",
        "trusted_until"
      ],
      "properties": {
        "bor": {
          "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/block"
        },
        "heimdall": {
          "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/block"
        },
        "trusted_until": {
          "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/positive"
        }
      }
    },
    "valid_from": {
      "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/safe"
    },
    "valid_until": {
      "$ref": "https://xcim.invalid/ietf/nb01/schemas/common.schema.json#/$defs/positive"
    },
    "limits": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "per_call_ms",
        "total_ms",
        "max_calls",
        "max_ancestry",
        "response_bytes",
        "total_bytes",
        "max_clock_uncertainty",
        "max_header_age",
        "max_cache_age"
      ],
      "properties": {
        "per_call_ms": {
          "type": "integer",
          "minimum": 1,
          "maximum": 2000
        },
        "total_ms": {
          "type": "integer",
          "minimum": 1,
          "maximum": 10000
        },
        "max_calls": {
          "type": "integer",
          "minimum": 1,
          "maximum": 256
        },
        "max_ancestry": {
          "type": "integer",
          "minimum": 1,
          "maximum": 128
        },
        "response_bytes": {
          "type": "integer",
          "minimum": 256,
          "maximum": 1048576
        },
        "total_bytes": {
          "type": "integer",
          "minimum": 256,
          "maximum": 8388608
        },
        "max_clock_uncertainty": {
          "type": "integer",
          "minimum": 0,
          "maximum": 60
        },
        "max_header_age": {
          "type": "integer",
          "minimum": 1,
          "maximum": 120
        },
        "max_cache_age": {
          "type": "integer",
          "minimum": 1,
          "maximum": 30
        }
      }
    }
  }
}
