{
  "$ref": "#/definitions/hyperlaneChainMetadata",
  "definitions": {
    "hyperlaneChainMetadata": {
      "type": "object",
      "properties": {
        "availability": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "status": {
                  "type": "string",
                  "const": "disabled",
                  "description": "The status that represents the chain availability. See ChainStatus for valid values."
                },
                "reasons": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "badrpc",
                      "deprecated",
                      "private",
                      "unavailable",
                      "other"
                    ]
                  },
                  "minItems": 1,
                  "description": "List of reasons explaining why the chain is disabled."
                }
              },
              "required": [
                "status",
                "reasons"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "status": {
                  "type": "string",
                  "const": "live",
                  "description": "The status that represents the chain availability. See ChainStatus for valid values."
                }
              },
              "required": [
                "status"
              ],
              "additionalProperties": false
            }
          ],
          "description": "Specifies if the chain is available and the reasons why it is disabled."
        },
        "bech32Prefix": {
          "type": "string",
          "description": "The human readable address prefix for the chains using bech32."
        },
        "blockExplorers": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "A human readable name for the explorer."
              },
              "url": {
                "type": "string",
                "format": "uri",
                "description": "The base URL for the explorer."
              },
              "apiUrl": {
                "type": "string",
                "format": "uri",
                "description": "The base URL for requests to the explorer API."
              },
              "apiKey": {
                "type": "string",
                "description": "An API key for the explorer (recommended for better reliability)."
              },
              "family": {
                "type": "string",
                "enum": [
                  "etherscan",
                  "blockscout",
                  "routescan",
                  "voyager",
                  "other"
                ],
                "description": "The type of the block explorer. See ExplorerFamily for valid values."
              }
            },
            "required": [
              "name",
              "url",
              "apiUrl"
            ],
            "additionalProperties": false
          },
          "description": "A list of block explorers with data for this chain"
        },
        "blocks": {
          "type": "object",
          "properties": {
            "confirmations": {
              "type": "integer",
              "minimum": 0,
              "description": "Number of blocks to wait before considering a transaction confirmed."
            },
            "reorgPeriod": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0
                },
                {
                  "type": "string"
                }
              ],
              "description": "Number of blocks before a transaction has a near-zero chance of reverting or block tag."
            },
            "estimateBlockTime": {
              "type": "number",
              "exclusiveMinimum": 0,
              "description": "Rough estimate of time per block in seconds."
            }
          },
          "required": [
            "confirmations"
          ],
          "additionalProperties": false,
          "description": "Block settings for the chain/deployment."
        },
        "chainId": {
          "anyOf": [
            {
              "type": "integer",
              "exclusiveMinimum": 0
            },
            {
              "type": "string"
            }
          ],
          "description": "The chainId of the chain. Uses EIP-155 for EVM chains"
        },
        "customGrpcUrls": {
          "type": "string",
          "description": "Specify a comma separated list of custom GRPC URLs to use for this chain. If not specified, the default GRPC urls will be used."
        },
        "deployer": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "The name of the deployer."
            },
            "email": {
              "type": "string",
              "format": "email",
              "description": "The email address of the deployer."
            },
            "url": {
              "type": "string",
              "format": "uri",
              "description": "The URL of the deployer."
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false,
          "description": "Identity information of the deployer of a Hyperlane instance to this chain"
        },
        "displayName": {
          "type": "string",
          "description": "Human-readable name of the chain."
        },
        "displayNameShort": {
          "type": "string",
          "description": "A shorter human-readable name of the chain for use in user interfaces."
        },
        "domainId": {
          "type": "integer",
          "exclusiveMinimum": 0,
          "description": "The domainId of the chain, should generally default to `chainId`. Consumer of `ChainMetadata` should use this value or `name` as a unique identifier."
        },
        "gasCurrencyCoinGeckoId": {
          "type": "string",
          "description": "The ID on CoinGecko of the token used for gas payments."
        },
        "gnosisSafeTransactionServiceUrl": {
          "type": "string",
          "description": "The URL of the gnosis safe transaction service."
        },
        "grpcUrls": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "http": {
                "type": "string",
                "format": "uri",
                "description": "The HTTP URL of the RPC endpoint (preferably HTTPS)."
              },
              "concurrency": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "description": "Maximum number of concurrent RPC requests."
              },
              "webSocket": {
                "type": "string",
                "description": "The WSS URL if the endpoint also supports websockets."
              },
              "pagination": {
                "type": "object",
                "properties": {
                  "maxBlockRange": {
                    "$ref": "#/definitions/hyperlaneChainMetadata/properties/chainId/anyOf/0",
                    "description": "The maximum range between block numbers for which the RPC can query data"
                  },
                  "minBlockNumber": {
                    "$ref": "#/definitions/hyperlaneChainMetadata/properties/blocks/properties/reorgPeriod/anyOf/0",
                    "description": "The absolute minimum block number that this RPC supports."
                  },
                  "maxBlockAge": {
                    "$ref": "#/definitions/hyperlaneChainMetadata/properties/chainId/anyOf/0",
                    "description": "The relative different from latest block that this RPC supports."
                  }
                },
                "additionalProperties": false,
                "description": "Limitations on the block range/age that can be queried."
              },
              "retry": {
                "type": "object",
                "properties": {
                  "maxRequests": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "description": "The maximum number of requests to attempt before failing."
                  },
                  "baseRetryMs": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "description": "The base retry delay in milliseconds."
                  }
                },
                "required": [
                  "maxRequests",
                  "baseRetryMs"
                ],
                "additionalProperties": false,
                "description": "Default retry settings to be used by a provider such as MultiProvider."
              }
            },
            "required": [
              "http"
            ],
            "additionalProperties": false
          },
          "description": "For cosmos chains only, a list of gRPC API URLs"
        },
        "index": {
          "type": "object",
          "properties": {
            "from": {
              "type": "number",
              "description": "The block to start any indexing from."
            }
          },
          "additionalProperties": false,
          "description": "Indexing settings for the chain."
        },
        "isTestnet": {
          "type": "boolean",
          "description": "Whether the chain is considered a testnet or a mainnet."
        },
        "logoURI": {
          "type": "string",
          "description": "A URI to a logo image for this chain for use in user interfaces."
        },
        "name": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9]*$",
          "description": "The unique string identifier of the chain, used as the key in ChainMap dictionaries."
        },
        "nativeToken": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "symbol": {
              "type": "string"
            },
            "decimals": {
              "type": "integer",
              "minimum": 0,
              "exclusiveMaximum": 256
            },
            "denom": {
              "type": "string"
            }
          },
          "required": [
            "name",
            "symbol",
            "decimals"
          ],
          "additionalProperties": false,
          "description": "The metadata of the native token of the chain (e.g. ETH for Ethereum)."
        },
        "protocol": {
          "type": "string",
          "enum": [
            "ethereum",
            "sealevel",
            "cosmos",
            "starknet"
          ],
          "description": "The type of protocol used by this chain. See ProtocolType for valid values."
        },
        "restUrls": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/hyperlaneChainMetadata/properties/grpcUrls/items"
          },
          "description": "For cosmos chains only, a list of Rest API URLs"
        },
        "rpcUrls": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/hyperlaneChainMetadata/properties/grpcUrls/items"
          },
          "minItems": 1,
          "description": "The list of RPC endpoints for interacting with the chain."
        },
        "slip44": {
          "type": "number",
          "description": "The SLIP-0044 coin type."
        },
        "technicalStack": {
          "type": "string",
          "enum": [
            "arbitrumnitro",
            "opstack",
            "polygoncdk",
            "polkadotsubstrate",
            "zksync",
            "other"
          ],
          "description": "The technical stack of the chain. See ChainTechnicalStack for valid values."
        },
        "transactionOverrides": {
          "type": "object",
          "additionalProperties": {},
          "description": "Properties to include when forming transaction requests."
        }
      },
      "required": [
        "chainId",
        "domainId",
        "name",
        "protocol",
        "rpcUrls"
      ],
      "additionalProperties": false
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}