diff --git a/.changeset/openapi-generator-and-ci.md b/.changeset/openapi-generator-and-ci.md new file mode 100644 index 000000000..f0af60525 --- /dev/null +++ b/.changeset/openapi-generator-and-ci.md @@ -0,0 +1,20 @@ +--- +"ensapi": patch +"@docs/mintlify": patch +--- + +Add OpenAPI spec generation tooling and CI validation + +**ENSApi:** + +- Add `OPENAPI_CI_CHECK` mode to start ENSApi with mock config for CI validation without external dependencies + +**@docs/mintlify:** + +- Introduce API documentation for EnsApi that's generated automatically from the OpenAPI spec + +**CI:** + +- Add `openapi-sync-check` job that validates committed `openapi.json` matches what ENSApi generates +- Add Mintlify OpenAPI validation step +- Trigger Mintlify rebuild on environment switch to keep production docs in sync diff --git a/.github/workflows/deploy_switch_ensnode_environment.yml b/.github/workflows/deploy_switch_ensnode_environment.yml index b34dd58e0..953f63dfb 100644 --- a/.github/workflows/deploy_switch_ensnode_environment.yml +++ b/.github/workflows/deploy_switch_ensnode_environment.yml @@ -81,6 +81,14 @@ jobs: chmod +x ./.github/scripts/promote_ensadmin.sh ./.github/scripts/promote_ensadmin.sh + - name: Trigger Mintlify Docs Rebuild + continue-on-error: true + run: | + curl --request POST \ + --url "https://api.mintlify.com/v1/project/update/${{ secrets.MINTLIFY_PROJECT_ID }}" \ + --header "Authorization: Bearer ${{ secrets.MINTLIFY_API_TOKEN }}" \ + --fail + - name: Send Slack Notification uses: ./.github/actions/send_slack_notification with: diff --git a/.github/workflows/test_ci.yml b/.github/workflows/test_ci.yml index 1e4419d58..915085c73 100644 --- a/.github/workflows/test_ci.yml +++ b/.github/workflows/test_ci.yml @@ -48,6 +48,48 @@ jobs: - uses: ./.github/actions/setup_node_environment - run: pnpm test + openapi-sync-check: + name: "OpenAPI Spec Sync Check" + runs-on: blacksmith-4vcpu-ubuntu-2204 + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup_node_environment + + - name: Start ENSApi in OpenAPI CI check mode + run: | + OPENAPI_CI_CHECK=true pnpm --filter ensapi start & + # Wait for server to be ready + for i in {1..30}; do + if curl -s http://localhost:4334/openapi.json > /dev/null 2>&1; then + echo "ENSApi is ready" + break + fi + echo "Waiting for ENSApi to start... ($i/30)" + sleep 1 + done + + - name: Generate OpenAPI spec from local build + working-directory: docs/docs.ensnode.io + run: pnpm openapi:generate http://localhost:4334 + + - name: Verify OpenAPI spec matches committed version + run: | + if git diff --quiet docs/docs.ensnode.io/openapi.json; then + echo "✅ OpenAPI spec is in sync with codebase" + else + echo "❌ OpenAPI spec is out of sync" + echo "" + echo "The committed openapi.json differs from what ENSApi generates:" + echo "" + git diff --color docs/docs.ensnode.io/openapi.json + echo "" + echo "Run 'OPENAPI_CI_CHECK=true pnpm --filter ensapi start' then 'pnpm --filter @docs/mintlify openapi:generate http://localhost:4334' and commit the changes." + exit 1 + fi + + - name: Validate OpenAPI spec with Mintlify + run: pnpm dlx mintlify openapi-check docs/docs.ensnode.io/openapi.json + integrity-check: name: "Integrity Check" runs-on: blacksmith-4vcpu-ubuntu-2204 diff --git a/apps/ensapi/src/config/config.schema.ts b/apps/ensapi/src/config/config.schema.ts index acc80a261..340b8936e 100644 --- a/apps/ensapi/src/config/config.schema.ts +++ b/apps/ensapi/src/config/config.schema.ts @@ -76,6 +76,57 @@ const EnsApiConfigSchema = z export type EnsApiConfig = z.infer; +const EnsApiConfigSchemaForOpenApiCiCheck = z.object({ + port: PortSchema.default(ENSApi_DEFAULT_PORT), + databaseUrl: DatabaseUrlSchema, + databaseSchemaName: DatabaseSchemaNameSchema, + ensIndexerUrl: EnsIndexerUrlSchema, + theGraphApiKey: TheGraphApiKeySchema, + namespace: ENSNamespaceSchema, + rpcConfigs: RpcConfigsSchema, + ensIndexerPublicConfig: makeENSIndexerPublicConfigSchema("ensIndexerPublicConfig"), + ensHolidayAwardsStart: z.number(), + ensHolidayAwardsEnd: z.number(), +}); + +function buildConfigForOpenApiCiCheck(env: EnsApiEnvironment): EnsApiConfig { + logger.info("OPENAPI_CI_CHECK mode enabled - using minimal mock config"); + + return EnsApiConfigSchemaForOpenApiCiCheck.parse({ + port: env.PORT || ENSApi_DEFAULT_PORT, + databaseUrl: "postgresql://openapi:openapi@localhost:5432/openapi", + databaseSchemaName: "public", + ensIndexerUrl: "http://localhost:42069", + theGraphApiKey: undefined, + namespace: "mainnet", + rpcConfigs: { + "1": "https://rpc.example.com", + }, + ensIndexerPublicConfig: { + labelSet: { + labelSetId: "ens-default", + labelSetVersion: 1, + }, + indexedChainIds: [1], + isSubgraphCompatible: false, + namespace: "mainnet", + plugins: ["subgraph"], + databaseSchemaName: "public", + versionInfo: { + nodejs: process.version, + ponder: "0.0.0", + ensDb: packageJson.version, + ensIndexer: packageJson.version, + ensNormalize: "0.0.0", + ensRainbow: packageJson.version, + ensRainbowSchema: 1, + }, + }, + ensHolidayAwardsStart: getUnixTime(new Date(ENS_HOLIDAY_AWARDS_START_DATE)), + ensHolidayAwardsEnd: getUnixTime(new Date(ENS_HOLIDAY_AWARDS_END_DATE)), + }) as EnsApiConfig; +} + /** * Builds the EnsApiConfig from an EnsApiEnvironment object, fetching the EnsIndexerPublicConfig. * @@ -83,6 +134,10 @@ export type EnsApiConfig = z.infer; * @throws Error with formatted validation messages if environment parsing fails */ export async function buildConfigFromEnvironment(env: EnsApiEnvironment): Promise { + if (env.OPENAPI_CI_CHECK === "true") { + return buildConfigForOpenApiCiCheck(env); + } + try { const ensIndexerUrl = EnsIndexerUrlSchema.parse(env.ENSINDEXER_URL); diff --git a/apps/ensapi/src/config/environment.ts b/apps/ensapi/src/config/environment.ts index cb968656c..0d3f4e918 100644 --- a/apps/ensapi/src/config/environment.ts +++ b/apps/ensapi/src/config/environment.ts @@ -21,4 +21,6 @@ export type EnsApiEnvironment = Omit & PortEnvironment & LogLevelEnvironment & TheGraphEnvironment & - EnsHolidayAwardsEnvironment; + EnsHolidayAwardsEnvironment & { + OPENAPI_CI_CHECK?: string; + }; diff --git a/docs/docs.ensnode.io/README.md b/docs/docs.ensnode.io/README.md index de8f99ab7..46325585e 100644 --- a/docs/docs.ensnode.io/README.md +++ b/docs/docs.ensnode.io/README.md @@ -2,39 +2,69 @@ [docs.ensnode.io](https://docs.ensnode.io) runs on [Mintlify](https://mintlify.com). +Learn more about [ENSNode](https://ensnode.io) from [the "Starlight" ENSNode docs](https://ensnode.io/docs/). Everything from these "Starlight" docs is planned to be transitioned into these Mintlify docs soon. + ## Local Development -### Getting Started +1. `git clone https://github.com/namehash/ensnode.git` +2. `cd docs/docs.ensnode.io` +3. `pnpm mint dev` +4. Open [http://localhost:3000](http://localhost:3000) in your browser -1. Clone the repository: +### Troubleshooting - ```bash - git clone https://github.com/namehash/ensnode.git - ``` +- If a page loads as a 404, ensure you're running in a folder with a valid `docs.json` +- Run `pnpm mint --help` for more Mintlify CLI details -2. Navigate to the docs directory: +## Publishing Changes - ```bash - cd ensnode/docs/docs.ensnode.io - ``` +Mintlify automatically deploys when changes are pushed to `main`. This presents a tradeoff: -3. Start the local development server: +| Content Type | Source | Behavior | +| ----------------- | ------------------ | ------------------------------------------- | +| **API Reference** | Production API URL | Always in sync with deployed production API | +| **Other docs** | Committed files | Deploys immediately on merge to main | - ```bash - pnpm mint dev - ``` +**The tradeoff:** Non-API documentation (guides, concepts, etc.) may be published before the corresponding code is released to production. However, the API Reference always reflects the actual production API since Mintlify fetches it from the production URL at build time. -4. Open [http://localhost:3000](http://localhost:3000) in your browser +To avoid documenting unreleased features: -### Troubleshooting +1. **Keep documentation PRs separate from code PRs** +2. **Merge documentation PRs only after the corresponding code is deployed to production** -- If a page loads as a 404, make sure you are running in a folder with a valid `docs.json`. -- Run `pnpm mint --help` to read more details about Mintlify CLI. +This ensures documentation stays aligned with what users can actually access, while still allowing PR previews for review. -## Publishing Changes +> **Note:** Mintlify currently doesn't support separating auto-deploy from PR previews, or an API for triggering preview builds for specific branches. If this changes, we could decouple the workflows. + +## OpenAPI Spec + +The API Reference is generated from an OpenAPI spec. In production, Mintlify fetches this from the live API URL. For PR previews, Mintlify uses the committed `openapi.json` file. + +### Generating the Spec + +To generate the OpenAPI spec, start ENSApi and run the generator: + +```bash +# Start ENSApi in CI check mode (no external dependencies required) +OPENAPI_CI_CHECK=true pnpm --filter ensapi start + +# In another terminal, generate the spec +pnpm --filter @docs/mintlify openapi:generate http://localhost:4334 +``` + +The URL argument is required — there is no default to avoid accidentally generating from the wrong source. + +### CI Validation + +CI runs an `openapi-sync-check` job that validates the committed `openapi.json` matches what ENSApi generates. Update the committed spec when you change API routes or schemas. + +### Environment Switch + +When switching production environments (green/blue), the `deploy_switch_ensnode_environment` workflow triggers a Mintlify rebuild to fetch the latest OpenAPI spec from the production API. -Changes pushed to the main branch are automatically deployed to production. +This requires `MINTLIFY_API_TOKEN` and `MINTLIFY_PROJECT_ID` to be configured as repository secrets. ## Resources - [Mintlify documentation](https://mintlify.com/docs) +- [ENSNode "Starlight" docs](https://ensnode.io/docs/) diff --git a/docs/docs.ensnode.io/docs.json b/docs/docs.ensnode.io/docs.json index 8f4554902..91b1a08ab 100644 --- a/docs/docs.ensnode.io/docs.json +++ b/docs/docs.ensnode.io/docs.json @@ -24,7 +24,13 @@ }, { "group": "API Reference", - "openapi": "https://gist.githubusercontent.com/notrab/94b637e77468cbddd895d7933ce88f64/raw/12cb5ed183558a9bdda5d1c7004db6c794dbd13e/green-ensnode-openapi.json" + "openapi": "https://api.alpha.ensnode.io/openapi.json" + }, + { + "group": "Preview", + "pages": ["ensapi/preview"], + "openapi": "./openapi.json", + "hidden": true } ] } diff --git a/docs/docs.ensnode.io/ensapi/preview.mdx b/docs/docs.ensnode.io/ensapi/preview.mdx new file mode 100644 index 000000000..9a08a0970 --- /dev/null +++ b/docs/docs.ensnode.io/ensapi/preview.mdx @@ -0,0 +1,9 @@ +--- +title: API Preview +sidebarTitle: Preview +description: Preview upcoming API changes from the current branch. +--- + +This page shows the OpenAPI specification from the current branch, which may include unreleased API changes. + +For the production API documentation, see the [API Reference](/ensapi). diff --git a/docs/docs.ensnode.io/openapi.json b/docs/docs.ensnode.io/openapi.json new file mode 100644 index 000000000..9ba9fc8a5 --- /dev/null +++ b/docs/docs.ensnode.io/openapi.json @@ -0,0 +1,5182 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "ENSApi APIs", + "description": "APIs for ENS resolution, navigating the ENS nameforest, and metadata about an ENSNode", + "version": "1.5.1" + }, + "servers": [ + { + "url": "https://api.alpha.ensnode.io", + "description": "ENSNode Alpha (Mainnet)" + }, + { + "url": "https://api.alpha-sepolia.ensnode.io", + "description": "ENSNode Alpha (Sepolia Testnet)" + }, + { + "url": "http://localhost:4334", + "description": "Local Development" + } + ], + "tags": [ + { + "name": "Resolution", + "description": "APIs for resolving ENS names and addresses" + }, + { + "name": "Meta", + "description": "APIs for indexing status, configuration, and realtime monitoring" + }, + { + "name": "Explore", + "description": "APIs for exploring the indexed state of ENS, including name tokens and registrar actions" + }, + { + "name": "ENSAwards", + "description": "APIs for ENSAwards functionality, including referrer data" + } + ], + "paths": { + "/api/config": { + "get": { + "operationId": "getApiConfig", + "tags": ["Meta"], + "summary": "Get ENSApi Public Config", + "description": "Gets the public config of the ENSApi instance", + "responses": { + "200": { + "description": "Successfully retrieved ENSApi public config", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "version": { + "type": "string", + "minLength": 1 + }, + "theGraphFallback": { + "anyOf": [ + { + "type": "object", + "properties": { + "canFallback": { + "type": "boolean", + "const": true + }, + "url": { + "type": "string" + } + }, + "required": ["canFallback", "url"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "canFallback": { + "type": "boolean", + "const": false + }, + "reason": { + "type": "string", + "enum": ["not-subgraph-compatible", "no-api-key", "no-subgraph-url"] + } + }, + "required": ["canFallback", "reason"], + "additionalProperties": false + } + ] + }, + "ensIndexerPublicConfig": { + "type": "object", + "properties": { + "labelSet": { + "type": "object", + "properties": { + "labelSetId": { + "type": "string", + "minLength": 1, + "maxLength": 50, + "pattern": "^[a-z-]+$" + }, + "labelSetVersion": { + "type": "number" + } + }, + "required": ["labelSetId", "labelSetVersion"] + }, + "indexedChainIds": { + "minItems": 1, + "type": "array", + "items": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "isSubgraphCompatible": { + "type": "boolean" + }, + "namespace": { + "type": "string", + "enum": ["mainnet", "sepolia", "ens-test-env"] + }, + "plugins": { + "minItems": 1, + "type": "array", + "items": { + "type": "string" + } + }, + "databaseSchemaName": { + "type": "string", + "minLength": 1 + }, + "versionInfo": { + "type": "object", + "properties": { + "nodejs": { + "type": "string", + "minLength": 1 + }, + "ponder": { + "type": "string", + "minLength": 1 + }, + "ensDb": { + "type": "string", + "minLength": 1 + }, + "ensIndexer": { + "type": "string", + "minLength": 1 + }, + "ensNormalize": { + "type": "string", + "minLength": 1 + }, + "ensRainbow": { + "type": "string", + "minLength": 1 + }, + "ensRainbowSchema": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + } + }, + "required": [ + "nodejs", + "ponder", + "ensDb", + "ensIndexer", + "ensNormalize", + "ensRainbow", + "ensRainbowSchema" + ], + "additionalProperties": false + } + }, + "required": [ + "labelSet", + "indexedChainIds", + "isSubgraphCompatible", + "namespace", + "plugins", + "databaseSchemaName", + "versionInfo" + ] + } + }, + "required": ["version", "theGraphFallback", "ensIndexerPublicConfig"], + "additionalProperties": false + } + } + } + } + } + } + }, + "/api/indexing-status": { + "get": { + "operationId": "getApiIndexing-status", + "tags": ["Meta"], + "summary": "Get ENSIndexer Indexing Status", + "description": "Returns the indexing status snapshot most recently captured from ENSIndexer", + "responses": { + "200": { + "description": "Successfully retrieved indexing status", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "ok" + }, + "realtimeProjection": { + "type": "object", + "properties": { + "projectedAt": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "worstCaseDistance": { + "type": "number" + }, + "snapshot": { + "anyOf": [ + { + "type": "object", + "properties": { + "strategy": { + "type": "string", + "const": "omnichain" + }, + "slowestChainIndexingCursor": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "snapshotTime": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "omnichainSnapshot": { + "anyOf": [ + { + "type": "object", + "properties": { + "omnichainStatus": { + "type": "string", + "const": "omnichain-unstarted" + }, + "chains": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-queued" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + } + }, + "required": ["chainStatus", "config"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-backfill" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "backfillEndBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "backfillEndBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-completed" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-following" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": ["configType", "startBlock"], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "latestKnownBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "latestKnownBlock" + ], + "additionalProperties": false + } + ] + } + }, + "omnichainIndexingCursor": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + }, + "required": [ + "omnichainStatus", + "chains", + "omnichainIndexingCursor" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "omnichainStatus": { + "type": "string", + "const": "omnichain-backfill" + }, + "chains": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-queued" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + } + }, + "required": ["chainStatus", "config"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-backfill" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "backfillEndBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "backfillEndBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-completed" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-following" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": ["configType", "startBlock"], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "latestKnownBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "latestKnownBlock" + ], + "additionalProperties": false + } + ] + } + }, + "omnichainIndexingCursor": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + }, + "required": [ + "omnichainStatus", + "chains", + "omnichainIndexingCursor" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "omnichainStatus": { + "type": "string", + "const": "omnichain-completed" + }, + "chains": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-queued" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + } + }, + "required": ["chainStatus", "config"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-backfill" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "backfillEndBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "backfillEndBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-completed" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-following" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": ["configType", "startBlock"], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "latestKnownBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "latestKnownBlock" + ], + "additionalProperties": false + } + ] + } + }, + "omnichainIndexingCursor": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + }, + "required": [ + "omnichainStatus", + "chains", + "omnichainIndexingCursor" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "omnichainStatus": { + "type": "string", + "const": "omnichain-following" + }, + "chains": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-queued" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + } + }, + "required": ["chainStatus", "config"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-backfill" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "backfillEndBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "backfillEndBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-completed" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-following" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": ["configType", "startBlock"], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "latestKnownBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "latestKnownBlock" + ], + "additionalProperties": false + } + ] + } + }, + "omnichainIndexingCursor": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + }, + "required": [ + "omnichainStatus", + "chains", + "omnichainIndexingCursor" + ], + "additionalProperties": false + } + ] + } + }, + "required": [ + "strategy", + "slowestChainIndexingCursor", + "snapshotTime", + "omnichainSnapshot" + ], + "additionalProperties": false + } + ] + } + }, + "required": ["projectedAt", "worstCaseDistance", "snapshot"], + "additionalProperties": false + } + }, + "required": ["responseCode", "realtimeProjection"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "error" + } + }, + "required": ["responseCode"], + "additionalProperties": false + } + ] + } + } + } + }, + "503": { + "description": "Indexing status snapshot unavailable", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "ok" + }, + "realtimeProjection": { + "type": "object", + "properties": { + "projectedAt": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "worstCaseDistance": { + "type": "number" + }, + "snapshot": { + "anyOf": [ + { + "type": "object", + "properties": { + "strategy": { + "type": "string", + "const": "omnichain" + }, + "slowestChainIndexingCursor": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "snapshotTime": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "omnichainSnapshot": { + "anyOf": [ + { + "type": "object", + "properties": { + "omnichainStatus": { + "type": "string", + "const": "omnichain-unstarted" + }, + "chains": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-queued" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + } + }, + "required": ["chainStatus", "config"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-backfill" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "backfillEndBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "backfillEndBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-completed" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-following" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": ["configType", "startBlock"], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "latestKnownBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "latestKnownBlock" + ], + "additionalProperties": false + } + ] + } + }, + "omnichainIndexingCursor": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + }, + "required": [ + "omnichainStatus", + "chains", + "omnichainIndexingCursor" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "omnichainStatus": { + "type": "string", + "const": "omnichain-backfill" + }, + "chains": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-queued" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + } + }, + "required": ["chainStatus", "config"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-backfill" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "backfillEndBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "backfillEndBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-completed" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-following" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": ["configType", "startBlock"], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "latestKnownBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "latestKnownBlock" + ], + "additionalProperties": false + } + ] + } + }, + "omnichainIndexingCursor": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + }, + "required": [ + "omnichainStatus", + "chains", + "omnichainIndexingCursor" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "omnichainStatus": { + "type": "string", + "const": "omnichain-completed" + }, + "chains": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-queued" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + } + }, + "required": ["chainStatus", "config"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-backfill" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "backfillEndBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "backfillEndBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-completed" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-following" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": ["configType", "startBlock"], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "latestKnownBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "latestKnownBlock" + ], + "additionalProperties": false + } + ] + } + }, + "omnichainIndexingCursor": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + }, + "required": [ + "omnichainStatus", + "chains", + "omnichainIndexingCursor" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "omnichainStatus": { + "type": "string", + "const": "omnichain-following" + }, + "chains": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-queued" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + } + }, + "required": ["chainStatus", "config"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-backfill" + }, + "config": { + "anyOf": [ + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + } + ] + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "backfillEndBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "backfillEndBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-completed" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "definite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "endBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "configType", + "startBlock", + "endBlock" + ], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "chainStatus": { + "type": "string", + "const": "chain-following" + }, + "config": { + "type": "object", + "properties": { + "configType": { + "type": "string", + "const": "indefinite" + }, + "startBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": ["configType", "startBlock"], + "additionalProperties": false + }, + "latestIndexedBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + }, + "latestKnownBlock": { + "type": "object", + "properties": { + "timestamp": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "number": { + "type": "integer", + "minimum": 0, + "maximum": 9007199254740991 + } + }, + "required": ["timestamp", "number"], + "additionalProperties": false + } + }, + "required": [ + "chainStatus", + "config", + "latestIndexedBlock", + "latestKnownBlock" + ], + "additionalProperties": false + } + ] + } + }, + "omnichainIndexingCursor": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + }, + "required": [ + "omnichainStatus", + "chains", + "omnichainIndexingCursor" + ], + "additionalProperties": false + } + ] + } + }, + "required": [ + "strategy", + "slowestChainIndexingCursor", + "snapshotTime", + "omnichainSnapshot" + ], + "additionalProperties": false + } + ] + } + }, + "required": ["projectedAt", "worstCaseDistance", "snapshot"], + "additionalProperties": false + } + }, + "required": ["responseCode", "realtimeProjection"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "error" + } + }, + "required": ["responseCode"], + "additionalProperties": false + } + ] + } + } + } + } + } + } + }, + "/api/name-tokens": { + "get": { + "operationId": "getApiName-tokens", + "tags": ["Explore"], + "summary": "Get Name Tokens", + "description": "Returns name tokens for the requested identifier (domainId or name)", + "responses": { + "200": { + "description": "Name tokens known", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "ok" + }, + "registeredNameTokens": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "tokens": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "token": { + "type": "object", + "properties": { + "assetNamespace": { + "type": "string", + "enum": ["erc721", "erc1155"] + }, + "contract": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + }, + "tokenId": { + "type": "string" + } + }, + "required": ["assetNamespace", "contract", "tokenId"] + }, + "ownership": { + "anyOf": [ + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "namewrapper" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + }, + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "fully-onchain" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + }, + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "burned" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + }, + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "unknown" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + } + ] + }, + "mintStatus": { + "type": "string", + "enum": ["minted", "burned"] + } + }, + "required": ["token", "ownership", "mintStatus"] + } + }, + "expiresAt": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "accurateAsOf": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + }, + "required": ["domainId", "name", "tokens", "expiresAt", "accurateAsOf"] + } + }, + "required": ["responseCode", "registeredNameTokens"], + "additionalProperties": false + }, + { + "anyOf": [ + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "error" + }, + "errorCode": { + "type": "string", + "const": "name-tokens-not-indexed" + }, + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "details": {} + }, + "required": ["message"] + } + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "error" + }, + "errorCode": { + "type": "string", + "const": "unsupported-ensindexer-config" + }, + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "details": {} + }, + "required": ["message"] + } + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "error" + }, + "errorCode": { + "type": "string", + "const": "unsupported-indexing-status" + }, + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "details": {} + }, + "required": ["message"] + } + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false + } + ] + } + ] + } + } + } + }, + "400": { + "description": "Invalid input", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "details": {} + }, + "required": ["message"] + } + } + } + }, + "404": { + "description": "Name tokens not indexed", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "ok" + }, + "registeredNameTokens": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "tokens": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "token": { + "type": "object", + "properties": { + "assetNamespace": { + "type": "string", + "enum": ["erc721", "erc1155"] + }, + "contract": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + }, + "tokenId": { + "type": "string" + } + }, + "required": ["assetNamespace", "contract", "tokenId"] + }, + "ownership": { + "anyOf": [ + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "namewrapper" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + }, + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "fully-onchain" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + }, + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "burned" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + }, + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "unknown" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + } + ] + }, + "mintStatus": { + "type": "string", + "enum": ["minted", "burned"] + } + }, + "required": ["token", "ownership", "mintStatus"] + } + }, + "expiresAt": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "accurateAsOf": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + }, + "required": ["domainId", "name", "tokens", "expiresAt", "accurateAsOf"] + } + }, + "required": ["responseCode", "registeredNameTokens"], + "additionalProperties": false + }, + { + "anyOf": [ + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "error" + }, + "errorCode": { + "type": "string", + "const": "name-tokens-not-indexed" + }, + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "details": {} + }, + "required": ["message"] + } + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "error" + }, + "errorCode": { + "type": "string", + "const": "unsupported-ensindexer-config" + }, + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "details": {} + }, + "required": ["message"] + } + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "error" + }, + "errorCode": { + "type": "string", + "const": "unsupported-indexing-status" + }, + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "details": {} + }, + "required": ["message"] + } + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false + } + ] + } + ] + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "details": {} + }, + "required": ["message"] + } + } + } + }, + "503": { + "description": "Service unavailable - Name Tokens API prerequisites not met (indexing status not ready or required plugins not activated)", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "ok" + }, + "registeredNameTokens": { + "type": "object", + "properties": { + "domainId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "tokens": { + "minItems": 1, + "type": "array", + "items": { + "type": "object", + "properties": { + "token": { + "type": "object", + "properties": { + "assetNamespace": { + "type": "string", + "enum": ["erc721", "erc1155"] + }, + "contract": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + }, + "tokenId": { + "type": "string" + } + }, + "required": ["assetNamespace", "contract", "tokenId"] + }, + "ownership": { + "anyOf": [ + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "namewrapper" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + }, + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "fully-onchain" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + }, + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "burned" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + }, + { + "type": "object", + "properties": { + "ownershipType": { + "type": "string", + "const": "unknown" + }, + "owner": { + "type": "object", + "properties": { + "chainId": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 9007199254740991 + }, + "address": { + "type": "string" + } + }, + "required": ["chainId", "address"], + "additionalProperties": false + } + }, + "required": ["ownershipType", "owner"] + } + ] + }, + "mintStatus": { + "type": "string", + "enum": ["minted", "burned"] + } + }, + "required": ["token", "ownership", "mintStatus"] + } + }, + "expiresAt": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + }, + "accurateAsOf": { + "type": "integer", + "minimum": -9007199254740991, + "maximum": 9007199254740991 + } + }, + "required": ["domainId", "name", "tokens", "expiresAt", "accurateAsOf"] + } + }, + "required": ["responseCode", "registeredNameTokens"], + "additionalProperties": false + }, + { + "anyOf": [ + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "error" + }, + "errorCode": { + "type": "string", + "const": "name-tokens-not-indexed" + }, + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "details": {} + }, + "required": ["message"] + } + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "error" + }, + "errorCode": { + "type": "string", + "const": "unsupported-ensindexer-config" + }, + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "details": {} + }, + "required": ["message"] + } + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "responseCode": { + "type": "string", + "const": "error" + }, + "errorCode": { + "type": "string", + "const": "unsupported-indexing-status" + }, + "error": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "details": {} + }, + "required": ["message"] + } + }, + "required": ["responseCode", "errorCode", "error"], + "additionalProperties": false + } + ] + } + ] + } + } + } + } + }, + "parameters": [ + { + "in": "query", + "name": "domainId", + "schema": { + "type": "string" + }, + "description": "Domain node hash identifier" + }, + { + "in": "query", + "name": "name", + "schema": { + "type": "string" + }, + "description": "ENS name to look up tokens for" + } + ] + } + }, + "/api/registrar-actions": { + "get": { + "operationId": "getApiRegistrar-actions", + "tags": ["Explore"], + "summary": "Get Registrar Actions", + "description": "Returns all registrar actions with optional filtering and pagination", + "responses": { + "200": { + "description": "Successfully retrieved registrar actions" + }, + "400": { + "description": "Invalid query" + }, + "500": { + "description": "Internal server error" + } + }, + "parameters": [ + { + "in": "query", + "name": "orderBy", + "schema": { + "default": "orderBy[timestamp]=desc", + "type": "string", + "enum": ["orderBy[timestamp]=desc"] + }, + "description": "Order of results" + }, + { + "in": "query", + "name": "page", + "schema": {}, + "description": "Page number for pagination" + }, + { + "in": "query", + "name": "recordsPerPage", + "schema": {}, + "description": "Number of records per page" + }, + { + "in": "query", + "name": "withReferral", + "schema": { + "type": "string" + }, + "description": "Filter to only include actions with referrals" + }, + { + "in": "query", + "name": "decodedReferrer", + "schema": { + "type": "string" + }, + "description": "Filter by decoded referrer address" + }, + { + "in": "query", + "name": "beginTimestamp", + "schema": {}, + "description": "Filter actions at or after this Unix timestamp" + }, + { + "in": "query", + "name": "endTimestamp", + "schema": {}, + "description": "Filter actions at or before this Unix timestamp" + } + ] + } + }, + "/api/registrar-actions/{parentNode}": { + "get": { + "operationId": "getApiRegistrar-actions:parentNode", + "tags": ["Explore"], + "summary": "Get Registrar Actions by Parent Node", + "description": "Returns registrar actions filtered by parent node hash with optional additional filtering and pagination", + "responses": { + "200": { + "description": "Successfully retrieved registrar actions" + }, + "400": { + "description": "Invalid input" + }, + "500": { + "description": "Internal server error" + } + }, + "parameters": [ + { + "in": "path", + "name": "parentNode", + "schema": { + "type": "string" + }, + "required": true, + "description": "Parent node to filter registrar actions" + }, + { + "in": "query", + "name": "orderBy", + "schema": { + "default": "orderBy[timestamp]=desc", + "type": "string", + "enum": ["orderBy[timestamp]=desc"] + }, + "description": "Order of results" + }, + { + "in": "query", + "name": "page", + "schema": {}, + "description": "Page number for pagination" + }, + { + "in": "query", + "name": "recordsPerPage", + "schema": {}, + "description": "Number of records per page" + }, + { + "in": "query", + "name": "withReferral", + "schema": { + "type": "string" + }, + "description": "Filter to only include actions with referrals" + }, + { + "in": "query", + "name": "decodedReferrer", + "schema": { + "type": "string" + }, + "description": "Filter by decoded referrer address" + }, + { + "in": "query", + "name": "beginTimestamp", + "schema": {}, + "description": "Filter actions at or after this Unix timestamp" + }, + { + "in": "query", + "name": "endTimestamp", + "schema": {}, + "description": "Filter actions at or before this Unix timestamp" + } + ] + } + }, + "/api/resolve/records/{name}": { + "get": { + "operationId": "getApiResolveRecords:name", + "tags": ["Resolution"], + "summary": "Resolve ENS Records", + "description": "Resolves ENS records for a given name", + "responses": { + "200": { + "description": "Successfully resolved records", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "records": { + "type": "object", + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "addresses": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "texts": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + } + } + }, + "accelerationRequested": { + "type": "boolean" + }, + "accelerationAttempted": { + "type": "boolean" + }, + "trace": { + "type": "array", + "items": {} + } + }, + "required": ["records", "accelerationRequested", "accelerationAttempted"] + } + } + } + } + }, + "parameters": [ + { + "in": "path", + "name": "name", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "addresses", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "texts", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "trace", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "accelerate", + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/resolve/primary-name/{address}/{chainId}": { + "get": { + "operationId": "getApiResolvePrimary-name:address:chainId", + "tags": ["Resolution"], + "summary": "Resolve Primary Name", + "description": "Resolves a primary name for a given `address` and `chainId`", + "responses": { + "200": { + "description": "Successfully resolved name", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "accelerationRequested": { + "type": "boolean" + }, + "accelerationAttempted": { + "type": "boolean" + }, + "trace": { + "type": "array", + "items": {} + } + }, + "required": ["name", "accelerationRequested", "accelerationAttempted"] + } + } + } + } + }, + "parameters": [ + { + "in": "path", + "name": "address", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "path", + "name": "chainId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "trace", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "accelerate", + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/resolve/primary-names/{address}": { + "get": { + "operationId": "getApiResolvePrimary-names:address", + "tags": ["Resolution"], + "summary": "Resolve Primary Names", + "description": "Resolves all primary names for a given address across multiple chains", + "responses": { + "200": { + "description": "Successfully resolved records", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "names": { + "type": "object", + "propertyNames": { + "type": "number" + }, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "accelerationRequested": { + "type": "boolean" + }, + "accelerationAttempted": { + "type": "boolean" + }, + "trace": { + "type": "array", + "items": {} + } + }, + "required": ["names", "accelerationRequested", "accelerationAttempted"] + } + } + } + } + }, + "parameters": [ + { + "in": "path", + "name": "address", + "schema": { + "type": "string" + }, + "required": true + }, + { + "in": "query", + "name": "chainIds", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "trace", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "accelerate", + "schema": { + "type": "string" + } + } + ] + } + }, + "/ensanalytics/referrers": { + "get": { + "operationId": "getEnsanalyticsReferrers", + "tags": ["ENSAwards"], + "summary": "Get Referrer Leaderboard", + "description": "Returns a paginated page from the referrer leaderboard", + "responses": { + "200": { + "description": "Successfully retrieved referrer leaderboard page" + }, + "500": { + "description": "Internal server error" + } + }, + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "description": "Page number for pagination" + }, + { + "in": "query", + "name": "recordsPerPage", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + }, + "description": "Number of referrers per page" + } + ] + } + }, + "/ensanalytics/referrers/{referrer}": { + "get": { + "operationId": "getEnsanalyticsReferrers:referrer", + "tags": ["ENSAwards"], + "summary": "Get Referrer Detail", + "description": "Returns detailed information for a specific referrer by address", + "responses": { + "200": { + "description": "Successfully retrieved referrer detail" + }, + "500": { + "description": "Internal server error" + }, + "503": { + "description": "Service unavailable - referrer leaderboard data not yet cached" + } + }, + "parameters": [ + { + "in": "path", + "name": "referrer", + "schema": { + "type": "string" + }, + "required": true, + "description": "Referrer Ethereum address" + } + ] + } + }, + "/ensanalytics/v1/referrers": { + "get": { + "operationId": "getEnsanalyticsV1Referrers", + "tags": ["ENSAwards"], + "summary": "Get Referrer Leaderboard (v1)", + "description": "Returns a paginated page from the referrer leaderboard", + "responses": { + "200": { + "description": "Successfully retrieved referrer leaderboard page" + }, + "500": { + "description": "Internal server error" + } + }, + "parameters": [ + { + "in": "query", + "name": "page", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 9007199254740991 + }, + "description": "Page number for pagination" + }, + { + "in": "query", + "name": "recordsPerPage", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + }, + "description": "Number of referrers per page" + } + ] + } + }, + "/ensanalytics/v1/referrers/{referrer}": { + "get": { + "operationId": "getEnsanalyticsV1Referrers:referrer", + "tags": ["ENSAwards"], + "summary": "Get Referrer Detail (v1)", + "description": "Returns detailed information for a specific referrer by address", + "responses": { + "200": { + "description": "Successfully retrieved referrer detail" + }, + "500": { + "description": "Internal server error" + }, + "503": { + "description": "Service unavailable - referrer leaderboard data not yet cached" + } + }, + "parameters": [ + { + "in": "path", + "name": "referrer", + "schema": { + "type": "string" + }, + "required": true, + "description": "Referrer Ethereum address" + } + ] + } + }, + "/amirealtime": { + "get": { + "operationId": "getAmirealtime", + "tags": ["Meta"], + "summary": "Check indexing progress", + "description": "Checks if the indexing progress is guaranteed to be within a requested worst-case distance of realtime", + "responses": { + "200": { + "description": "Indexing progress is guaranteed to be within the requested distance of realtime" + }, + "503": { + "description": "Indexing progress is not guaranteed to be within the requested distance of realtime or indexing status unavailable" + } + }, + "parameters": [ + { + "in": "query", + "name": "maxWorstCaseDistance", + "schema": {}, + "description": "Maximum acceptable worst-case indexing distance in seconds" + } + ] + } + } + }, + "components": {} +} diff --git a/docs/docs.ensnode.io/package.json b/docs/docs.ensnode.io/package.json index d77269424..167435cad 100644 --- a/docs/docs.ensnode.io/package.json +++ b/docs/docs.ensnode.io/package.json @@ -12,7 +12,11 @@ }, "homepage": "https://github.com/namehash/ensnode/tree/main/docs/docs.ensnode.io", "scripts": { - "mint": "pnpm dlx mint@^4.1.0" + "mint": "pnpm dlx mint@^4.1.0", + "openapi:generate": "tsx scripts/generate-openapi.ts" }, - "packageManager": "pnpm@10.28.0" + "packageManager": "pnpm@10.28.0", + "devDependencies": { + "tsx": "^4.7.1" + } } diff --git a/docs/docs.ensnode.io/scripts/generate-openapi.ts b/docs/docs.ensnode.io/scripts/generate-openapi.ts new file mode 100644 index 000000000..338dd0a9c --- /dev/null +++ b/docs/docs.ensnode.io/scripts/generate-openapi.ts @@ -0,0 +1,103 @@ +#!/usr/bin/env tsx + +/** + * Generate OpenAPI spec from a running ENSApi instance. + * + * Usage: + * pnpm openapi:generate http://localhost:4334 + * + * Output: + * Writes openapi.json to the docs directory for Mintlify to consume. Note that a rebuild of Mintlify is required for it to reflect an updated openapi.json. + */ + +import { execFileSync } from "node:child_process"; +import { writeFileSync } from "node:fs"; +import { resolve } from "node:path"; + +const OUTPUT_PATH = resolve(import.meta.dirname, "../openapi.json"); +const TIMEOUT_MS = 30000; + +async function main() { + const ensapiUrl = process.argv[2]; + + if (!ensapiUrl) { + console.error("Error: ENSApi URL is required."); + console.error("Usage: pnpm openapi:generate "); + console.error("Example: pnpm openapi:generate http://localhost:4334"); + process.exit(1); + } + + const openapiUrl = `${ensapiUrl}/openapi.json`; + + console.log(`Fetching OpenAPI spec from: ${openapiUrl}`); + + let response: Response; + try { + response = await fetch(openapiUrl, { + signal: AbortSignal.timeout(TIMEOUT_MS), + }); + } catch (error) { + if (error instanceof Error) { + if (error.name === "TimeoutError") { + console.error(`Error: Request timed out after ${TIMEOUT_MS / 1000} seconds.`); + console.error("The server may be slow to respond or unreachable."); + } else if (error.cause && (error.cause as NodeJS.ErrnoException).code === "ECONNREFUSED") { + console.error(`Error: Connection refused to ${ensapiUrl}`); + console.error("Make sure the ENSApi server is running and accessible."); + } else { + console.error(`Error: Failed to connect to ${ensapiUrl}`); + console.error(error.message); + } + } + process.exit(1); + } + + if (!response.ok) { + console.error(`Error: Server returned ${response.status} ${response.statusText}`); + if (response.status === 404) { + console.error("The /openapi.json endpoint was not found. Is this an ENSApi server?"); + } + process.exit(1); + } + + let spec: unknown; + try { + spec = await response.json(); + } catch { + console.error("Error: Response is not valid JSON."); + console.error("The server may not be returning an OpenAPI spec."); + process.exit(1); + } + + if (typeof spec !== "object" || spec === null || !("info" in spec) || !("paths" in spec)) { + console.error("Error: Response does not appear to be a valid OpenAPI spec."); + console.error("Expected an object with 'info' and 'paths' properties."); + process.exit(1); + } + + const typedSpec = spec as { + info?: { version?: string }; + paths?: Record; + }; + + // Pretty-print the JSON for readability in git diffs + const content = `${JSON.stringify(spec, null, 2)}\n`; + + writeFileSync(OUTPUT_PATH, content, "utf-8"); + + console.log(`OpenAPI spec written to: ${OUTPUT_PATH}`); + console.log(`Spec version: ${typedSpec.info?.version}`); + console.log(`Paths: ${Object.keys(typedSpec.paths || {}).length}`); + + // Format the output with Biome + console.log("Formatting with Biome..."); + try { + execFileSync("pnpm", ["biome", "format", "--write", OUTPUT_PATH], { + stdio: "inherit", + }); + } catch { + console.error("Warning: Failed to format with Biome. The file was still written."); + } +} + +main(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7f19b0d1..b5cbaad04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -598,7 +598,11 @@ importers: specifier: 'catalog:' version: 4.0.5(@types/debug@4.1.12)(@types/node@24.10.9)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) - docs/docs.ensnode.io: {} + docs/docs.ensnode.io: + devDependencies: + tsx: + specifier: ^4.7.1 + version: 4.20.6 docs/ensnode.io: dependencies: