diff --git a/docs/1.getting-started/4.package.md b/docs/1.getting-started/4.package.md index 880591377..1403c3c0e 100644 --- a/docs/1.getting-started/4.package.md +++ b/docs/1.getting-started/4.package.md @@ -21,6 +21,7 @@ The structure of the resulting package is the following: | :file_folder: `hasura` | Arbitrary Hasura metadata to apply during configuration | | :file_folder: `hooks` | User-defined callbacks to run manually or by schedule | | :file_folder: `models` | DipDup ORM models to store data in the database | +| :file_folder: `mcp` | Custom MCP rools and resources | | :file_folder: `sql` | SQL scripts and queries to run manually or on specific events | | :file_folder: `types` | Automatically generated Pydantic dataclasses for contract types | | `dipdup.yaml` | Root DipDup config; can be expanded with env-specific files | diff --git a/docs/5.advanced/7.mcp.md b/docs/5.advanced/7.mcp.md new file mode 100644 index 000000000..756ed0f4b --- /dev/null +++ b/docs/5.advanced/7.mcp.md @@ -0,0 +1,203 @@ +--- +title: "MCP" +description: "MCP is an open protocol that standardizes how applications provide context to LLMs. This document explains how to integrate DipDup with MCP clients and implement custom tools and resources." +--- + +# MCP integration + +::banner{type="warning"} +**You are early!** + +MCP is a pretty recent technology, so many tools might not work as expected. Consult the [Known issues](#known-issues) section for more information and open the ticket in [GitHub issues](https://github.com/dipdup-io/dipdup/issues) if you encounter any problems. +:: + +## Introduction + +The **Model Context Protocol** (MCP) is an open protocol that enables seamless integration between LLM applications and external data sources and tools. Whether you're building an AI-powered IDE, enhancing a chat interface, or creating custom AI workflows, MCP provides a standardized way to connect LLMs with the context they need. + +There are three types of MCP primitives (citing from the docs): + +- **Resources** are **application-controlled** and allow to expose data and content that can be read by clients and used as context for LLM interactions. +- **Tools** are **model-controlled** and enable servers to expose executable functionality to clients, such as interacting with external systems, performing computations, and taking actions in the real world. +- **Prompts** are **user-controlled** and enable servers to define reusable prompt templates and workflows that clients can easily surface to users and LLMs + +**DipDup** provides an MCP server with several built-in primitives to help LLMs understand the context of your project and the current state of the indexer. You can also implement your own tools and resources specific to your project. + +## Running MCP server + +DipDup MCP server runs in a separate process via the SSE transport. To start it, run the following command: + +```shell +dipdup mcp run +``` + +Make sure that you use the same database connection settings as for the indexer. + +By default, the server listens on `http://127.0.0.1:9999`. You can change the settings in the `mcp` section of the configuration file. + +```yaml [dipdup.yaml] +mcp: + host: 127.0.0.1 + port: 9999 +``` + +## Connecting clients + +### Cursor + +To configure MCP servers go to `File -> Preferences -> Cursor Settings -> MCP`. + +Add the following configuration to `~/.cursor/mcp.json`: + +```json [~/.cursor/mcp.json] +{ + "mcpServers": { + "local": { + "url": "http://127.0.0.1:9999/sse" + } + } +} +``` + +If your server is running, but Cursor doesn't connect, try "Reload Window" in the Command Palette. + +### VSCode (Copilot) + +There is no official support for MCP in VSCode yet. + +There are two extensions available in repository to add MCP capabilities to **Copilot** assistant. None of them worked out-of-the-box at the time of writing this document. + +- [Copilot MCP](https://marketplace.visualstudio.com/items?itemName=AutomataLabs.copilot-mcp) (issue [#20](https://github.com/VikashLoomba/copilot-mcp/issues/20)) +- [MCP-Client](https://marketplace.visualstudio.com/items?itemName=m1self.mcp-client) + +### Claude Desktop + +[Claude Desktop](https://claude.ai/download) currently only supports stdio-based MCP servers. You can use [supercorp-ai/supergateway](https://github.com/supercorp-ai/supergateway) tool to connect DipDup MCP server to Claude Desktop: + +```shell [Terminal] +npx -y supergateway --sse http://127.0.0.1:9999 +``` + +There is also [lightconetech/mcp-gateway](https://github.com/lightconetech/mcp-gateway) tool available for the same purpose. + +## Implementing MCP primitives + +To make your server more useful, you can implement custom MCP primitives specific to your project. For example, let's implement a tool that provides some information about token holders. + +If you used DipDup prior to 8.3 release, run `dipdup init` command to update the project structure. + +Create a new file `tools.py` in the `mcp` project directory. In this example, we define a new tool `TopHolders` that returns the top 10 token holders sorted by their balance. + +```python [mcp/tools.py] +from dipdup import mcp + +from demo_evm_events import models + +@mcp.tool('TopHolders', 'Get top token holders') +async def tool_holders() -> str: + holders = await models.Holder.filter().order_by('-balance').limit(10).all() + res = 'Top holders:\n\n' + for holder in holders: + res += f'- {holder.address}: {holder.balance}\n' + return res +``` + +### Using application context + +You can use the application context the same way as in handlers and hooks. Use the `mcp.get_ctx()` function to get the context object. + +```python +from dipdup import mcp +from dipdup.context import McpContext + +@mcp.tool(...) +async def tool(): + ctx: McpContext = mcp.get_ctx() + + ctx.logger.info('Hello from MCP tool!') +``` + +### Calling other callbacks + +You can use the `dipdup.mcp` functions to read other resources or call tools from your callbacks. + +```python +from dipdup import mcp + +@mcp.tool(...) +async def tool(): + result = await mcp.call_tool('my_tool', {}) +``` + +For a low-level access you can use `dipdup.mcp.server` singleton to interact with the running server. + +### Interacting with running indexer + +DipDup provides [management API](../7.references/4.api.md) to interact with the running indexer. For example you can use it to add indexes in runtime. First, add running indexer as a HTTP datasource: + +```yaml [dipdup.yaml] +datasources: + indexer: + kind: http + # NOTE: Default for Compose stack + url: http://api:46339 +``` + +Then, call this datasource from your MCP tool: + +```python +from dipdup import mcp + +@mcp.tool(...) +async def tool(): + ctx = mcp.get_ctx() + datasource = ctx.get_http_datasource('indexer') + response = await datasource.post( + '/add_index', + params={ + 'name': 'my_index', + 'template': 'my_template', + 'values': {'param': 'value'}, + 'first_level': 0, + 'last_level': 1000, + } + ) +``` + +## Running in Docker + +You can find a Compose file in `deploy/` project directory that runs both the indexer and the MCP server in Docker containers. To use this manifest, use the following command: + +```shell [Terminal] +make up COMPOSE=deploy/compose.mcp.yaml +``` + +### Debugging and troubleshooting + +To check if your tool is working correctly before using it in the client, you can use the [MCP Inspector](https://modelcontextprotocol.io/docs/tools/inspector) app: + +1. Run `npx @modelcontextprotocol/inspector` +2. Open `http://127.0.0.1:5173/` in your browser +3. Choose SSE transport and connect to `http://127.0.0.1:9999/sse`. + +You can also enable full logging to get some insights into the MCP server: + +```yaml [dipdup.yaml] +logging: + '': DEBUG +``` + +## Known issues + +- **DipDup** doesn't support custom prompts at the moment. +- **Cursor** fails to discover resources exposed by DipDup server. Tools work fine. (0.47.8 tested) +- **VSCode** community extensions for MCP don't work out-of-the-box. +- **Claude Desktop** doesn't support SSE-based MCP servers; gateway tools are required. + +## Further reading + +- [For Server Developers - Model Context Protocol](https://modelcontextprotocol.io/quickstart/server) +- [Example Servers - Model Context Protocol](https://modelcontextprotocol.io/examples) +- [qpd-v/mcp-guide](https://github.com/qpd-v/mcp-guide) - a tutorial server that helps users understand MCP concepts, provides interactive examples, and demonstrates best practices for building MCP integrations. Contains [awesome-list](https://raw.githubusercontent.com/qpd-v/mcp-guide/refs/heads/main/src/servers/serverlist.txt) of related projects. +- [anjor/coinmarket-mcp-server](https://github.com/anjor/coinmarket-mcp-server) - example MCP server for CoinMarketCap API. +- [ample-education/cursor-resources](https://github.com/ample-education/cursor-resources) - a collection of resources to maximize productivity with Cursor: prompts, rules, MCP servers etc. diff --git a/docs/7.references/1.cli.md b/docs/7.references/1.cli.md index fb320104b..d2a29d5af 100644 --- a/docs/7.references/1.cli.md +++ b/docs/7.references/1.cli.md @@ -203,6 +203,24 @@ Discord:
dipdup mcp [OPTIONS] COMMAND [ARGS]...
+
+ + + +### run + +

Run MCP server.

+
dipdup mcp run [OPTIONS]
+
+
+ + + + ## migrate

Migrate project to the new spec version.

diff --git a/docs/7.references/2.config.md b/docs/7.references/2.config.md index 25af581d4..3c28f0c5d 100644 --- a/docs/7.references/2.config.md +++ b/docs/7.references/2.config.md @@ -10,7 +10,7 @@ description: "Config file reference" ## dipdup.config.DipDupConfig -class dipdup.config.DipDupConfig(*args, spec_version, package, datasources=<factory>, database=<factory>, runtimes=<factory>, contracts=<factory>, indexes=<factory>, templates=<factory>, jobs=<factory>, hooks=<factory>, hasura=None, sentry=None, prometheus=None, api=None, advanced=<factory>, custom=<factory>, logging='INFO') +class dipdup.config.DipDupConfig(*args, spec_version, package, datasources=<factory>, database=<factory>, runtimes=<factory>, contracts=<factory>, indexes=<factory>, templates=<factory>, jobs=<factory>, hooks=<factory>, hasura=None, sentry=None, prometheus=None, api=None, advanced=<factory>, custom=<factory>, logging='INFO', mcp=None)

DipDup project configuration file

Parameters:
@@ -32,6 +32,7 @@ description: "Config file reference"
  • advanced (AdvancedConfig) – Advanced config

  • custom (dict[str, Any]) – User-defined configuration to use in callbacks

  • logging (dict[str, str | int] | str | int) – Modify logging verbosity

  • +
  • mcp (McpConfig | None) – MCP server config

  • diff --git a/docs/7.references/3.context.md b/docs/7.references/3.context.md index 2f286b646..b5c9b0b09 100644 --- a/docs/7.references/3.context.md +++ b/docs/7.references/3.context.md @@ -18,7 +18,7 @@ description: "Context reference"
  • config (DipDupConfig) – DipDup configuration

  • package (DipDupPackage) – DipDup package

  • datasources (dict[str, Datasource[Any]]) – Mapping of available datasources

  • -
  • transactions (TransactionManager) – Transaction manager (don’t use it directly)

  • +
  • transactions (TransactionManager) – Transaction manager (low-level interface)

  • logger – Context-aware logger instance

  • @@ -37,7 +37,7 @@ description: "Context reference"
  • config (DipDupConfig) – DipDup configuration

  • package (DipDupPackage) – DipDup package

  • datasources (dict[str, Datasource[Any]]) – Mapping of available datasources

  • -
  • transactions (TransactionManager) – Transaction manager (don’t use it directly)

  • +
  • transactions (TransactionManager) – Transaction manager (low-level interface)

  • logger (Logger) – Context-aware logger instance

  • handler_config (HandlerConfig) – Configuration of the current handler

  • @@ -57,7 +57,7 @@ description: "Context reference"
  • config (DipDupConfig) – DipDup configuration

  • package (DipDupPackage) – DipDup package

  • datasources (dict[str, Datasource[Any]]) – Mapping of available datasources

  • -
  • transactions (TransactionManager) – Transaction manager (don’t use it directly)

  • +
  • transactions (TransactionManager) – Transaction manager (low-level interface)

  • logger (Logger) – Context-aware logger instance

  • hook_config (HookConfig) – Configuration of the current hook

  • @@ -65,6 +65,26 @@ description: "Context reference" +
    + +## dipdup.context.McpContext + +class dipdup.context.McpContext(config, package, datasources, transactions, logger, server) +

    Execution context of MCP tools, resources and prompts.

    +
    +
    Parameters:
    +
      +
    • config (DipDupConfig) – DipDup configuration

    • +
    • package (DipDupPackage) – DipDup package

    • +
    • datasources (dict[str, Datasource[Any]]) – Mapping of available datasources

    • +
    • transactions (TransactionManager) – Transaction manager (low-level interface)

    • +
    • logger (Logger) – Context-aware logger instance

    • +
    • server (McpServer[Any]) – Running MCP server instance

    • +
    +
    +
    +
    +
    ## dipdup.context.DipDupContext.add_contract diff --git a/docs/7.references/4.models.md b/docs/7.references/4.models.md index 2bf5be8b3..129fe8a94 100644 --- a/docs/7.references/4.models.md +++ b/docs/7.references/4.models.md @@ -120,7 +120,7 @@ description: "Models reference" ## dipdup.models.IndexType class dipdup.models.IndexType(*values) -

    Enum for dipdup.models.Index

    +

    Kind of the index

    diff --git a/docs/9.release-notes/1.v8.3.md b/docs/9.release-notes/1.v8.3.md new file mode 100644 index 000000000..7bd837d33 --- /dev/null +++ b/docs/9.release-notes/1.v8.3.md @@ -0,0 +1,13 @@ +--- +title: "8.3" +description: DipDup 8.3 release notes +--- + + + +# Release Notes: 8.3 + +... + +{{ #include 9.release-notes/_8.3_changelog.md }} +{{ #include 9.release-notes/_footer.md }} diff --git a/docs/9.release-notes/9.v7.0.md b/docs/9.release-notes/10.v7.0.md similarity index 100% rename from docs/9.release-notes/9.v7.0.md rename to docs/9.release-notes/10.v7.0.md diff --git a/docs/9.release-notes/1.v8.2.md b/docs/9.release-notes/2.v8.2.md similarity index 100% rename from docs/9.release-notes/1.v8.2.md rename to docs/9.release-notes/2.v8.2.md diff --git a/docs/9.release-notes/2.v8.1.md b/docs/9.release-notes/3.v8.1.md similarity index 100% rename from docs/9.release-notes/2.v8.1.md rename to docs/9.release-notes/3.v8.1.md diff --git a/docs/9.release-notes/3.v8.0.md b/docs/9.release-notes/4.v8.0.md similarity index 100% rename from docs/9.release-notes/3.v8.0.md rename to docs/9.release-notes/4.v8.0.md diff --git a/docs/9.release-notes/4.v7.5.md b/docs/9.release-notes/5.v7.5.md similarity index 92% rename from docs/9.release-notes/4.v7.5.md rename to docs/9.release-notes/5.v7.5.md index 77666a548..3d1fd408f 100644 --- a/docs/9.release-notes/4.v7.5.md +++ b/docs/9.release-notes/5.v7.5.md @@ -15,7 +15,7 @@ A bunch of performance improvements have been made in this release. DipDup now i The Hasura adapter now supports the `bulk` request type to apply table customizations faster and organize custom metadata files more conveniently. -Finally, DipDup 6.5, the stable release branch, has reached end-of-life. 6.5.16 is the last release in this branch. Please, follow the [7.0 Migration Guide](../9.release-notes/9.v7.0.md#migration-guide) to upgrade to the latest version. +Finally, DipDup 6.5, the stable release branch, has reached end-of-life. 6.5.16 is the last release in this branch. Please, follow the [7.0 Migration Guide](../9.release-notes/10.v7.0.md#migration-guide) to upgrade to the latest version. {{ #include 9.release-notes/_7.5_changelog.md }} {{ #include 9.release-notes/_footer.md }} diff --git a/docs/9.release-notes/5.v7.4.md b/docs/9.release-notes/6.v7.4.md similarity index 100% rename from docs/9.release-notes/5.v7.4.md rename to docs/9.release-notes/6.v7.4.md diff --git a/docs/9.release-notes/6.v7.3.md b/docs/9.release-notes/7.v7.3.md similarity index 100% rename from docs/9.release-notes/6.v7.3.md rename to docs/9.release-notes/7.v7.3.md diff --git a/docs/9.release-notes/7.v7.2.md b/docs/9.release-notes/8.v7.2.md similarity index 100% rename from docs/9.release-notes/7.v7.2.md rename to docs/9.release-notes/8.v7.2.md diff --git a/docs/9.release-notes/8.v7.1.md b/docs/9.release-notes/9.v7.1.md similarity index 100% rename from docs/9.release-notes/8.v7.1.md rename to docs/9.release-notes/9.v7.1.md diff --git a/docs/9.release-notes/_8.3_changelog.md b/docs/9.release-notes/_8.3_changelog.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/context.rst b/docs/context.rst index d0183170e..013204e35 100644 --- a/docs/context.rst +++ b/docs/context.rst @@ -3,6 +3,7 @@ .. autoclass:: dipdup.context.DipDupContext .. autoclass:: dipdup.context.HandlerContext .. autoclass:: dipdup.context.HookContext +.. autoclass:: dipdup.context.McpContext .. automethod:: dipdup.context.DipDupContext.add_contract .. automethod:: dipdup.context.DipDupContext.add_index diff --git a/pyproject.toml b/pyproject.toml index afa1d773a..8a001ba5c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,6 +61,7 @@ dependencies = [ "datamodel-code-generator~=0.26", "eth-abi~=5.0", "lru-dict~=1.3", + "mcp>=1.2.1", "orjson~=3.10", "prometheus-client~=0.20", "pycryptodome~=3.20", @@ -68,11 +69,11 @@ dependencies = [ "pyhumps~=3.8", "pysignalr~=1.0", "python-dotenv~=1.0", - "python-json-logger~=2.0", # pinned + "python-json-logger~=2.0", # pinned "ruamel.yaml~=0.18.6", "sentry-sdk~=2.16", "sqlparse~=0.5", - "starknet-py~=0.25.0", # pinned + "starknet-py~=0.25.0", # pinned "strict-rfc3339~=0.7", "survey~=5.4", "tabulate~=0.9", diff --git a/requirements.txt b/requirements.txt index 3ff4bcd4e..e13a58711 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,24 +7,24 @@ aerich==0.8.2 \ aiohappyeyeballs==2.6.1 \ --hash=sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558 \ --hash=sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8 -aiohttp==3.11.13 \ - --hash=sha256:2eabb269dc3852537d57589b36d7f7362e57d1ece308842ef44d9830d2dc3c90 \ - --hash=sha256:47dc018b1b220c48089b5b9382fbab94db35bef2fa192995be22cbad3c5730c8 \ - --hash=sha256:5194143927e494616e335d074e77a5dac7cd353a04755330c9adc984ac5a628e \ - --hash=sha256:55789e93c5ed71832e7fac868167276beadf9877b85697020c46e9a75471f55f \ - --hash=sha256:5724cc77f4e648362ebbb49bdecb9e2b86d9b172c68a295263fa072e679ee69d \ - --hash=sha256:669dd33f028e54fe4c96576f406ebb242ba534dd3a981ce009961bf49960f117 \ - --hash=sha256:7104d5b3943c6351d1ad7027d90bdd0ea002903e9f610735ac99df3b81f102ee \ - --hash=sha256:7b77ee42addbb1c36d35aca55e8cc6d0958f8419e458bb70888d8c69a4ca833d \ - --hash=sha256:7c1b20a1ace54af7db1f95af85da530fe97407d9063b7aaf9ce6a32f44730778 \ - --hash=sha256:8ce789231404ca8fff7f693cdce398abf6d90fd5dae2b1847477196c243b1fbb \ - --hash=sha256:9229d8613bd8401182868fe95688f7581673e1c18ff78855671a4b8284f47bcb \ - --hash=sha256:9b5b37c863ad5b0892cc7a4ceb1e435e5e6acd3f2f8d3e11fa56f08d3c67b820 \ - --hash=sha256:aa36c35e94ecdb478246dd60db12aba57cfcd0abcad43c927a8876f25734d496 \ - --hash=sha256:afcb6b275c2d2ba5d8418bf30a9654fa978b4f819c2e8db6311b3525c86fe637 \ - --hash=sha256:c929f9a7249a11e4aa5c157091cfad7f49cc6b13f4eecf9b747104befd9f56f2 \ - --hash=sha256:d33851d85537bbf0f6291ddc97926a754c8f041af759e0aa0230fe939168852b \ - --hash=sha256:e06cf4852ce8c4442a59bae5a3ea01162b8fcb49ab438d8548b8dc79375dad8a +aiohttp==3.11.14 \ + --hash=sha256:0b2501f1b981e70932b4a552fc9b3c942991c7ae429ea117e8fba57718cdeed0 \ + --hash=sha256:0df3788187559c262922846087e36228b75987f3ae31dd0a1e5ee1034090d42f \ + --hash=sha256:28a3d083819741592685762d51d789e6155411277050d08066537c5edc4066e6 \ + --hash=sha256:3a8a0d127c10b8d89e69bbd3430da0f73946d839e65fec00ae48ca7916a31948 \ + --hash=sha256:3b420d076a46f41ea48e5fcccb996f517af0d406267e31e6716f480a3d50d65c \ + --hash=sha256:3b512f1de1c688f88dbe1b8bb1283f7fbeb7a2b2b26e743bb2193cbadfa6f307 \ + --hash=sha256:41cf0cefd9e7b5c646c2ef529c8335e7eafd326f444cc1cdb0c47b6bc836f9be \ + --hash=sha256:51ba80d473eb780a329d73ac8afa44aa71dfb521693ccea1dea8b9b5c4df45ce \ + --hash=sha256:602d4db80daf4497de93cb1ce00b8fc79969c0a7cf5b67bec96fa939268d806a \ + --hash=sha256:70ab0f61c1a73d3e0342cedd9a7321425c27a7067bebeeacd509f96695b875fc \ + --hash=sha256:8aa5c68e1e68fff7cd3142288101deb4316b51f03d50c92de6ea5ce646e6c71f \ + --hash=sha256:8d1dd75aa4d855c7debaf1ef830ff2dfcc33f893c7db0af2423ee761ebffd22b \ + --hash=sha256:948abc8952aff63de7b2c83bfe3f211c727da3a33c3a5866a0e2cf1ee1aa950f \ + --hash=sha256:9e73fa341d8b308bb799cf0ab6f55fc0461d27a9fa3e4582755a3d81a6af8c09 \ + --hash=sha256:ca9f835cdfedcb3f5947304e85b8ca3ace31eef6346d8027a97f4de5fb687534 \ + --hash=sha256:cc9253069158d57e27d47a8453d8a2c5a370dc461374111b5184cf2f147a3cc3 \ + --hash=sha256:d6edc538c7480fa0a3b2bdd705f8010062d74700198da55d16498e1b49549b9c aiolimiter==1.2.1 \ --hash=sha256:d3f249e9059a20badcb56b61601a83556133655c11d1eb3dd3e04ff069e5f3c7 \ --hash=sha256:e02a37ea1a855d9e832252a105420ad4d15011505512a1a1d814647451b5cca9 @@ -40,9 +40,9 @@ aiosubstrate==0.1.0 \ annotated-types==0.7.0 \ --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 -anyio==4.8.0 \ - --hash=sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a \ - --hash=sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a +anyio==4.9.0 \ + --hash=sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028 \ + --hash=sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c appdirs==1.4.4 \ --hash=sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41 \ --hash=sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128 @@ -55,9 +55,9 @@ argcomplete==3.6.0 \ asgiref==3.8.1 \ --hash=sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47 \ --hash=sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590 -async-lru==2.0.4 \ - --hash=sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627 \ - --hash=sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224 +async-lru==2.0.5 \ + --hash=sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb \ + --hash=sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943 asyncclick==8.1.8 \ --hash=sha256:0f0eb0f280e04919d67cf71b9fcdfb4db2d9ff7203669c40284485c149578e4c \ --hash=sha256:be146a2d8075d4fe372ff4e877f23c8b5af269d16705c1948123b9415f6fd678 \ @@ -72,28 +72,28 @@ asyncpg==0.30.0 \ --hash=sha256:c551e9928ab6707602f44811817f82ba3c446e018bfe1d3abecc8ba5f3eac851 \ --hash=sha256:c902a60b52e506d38d7e80e0dd5399f657220f24635fee368117b8b5fce1142e \ --hash=sha256:db9891e2d76e6f425746c5d2da01921e9a16b5a71a1c905b13f30e12a257c4af -attrs==25.2.0 \ - --hash=sha256:18a06db706db43ac232cce80443fcd9f2500702059ecf53489e3c5a3f417acaf \ - --hash=sha256:611344ff0a5fed735d86d7784610c84f8126b95e549bcad9ff61b4242f2d386b +attrs==25.3.0 \ + --hash=sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3 \ + --hash=sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b base58==2.1.1 \ --hash=sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2 \ --hash=sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c -bitarray==3.1.1 \ - --hash=sha256:079a2fd318d2300c2ef6e84fe9f8f563bcfad46b1360b7d58d82711e5bd8ea56 \ - --hash=sha256:1af43aa945c595bff4386a2b64c46f6cee653883e295907e419f6745123a168f \ - --hash=sha256:1dffa70fdf6e4aba4e4f8c8aa408950c3199f71546fb24cafc70f03400b22a59 \ - --hash=sha256:21081fb49d6b0a19b238d30dc0c948bec365bf16fccc2a1478a2794b37a6a812 \ - --hash=sha256:41f0f93a3ccde6f0e3b953d5adc89f7d4acdd3aadf71af8353c8b288a9d4bd80 \ - --hash=sha256:514757d0f76d9f84187ea15debd8b3956438f6f4f1e600be1019facdb6076796 \ - --hash=sha256:51f860b200fa90e446db77fe57173603ddb81eef4d4ba1ccdc277b564b3f20ab \ - --hash=sha256:5c819daa6c11107614328d9018ccbaf5b7c64060172bf564373d62928f139e87 \ - --hash=sha256:6a3816df3db86feaa8b4efd6844c6808147954626898355253e11e2544145f48 \ - --hash=sha256:7aceaaff83bcdf87bcc13788e29fd068d1a1e6965946ffed80f6e9323e5edd3d \ - --hash=sha256:97825938fa3fd7e917e40d66ab70ff133dee385da13cf91e0bd5cd4ec2d97048 \ - --hash=sha256:9e43e1a8b38d6e8ccc27cad74dabd8005b078856c471a1d0537491b71184f209 \ - --hash=sha256:a3c1d74ac2c969bac33169286fe601f8a6f4ca0e8f26dbaa22ad61fbf8fcf259 \ - --hash=sha256:a44c5271f7e079530f7a5eecac55cb4ff350ac82db768c550f66c1419893e4c7 \ - --hash=sha256:f913548d2907633782f0c3de72fa28646e1f97bdaf7f2df04014a17e923a258b +bitarray==3.2.0 \ + --hash=sha256:0d794a6a0c59c70026260ae3c983e05f7b712d0d28da9780f70032031c8741b5 \ + --hash=sha256:0e8e5f4073ad83e0086fc7db7da8977f83c488eae05e407869b51739011c392b \ + --hash=sha256:15f4793c0ae6d2350059f5d245ed0422dfea1fe5482fbc3dfe6f991fd9c9af01 \ + --hash=sha256:2b6b7f1cd876adf5ab029dff9140709f14ad732f965b58dd204e71d22b9b4b7a \ + --hash=sha256:333a3bf66eb80d3fe27fa7e4290204076a4b6b5b2e306676543c5955858c92e3 \ + --hash=sha256:55684bcf2f258d878cf2371065c3f45c55a42984b9a3ac7932ab9824a5acaa15 \ + --hash=sha256:75abbe1cf8b8e1286d0c302afac1d417a4460797a7648e55091ac2fc47e914f6 \ + --hash=sha256:79c3b3429a2ae5175452830d6674b3cd96b8b588d59e4d2dbe109d547f10d55d \ + --hash=sha256:9225fafa071f167e5be7b62fd433588cbc4909d896ac52be2da221abbe8d047a \ + --hash=sha256:98ca5afd7fbd4af2ad9fa7efdb146bc6da81a7cc58fb6b3c44cd46c72af21fa3 \ + --hash=sha256:aeba73ba4163b9b1e396c65ec2c51d2437b95d299f325b35a2509dcfafa88a00 \ + --hash=sha256:ef0d96550bd97df4d138a2ac5fa159b9d867ba7e04841a2b8ef92d502c6d6ab1 \ + --hash=sha256:f19c8c663123d146cd81357cb2a2c6f4528c6439d749056833addd8f81bd06b2 \ + --hash=sha256:f3976bfcdb15002b2b7beae1a96b07d97478f5b8d0ab2e4023aabcb4f2dccd04 \ + --hash=sha256:f766d1c6a5cbb1f87cb8ce0ff46cefda681cc2f9bef971908f914b2862409922 black==25.1.0 \ --hash=sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc \ --hash=sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666 \ @@ -123,17 +123,17 @@ charset-normalizer==3.4.1 \ --hash=sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7 \ --hash=sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1 \ --hash=sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616 -ckzg==2.0.1 \ - --hash=sha256:1fd9fb690c88919f30c9f3ab7cc46a7ecd734d5ff4c9ccea383c119b9b7cc4da \ - --hash=sha256:285cf3121b8a8c5609c5b706314f68d2ba2784ab02c5bb7487c6ae1714ecb27f \ - --hash=sha256:2eb50c53efdb9c34f762bd0c8006cf79bc92a9daf47aa6b541e496988484124f \ - --hash=sha256:2f927bc41c2551b0ef0056a649a7ebed29d9665680a10795f4cee5002c69ddb7 \ - --hash=sha256:62c5adc381637affa7e1df465c57750b356a761b8a3164c3106589b02532b9c9 \ - --hash=sha256:7960cc62f959403293fb53a3c2404778369ae7cefc6d7f202e5e00567cf98c4b \ - --hash=sha256:d721bcd492294c70eca39da0b0a433c29b6a571dbac2f7084bab06334904af06 \ - --hash=sha256:dde2391d025b5033ef0eeacf62b11ecfe446aea25682b5f547a907766ad0a8cb \ - --hash=sha256:fab8859d9420f6f7df4e094ee3639bc49d18c8dab0df81bee825e2363dd67a09 \ - --hash=sha256:fabc3bd41b306d1c7025d561c3281a007c2aca8ceaf998582dc3894904d9c73e +ckzg==2.1.0 \ + --hash=sha256:0959685678e3b89d740412f6d7ae0821b74ccbeac04080cb066774ea3044e2e9 \ + --hash=sha256:1bc4c46b0d7db4dd88b55cbd40d13e193536dcd5ae5d0634f0d838de832f429e \ + --hash=sha256:516610ac84f414338b0c1dc41a423906503e34b6672450e50cf22a21a707e51f \ + --hash=sha256:5a4a3de4f0e264c6d1676379a8968aef681f14df7b1144b7a9ba391180f33510 \ + --hash=sha256:73a353f31c945f0617a6b98d82fbb23909ac5039a10e345c681b728dd917b51a \ + --hash=sha256:9d9b35cf921a68769dce6fb64c34a7c331e6f7b8055bfbb8661e7163180f2742 \ + --hash=sha256:a13ce05bc4d2b93aa4f8aaecf9d785878f3d319a05e499268035a1ab1d464d52 \ + --hash=sha256:cecfafea88ef8106440e22eb6db56bf702f30d3af8a3fb54b2a628a5c4e10056 \ + --hash=sha256:e28a995e3b2923b05adb023412943dfd3b1aa1ca4e3a93d2149dcfbc15de639f \ + --hash=sha256:fb1054189f4c6b83d19e2c1a65521485227eb3b63fa3211adccaa7c587befc2a click==8.1.8 \ --hash=sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2 \ --hash=sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a @@ -225,9 +225,21 @@ frozenlist==1.5.0 \ genson==1.3.0 \ --hash=sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7 \ --hash=sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37 +h11==0.14.0 \ + --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ + --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 hexbytes==1.3.0 \ --hash=sha256:4a61840c24b0909a6534350e2d28ee50159ca1c9e89ce275fd31c110312cf684 \ --hash=sha256:83720b529c6e15ed21627962938dc2dec9bb1010f17bbbd66bf1e6a8287d522c +httpcore==1.0.7 \ + --hash=sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c \ + --hash=sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd +httpx==0.28.1 \ + --hash=sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc \ + --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad +httpx-sse==0.4.0 \ + --hash=sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721 \ + --hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f idna==3.10 \ --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 @@ -282,6 +294,9 @@ marshmallow-dataclass==8.7.1 \ marshmallow-oneofschema==3.1.1 \ --hash=sha256:68b4a57d0281a04ac25d4eb7a4c5865a57090a0a8fd30fd6362c8e833ac6a6d9 \ --hash=sha256:ff4cb2a488785ee8edd521a765682c2c80c78b9dc48894124531bdfa1ec9303b +mcp==1.4.1 \ + --hash=sha256:a7716b1ec1c054e76f49806f7d96113b99fc1166fc9244c2c6f19867cb75b593 \ + --hash=sha256:b9655d2de6313f9d55a7d1df62b3c3fe27a530100cc85bf23729145b0dba4c7a more-itertools==10.6.0 \ --hash=sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b \ --hash=sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89 @@ -301,24 +316,24 @@ msgpack==1.1.0 \ --hash=sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b \ --hash=sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d \ --hash=sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e -multidict==6.1.0 \ - --hash=sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761 \ - --hash=sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6 \ - --hash=sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966 \ - --hash=sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1 \ - --hash=sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305 \ - --hash=sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a \ - --hash=sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3 \ - --hash=sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506 \ - --hash=sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925 \ - --hash=sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e \ - --hash=sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95 \ - --hash=sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133 \ - --hash=sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436 \ - --hash=sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2 \ - --hash=sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2 \ - --hash=sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa \ - --hash=sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef +multidict==6.2.0 \ + --hash=sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8 \ + --hash=sha256:095a2eabe8c43041d3e6c2cb8287a257b5f1801c2d6ebd1dd877424f1e89cf29 \ + --hash=sha256:0b183a959fb88ad1be201de2c4bdf52fa8e46e6c185d76201286a97b6f5ee65c \ + --hash=sha256:125dd82b40f8c06d08d87b3510beaccb88afac94e9ed4a6f6c71362dc7dbb04b \ + --hash=sha256:437c33561edb6eb504b5a30203daf81d4a9b727e167e78b0854d9a4e18e8950b \ + --hash=sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530 \ + --hash=sha256:5dd7106d064d05896ce28c97da3f46caa442fe5a43bc26dfb258e90853b39b44 \ + --hash=sha256:61d5541f27533f803a941d3a3f8a3d10ed48c12cf918f557efcbf3cd04ef265c \ + --hash=sha256:76b34c12b013d813e6cb325e6bd4f9c984db27758b16085926bbe7ceeaace626 \ + --hash=sha256:7c611345bbe7cb44aabb877cb94b63e86f2d0db03e382667dbd037866d44b4f8 \ + --hash=sha256:89b3857652183b8206a891168af47bac10b970d275bba1f6ee46565a758c078d \ + --hash=sha256:8cd1a0644ccaf27e9d2f6d9c9474faabee21f0578fe85225cc5af9a61e1653df \ + --hash=sha256:9f49585f4abadd2283034fc605961f40c638635bc60f5162276fec075f2e37a4 \ + --hash=sha256:a0cc398350ef31167e03f3ca7c19313d4e40a662adcb98a88755e4e861170bdd \ + --hash=sha256:ac380cacdd3b183338ba63a144a34e9044520a6fb30c58aa14077157a033c13e \ + --hash=sha256:e25b11a0417475f093d0f0809a149aff3943c2c56da50fdf2c3c88d57fe3dfbd \ + --hash=sha256:facaf11f21f3a4c51b62931feb13310e6fe3475f85e20d9c9fdce0d2ea561b87 mypy-extensions==1.0.0 \ --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 @@ -346,9 +361,9 @@ parsimonious==0.10.0 \ pathspec==0.12.1 \ --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 -platformdirs==4.3.6 \ - --hash=sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907 \ - --hash=sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb +platformdirs==4.3.7 \ + --hash=sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94 \ + --hash=sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351 poseidon-py==0.1.5 \ --hash=sha256:0261221c68c36fd11cfcb91e5074953bfbe7a33031d806d3ab2dc5c7c1e70a2b \ --hash=sha256:06c07b1e2ad273d50b243121b1e94b28bf893bd4942fe1808f98d33cd2de2790 \ @@ -389,20 +404,20 @@ propcache==0.3.0 \ py-ecc==7.0.1 \ --hash=sha256:557461f42e57294d734305a30faf6b8903421651871e9cdeff8d8e67c6796c70 \ --hash=sha256:84a8b4d436163c83c65345a68e32f921ef6e64374a36f8e561f0455b4b08f5f2 -pycryptodome==3.21.0 \ - --hash=sha256:0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8 \ - --hash=sha256:18caa8cfbc676eaaf28613637a89980ad2fd96e00c564135bf90bc3f0b34dd93 \ - --hash=sha256:2480ec2c72438430da9f601ebc12c518c093c13111a5c1644c82cdfc2e50b1e4 \ - --hash=sha256:280b67d20e33bb63171d55b1067f61fbd932e0b1ad976b3a184303a3dad22764 \ - --hash=sha256:2cb635b67011bc147c257e61ce864879ffe6d03342dc74b6045059dfbdedafca \ - --hash=sha256:2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e \ - --hash=sha256:4c26a2f0dc15f81ea3afa3b0c87b87e501f235d332b7f27e2225ecb80c0b1cdd \ - --hash=sha256:7d85c1b613121ed3dbaa5a97369b3b757909531a959d229406a75b912dd51dd1 \ - --hash=sha256:8898a66425a57bcf15e25fc19c12490b87bd939800f39a03ea2de2aea5e3611a \ - --hash=sha256:932c905b71a56474bff8a9c014030bc3c882cee696b448af920399f730a650c2 \ - --hash=sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53 \ - --hash=sha256:de18954104667f565e2fbb4783b56667f30fb49c4d79b346f52a29cb198d5b6b \ - --hash=sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297 +pycryptodome==3.22.0 \ + --hash=sha256:009e1c80eea42401a5bd5983c4bab8d516aef22e014a4705622e24e6d9d703c6 \ + --hash=sha256:18d5b0ddc7cf69231736d778bd3ae2b3efb681ae33b64b0c92fb4626bb48bb89 \ + --hash=sha256:37ddcd18284e6b36b0a71ea495a4c4dca35bb09ccc9bfd5b91bfaf2321f131c1 \ + --hash=sha256:3b76fa80daeff9519d7e9f6d9e40708f2fce36b9295a847f00624a08293f4f00 \ + --hash=sha256:98fd9da809d5675f3a65dcd9ed384b9dc67edab6a4cda150c5870a8122ec961d \ + --hash=sha256:a0092fd476701eeeb04df5cc509d8b739fa381583cda6a46ff0a60639b7cd70d \ + --hash=sha256:a31fa5914b255ab62aac9265654292ce0404f6b66540a065f538466474baedbc \ + --hash=sha256:aec7b40a7ea5af7c40f8837adf20a137d5e11a6eb202cde7e588a48fb2d871a8 \ + --hash=sha256:d086aed307e96d40c23c42418cbbca22ecc0ab4a8a0e24f87932eeab26c08627 \ + --hash=sha256:d21c1eda2f42211f18a25db4eaf8056c94a8563cd39da3683f89fe0d881fb772 \ + --hash=sha256:f02baa9f5e35934c6e8dcec91fcde96612bdefef6e442813b8ea34e82c84bbfb \ + --hash=sha256:f6cf6aa36fcf463e622d2165a5ad9963b2762bebae2f632d719dfb8544903cf5 \ + --hash=sha256:fd7ab568b3ad7b77c908d7c3f7e167ec5a8f035c64ff74f10d47a4edd043d723 pydantic==2.10.6 \ --hash=sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584 \ --hash=sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236 @@ -422,6 +437,9 @@ pydantic-core==2.27.2 \ --hash=sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9 \ --hash=sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3 \ --hash=sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39 +pydantic-settings==2.8.1 \ + --hash=sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c \ + --hash=sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585 pyhumps==3.8.0 \ --hash=sha256:060e1954d9069f428232a1adda165db0b9d8dfdce1d265d36df7fbff540acfd6 \ --hash=sha256:498026258f7ee1a8e447c2e28526c0bea9407f9a59c03260aee4bd6c04d681a3 @@ -498,9 +516,9 @@ ruamel-yaml-clib==0.2.12 ; platform_python_implementation == 'CPython' \ scalecodec==1.2.11 \ --hash=sha256:99a2cdbfccdcaf22bd86b86da55a730a2855514ad2309faef4a4a93ac6cbeb8d \ --hash=sha256:d15c94965f617caa25096f83a45f5f73031d05e6ee08d6039969f0a64fc35de1 -sentry-sdk==2.22.0 \ - --hash=sha256:3d791d631a6c97aad4da7074081a57073126c69487560c6f8bffcf586461de66 \ - --hash=sha256:b4bf43bb38f547c84b2eadcefbe389b36ef75f3f38253d7a74d6b928c07ae944 +sentry-sdk==2.23.1 \ + --hash=sha256:2288320465065f3f056630ce55936426204f96f63f1208edb79e033ed03774db \ + --hash=sha256:42ef3a6cc1db3d22cb2ab24163d75b23f291ad9892b1a8c44075ce809a32b191 six==1.17.0 \ --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 @@ -510,8 +528,14 @@ sniffio==1.3.1 \ sqlparse==0.5.3 \ --hash=sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272 \ --hash=sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca +sse-starlette==2.2.1 \ + --hash=sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419 \ + --hash=sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99 starknet-py==0.25.0 \ --hash=sha256:452f2c9ed5e235540209ec2042d22dcf79c6cec2a6850f5b518d61b3fada3706 +starlette==0.46.1 \ + --hash=sha256:3c88d58ee4bd1bb807c0d1acb381838afc7752f9ddaec81bbe4383611d833230 \ + --hash=sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227 strict-rfc3339==0.7 \ --hash=sha256:5cad17bedfc3af57b399db0fed32771f18fc54bbd917e85546088607ac5e1277 survey==5.4.2 \ @@ -550,6 +574,9 @@ tzlocal==5.3.1 \ urllib3==2.3.0 \ --hash=sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df \ --hash=sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d +uvicorn==0.34.0 \ + --hash=sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4 \ + --hash=sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9 uvloop==0.21.0 \ --hash=sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f \ --hash=sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c \ diff --git a/schemas/dipdup-3.0.json b/schemas/dipdup-3.0.json index 1bf12cf38..6ec34ffe5 100644 --- a/schemas/dipdup-3.0.json +++ b/schemas/dipdup-3.0.json @@ -1221,6 +1221,26 @@ "title": "JobConfig", "type": "object" }, + "McpConfig": { + "additionalProperties": false, + "description": "Config for MCP server", + "properties": { + "host": { + "default": "127.0.0.1", + "description": "Host to bind to", + "title": "host", + "type": "string" + }, + "port": { + "default": 9999, + "description": "Port to bind to", + "title": "port", + "type": "integer" + } + }, + "title": "McpConfig", + "type": "object" + }, "PostgresDatabaseConfig": { "additionalProperties": false, "description": "Postgres database connection config", @@ -3311,6 +3331,19 @@ "description": "Modify logging verbosity", "title": "logging" }, + "mcp": { + "anyOf": [ + { + "$ref": "#/$defs/McpConfig" + }, + { + "type": "null" + } + ], + "default": null, + "description": "MCP server config", + "title": "mcp" + }, "package": { "description": "Name of indexer's Python package, existing or not", "title": "package", diff --git a/src/demo_blank/Makefile b/src/demo_blank/Makefile index 58d80aa22..ab64725ce 100644 --- a/src/demo_blank/Makefile +++ b/src/demo_blank/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_blank/configs/dipdup.compose.yaml b/src/demo_blank/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_blank/configs/dipdup.compose.yaml +++ b/src/demo_blank/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_blank/configs/dipdup.sqlite.yaml b/src/demo_blank/configs/dipdup.sqlite.yaml index 1d6c41b76..a3b743fe4 100644 --- a/src/demo_blank/configs/dipdup.sqlite.yaml +++ b/src/demo_blank/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_blank/configs/dipdup.swarm.yaml b/src/demo_blank/configs/dipdup.swarm.yaml index 36eb14772..2caceff6a 100644 --- a/src/demo_blank/configs/dipdup.swarm.yaml +++ b/src/demo_blank/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_blank/deploy/compose.mcp.yaml b/src/demo_blank/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_blank/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_blank/mcp/.keep b/src/demo_blank/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_evm_events/Makefile b/src/demo_evm_events/Makefile index a48d49fc2..488754967 100644 --- a/src/demo_evm_events/Makefile +++ b/src/demo_evm_events/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_evm_events/configs/dipdup.compose.yaml b/src/demo_evm_events/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_evm_events/configs/dipdup.compose.yaml +++ b/src/demo_evm_events/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_evm_events/configs/dipdup.sqlite.yaml b/src/demo_evm_events/configs/dipdup.sqlite.yaml index 83ddb8838..936193068 100644 --- a/src/demo_evm_events/configs/dipdup.sqlite.yaml +++ b/src/demo_evm_events/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_evm_events/configs/dipdup.swarm.yaml b/src/demo_evm_events/configs/dipdup.swarm.yaml index 109637933..f18d2ca5d 100644 --- a/src/demo_evm_events/configs/dipdup.swarm.yaml +++ b/src/demo_evm_events/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_evm_events/deploy/compose.mcp.yaml b/src/demo_evm_events/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_evm_events/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_evm_events/mcp/.keep b/src/demo_evm_events/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_evm_transactions/Makefile b/src/demo_evm_transactions/Makefile index 2092d2906..d7f6d4e5b 100644 --- a/src/demo_evm_transactions/Makefile +++ b/src/demo_evm_transactions/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_evm_transactions/configs/dipdup.compose.yaml b/src/demo_evm_transactions/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_evm_transactions/configs/dipdup.compose.yaml +++ b/src/demo_evm_transactions/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_evm_transactions/configs/dipdup.sqlite.yaml b/src/demo_evm_transactions/configs/dipdup.sqlite.yaml index a3da667a6..013a6b225 100644 --- a/src/demo_evm_transactions/configs/dipdup.sqlite.yaml +++ b/src/demo_evm_transactions/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_evm_transactions/configs/dipdup.swarm.yaml b/src/demo_evm_transactions/configs/dipdup.swarm.yaml index 921a981b5..be66a939b 100644 --- a/src/demo_evm_transactions/configs/dipdup.swarm.yaml +++ b/src/demo_evm_transactions/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_evm_transactions/deploy/compose.mcp.yaml b/src/demo_evm_transactions/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_evm_transactions/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_evm_transactions/mcp/.keep b/src/demo_evm_transactions/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_evm_uniswap/Makefile b/src/demo_evm_uniswap/Makefile index 5b92732b5..b6cd87e22 100644 --- a/src/demo_evm_uniswap/Makefile +++ b/src/demo_evm_uniswap/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_evm_uniswap/configs/dipdup.compose.yaml b/src/demo_evm_uniswap/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_evm_uniswap/configs/dipdup.compose.yaml +++ b/src/demo_evm_uniswap/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_evm_uniswap/configs/dipdup.sqlite.yaml b/src/demo_evm_uniswap/configs/dipdup.sqlite.yaml index 8d04cd1a7..b2380486a 100644 --- a/src/demo_evm_uniswap/configs/dipdup.sqlite.yaml +++ b/src/demo_evm_uniswap/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_evm_uniswap/configs/dipdup.swarm.yaml b/src/demo_evm_uniswap/configs/dipdup.swarm.yaml index c0f5296d5..50f540b09 100644 --- a/src/demo_evm_uniswap/configs/dipdup.swarm.yaml +++ b/src/demo_evm_uniswap/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_evm_uniswap/deploy/compose.mcp.yaml b/src/demo_evm_uniswap/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_evm_uniswap/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_evm_uniswap/handlers/factory/pool_created.py b/src/demo_evm_uniswap/handlers/factory/pool_created.py index 637b1890f..36eaa74c6 100644 --- a/src/demo_evm_uniswap/handlers/factory/pool_created.py +++ b/src/demo_evm_uniswap/handlers/factory/pool_created.py @@ -1,15 +1,18 @@ from contextlib import suppress +from typing import TYPE_CHECKING from typing import cast from demo_evm_uniswap import models as models from demo_evm_uniswap.models.token import WHITELIST_TOKENS from demo_evm_uniswap.models.token import ERC20Token from demo_evm_uniswap.types.factory.evm_events.pool_created import PoolCreatedPayload -from dipdup.config.evm import EvmContractConfig from dipdup.context import HandlerContext from dipdup.models.evm import EvmEvent from tortoise.exceptions import OperationalError +if TYPE_CHECKING: + from dipdup.config.evm import EvmContractConfig + POOL_BLACKLIST = {'0x8fe8d9bb8eeba3ed688069c3d6b556c9ca258248'} WETH_ADDRESS = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2' @@ -42,7 +45,7 @@ async def pool_created( ctx.logger.info('Pool %s is blacklisted', event.payload.pool) return - factory_address = cast(EvmContractConfig, ctx.config.get_contract('factory')).address + factory_address = cast('EvmContractConfig', ctx.config.get_contract('factory')).address factory, _ = await models.Factory.get_or_create(id=factory_address) factory.pool_count += 1 await factory.save() diff --git a/src/demo_evm_uniswap/mcp/.keep b/src/demo_evm_uniswap/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_evm_uniswap/models/abi.py b/src/demo_evm_uniswap/models/abi.py index 0c4dd2a87..9749882ca 100644 --- a/src/demo_evm_uniswap/models/abi.py +++ b/src/demo_evm_uniswap/models/abi.py @@ -9,4 +9,4 @@ def get_abi(path: str) -> dict[str, Any]: """Get ABI without context to cache in the module""" package_dir = Path(__file__).parent.parent abi_path = package_dir / 'abi' / f"{path.replace('.', '/')}.json" - return cast(dict[str, Any], orjson.loads(abi_path.read_bytes())) + return cast('dict[str, Any]', orjson.loads(abi_path.read_bytes())) diff --git a/src/demo_evm_uniswap/models/repo.py b/src/demo_evm_uniswap/models/repo.py index a3a27c9c9..cdaea4177 100644 --- a/src/demo_evm_uniswap/models/repo.py +++ b/src/demo_evm_uniswap/models/repo.py @@ -1,13 +1,16 @@ from decimal import Decimal +from typing import TYPE_CHECKING from typing import Any from typing import cast -from dipdup.config.evm import EvmContractConfig from dipdup.context import HandlerContext from lru import LRU import demo_evm_uniswap.models as models +if TYPE_CHECKING: + from dipdup.config.evm import EvmContractConfig + USDC_WETH_03_POOL = '0x8ad599c3a0ff1de082011efddc58f1908eb6e6d8' @@ -36,7 +39,7 @@ def get_pending_position(self, idx: str) -> dict[str, Any] | None: async def get_ctx_factory(ctx: HandlerContext) -> models.Factory: - factory_address = cast(EvmContractConfig, ctx.config.get_contract('factory')).address + factory_address = cast('EvmContractConfig', ctx.config.get_contract('factory')).address if factory_address is None: raise Exception('Factory address is not specified') return await models.Factory.cached_get(factory_address) diff --git a/src/demo_starknet_events/Makefile b/src/demo_starknet_events/Makefile index fa47b1032..2028f141c 100644 --- a/src/demo_starknet_events/Makefile +++ b/src/demo_starknet_events/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_starknet_events/configs/dipdup.compose.yaml b/src/demo_starknet_events/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_starknet_events/configs/dipdup.compose.yaml +++ b/src/demo_starknet_events/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_starknet_events/configs/dipdup.sqlite.yaml b/src/demo_starknet_events/configs/dipdup.sqlite.yaml index 1730e2290..e7e8fc909 100644 --- a/src/demo_starknet_events/configs/dipdup.sqlite.yaml +++ b/src/demo_starknet_events/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_starknet_events/configs/dipdup.swarm.yaml b/src/demo_starknet_events/configs/dipdup.swarm.yaml index 5c67dc423..af712e667 100644 --- a/src/demo_starknet_events/configs/dipdup.swarm.yaml +++ b/src/demo_starknet_events/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_starknet_events/deploy/compose.mcp.yaml b/src/demo_starknet_events/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_starknet_events/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_starknet_events/mcp/.keep b/src/demo_starknet_events/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_substrate_events/Makefile b/src/demo_substrate_events/Makefile index 1c6eb8fa4..f8bdcb3ef 100644 --- a/src/demo_substrate_events/Makefile +++ b/src/demo_substrate_events/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_substrate_events/configs/dipdup.compose.yaml b/src/demo_substrate_events/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_substrate_events/configs/dipdup.compose.yaml +++ b/src/demo_substrate_events/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_substrate_events/configs/dipdup.sqlite.yaml b/src/demo_substrate_events/configs/dipdup.sqlite.yaml index 119aab5b2..e02ac229c 100644 --- a/src/demo_substrate_events/configs/dipdup.sqlite.yaml +++ b/src/demo_substrate_events/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_substrate_events/configs/dipdup.swarm.yaml b/src/demo_substrate_events/configs/dipdup.swarm.yaml index 91290d8c8..a12e9c085 100644 --- a/src/demo_substrate_events/configs/dipdup.swarm.yaml +++ b/src/demo_substrate_events/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_substrate_events/deploy/compose.mcp.yaml b/src/demo_substrate_events/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_substrate_events/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_substrate_events/mcp/.keep b/src/demo_substrate_events/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_auction/Makefile b/src/demo_tezos_auction/Makefile index 598d8dcb2..670c1ba21 100644 --- a/src/demo_tezos_auction/Makefile +++ b/src/demo_tezos_auction/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_auction/configs/dipdup.compose.yaml b/src/demo_tezos_auction/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_auction/configs/dipdup.compose.yaml +++ b/src/demo_tezos_auction/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_auction/configs/dipdup.sqlite.yaml b/src/demo_tezos_auction/configs/dipdup.sqlite.yaml index f302f6caf..4c24b9c7e 100644 --- a/src/demo_tezos_auction/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_auction/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_auction/configs/dipdup.swarm.yaml b/src/demo_tezos_auction/configs/dipdup.swarm.yaml index cdbba5bc2..9df161c26 100644 --- a/src/demo_tezos_auction/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_auction/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_auction/deploy/compose.mcp.yaml b/src/demo_tezos_auction/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_auction/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_auction/mcp/.keep b/src/demo_tezos_auction/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_dao/Makefile b/src/demo_tezos_dao/Makefile index bb820215e..0c1d03421 100644 --- a/src/demo_tezos_dao/Makefile +++ b/src/demo_tezos_dao/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_dao/configs/dipdup.compose.yaml b/src/demo_tezos_dao/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_dao/configs/dipdup.compose.yaml +++ b/src/demo_tezos_dao/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_dao/configs/dipdup.sqlite.yaml b/src/demo_tezos_dao/configs/dipdup.sqlite.yaml index eb8a87dae..4a0f5f22b 100644 --- a/src/demo_tezos_dao/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_dao/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_dao/configs/dipdup.swarm.yaml b/src/demo_tezos_dao/configs/dipdup.swarm.yaml index 973ef4168..aa9305190 100644 --- a/src/demo_tezos_dao/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_dao/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_dao/deploy/compose.mcp.yaml b/src/demo_tezos_dao/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_dao/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_dao/mcp/.keep b/src/demo_tezos_dao/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_dex/Makefile b/src/demo_tezos_dex/Makefile index 7aaa2b156..1ea571baa 100644 --- a/src/demo_tezos_dex/Makefile +++ b/src/demo_tezos_dex/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_dex/configs/dipdup.compose.yaml b/src/demo_tezos_dex/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_dex/configs/dipdup.compose.yaml +++ b/src/demo_tezos_dex/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_dex/configs/dipdup.sqlite.yaml b/src/demo_tezos_dex/configs/dipdup.sqlite.yaml index 630e591e3..dd7b94539 100644 --- a/src/demo_tezos_dex/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_dex/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_dex/configs/dipdup.swarm.yaml b/src/demo_tezos_dex/configs/dipdup.swarm.yaml index 113dd97eb..759e0c8dc 100644 --- a/src/demo_tezos_dex/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_dex/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_dex/deploy/compose.mcp.yaml b/src/demo_tezos_dex/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_dex/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_dex/mcp/.keep b/src/demo_tezos_dex/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_domains/Makefile b/src/demo_tezos_domains/Makefile index 3cdb71a7e..f29409011 100644 --- a/src/demo_tezos_domains/Makefile +++ b/src/demo_tezos_domains/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_domains/configs/dipdup.compose.yaml b/src/demo_tezos_domains/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_domains/configs/dipdup.compose.yaml +++ b/src/demo_tezos_domains/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_domains/configs/dipdup.sqlite.yaml b/src/demo_tezos_domains/configs/dipdup.sqlite.yaml index 2909e2de4..7fc06c608 100644 --- a/src/demo_tezos_domains/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_domains/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_domains/configs/dipdup.swarm.yaml b/src/demo_tezos_domains/configs/dipdup.swarm.yaml index cb56d992f..e02b4f916 100644 --- a/src/demo_tezos_domains/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_domains/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_domains/deploy/compose.mcp.yaml b/src/demo_tezos_domains/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_domains/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_domains/handlers/on_update_expiry_map.py b/src/demo_tezos_domains/handlers/on_update_expiry_map.py index f0dbacd7c..3eb8999b3 100644 --- a/src/demo_tezos_domains/handlers/on_update_expiry_map.py +++ b/src/demo_tezos_domains/handlers/on_update_expiry_map.py @@ -41,7 +41,7 @@ async def on_update_expiry_map( record.expired = False await record.save() if record.address is not None: - metadata = {} if record.metadata is None else cast(dict[str, Any], record.metadata) + metadata = {} if record.metadata is None else cast('dict[str, Any]', record.metadata) metadata.update(name=record.id) await ctx.update_contract_metadata( network=ctx.handler_config.parent.datasources[0].name, diff --git a/src/demo_tezos_domains/hooks/check_expiration.py b/src/demo_tezos_domains/hooks/check_expiration.py index d996f6290..147c44c76 100644 --- a/src/demo_tezos_domains/hooks/check_expiration.py +++ b/src/demo_tezos_domains/hooks/check_expiration.py @@ -1,15 +1,18 @@ from datetime import datetime +from typing import TYPE_CHECKING from typing import cast from demo_tezos_domains.models import Record from dipdup.context import HookContext -from dipdup.datasources.tezos_tzkt import TezosTzktDatasource + +if TYPE_CHECKING: + from dipdup.datasources.tezos_tzkt import TezosTzktDatasource async def check_expiration( ctx: HookContext, ) -> None: - ds = cast(TezosTzktDatasource, next(iter(ctx.datasources.values()))) + ds = cast('TezosTzktDatasource', next(iter(ctx.datasources.values()))) expiring_records = ( await Record.filter(expired=False, domain__expires_at__lt=datetime.utcnow()).all().prefetch_related('domain') ) diff --git a/src/demo_tezos_domains/mcp/.keep b/src/demo_tezos_domains/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_events/Makefile b/src/demo_tezos_events/Makefile index aa32ac445..de736f5c8 100644 --- a/src/demo_tezos_events/Makefile +++ b/src/demo_tezos_events/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_events/configs/dipdup.compose.yaml b/src/demo_tezos_events/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_events/configs/dipdup.compose.yaml +++ b/src/demo_tezos_events/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_events/configs/dipdup.sqlite.yaml b/src/demo_tezos_events/configs/dipdup.sqlite.yaml index c913ee9db..f83133c5c 100644 --- a/src/demo_tezos_events/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_events/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_events/configs/dipdup.swarm.yaml b/src/demo_tezos_events/configs/dipdup.swarm.yaml index 3dd5dfcee..1b6485e2b 100644 --- a/src/demo_tezos_events/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_events/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_events/deploy/compose.mcp.yaml b/src/demo_tezos_events/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_events/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_events/mcp/.keep b/src/demo_tezos_events/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_factories/Makefile b/src/demo_tezos_factories/Makefile index f53b618b8..3f78be458 100644 --- a/src/demo_tezos_factories/Makefile +++ b/src/demo_tezos_factories/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_factories/configs/dipdup.compose.yaml b/src/demo_tezos_factories/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_factories/configs/dipdup.compose.yaml +++ b/src/demo_tezos_factories/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_factories/configs/dipdup.sqlite.yaml b/src/demo_tezos_factories/configs/dipdup.sqlite.yaml index 6f12866e8..1f28f1537 100644 --- a/src/demo_tezos_factories/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_factories/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_factories/configs/dipdup.swarm.yaml b/src/demo_tezos_factories/configs/dipdup.swarm.yaml index f1ab8d2a7..56368db65 100644 --- a/src/demo_tezos_factories/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_factories/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_factories/deploy/compose.mcp.yaml b/src/demo_tezos_factories/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_factories/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_factories/handlers/on_factory_origination.py b/src/demo_tezos_factories/handlers/on_factory_origination.py index 719311c79..76650e619 100644 --- a/src/demo_tezos_factories/handlers/on_factory_origination.py +++ b/src/demo_tezos_factories/handlers/on_factory_origination.py @@ -12,8 +12,8 @@ async def on_factory_origination( origination_1: TezosOperationData, ) -> None: assert transaction_0.parameter_json - dex_contract = cast(str, origination_1.originated_contract_address) - token_contract = cast(str, transaction_0.parameter_json['token']['address']) + dex_contract = cast('str', origination_1.originated_contract_address) + token_contract = cast('str', transaction_0.parameter_json['token']['address']) await ctx.add_contract( kind='tezos', diff --git a/src/demo_tezos_factories/mcp/.keep b/src/demo_tezos_factories/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_head/Makefile b/src/demo_tezos_head/Makefile index a51cdec8f..f3f1c155b 100644 --- a/src/demo_tezos_head/Makefile +++ b/src/demo_tezos_head/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_head/configs/dipdup.compose.yaml b/src/demo_tezos_head/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_head/configs/dipdup.compose.yaml +++ b/src/demo_tezos_head/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_head/configs/dipdup.sqlite.yaml b/src/demo_tezos_head/configs/dipdup.sqlite.yaml index 1982997bf..1334add06 100644 --- a/src/demo_tezos_head/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_head/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_head/configs/dipdup.swarm.yaml b/src/demo_tezos_head/configs/dipdup.swarm.yaml index 3ac8e209b..ea6defb04 100644 --- a/src/demo_tezos_head/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_head/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_head/deploy/compose.mcp.yaml b/src/demo_tezos_head/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_head/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_head/mcp/.keep b/src/demo_tezos_head/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_nft_marketplace/Makefile b/src/demo_tezos_nft_marketplace/Makefile index fe5375ea1..9a5bbead0 100644 --- a/src/demo_tezos_nft_marketplace/Makefile +++ b/src/demo_tezos_nft_marketplace/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_nft_marketplace/configs/dipdup.compose.yaml b/src/demo_tezos_nft_marketplace/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_nft_marketplace/configs/dipdup.compose.yaml +++ b/src/demo_tezos_nft_marketplace/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_nft_marketplace/configs/dipdup.sqlite.yaml b/src/demo_tezos_nft_marketplace/configs/dipdup.sqlite.yaml index 4ddb8a731..fe0d9f7d5 100644 --- a/src/demo_tezos_nft_marketplace/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_nft_marketplace/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_nft_marketplace/configs/dipdup.swarm.yaml b/src/demo_tezos_nft_marketplace/configs/dipdup.swarm.yaml index 49f7424fc..3c9372543 100644 --- a/src/demo_tezos_nft_marketplace/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_nft_marketplace/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_nft_marketplace/deploy/compose.mcp.yaml b/src/demo_tezos_nft_marketplace/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_nft_marketplace/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_nft_marketplace/mcp/.keep b/src/demo_tezos_nft_marketplace/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_raw/Makefile b/src/demo_tezos_raw/Makefile index dfa7bccac..b8f0662a1 100644 --- a/src/demo_tezos_raw/Makefile +++ b/src/demo_tezos_raw/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_raw/configs/dipdup.compose.yaml b/src/demo_tezos_raw/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_raw/configs/dipdup.compose.yaml +++ b/src/demo_tezos_raw/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_raw/configs/dipdup.sqlite.yaml b/src/demo_tezos_raw/configs/dipdup.sqlite.yaml index 5b239d9ae..de4f30bd2 100644 --- a/src/demo_tezos_raw/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_raw/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_raw/configs/dipdup.swarm.yaml b/src/demo_tezos_raw/configs/dipdup.swarm.yaml index 0bbc02845..180aa4c2f 100644 --- a/src/demo_tezos_raw/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_raw/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_raw/deploy/compose.mcp.yaml b/src/demo_tezos_raw/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_raw/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_raw/mcp/.keep b/src/demo_tezos_raw/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_token/Makefile b/src/demo_tezos_token/Makefile index 34e406eb9..0a12d993e 100644 --- a/src/demo_tezos_token/Makefile +++ b/src/demo_tezos_token/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_token/configs/dipdup.compose.yaml b/src/demo_tezos_token/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_token/configs/dipdup.compose.yaml +++ b/src/demo_tezos_token/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_token/configs/dipdup.sqlite.yaml b/src/demo_tezos_token/configs/dipdup.sqlite.yaml index 6679102e4..1aaf06898 100644 --- a/src/demo_tezos_token/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_token/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_token/configs/dipdup.swarm.yaml b/src/demo_tezos_token/configs/dipdup.swarm.yaml index dac6da61c..be4f503d3 100644 --- a/src/demo_tezos_token/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_token/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_token/deploy/compose.mcp.yaml b/src/demo_tezos_token/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_token/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_token/mcp/.keep b/src/demo_tezos_token/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_token_balances/Makefile b/src/demo_tezos_token_balances/Makefile index 66f6dfb0c..c8504a028 100644 --- a/src/demo_tezos_token_balances/Makefile +++ b/src/demo_tezos_token_balances/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_token_balances/configs/dipdup.compose.yaml b/src/demo_tezos_token_balances/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_token_balances/configs/dipdup.compose.yaml +++ b/src/demo_tezos_token_balances/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_token_balances/configs/dipdup.sqlite.yaml b/src/demo_tezos_token_balances/configs/dipdup.sqlite.yaml index bcaa587a3..e8cf4b407 100644 --- a/src/demo_tezos_token_balances/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_token_balances/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_token_balances/configs/dipdup.swarm.yaml b/src/demo_tezos_token_balances/configs/dipdup.swarm.yaml index 704c4305a..c819cb038 100644 --- a/src/demo_tezos_token_balances/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_token_balances/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_token_balances/deploy/compose.mcp.yaml b/src/demo_tezos_token_balances/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_token_balances/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_token_balances/mcp/.keep b/src/demo_tezos_token_balances/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/demo_tezos_token_transfers/Makefile b/src/demo_tezos_token_transfers/Makefile index 85b5c7d92..269f174ca 100644 --- a/src/demo_tezos_token_transfers/Makefile +++ b/src/demo_tezos_token_transfers/Makefile @@ -1,3 +1,4 @@ +# generated by DipDup 8.2.2 .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -16,11 +17,11 @@ all: ## Run an entire CI pipeline ## install: ## Install dependencies - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked update: ## Update dependencies - dipdup self update -q - uv sync --all-extras --all-groups + # dipdup self update -q + uv sync --all-extras --all-groups --link-mode symlink format: ## Format with all tools make black diff --git a/src/demo_tezos_token_transfers/configs/dipdup.compose.yaml b/src/demo_tezos_token_transfers/configs/dipdup.compose.yaml index 02550b348..5a23eabaa 100644 --- a/src/demo_tezos_token_transfers/configs/dipdup.compose.yaml +++ b/src/demo_tezos_token_transfers/configs/dipdup.compose.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_token_transfers/configs/dipdup.sqlite.yaml b/src/demo_tezos_token_transfers/configs/dipdup.sqlite.yaml index b9e75120b..9a4aac2e0 100644 --- a/src/demo_tezos_token_transfers/configs/dipdup.sqlite.yaml +++ b/src/demo_tezos_token_transfers/configs/dipdup.sqlite.yaml @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_token_transfers/configs/dipdup.swarm.yaml b/src/demo_tezos_token_transfers/configs/dipdup.swarm.yaml index a7f2190ea..9b05130ed 100644 --- a/src/demo_tezos_token_transfers/configs/dipdup.swarm.yaml +++ b/src/demo_tezos_token_transfers/configs/dipdup.swarm.yaml @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: - host: 0.0.0.0 \ No newline at end of file + host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 \ No newline at end of file diff --git a/src/demo_tezos_token_transfers/deploy/compose.mcp.yaml b/src/demo_tezos_token_transfers/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/demo_tezos_token_transfers/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/demo_tezos_token_transfers/mcp/.keep b/src/demo_tezos_token_transfers/mcp/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/src/dipdup/_version.py b/src/dipdup/_version.py index e179e4ed7..6e891e373 100644 --- a/src/dipdup/_version.py +++ b/src/dipdup/_version.py @@ -63,7 +63,7 @@ async def _get_latest_version() -> str | None: try: response = await session.get(RELEASES_URL) response_json = await response.json() - return cast(str, response_json['tag_name']) + return cast('str', response_json['tag_name']) except Exception as e: _logger.debug('Failed to get the latest version from GitHub: %s', e) return None @@ -81,7 +81,7 @@ def _read_cached_version() -> str | None: try: cached_version = cast( - CachedVersion, + 'CachedVersion', json.loads(CACHE_PATH.read_bytes()), ) # NOTE: Invalidate cache if installed version is different diff --git a/src/dipdup/cli.py b/src/dipdup/cli.py index 9e210da44..f7adfb90b 100644 --- a/src/dipdup/cli.py +++ b/src/dipdup/cli.py @@ -23,6 +23,7 @@ from dipdup import __version__ from dipdup import env from dipdup._version import check_version +from dipdup.config import McpConfig from dipdup.exceptions import CallbackError from dipdup.install import EPILOG from dipdup.install import WELCOME_ASCII @@ -198,7 +199,7 @@ def wrapper(ctx: click.Context, *args: Any, **kwargs: Any) -> None: package = ctx.obj.config.package save_report(package, None) - return cast(WrappedCommandT, wrapper) + return cast('WrappedCommandT', wrapper) def _cli_unwrapper(cmd: click.Command) -> Callable[..., Coroutine[Any, Any, None]]: @@ -214,6 +215,7 @@ def _skip_cli_group() -> bool: ['hasura'], ['package'], ['schema'], + ['mcp'], ) # NOTE: Simple helpers that don't use any of our cli boilerplate is_script_group = args[0] in ( @@ -529,6 +531,83 @@ async def hasura(ctx: click.Context) -> None: pass +@cli.group(help='Commands related to MCP integration.') +@click.pass_context +@_cli_wrapper +async def mcp(ctx: click.Context) -> None: + pass + + +@mcp.command(name='run') +@click.pass_context +@_cli_wrapper +async def mcp_run(ctx: click.Context) -> None: + """Run MCP server.""" + + import uvicorn + from anyio import from_thread + from mcp.server.sse import SseServerTransport + from starlette.applications import Starlette + from starlette.routing import Mount + from starlette.routing import Route + + from dipdup import mcp + from dipdup.config import DipDupConfig + from dipdup.context import McpContext + from dipdup.dipdup import DipDup + + config: DipDupConfig = ctx.obj.config + dipdup = DipDup(config) + + if not config.mcp: + config.mcp = McpConfig() + mcp_config = config.mcp + + mcp_ctx = McpContext._wrap( + ctx=dipdup._ctx, + logger=mcp._logger, + server=mcp.server, + ) + mcp._set_ctx(mcp_ctx) + + # NOTE: Import all submodules to find @mcp decorators + dipdup._ctx.package.verify() + + # NOTE: Run MCP in a separate thread to avoid blocking the DB connection + with from_thread.start_blocking_portal() as portal: + async with AsyncExitStack() as stack: + await dipdup._create_datasources() + await dipdup._set_up_database(stack) + + sse = SseServerTransport('/messages/') + + async def handle_sse(request: Any) -> None: + async with sse.connect_sse(request.scope, request.receive, request._send) as streams: + await mcp.server.run( + read_stream=streams[0], + write_stream=streams[1], + initialization_options=mcp.server.create_initialization_options(), + raise_exceptions=False, + ) + + starlette_app = Starlette( + debug=True, + routes=[ + Route('/sse', endpoint=handle_sse), + Mount('/messages/', app=sse.handle_post_message), + ], + ) + + uv_config = uvicorn.Config( + app=starlette_app, + host=mcp_config.host, + port=mcp_config.port, + log_level='debug', + ) + server = uvicorn.Server(uv_config) + portal.call(server.serve) + + @hasura.command(name='configure') @click.option('--force', '-f', is_flag=True, help='Proceed even if Hasura is already configured.') @click.pass_context @@ -547,7 +626,7 @@ async def hasura_configure(ctx: click.Context, force: bool) -> None: hasura_gateway = HasuraGateway( package=config.package, hasura_config=config.hasura, - database_config=cast(PostgresDatabaseConfig, config.database), + database_config=cast('PostgresDatabaseConfig', config.database), ) async with AsyncExitStack() as stack: diff --git a/src/dipdup/codegen/evm.py b/src/dipdup/codegen/evm.py index 410e56fbb..b0235b2ae 100644 --- a/src/dipdup/codegen/evm.py +++ b/src/dipdup/codegen/evm.py @@ -84,7 +84,7 @@ async def _fetch_abi(self, index_config: EvmIndexConfigU) -> None: # deduplicated (by name) Datasource list datasources: list[AbiDatasource[Any]] = list( { - datasource_config.name: cast(AbiDatasource[Any], self._datasources[datasource_config.name]) + datasource_config.name: cast('AbiDatasource[Any]', self._datasources[datasource_config.name]) for datasource_config in index_config.datasources if isinstance( datasource_config, diff --git a/src/dipdup/codegen/starknet.py b/src/dipdup/codegen/starknet.py index 12c1c2b52..022db16ee 100644 --- a/src/dipdup/codegen/starknet.py +++ b/src/dipdup/codegen/starknet.py @@ -37,7 +37,7 @@ async def _fetch_abi(self, index_config: StarknetEventsIndexConfig) -> None: # deduplicated (by name) Datasource list datasources: list[AbiDatasource[Any]] = list( { - datasource_config.name: cast(AbiDatasource[Any], self._datasources[datasource_config.name]) + datasource_config.name: cast('AbiDatasource[Any]', self._datasources[datasource_config.name]) for datasource_config in index_config.datasources if isinstance(datasource_config, StarknetNodeDatasourceConfig) }.values() diff --git a/src/dipdup/codegen/substrate.py b/src/dipdup/codegen/substrate.py index 3509c0dd7..88330d21c 100644 --- a/src/dipdup/codegen/substrate.py +++ b/src/dipdup/codegen/substrate.py @@ -137,7 +137,7 @@ async def generate_abis(self) -> None: for datasource_config in index_config.datasources: if isinstance(datasource_config, SubstrateSubscanDatasourceConfig): - datasource = cast(SubstrateSubscanDatasource, self._datasources[datasource_config.name]) + datasource = cast('SubstrateSubscanDatasource', self._datasources[datasource_config.name]) break else: raise NotImplementedError('Codegen currently requires `substrate.subscan` datasource') diff --git a/src/dipdup/codegen/tezos.py b/src/dipdup/codegen/tezos.py index 5e11f5b20..09145a68a 100644 --- a/src/dipdup/codegen/tezos.py +++ b/src/dipdup/codegen/tezos.py @@ -77,7 +77,7 @@ def preprocess_storage_jsonschema(schema: dict[str, Any]) -> dict[str, Any]: 'additionalProperties': preprocess_storage_jsonschema(schema['additionalProperties']), } if schema.get('$comment') == 'big_map': - return cast(dict[str, Any], schema['oneOf'][1]) + return cast('dict[str, Any]', schema['oneOf'][1]) return schema @@ -123,7 +123,7 @@ async def generate_schemas(self) -> None: for index_config in self._config.indexes.values(): if isinstance(index_config, TezosOperationsIndexConfig): await self._fetch_operation_index_schema(index_config) - template = cast(TezosOperationsIndexConfig, index_config._parent) + template = cast('TezosOperationsIndexConfig', index_config._parent) if template in unused_operation_templates: unused_operation_templates.remove(template) elif isinstance(index_config, TezosBigMapsIndexConfig): @@ -273,7 +273,7 @@ async def _fetch_operation_pattern_schema( return parameter_schemas_path = contract_schemas_path / 'tezos_parameters' - entrypoint = cast(str, operation_pattern_config.entrypoint) + entrypoint = cast('str', operation_pattern_config.entrypoint) try: entrypoint_schema = match_entrypoint_schema( @@ -375,7 +375,7 @@ async def get_schemas( self._logger.info('Fetching schemas for contract `%s`', address) address_schemas_json = await datasource.get_jsonschemas(address) schemas[datasource.name][address] = address_schemas_json - return cast(dict[str, Any], schemas[datasource.name][address]) + return cast('dict[str, Any]', schemas[datasource.name][address]) def get_storage_type(package: DipDupPackage, typename: str) -> TypeClass: diff --git a/src/dipdup/config/__init__.py b/src/dipdup/config/__init__.py index c27ef907f..78a0610ed 100644 --- a/src/dipdup/config/__init__.py +++ b/src/dipdup/config/__init__.py @@ -545,6 +545,18 @@ class ApiConfig: port: int = 46339 # dial INDEX 😎 +@dataclass(config=ConfigDict(extra='forbid', defer_build=True), kw_only=True) +class McpConfig: + """Config for MCP server + + :param host: Host to bind to + :param port: Port to bind to + """ + + host: str = '127.0.0.1' + port: int = 9999 + + # NOTE: Should be the only place where extras are allowed @dataclass(config=ConfigDict(extra='allow', defer_build=True), kw_only=True) class AdvancedConfig: @@ -591,6 +603,7 @@ class DipDupConfig(InteractiveMixin): :param advanced: Advanced config :param custom: User-defined configuration to use in callbacks :param logging: Modify logging verbosity + :param mcp: MCP server config """ spec_version: ToStr @@ -610,6 +623,7 @@ class DipDupConfig(InteractiveMixin): advanced: AdvancedConfig = Field(default_factory=AdvancedConfig) custom: dict[str, Any] = Field(default_factory=dict) logging: dict[str, str | int] | str | int = 'INFO' + mcp: McpConfig | None = None def __post_init__(self) -> None: if self.package != pascal_to_snake(self.package): @@ -954,7 +968,7 @@ def add_index( ) template_config._name = name self._resolve_template(template_config) - index_config = cast(ResolvedIndexConfigU, self.indexes[name]) + index_config = cast('ResolvedIndexConfigU', self.indexes[name]) self._resolve_index_links(index_config) index_config._name = name @@ -1183,7 +1197,7 @@ def _resolve_index_links(self, index_config: ResolvedIndexConfigU) -> None: def _set_names(self) -> None: named_config_sections = cast( - tuple[dict[str, NameMixin], ...], + 'tuple[dict[str, NameMixin], ...]', ( self.contracts, self.datasources, diff --git a/src/dipdup/config/_mixin.py b/src/dipdup/config/_mixin.py index 98890924d..a3ec78c1c 100644 --- a/src/dipdup/config/_mixin.py +++ b/src/dipdup/config/_mixin.py @@ -64,7 +64,7 @@ def locate_arguments(self) -> dict[str, type | None]: kwargs: dict[str, type[Any] | None] = {} for name, cls in self.iter_arguments(): cls = cls.split(' as ')[0] - kwargs[name] = cast(type | None, locate(cls)) + kwargs[name] = cast('type | None', locate(cls)) return kwargs diff --git a/src/dipdup/config/substrate_events.py b/src/dipdup/config/substrate_events.py index 5e008b656..04226b0c1 100644 --- a/src/dipdup/config/substrate_events.py +++ b/src/dipdup/config/substrate_events.py @@ -40,7 +40,7 @@ def iter_imports(self, package: str) -> Iterator[tuple[str, str]]: event_cls = snake_to_pascal(self.name) + 'Payload' event_module = pascal_to_snake(self.name.replace('.', '')) - parent = cast(SubstrateIndexConfig, self.parent) + parent = cast('SubstrateIndexConfig', self.parent) yield f'{package}.types.{parent.runtime.name}.substrate_events.{event_module}', event_cls def iter_arguments(self) -> Iterator[tuple[str, str]]: diff --git a/src/dipdup/config/tezos_operations.py b/src/dipdup/config/tezos_operations.py index e6fa68bfe..2ba2b67cb 100644 --- a/src/dipdup/config/tezos_operations.py +++ b/src/dipdup/config/tezos_operations.py @@ -139,7 +139,7 @@ def iter_imports(self, package: str) -> Iterator[tuple[str, str]]: yield self.format_parameter_import( package, module_name, - cast(str, self.entrypoint), + cast('str', self.entrypoint), self.alias, ) yield self.format_storage_import(package, module_name) @@ -151,7 +151,7 @@ def iter_arguments(self) -> Iterator[tuple[str, str]]: module_name = self.typed_contract.module_name yield self.format_operation_argument( module_name, - cast(str, self.entrypoint), + cast('str', self.entrypoint), self.optional, self.alias, ) diff --git a/src/dipdup/context.py b/src/dipdup/context.py index 6ac732a7c..7c18a69ec 100644 --- a/src/dipdup/context.py +++ b/src/dipdup/context.py @@ -13,6 +13,7 @@ from typing import TYPE_CHECKING from typing import Any from typing import Literal +from typing import Self from typing import TypeVar from tortoise.exceptions import OperationalError @@ -102,6 +103,8 @@ from collections.abc import Iterator from types import ModuleType + from mcp.server import Server as McpServer + from dipdup.package import DipDupPackage from dipdup.transactions import TransactionManager @@ -145,7 +148,7 @@ class DipDupContext: :param config: DipDup configuration :param package: DipDup package :param datasources: Mapping of available datasources - :param transactions: Transaction manager (don't use it directly) + :param transactions: Transaction manager (low-level interface) :param logger: Context-aware logger instance """ @@ -788,7 +791,7 @@ class HookContext(DipDupContext): :param config: DipDup configuration :param package: DipDup package :param datasources: Mapping of available datasources - :param transactions: Transaction manager (don't use it directly) + :param transactions: Transaction manager (low-level interface) :param logger: Context-aware logger instance :param hook_config: Configuration of the current hook """ @@ -820,7 +823,7 @@ def _wrap( ctx: DipDupContext, logger: Logger, hook_config: HookConfig, - ) -> HookContext: + ) -> Self: new_ctx = cls( config=ctx.config, package=ctx.package, @@ -851,7 +854,7 @@ class HandlerContext(DipDupContext): :param config: DipDup configuration :param package: DipDup package :param datasources: Mapping of available datasources - :param transactions: Transaction manager (don't use it directly) + :param transactions: Transaction manager (low-level interface) :param logger: Context-aware logger instance :param handler_config: Configuration of the current handler """ @@ -887,7 +890,7 @@ def _wrap( ctx: DipDupContext, logger: Logger, handler_config: HandlerConfig, - ) -> HandlerContext: + ) -> Self: new_ctx = cls( config=ctx.config, package=ctx.package, @@ -903,3 +906,51 @@ def _wrap( def is_finalized(self) -> bool: # FIXME: check the datasource return True + + +class McpContext(DipDupContext): + """Execution context of MCP tools, resources and prompts. + + :param config: DipDup configuration + :param package: DipDup package + :param datasources: Mapping of available datasources + :param transactions: Transaction manager (low-level interface) + :param logger: Context-aware logger instance + :param server: Running MCP server instance + """ + + def __init__( + self, + config: DipDupConfig, + package: DipDupPackage, + datasources: dict[str, Datasource[Any]], + transactions: TransactionManager, + logger: Logger, + server: McpServer[Any], + ) -> None: + super().__init__( + config=config, + package=package, + datasources=datasources, + transactions=transactions, + ) + self.logger = logger + self.server = server + + @classmethod + def _wrap( + cls, + ctx: DipDupContext, + logger: Logger, + server: Any, + ) -> Self: + new_ctx = cls( + config=ctx.config, + package=ctx.package, + datasources=ctx.datasources, + transactions=ctx.transactions, + logger=logger, + server=server, + ) + ctx._link(new_ctx) + return new_ctx diff --git a/src/dipdup/database.py b/src/dipdup/database.py index 7870ac11e..97ff8868c 100644 --- a/src/dipdup/database.py +++ b/src/dipdup/database.py @@ -48,7 +48,7 @@ def get_connection() -> SupportedClient: - return cast(SupportedClient, connections.get(DEFAULT_CONNECTION_NAME)) + return cast('SupportedClient', connections.get(DEFAULT_CONNECTION_NAME)) def set_connection(conn: SupportedClient) -> None: diff --git a/src/dipdup/datasources/_subsquid.py b/src/dipdup/datasources/_subsquid.py index 94609dff1..6200dae7d 100644 --- a/src/dipdup/datasources/_subsquid.py +++ b/src/dipdup/datasources/_subsquid.py @@ -30,7 +30,7 @@ async def query(self, query: QueryT) -> list[dict[str, Any]]: url='', json=query, ) - return cast(list[dict[str, Any]], response) + return cast('list[dict[str, Any]]', response) class AbstractSubsquidDatasource( diff --git a/src/dipdup/datasources/coinbase.py b/src/dipdup/datasources/coinbase.py index 346fe1087..f1f508e6f 100644 --- a/src/dipdup/datasources/coinbase.py +++ b/src/dipdup/datasources/coinbase.py @@ -26,7 +26,7 @@ async def run(self) -> None: async def get_oracle_prices(self) -> dict[str, Any]: return cast( - dict[str, Any], + 'dict[str, Any]', await self.request( 'get', url='oracle', diff --git a/src/dipdup/datasources/evm_blockvision.py b/src/dipdup/datasources/evm_blockvision.py index 4763d546b..5edeaadff 100644 --- a/src/dipdup/datasources/evm_blockvision.py +++ b/src/dipdup/datasources/evm_blockvision.py @@ -18,4 +18,4 @@ async def get_abi(self, address: str) -> dict[str, Any] | list[Any]: url='verifyContractV2/data', params={'address': address}, ) - return cast(list[Any], orjson.loads(response['result']['contractABI'])) + return cast('list[Any]', orjson.loads(response['result']['contractABI'])) diff --git a/src/dipdup/datasources/evm_etherscan.py b/src/dipdup/datasources/evm_etherscan.py index 7f4b278c0..f9209fcbd 100644 --- a/src/dipdup/datasources/evm_etherscan.py +++ b/src/dipdup/datasources/evm_etherscan.py @@ -56,7 +56,7 @@ async def get_abi(self, address: str) -> dict[str, Any] | list[Any]: self._logger.warning('Failed to get ABI: %s', e) try: - return cast(dict[str, Any], orjson.loads(result)) + return cast('dict[str, Any]', orjson.loads(result)) except orjson.JSONDecodeError as e: raise DatasourceError(result, self.name) from e @@ -78,5 +78,5 @@ async def get_abi_failover(self, address: str) -> dict[str, Any]: regex = r'id=["\']js-copytextarea2(.*)>(\[.*?)\<\/pre' if (match := re.search(regex, html)) and (abi := match.group(2)): - return cast(dict[str, Any], orjson.loads(abi)) + return cast('dict[str, Any]', orjson.loads(abi)) raise DatasourceError('Failed to get ABI', self.name) diff --git a/src/dipdup/datasources/evm_sourcify.py b/src/dipdup/datasources/evm_sourcify.py index 99c28977f..f085f6c19 100644 --- a/src/dipdup/datasources/evm_sourcify.py +++ b/src/dipdup/datasources/evm_sourcify.py @@ -18,4 +18,4 @@ async def get_abi(self, address: str) -> dict[str, Any] | list[Any]: 'fields': 'abi', }, ) - return cast(list[Any], response['abi']) + return cast('list[Any]', response['abi']) diff --git a/src/dipdup/datasources/substrate_subscan.py b/src/dipdup/datasources/substrate_subscan.py index ba453454a..615edfb6c 100644 --- a/src/dipdup/datasources/substrate_subscan.py +++ b/src/dipdup/datasources/substrate_subscan.py @@ -19,7 +19,7 @@ async def get_runtime_list(self) -> list[dict[str, Any]]: 'post', 'scan/runtime/list', ) - return cast(list[dict[str, Any]], res['data']['list']) + return cast('list[dict[str, Any]]', res['data']['list']) async def get_runtime_metadata(self, spec_version: int) -> dict[str, Any]: res = await self.request( @@ -27,4 +27,4 @@ async def get_runtime_metadata(self, spec_version: int) -> dict[str, Any]: 'scan/runtime/metadata', json={'spec': spec_version}, ) - return cast(dict[str, Any], res['data']['info']['metadata']) + return cast('dict[str, Any]', res['data']['info']['metadata']) diff --git a/src/dipdup/datasources/tezos_tzkt.py b/src/dipdup/datasources/tezos_tzkt.py index 73df76f53..07e2de1c2 100644 --- a/src/dipdup/datasources/tezos_tzkt.py +++ b/src/dipdup/datasources/tezos_tzkt.py @@ -431,7 +431,7 @@ async def get_contract_summary(self, address: str) -> dict[str, Any]: """Get contract summary""" self._logger.info('Fetching contract summary for address `%s`', address) return cast( - dict[str, Any], + 'dict[str, Any]', await self.request( 'get', url=f'v1/contracts/{address}', @@ -464,7 +464,7 @@ async def get_contract_address(self, code_hash: int, type_hash: int) -> str: ) if not response: raise ValueError(f'Contract with code hash `{code_hash}` not found') from None - address = cast(str, response[0]['address']) + address = cast('str', response[0]['address']) self._contract_hashes.add(address, code_hash, type_hash) return address @@ -472,7 +472,7 @@ async def get_contract_storage(self, address: str) -> dict[str, Any]: """Get contract storage""" self._logger.info('Fetching contract storage for address `%s`', address) return cast( - dict[str, Any], + 'dict[str, Any]', await self.request( 'get', url=f'v1/contracts/{address}/storage', @@ -489,7 +489,7 @@ async def get_jsonschemas(self, address: str) -> dict[str, Any]: else: raise NotImplementedError return cast( - dict[str, Any], + 'dict[str, Any]', await self.request( 'get', url=f'v1/{endpoint}/{address}/interface', @@ -1095,7 +1095,7 @@ async def _subscribe(self, subscription: TezosTzktSubscription) -> None: async def _on_subscribe(message: CompletionMessage) -> None: if message.error: await self._on_error(message) - level = cast(int, message.result) + level = cast('int', message.result) self._subscriptions.set_sync_level(subscription, level) event.set() @@ -1261,17 +1261,17 @@ async def _on_message(self, type_: TezosTzktMessageType, message: list[dict[str, # NOTE: Process extensive data from buffer for buffered_message in self._buffer.yield_from(): if buffered_message.type == TezosTzktMessageType.operation: - await self._process_operations_data(cast(list[dict[str, Any]], buffered_message.data)) + await self._process_operations_data(cast('list[dict[str, Any]]', buffered_message.data)) elif buffered_message.type == TezosTzktMessageType.token_transfer: - await self._process_token_transfers_data(cast(list[dict[str, Any]], buffered_message.data)) + await self._process_token_transfers_data(cast('list[dict[str, Any]]', buffered_message.data)) elif buffered_message.type == TezosTzktMessageType.token_balance: - await self._process_token_balances_data(cast(list[dict[str, Any]], buffered_message.data)) + await self._process_token_balances_data(cast('list[dict[str, Any]]', buffered_message.data)) elif buffered_message.type == TezosTzktMessageType.big_map: - await self._process_big_maps_data(cast(list[dict[str, Any]], buffered_message.data)) + await self._process_big_maps_data(cast('list[dict[str, Any]]', buffered_message.data)) elif buffered_message.type == TezosTzktMessageType.head: - await self._process_head_data(cast(dict[str, Any], buffered_message.data)) + await self._process_head_data(cast('dict[str, Any]', buffered_message.data)) elif buffered_message.type == TezosTzktMessageType.event: - await self._process_events_data(cast(list[dict[str, Any]], buffered_message.data)) + await self._process_events_data(cast('list[dict[str, Any]]', buffered_message.data)) else: raise NotImplementedError(f'Unknown message type: {buffered_message.type}') diff --git a/src/dipdup/datasources/tzip_metadata.py b/src/dipdup/datasources/tzip_metadata.py index a16afbe12..57b9b1bd9 100644 --- a/src/dipdup/datasources/tzip_metadata.py +++ b/src/dipdup/datasources/tzip_metadata.py @@ -26,7 +26,7 @@ async def get_contract_metadata(self, address: str) -> dict[str, Any] | None: ) response = response['contract_metadata'] if response: - return cast(dict[str, Any], response[0]['metadata']) + return cast('dict[str, Any]', response[0]['metadata']) return None async def get_token_metadata(self, address: str, token_id: int) -> dict[str, Any] | None: @@ -42,7 +42,7 @@ async def get_token_metadata(self, address: str, token_id: int) -> dict[str, Any response = response['token_metadata'] if response: return cast( - dict[str, Any], + 'dict[str, Any]', response[0]['metadata'], ) return None diff --git a/src/dipdup/hasura.py b/src/dipdup/hasura.py index da7444095..2a5a3b406 100644 --- a/src/dipdup/hasura.py +++ b/src/dipdup/hasura.py @@ -209,7 +209,7 @@ async def configure(self, force: bool = False) -> None: def _get_source(self, metadata: dict[str, Any], name: str) -> dict[str, Any] | None: for source in metadata['sources']: if source['name'] == name: - return cast(dict[str, Any], source) + return cast('dict[str, Any]', source) else: return None @@ -242,7 +242,7 @@ async def _hasura_request( if errors := result.get('error') or result.get('errors'): raise HasuraError(errors) - return cast(dict[str, Any], result) + return cast('dict[str, Any]', result) async def _healthcheck(self) -> None: self._logger.info('Connecting to Hasura instance') @@ -476,7 +476,7 @@ async def _get_fields_json(self, name: str) -> list[dict[str, Any]]: }, ) try: - return cast(list[dict[str, Any]], result['data']['__type']['fields']) + return cast('list[dict[str, Any]]', result['data']['__type']['fields']) except TypeError as e: raise HasuraError(f'Unknown table `{name}`') from e diff --git a/src/dipdup/index.py b/src/dipdup/index.py index aecda02ef..90d660416 100644 --- a/src/dipdup/index.py +++ b/src/dipdup/index.py @@ -218,7 +218,7 @@ def get_sync_level(self) -> int: # NOTE: Multiple sync levels means index with new subscriptions was added in runtime. # NOTE: Choose the highest level; outdated realtime messages will be dropped from the queue anyway. - return max(cast(set[int], sync_levels)) + return max(cast('set[int]', sync_levels)) async def initialize_state(self, state: models.Index | None = None) -> None: if self._state: diff --git a/src/dipdup/indexes/tezos_operations/parser.py b/src/dipdup/indexes/tezos_operations/parser.py index 212bb2e23..4b48cacfd 100644 --- a/src/dipdup/indexes/tezos_operations/parser.py +++ b/src/dipdup/indexes/tezos_operations/parser.py @@ -28,7 +28,7 @@ def extract_root_outer_type(storage_type: type[BaseModel]) -> type[BaseModel]: root_field = storage_type.model_fields['root'] if not root_field.is_required(): # NOTE: Optional is a magic _SpecialForm - return cast(type[BaseModel], Optional[root_field.annotation]) # noqa: UP007 + return cast('type[BaseModel]', Optional[root_field.annotation]) # noqa: UP007 return root_field.annotation # type: ignore[return-value] @@ -102,7 +102,7 @@ def _preprocess_bigmap_diffs(diffs: Iterable[dict[str, Any]]) -> dict[int, Itera k: tuple(v) for k, v in groupby( filter(lambda d: d['action'] in ('add_key', 'update_key'), diffs), - lambda d: cast(int, d['bigmap']), + lambda d: cast('int', d['bigmap']), ) } diff --git a/src/dipdup/install.py b/src/dipdup/install.py index f2ae97493..88732e1ce 100755 --- a/src/dipdup/install.py +++ b/src/dipdup/install.py @@ -197,7 +197,7 @@ def install( pipx_packages = env._pipx_packages - python_inter_pipx = cast(str, which('python3.12')) + python_inter_pipx = cast('str', which('python3.12')) if 'pyenv' in python_inter_pipx: python_inter_pipx = ( subprocess.run( diff --git a/src/dipdup/mcp.py b/src/dipdup/mcp.py new file mode 100644 index 000000000..137f670d5 --- /dev/null +++ b/src/dipdup/mcp.py @@ -0,0 +1,232 @@ +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING +from typing import Any +from typing import cast + +from pydantic import AnyUrl + +from dipdup import models +from dipdup.context import McpContext +from dipdup.exceptions import FrameworkException +from dipdup.utils import json_dumps + +_logger = logging.getLogger(__name__) + +_ctx: McpContext | None = None + +import mcp.server +import mcp.types as types + +if TYPE_CHECKING: + from collections.abc import Awaitable + from collections.abc import Callable + from collections.abc import Iterable + +# NOTE: Resource and tool callbacks + + +async def _resource_config() -> str: + return get_ctx().config._json.dump(strip_secrets=True) + + +async def _resource_metrics() -> dict[str, Any]: + metrics_model = await models.Meta.get_or_none(key='dipdup_metrics') + if metrics_model: + return cast('dict[str, Any]', metrics_model.value) + return {} + + +async def _resource_heads() -> list[dict[str, Any]]: + res = [] + for m in await models.Head.all(): + res.append( + { + 'datasource_name': m.name, + 'level': m.level, + 'hash': m.hash, + 'timestamp': m.timestamp.strftime('%Y-%m-%d %H:%M:%S'), + 'updated_at': m.updated_at.strftime('%Y-%m-%d %H:%M:%S'), + } + ) + return res + + +async def _resource_indexes() -> list[dict[str, Any]]: + res = [] + for m in await models.Index.all(): + res.append( + { + 'name': m.name, + 'kind': m.type.value, + 'status': m.status.value, + 'height': m.level, + 'updated_at': m.updated_at.strftime('%Y-%m-%d %H:%M:%S'), + } + ) + return res + + +# NOTE: Built-in tools and resources + +DIPDUP_RESOURCES: dict[str, types.Resource] = { + 'config': types.Resource( + uri=AnyUrl('dipdup://config'), + name='config', + description='Dump the current indexer configuration in YAML format', + mimeType='text/plain', + ), + 'metrics': types.Resource( + uri=AnyUrl('dipdup://metrics'), + name='metrics', + description='Show the current indexer metrics', + mimeType='application/json', + ), + 'heads': types.Resource( + uri=AnyUrl('dipdup://heads'), + name='heads', + description='Show the current datasource head blocks', + mimeType='application/json', + ), + 'indexes': types.Resource( + uri=AnyUrl('dipdup://indexes'), + name='indexes', + description='Show the current indexer state', + mimeType='application/json', + ), +} +DIPDUP_RESOURCES_FN: dict[str, Callable[..., Awaitable[Any]]] = { + 'config': _resource_config, + 'metrics': _resource_metrics, + 'heads': _resource_heads, + 'indexes': _resource_indexes, +} + +DIPDUP_TOOLS: dict[str, types.Tool] = {} +DIPDUP_TOOLS_FN: dict[str, Callable[..., Awaitable[Iterable[str]]]] = {} + +# NOTE: Context management + + +def get_ctx() -> McpContext: + global _ctx + if _ctx is None: + raise FrameworkException('DipDup context is not initialized') + return _ctx + + +def _set_ctx(ctx: McpContext) -> None: + global _ctx + if _ctx is not None: + raise FrameworkException('DipDup context is already initialized') + _ctx = ctx + + +# TODO: Add instructions +server: mcp.server.Server[Any] = mcp.server.Server(name='DipDup') +_user_tools: dict[str, types.Tool] = {} +_user_tools_fn: dict[str, Callable[..., Awaitable[Iterable[str]]]] = {} +_user_resources: dict[str, types.Resource] = {} +_user_resources_fn: dict[str, Callable[..., Awaitable[Iterable[str]]]] = {} + + +# TODO: Push typehints to upstream +@server.list_tools() # type: ignore[no-untyped-call,misc] +async def list_tools() -> list[types.Tool]: + return [ + *list(DIPDUP_TOOLS.values()), + *list(_user_tools.values()), + ] + + +@server.list_resources() # type: ignore[no-untyped-call,misc] +async def list_resources() -> list[types.Resource]: + return [ + *list(DIPDUP_RESOURCES.values()), + *list(_user_resources.values()), + ] + + +# FIXME: Not supported +@server.list_resource_templates() # type: ignore[no-untyped-call,misc] +async def list_resource_templates() -> list[types.ResourceTemplate]: + return [] + + +@server.call_tool() # type: ignore[no-untyped-call,misc] +async def call_tool(name: str, arguments: dict[str, Any]) -> list[types.TextContent]: + if name in _user_tools_fn: + res = await _user_tools_fn[name](**arguments) + return [types.TextContent(type='text', text=res)] + + if name in DIPDUP_TOOLS_FN: + res = await DIPDUP_TOOLS_FN[name](**arguments) + return [types.TextContent(type='text', text=res)] + + raise NotImplementedError(name) + + +@server.read_resource() # type: ignore[no-untyped-call,misc] +async def read_resource(uri: AnyUrl) -> str: + + if uri.scheme != 'dipdup': + raise ValueError(f'Invalid scheme: {uri.scheme}') + + name = uri.host.lstrip('/') # type: ignore[union-attr] + if name in _user_resources_fn: + res = await _user_resources_fn[name]() + elif name in DIPDUP_RESOURCES_FN: + res = await DIPDUP_RESOURCES_FN[name]() + else: + msg = f'Resource `{name}` not found' + raise FrameworkException(msg) + + # FIXME: mimeType is always `text/plain` + return json_dumps(res, None).decode() + + +def tool(name: str, description: str) -> Any: + def wrapper(func: Any) -> Any: + global _user_tools + global _user_tools_fn + + if name in _user_tools or name in DIPDUP_TOOLS: + msg = f'Tool `{name}` is already registered' + raise FrameworkException(msg) + + from mcp.server.fastmcp.tools.base import Tool + + tool_info = Tool.from_function(func, name=name, description=description) + + _user_tools[name] = types.Tool( + name=name, + description=description, + inputSchema=tool_info.parameters, + ) + _user_tools_fn[name] = func + + return func + + return wrapper + + +def resource(name: str, description: str, mime_type: str) -> Any: + def wrapper(func: Any) -> Any: + global _user_resources + global _user_resources_fn + + if name in _user_resources or name in DIPDUP_RESOURCES: + msg = f'Resource `{name}` is already registered' + raise FrameworkException(msg) + + _user_resources[name] = types.Resource( + uri=AnyUrl(f'dipdup://{name}'), + name=name, + description=description, + mimeType=mime_type, + ) + _user_resources_fn[name] = func + return func + + return wrapper diff --git a/src/dipdup/models/__init__.py b/src/dipdup/models/__init__.py index 9d573c65c..52ea1bced 100644 --- a/src/dipdup/models/__init__.py +++ b/src/dipdup/models/__init__.py @@ -45,11 +45,10 @@ class IndexType(Enum): - """Enum for `dipdup.models.Index`""" + """Kind of the index""" evm_events = 'evm.events' evm_transactions = 'evm.transactions' - evm_subsquid_traces = 'evm.traces' tezos_big_maps = 'tezos.big_maps' tezos_events = 'tezos.events' tezos_head = 'tezos.head' @@ -312,7 +311,7 @@ class BulkUpdateQuery(TortoiseBulkUpdateQuery): # type: ignore[type-arg] async def _execute_many(self, queries_with_params: list[tuple[str, list[Any]]]) -> int: for model in self._objects: if update := ModelUpdate.from_model( - cast(Model, model), + cast('Model', model), ModelUpdateAction.UPDATE, ): get_pending_updates().append(update) @@ -324,7 +323,7 @@ class BulkCreateQuery(TortoiseBulkCreateQuery): # type: ignore[type-arg] async def _execute_many(self, insert_sql: str, insert_sql_all: str) -> None: for model in self._objects: if update := ModelUpdate.from_model( - cast(Model, model), + cast('Model', model), ModelUpdateAction.INSERT, ): get_pending_updates().append(update) diff --git a/src/dipdup/models/substrate.py b/src/dipdup/models/substrate.py index 36e51d26e..4cb132e47 100644 --- a/src/dipdup/models/substrate.py +++ b/src/dipdup/models/substrate.py @@ -123,7 +123,7 @@ def payload(self) -> PayloadT: else: raise NotImplementedError - return cast(PayloadT, payload) + return cast('PayloadT', payload) @property def level(self) -> int: diff --git a/src/dipdup/package.py b/src/dipdup/package.py index fd5855aec..a77e84e02 100644 --- a/src/dipdup/package.py +++ b/src/dipdup/package.py @@ -77,6 +77,7 @@ def __init__(self, root: Path, quiet: bool = False) -> None: self.models = root / 'models' self.sql = root / 'sql' self.types = root / 'types' + self.mcp = root / 'mcp' # NOTE: Optional, created if aerich is installed self.migrations = root / 'migrations' @@ -128,6 +129,7 @@ def skel(self) -> dict[Path, str | None]: self.models: '**/*.py', self.sql: '**/*.sql', self.types: '**/*.py', + self.mcp: '**/*.py', # NOTE: Python metadata Path(PEP_561_MARKER): None, } @@ -197,6 +199,7 @@ def verify(self) -> None: import_submodules(f'{self.name}.handlers') import_submodules(f'{self.name}.hooks') import_submodules(f'{self.name}.types') + import_submodules(f'{self.name}.mcp') def get_type(self, typename: str, module: str, name: str) -> type[BaseModel]: key = f'{typename}{module}{name}' @@ -216,4 +219,4 @@ def get_callback(self, kind: str, module: str, name: str) -> Callable[..., Await if not callable(callback): raise ProjectPackageError(f'`{path}.{name}` is not a valid callback') self._callbacks[key] = callback - return cast(Callable[..., Awaitable[None]], callback) + return cast('Callable[..., Awaitable[None]]', callback) diff --git a/src/dipdup/performance.py b/src/dipdup/performance.py index 1cd8848b3..235eb80f3 100644 --- a/src/dipdup/performance.py +++ b/src/dipdup/performance.py @@ -93,7 +93,7 @@ def stats(self) -> dict[str, Any]: stats[name] = {'size': len(plain_cache)} for name, fn_cache in chain(self._lru.items(), self._alru.items()): name = f'lru:{name}' - c = cast(_CacheInfo, fn_cache.cache_info()) # type: ignore[attr-defined] + c = cast('_CacheInfo', fn_cache.cache_info()) # type: ignore[attr-defined] if not c.hits and not c.misses: continue stats[name] = { @@ -117,7 +117,7 @@ def clear(self) -> None: items += len(plain_cache) plain_cache.clear() for fn_cache in chain(self._lru.values(), self._alru.values()): - stats = cast(_CacheInfo, fn_cache.cache_info()) # type: ignore[attr-defined] + stats = cast('_CacheInfo', fn_cache.cache_info()) # type: ignore[attr-defined] items += stats.currsize fn_cache.cache_clear() # type: ignore[attr-defined] for model_cls in self._models: diff --git a/src/dipdup/projects/base/Makefile.j2 b/src/dipdup/projects/base/Makefile.j2 index 3da7103eb..003fdd660 100644 --- a/src/dipdup/projects/base/Makefile.j2 +++ b/src/dipdup/projects/base/Makefile.j2 @@ -1,3 +1,4 @@ +{{ header }} .PHONY: $(MAKECMDGOALS) MAKEFLAGS += --no-print-directory ## @@ -17,7 +18,7 @@ all: ## Run an entire CI pipeline install: ## Install dependencies {%- if project.package_manager == 'uv' %} - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink --locked {%- elif project.package_manager == 'poetry' %} poetry install {%- elif project.package_manager == 'pdm' %} @@ -27,15 +28,13 @@ install: ## Install dependencies {% endif %} update: ## Update dependencies - dipdup self update -q + # dipdup self update -q {%- if project.package_manager == 'uv' %} - uv sync --all-extras --all-groups + uv sync --all-extras --all-groups --link-mode symlink {%- elif project.package_manager == 'poetry' %} poetry update - dipdup self update -q {%- elif project.package_manager == 'pdm' %} pdm update - dipdup self update -q {%- elif project.package_manager == 'none' %} true {% endif %} diff --git a/src/dipdup/projects/base/configs/dipdup.compose.yaml.j2 b/src/dipdup/projects/base/configs/dipdup.compose.yaml.j2 index c17df5459..6cf9afed6 100644 --- a/src/dipdup/projects/base/configs/dipdup.compose.yaml.j2 +++ b/src/dipdup/projects/base/configs/dipdup.compose.yaml.j2 @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 diff --git a/src/dipdup/projects/base/configs/dipdup.sqlite.yaml.j2 b/src/dipdup/projects/base/configs/dipdup.sqlite.yaml.j2 index cfacbfb9a..cb24fa0e2 100644 --- a/src/dipdup/projects/base/configs/dipdup.sqlite.yaml.j2 +++ b/src/dipdup/projects/base/configs/dipdup.sqlite.yaml.j2 @@ -8,6 +8,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 diff --git a/src/dipdup/projects/base/configs/dipdup.swarm.yaml.j2 b/src/dipdup/projects/base/configs/dipdup.swarm.yaml.j2 index 39eb329fb..a2b387838 100644 --- a/src/dipdup/projects/base/configs/dipdup.swarm.yaml.j2 +++ b/src/dipdup/projects/base/configs/dipdup.swarm.yaml.j2 @@ -19,6 +19,12 @@ sentry: prometheus: host: 0.0.0.0 + port: 8000 api: host: 0.0.0.0 + port: 46339 + +mcp: + host: 0.0.0.0 + port: 9999 diff --git a/src/dipdup/projects/base/deploy/compose.mcp.yaml b/src/dipdup/projects/base/deploy/compose.mcp.yaml new file mode 100644 index 000000000..4fc09271b --- /dev/null +++ b/src/dipdup/projects/base/deploy/compose.mcp.yaml @@ -0,0 +1,67 @@ +name: {{ project.package }} + +services: + dipdup: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 46339 + - 9000 + command: ["-C", "compose", "run"] + depends_on: + - db + - hasura + + db: + image: {{ project.postgres_image }} + ports: + - "${POSTGRES_HOST_PORT:-5432}:5432" + volumes: + - db:{{ project.postgres_data_path }} + restart: always + env_file: .env + environment: + - POSTGRES_USER=dipdup + - POSTGRES_DB=dipdup + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U dipdup"] + interval: 10s + timeout: 5s + retries: 5 + + hasura: + image: {{ project.hasura_image }} + ports: + - "${HASURA_HOST_PORT:-8080}:8080" + depends_on: + - db + restart: always + environment: + - HASURA_GRAPHQL_DATABASE_URL=postgres://dipdup:${POSTGRES_PASSWORD}@db:5432/dipdup + - HASURA_GRAPHQL_ADMIN_SECRET=${HASURA_SECRET} + - HASURA_GRAPHQL_ENABLE_CONSOLE=true + - HASURA_GRAPHQL_DEV_MODE=true + - HASURA_GRAPHQL_LOG_LEVEL=info + - HASURA_GRAPHQL_ENABLE_TELEMETRY=false + - HASURA_GRAPHQL_UNAUTHORIZED_ROLE=user + - HASURA_GRAPHQL_STRINGIFY_NUMERIC_TYPES=true + + mcp: + build: + context: .. + dockerfile: deploy/Dockerfile + restart: always + env_file: .env + ports: + - 9999 + command: ["-C", "compose", "mcp", "run"] + depends_on: + - db + - hasura + +volumes: + db: diff --git a/src/dipdup/yaml.py b/src/dipdup/yaml.py index 3f30fb710..d948ebba9 100644 --- a/src/dipdup/yaml.py +++ b/src/dipdup/yaml.py @@ -41,11 +41,21 @@ yaml_dumper.indent(mapping=2, sequence=4, offset=2) -def exclude_none(config_json: Any) -> Any: +def filter_config_json(config_json: Any, strip_secrets: bool = False) -> Any: + """Exclude `None` values, private fields and secrets from config JSON.""" + secrets = {'password', 'api_key', 'secret'} if isinstance(config_json, list | tuple): - return [exclude_none(i) for i in config_json if i is not None] + return [ + filter_config_json(i, strip_secrets) + for i in config_json + if i is not None and not (strip_secrets and isinstance(i, str) and any(s in i for s in secrets)) + ] if isinstance(config_json, dict): - return {k: exclude_none(v) for k, v in config_json.items() if v is not None and not k.startswith('_')} + return { + k: filter_config_json(v, strip_secrets) + for k, v in config_json.items() + if v is not None and not k.startswith('_') and not (strip_secrets and any(s in k for s in secrets)) + } return config_json @@ -77,8 +87,8 @@ def read_config_yaml(path: Path) -> str: raise ConfigurationError(f'Config file `{path}` is not readable: {e}') from e -def dump(value: dict[str, Any]) -> str: - value = exclude_none(value) +def dump(value: dict[str, Any], strip_secrets: bool = False) -> str: + value = filter_config_json(value, strip_secrets) buffer = StringIO() yaml_dumper.dump(value, buffer) return buffer.getvalue() @@ -162,5 +172,5 @@ def load( return config, config_environment - def dump(self) -> str: - return dump(self) + def dump(self, strip_secrets: bool = False) -> str: + return dump(self, strip_secrets) diff --git a/tests/test_index/test_tzkt_operations.py b/tests/test_index/test_tzkt_operations.py index 64e47982e..8e6125744 100644 --- a/tests/test_index/test_tzkt_operations.py +++ b/tests/test_index/test_tzkt_operations.py @@ -33,7 +33,7 @@ async def tzkt() -> AsyncIterator[TezosTzktDatasource]: def index_config() -> TezosOperationsIndexConfig: config = DipDupConfig.load([TEST_CONFIGS / 'operation_filters.yml'], True) config.initialize() - return cast(TezosOperationsIndexConfig, config.indexes['test']) + return cast('TezosOperationsIndexConfig', config.indexes['test']) async def test_ignored_type_filter( @@ -155,7 +155,7 @@ async def test_realtime() -> None: await dipdup._set_up_datasources(stack) dispatcher = dipdup._index_dispatcher - index = cast(TezosOperationsIndex, await spawn_index(dipdup, 'tzbtc_holders_mainnet')) + index = cast('TezosOperationsIndex', await spawn_index(dipdup, 'tzbtc_holders_mainnet')) # NOTE: Start sync and realtime connection simultaneously. first_level = 1365000 diff --git a/uv.lock b/uv.lock index 3aba5bbd2..c64eb6504 100644 --- a/uv.lock +++ b/uv.lock @@ -27,7 +27,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.11.13" +version = "3.11.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -38,24 +38,24 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/3f/c4a667d184c69667b8f16e0704127efc5f1e60577df429382b4d95fd381e/aiohttp-3.11.13.tar.gz", hash = "sha256:8ce789231404ca8fff7f693cdce398abf6d90fd5dae2b1847477196c243b1fbb", size = 7674284 } +sdist = { url = "https://files.pythonhosted.org/packages/6c/96/91e93ae5fd04d428c101cdbabce6c820d284d61d2614d00518f4fa52ea24/aiohttp-3.11.14.tar.gz", hash = "sha256:d6edc538c7480fa0a3b2bdd705f8010062d74700198da55d16498e1b49549b9c", size = 7676994 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/a9/6657664a55f78db8767e396cc9723782ed3311eb57704b0a5dacfa731916/aiohttp-3.11.13-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2eabb269dc3852537d57589b36d7f7362e57d1ece308842ef44d9830d2dc3c90", size = 705054 }, - { url = "https://files.pythonhosted.org/packages/3b/06/f7df1fe062d16422f70af5065b76264f40b382605cf7477fa70553a9c9c1/aiohttp-3.11.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b77ee42addbb1c36d35aca55e8cc6d0958f8419e458bb70888d8c69a4ca833d", size = 464440 }, - { url = "https://files.pythonhosted.org/packages/22/3a/8773ea866735754004d9f79e501fe988bdd56cfac7fdecbc8de17fc093eb/aiohttp-3.11.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55789e93c5ed71832e7fac868167276beadf9877b85697020c46e9a75471f55f", size = 456394 }, - { url = "https://files.pythonhosted.org/packages/7f/61/8e2f2af2327e8e475a2b0890f15ef0bbfd117e321cce1e1ed210df81bbac/aiohttp-3.11.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c929f9a7249a11e4aa5c157091cfad7f49cc6b13f4eecf9b747104befd9f56f2", size = 1682752 }, - { url = "https://files.pythonhosted.org/packages/24/ed/84fce816bc8da39aa3f6c1196fe26e47065fea882b1a67a808282029c079/aiohttp-3.11.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d33851d85537bbf0f6291ddc97926a754c8f041af759e0aa0230fe939168852b", size = 1737375 }, - { url = "https://files.pythonhosted.org/packages/d9/de/35a5ba9e3d21ebfda1ebbe66f6cc5cbb4d3ff9bd6a03e5e8a788954f8f27/aiohttp-3.11.13-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9229d8613bd8401182868fe95688f7581673e1c18ff78855671a4b8284f47bcb", size = 1793660 }, - { url = "https://files.pythonhosted.org/packages/ff/fe/0f650a8c7c72c8a07edf8ab164786f936668acd71786dd5885fc4b1ca563/aiohttp-3.11.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669dd33f028e54fe4c96576f406ebb242ba534dd3a981ce009961bf49960f117", size = 1692233 }, - { url = "https://files.pythonhosted.org/packages/a8/20/185378b3483f968c6303aafe1e33b0da0d902db40731b2b2b2680a631131/aiohttp-3.11.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c1b20a1ace54af7db1f95af85da530fe97407d9063b7aaf9ce6a32f44730778", size = 1619708 }, - { url = "https://files.pythonhosted.org/packages/a4/f9/d9c181750980b17e1e13e522d7e82a8d08d3d28a2249f99207ef5d8d738f/aiohttp-3.11.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5724cc77f4e648362ebbb49bdecb9e2b86d9b172c68a295263fa072e679ee69d", size = 1641802 }, - { url = "https://files.pythonhosted.org/packages/50/c7/1cb46b72b1788710343b6e59eaab9642bd2422f2d87ede18b1996e0aed8f/aiohttp-3.11.13-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:aa36c35e94ecdb478246dd60db12aba57cfcd0abcad43c927a8876f25734d496", size = 1684678 }, - { url = "https://files.pythonhosted.org/packages/71/87/89b979391de840c5d7c34e78e1148cc731b8aafa84b6a51d02f44b4c66e2/aiohttp-3.11.13-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9b5b37c863ad5b0892cc7a4ceb1e435e5e6acd3f2f8d3e11fa56f08d3c67b820", size = 1646921 }, - { url = "https://files.pythonhosted.org/packages/a7/db/a463700ac85b72f8cf68093e988538faaf4e865e3150aa165cf80ee29d6e/aiohttp-3.11.13-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e06cf4852ce8c4442a59bae5a3ea01162b8fcb49ab438d8548b8dc79375dad8a", size = 1702493 }, - { url = "https://files.pythonhosted.org/packages/b8/32/1084e65da3adfb08c7e1b3e94f3e4ded8bd707dee265a412bc377b7cd000/aiohttp-3.11.13-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5194143927e494616e335d074e77a5dac7cd353a04755330c9adc984ac5a628e", size = 1735004 }, - { url = "https://files.pythonhosted.org/packages/a0/bb/a634cbdd97ce5d05c2054a9a35bfc32792d7e4f69d600ad7e820571d095b/aiohttp-3.11.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afcb6b275c2d2ba5d8418bf30a9654fa978b4f819c2e8db6311b3525c86fe637", size = 1694964 }, - { url = "https://files.pythonhosted.org/packages/fd/cf/7d29db4e5c28ec316e5d2ac9ac9df0e2e278e9ea910e5c4205b9b64c2c42/aiohttp-3.11.13-cp312-cp312-win32.whl", hash = "sha256:7104d5b3943c6351d1ad7027d90bdd0ea002903e9f610735ac99df3b81f102ee", size = 411746 }, - { url = "https://files.pythonhosted.org/packages/65/a9/13e69ad4fd62104ebd94617f9f2be58231b50bb1e6bac114f024303ac23b/aiohttp-3.11.13-cp312-cp312-win_amd64.whl", hash = "sha256:47dc018b1b220c48089b5b9382fbab94db35bef2fa192995be22cbad3c5730c8", size = 438078 }, + { url = "https://files.pythonhosted.org/packages/9c/ca/e4acb3b41f9e176f50960f7162d656e79bed151b1f911173b2c4a6c0a9d2/aiohttp-3.11.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:70ab0f61c1a73d3e0342cedd9a7321425c27a7067bebeeacd509f96695b875fc", size = 705489 }, + { url = "https://files.pythonhosted.org/packages/84/d5/dcf870e0b11f0c1e3065b7f17673485afa1ddb3d630ccd8f328bccfb459f/aiohttp-3.11.14-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:602d4db80daf4497de93cb1ce00b8fc79969c0a7cf5b67bec96fa939268d806a", size = 464807 }, + { url = "https://files.pythonhosted.org/packages/7c/f0/dc417d819ae26be6abcd72c28af99d285887fddbf76d4bbe46346f201870/aiohttp-3.11.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a8a0d127c10b8d89e69bbd3430da0f73946d839e65fec00ae48ca7916a31948", size = 456819 }, + { url = "https://files.pythonhosted.org/packages/28/db/f7deb0862ebb821aa3829db20081a122ba67ffd149303f2d5202e30f20cd/aiohttp-3.11.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9f835cdfedcb3f5947304e85b8ca3ace31eef6346d8027a97f4de5fb687534", size = 1683536 }, + { url = "https://files.pythonhosted.org/packages/5e/0d/8bf0619e21c6714902c44ab53e275deb543d4d2e68ab2b7b8fe5ba267506/aiohttp-3.11.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aa5c68e1e68fff7cd3142288101deb4316b51f03d50c92de6ea5ce646e6c71f", size = 1738111 }, + { url = "https://files.pythonhosted.org/packages/f5/10/204b3700bb57b30b9e759d453fcfb3ad79a3eb18ece4e298aaf7917757dd/aiohttp-3.11.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b512f1de1c688f88dbe1b8bb1283f7fbeb7a2b2b26e743bb2193cbadfa6f307", size = 1794508 }, + { url = "https://files.pythonhosted.org/packages/cc/39/3f65072614c62a315a951fda737e4d9e6e2703f1da0cd2f2d8f629e6092e/aiohttp-3.11.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc9253069158d57e27d47a8453d8a2c5a370dc461374111b5184cf2f147a3cc3", size = 1692006 }, + { url = "https://files.pythonhosted.org/packages/73/77/cc06ecea173f9bee2f20c8e32e2cf4c8e03909a707183cdf95434db4993e/aiohttp-3.11.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b2501f1b981e70932b4a552fc9b3c942991c7ae429ea117e8fba57718cdeed0", size = 1620369 }, + { url = "https://files.pythonhosted.org/packages/87/75/5bd424bcd90c7eb2f50fd752d013db4cefb447deeecfc5bc4e8e0b1c74dd/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:28a3d083819741592685762d51d789e6155411277050d08066537c5edc4066e6", size = 1642508 }, + { url = "https://files.pythonhosted.org/packages/81/f0/ce936ec575e0569f91e5c8374086a6f7760926f16c3b95428fb55d6bfe91/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0df3788187559c262922846087e36228b75987f3ae31dd0a1e5ee1034090d42f", size = 1685771 }, + { url = "https://files.pythonhosted.org/packages/68/b7/5216590b99b5b1f18989221c25ac9d9a14a7b0c3c4ae1ff728e906c36430/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e73fa341d8b308bb799cf0ab6f55fc0461d27a9fa3e4582755a3d81a6af8c09", size = 1648318 }, + { url = "https://files.pythonhosted.org/packages/a5/c2/c27061c4ab93fa25f925c7ebddc10c20d992dbbc329e89d493811299dc93/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:51ba80d473eb780a329d73ac8afa44aa71dfb521693ccea1dea8b9b5c4df45ce", size = 1704545 }, + { url = "https://files.pythonhosted.org/packages/09/f5/11b2da82f2c52365a5b760a4e944ae50a89cf5fb207024b7853615254584/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8d1dd75aa4d855c7debaf1ef830ff2dfcc33f893c7db0af2423ee761ebffd22b", size = 1737839 }, + { url = "https://files.pythonhosted.org/packages/03/7f/145e23fe0a4c45b256f14c3268ada5497d487786334721ae8a0c818ee516/aiohttp-3.11.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41cf0cefd9e7b5c646c2ef529c8335e7eafd326f444cc1cdb0c47b6bc836f9be", size = 1695833 }, + { url = "https://files.pythonhosted.org/packages/1c/78/627dba6ee9fb9439e2e29b521adb1135877a9c7b54811fec5c46e59f2fc8/aiohttp-3.11.14-cp312-cp312-win32.whl", hash = "sha256:948abc8952aff63de7b2c83bfe3f211c727da3a33c3a5866a0e2cf1ee1aa950f", size = 412185 }, + { url = "https://files.pythonhosted.org/packages/3f/5f/1737cf6fcf0524693a4aeff8746530b65422236761e7bfdd79c6d2ce2e1c/aiohttp-3.11.14-cp312-cp312-win_amd64.whl", hash = "sha256:3b420d076a46f41ea48e5fcccb996f517af0d406267e31e6716f480a3d50d65c", size = 438526 }, ] [[package]] @@ -127,16 +127,16 @@ wheels = [ [[package]] name = "anyio" -version = "4.8.0" +version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 }, ] [[package]] @@ -180,11 +180,11 @@ wheels = [ [[package]] name = "async-lru" -version = "2.0.4" +version = "2.0.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/80/e2/2b4651eff771f6fd900d233e175ddc5e2be502c7eb62c0c42f975c6d36cd/async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627", size = 10019 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/4d/71ec4d3939dc755264f680f6c2b4906423a304c3d18e96853f0a595dfe97/async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb", size = 10380 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/9f/3c3503693386c4b0f245eaf5ca6198e3b28879ca0a40bde6b0e319793453/async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224", size = 6111 }, + { url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943", size = 6069 }, ] [[package]] @@ -219,11 +219,11 @@ wheels = [ [[package]] name = "attrs" -version = "25.2.0" +version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/69/82/3c4e1d44f3cbaa2a578127d641fe385ba3bff6c38b789447ae11a21fa413/attrs-25.2.0.tar.gz", hash = "sha256:18a06db706db43ac232cce80443fcd9f2500702059ecf53489e3c5a3f417acaf", size = 812038 } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/33/7a7388b9ef94aab40539939d94461ec682afbd895458945ed25be07f03f6/attrs-25.2.0-py3-none-any.whl", hash = "sha256:611344ff0a5fed735d86d7784610c84f8126b95e549bcad9ff61b4242f2d386b", size = 64016 }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, ] [[package]] @@ -246,24 +246,24 @@ wheels = [ [[package]] name = "bitarray" -version = "3.1.1" +version = "3.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/9a/19f3d74ed2949afcc5c4f2ae6aec2e962004b8a9855070f68b3c6d7e838b/bitarray-3.1.1.tar.gz", hash = "sha256:a3c1d74ac2c969bac33169286fe601f8a6f4ca0e8f26dbaa22ad61fbf8fcf259", size = 135976 } +sdist = { url = "https://files.pythonhosted.org/packages/70/e2/b80354798b87e4b6918ba0ad71d30da3e14c83ea38cb4a4e609d49501dd3/bitarray-3.2.0.tar.gz", hash = "sha256:f766d1c6a5cbb1f87cb8ce0ff46cefda681cc2f9bef971908f914b2862409922", size = 137064 } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/e8/b24ad217de77f89b045c994159d9411d18aa6e900b450186160c8d3c51c8/bitarray-3.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1af43aa945c595bff4386a2b64c46f6cee653883e295907e419f6745123a168f", size = 132304 }, - { url = "https://files.pythonhosted.org/packages/f4/3a/d690bf045027bf68008698ad05622a95bebb9744a4f03b65b7ccc8e27161/bitarray-3.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e43e1a8b38d6e8ccc27cad74dabd8005b078856c471a1d0537491b71184f209", size = 129192 }, - { url = "https://files.pythonhosted.org/packages/22/8d/27917c589b2abd4e7d9625e809ecb94d58a7bab795980aad71ccb9e2ec37/bitarray-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3816df3db86feaa8b4efd6844c6808147954626898355253e11e2544145f48", size = 302728 }, - { url = "https://files.pythonhosted.org/packages/af/b2/8853417c300ed2deba433370adcbcc7782d127fb8689b81900ef30fefc01/bitarray-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f913548d2907633782f0c3de72fa28646e1f97bdaf7f2df04014a17e923a258b", size = 316634 }, - { url = "https://files.pythonhosted.org/packages/ac/27/4e73989d43b3fa50846aba2786dce9e287bad50d51bf10626ba54f126d82/bitarray-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7aceaaff83bcdf87bcc13788e29fd068d1a1e6965946ffed80f6e9323e5edd3d", size = 318709 }, - { url = "https://files.pythonhosted.org/packages/89/b8/5a3ba6c0c7bc5c45ded73d346cf9e9ebd6724c5afdc741a4255a7531e718/bitarray-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:079a2fd318d2300c2ef6e84fe9f8f563bcfad46b1360b7d58d82711e5bd8ea56", size = 303590 }, - { url = "https://files.pythonhosted.org/packages/03/45/f28008eea33a8dceaab3887d3085402f7a6aa8db440b93e7789099d7ca20/bitarray-3.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41f0f93a3ccde6f0e3b953d5adc89f7d4acdd3aadf71af8353c8b288a9d4bd80", size = 293191 }, - { url = "https://files.pythonhosted.org/packages/7a/d8/97e13bfcfd89232a89880aced20548672fbb64a1eb652aab26a7e786d264/bitarray-3.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51f860b200fa90e446db77fe57173603ddb81eef4d4ba1ccdc277b564b3f20ab", size = 296698 }, - { url = "https://files.pythonhosted.org/packages/8f/1a/bae81c46ebddf5024e8eabe894d76c4095a8bea6d868edfdb6a0fc207f17/bitarray-3.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5c819daa6c11107614328d9018ccbaf5b7c64060172bf564373d62928f139e87", size = 288895 }, - { url = "https://files.pythonhosted.org/packages/be/ef/e2984fc89c94a05d8d27647ae734e360d85f9fac042d7ea18547f28ac64e/bitarray-3.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:21081fb49d6b0a19b238d30dc0c948bec365bf16fccc2a1478a2794b37a6a812", size = 311913 }, - { url = "https://files.pythonhosted.org/packages/0e/1c/032b6e09d39e80a9df1ca644bfb6b8a0dbdfd68c12c4195e060797ea19d2/bitarray-3.1.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:514757d0f76d9f84187ea15debd8b3956438f6f4f1e600be1019facdb6076796", size = 323415 }, - { url = "https://files.pythonhosted.org/packages/40/fe/ec3ce002540644f2c89ea6109138d3281336f2d11af33dd77729314bf93e/bitarray-3.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a44c5271f7e079530f7a5eecac55cb4ff350ac82db768c550f66c1419893e4c7", size = 295773 }, - { url = "https://files.pythonhosted.org/packages/ea/aa/de763b168406eb23a8f489006905dd51c9ee3965f5220170b74097662d8f/bitarray-3.1.1-cp312-cp312-win32.whl", hash = "sha256:97825938fa3fd7e917e40d66ab70ff133dee385da13cf91e0bd5cd4ec2d97048", size = 127695 }, - { url = "https://files.pythonhosted.org/packages/fa/a1/3331f8b4c422f30839fee1f5e486524a7f82269d46008af84ff300b39084/bitarray-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:1dffa70fdf6e4aba4e4f8c8aa408950c3199f71546fb24cafc70f03400b22a59", size = 134144 }, + { url = "https://files.pythonhosted.org/packages/9c/2a/c212ed17befafad333774d3734e9efd668ec268f6730e7ba2b9b8f958c2e/bitarray-3.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aeba73ba4163b9b1e396c65ec2c51d2437b95d299f325b35a2509dcfafa88a00", size = 133283 }, + { url = "https://files.pythonhosted.org/packages/5f/38/cab71558416f2fd3e31eed021e5baf4e8ffd2c6b38517c645a3fbee03dfa/bitarray-3.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e8e5f4073ad83e0086fc7db7da8977f83c488eae05e407869b51739011c392b", size = 130260 }, + { url = "https://files.pythonhosted.org/packages/f1/7c/033939e149ecbf9158dc816024e4f662d3b8f5fce199babf6456710dded0/bitarray-3.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f19c8c663123d146cd81357cb2a2c6f4528c6439d749056833addd8f81bd06b2", size = 304235 }, + { url = "https://files.pythonhosted.org/packages/ab/5d/a28c8ab8ac461dc950adad23ad6dd5eec7cbd22be1b7c87d258e23aebf67/bitarray-3.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef0d96550bd97df4d138a2ac5fa159b9d867ba7e04841a2b8ef92d502c6d6ab1", size = 318127 }, + { url = "https://files.pythonhosted.org/packages/06/0c/f6d5b1ce40c380308dce9373d156ef5c40e338f4dcdedf9d479c61f9fc1d/bitarray-3.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55684bcf2f258d878cf2371065c3f45c55a42984b9a3ac7932ab9824a5acaa15", size = 320411 }, + { url = "https://files.pythonhosted.org/packages/3d/9a/423737d3865f6416154ab03d272567d348551246d0f6bccd4889cc8c7dca/bitarray-3.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79c3b3429a2ae5175452830d6674b3cd96b8b588d59e4d2dbe109d547f10d55d", size = 305104 }, + { url = "https://files.pythonhosted.org/packages/01/6c/b4e29e9aedf284d9e91ad9aec84f4e57f280db6bbb98ebfcef8c7ba1cb2a/bitarray-3.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d794a6a0c59c70026260ae3c983e05f7b712d0d28da9780f70032031c8741b5", size = 294496 }, + { url = "https://files.pythonhosted.org/packages/df/9c/cd12b194f33dd47964f6e103fa0b1e963b6dbd37a4c6ed7b5b482b983dc1/bitarray-3.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15f4793c0ae6d2350059f5d245ed0422dfea1fe5482fbc3dfe6f991fd9c9af01", size = 298245 }, + { url = "https://files.pythonhosted.org/packages/07/e6/339eefefddaf9fd4df78a5a10deac7a3eda504ec84affe0861548a8e8104/bitarray-3.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9225fafa071f167e5be7b62fd433588cbc4909d896ac52be2da221abbe8d047a", size = 290213 }, + { url = "https://files.pythonhosted.org/packages/04/3f/30dce3c58ba526df0ca20b448def5fdf7523e99022df7f237f607bc5ec24/bitarray-3.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:333a3bf66eb80d3fe27fa7e4290204076a4b6b5b2e306676543c5955858c92e3", size = 313614 }, + { url = "https://files.pythonhosted.org/packages/8b/0e/d181dcebc2248884792ebe54ff59aa23d4a15f2eca587d291ccf73d81e69/bitarray-3.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:75abbe1cf8b8e1286d0c302afac1d417a4460797a7648e55091ac2fc47e914f6", size = 325379 }, + { url = "https://files.pythonhosted.org/packages/f0/db/a551a02de8534a0d1cfed675277907a149936bb30c900ea64763a4ce7cf7/bitarray-3.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b6b7f1cd876adf5ab029dff9140709f14ad732f965b58dd204e71d22b9b4b7a", size = 297295 }, + { url = "https://files.pythonhosted.org/packages/96/f3/be72179d6fb351deb9bdccd75212510e18f9e82e6c00f4cb1196c48e6903/bitarray-3.2.0-cp312-cp312-win32.whl", hash = "sha256:f3976bfcdb15002b2b7beae1a96b07d97478f5b8d0ab2e4023aabcb4f2dccd04", size = 128525 }, + { url = "https://files.pythonhosted.org/packages/36/2f/667942ec6570987255f7f3c996a53ffea281d6666f8afd673520447f04d4/bitarray-3.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:98ca5afd7fbd4af2ad9fa7efdb146bc6da81a7cc58fb6b3c44cd46c72af21fa3", size = 135000 }, ] [[package]] @@ -328,19 +328,19 @@ wheels = [ [[package]] name = "ckzg" -version = "2.0.1" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/80/4b6219a65634915efc4694fa606f38d4b893dcdc1e50b9bcf69b38ec82b0/ckzg-2.0.1.tar.gz", hash = "sha256:62c5adc381637affa7e1df465c57750b356a761b8a3164c3106589b02532b9c9", size = 1113747 } +sdist = { url = "https://files.pythonhosted.org/packages/5a/09/f6c82fe66a577f83939e5bd729dc7ace3e84a3431c657f0f49fe233fd232/ckzg-2.1.0.tar.gz", hash = "sha256:73a353f31c945f0617a6b98d82fbb23909ac5039a10e345c681b728dd917b51a", size = 1120597 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/87/dcc62fc2f6651127b6306a37db492998c291ad1a09a6a0d18895882fec51/ckzg-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:285cf3121b8a8c5609c5b706314f68d2ba2784ab02c5bb7487c6ae1714ecb27f", size = 114776 }, - { url = "https://files.pythonhosted.org/packages/fd/99/2d3aa09ebf692c26e03d17b9e7426a34fd71fe4d9b2ff1acf482736cc8da/ckzg-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f927bc41c2551b0ef0056a649a7ebed29d9665680a10795f4cee5002c69ddb7", size = 98711 }, - { url = "https://files.pythonhosted.org/packages/50/b3/44a533895aa4257d0dcb2818f7dd9b1321664784cac2d381022ed8c40113/ckzg-2.0.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fd9fb690c88919f30c9f3ab7cc46a7ecd734d5ff4c9ccea383c119b9b7cc4da", size = 175026 }, - { url = "https://files.pythonhosted.org/packages/54/a2/c594861665851f91ae81ec29cf90e38999de042aa95604737d4b779a8609/ckzg-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fabc3bd41b306d1c7025d561c3281a007c2aca8ceaf998582dc3894904d9c73e", size = 161039 }, - { url = "https://files.pythonhosted.org/packages/59/a0/96bb77fb8bf4cd4d51d8bd1d67d59d13f51fa2477b11b915ab6465aa92ce/ckzg-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eb50c53efdb9c34f762bd0c8006cf79bc92a9daf47aa6b541e496988484124f", size = 169889 }, - { url = "https://files.pythonhosted.org/packages/68/c4/77d54a7e5f85d833e9664935f6278fbea7de30f4fde213d121f7fdbc27a0/ckzg-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7960cc62f959403293fb53a3c2404778369ae7cefc6d7f202e5e00567cf98c4b", size = 171378 }, - { url = "https://files.pythonhosted.org/packages/02/54/6520ab37c06680910f8ff99afdc473c945c37ab1016662288d98a028d775/ckzg-2.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d721bcd492294c70eca39da0b0a433c29b6a571dbac2f7084bab06334904af06", size = 185969 }, - { url = "https://files.pythonhosted.org/packages/d6/fa/16c3a4fd8353a3a9f95728f4141b2800b08e588522f7b5644c91308f6fe1/ckzg-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dde2391d025b5033ef0eeacf62b11ecfe446aea25682b5f547a907766ad0a8cb", size = 180093 }, - { url = "https://files.pythonhosted.org/packages/d5/ae/91d36445c247a8832bbb7a71bd75293c4c006731d03a2ccaa13e5506ac8a/ckzg-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fab8859d9420f6f7df4e094ee3639bc49d18c8dab0df81bee825e2363dd67a09", size = 98280 }, + { url = "https://files.pythonhosted.org/packages/20/ac/d28074b2bf8767bb872f5ea964bd5f20cff2f9aaf68c01daee86ea28135b/ckzg-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0959685678e3b89d740412f6d7ae0821b74ccbeac04080cb066774ea3044e2e9", size = 116255 }, + { url = "https://files.pythonhosted.org/packages/a6/82/83a44447ab4c15eff1a324a0d458878cee3e08f6870c4e37213e8f656cc0/ckzg-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1bc4c46b0d7db4dd88b55cbd40d13e193536dcd5ae5d0634f0d838de832f429e", size = 100050 }, + { url = "https://files.pythonhosted.org/packages/c9/a0/20b76eaebe3e431432664025a8bcaeecae7de86434f2dc9c96c4d1eaa480/ckzg-2.1.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a4a3de4f0e264c6d1676379a8968aef681f14df7b1144b7a9ba391180f33510", size = 175595 }, + { url = "https://files.pythonhosted.org/packages/ef/16/6a7ef181ac87373793179d276ecaec094cc244798ffebc4a72ef4ba4500c/ckzg-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d9b35cf921a68769dce6fb64c34a7c331e6f7b8055bfbb8661e7163180f2742", size = 161720 }, + { url = "https://files.pythonhosted.org/packages/e7/a7/d5afdbc5d1eebddc814872c4fc62ada407845c92654628b459a7eeb5d721/ckzg-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1054189f4c6b83d19e2c1a65521485227eb3b63fa3211adccaa7c587befc2a", size = 170587 }, + { url = "https://files.pythonhosted.org/packages/5d/bd/5c88328f30cbd1421a32e584f9277dd0b88e76f8e61f07b8b2a99a1f051d/ckzg-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cecfafea88ef8106440e22eb6db56bf702f30d3af8a3fb54b2a628a5c4e10056", size = 173593 }, + { url = "https://files.pythonhosted.org/packages/df/8a/342a365da21349709a7eaf49b768f1eee7cce570e1a9bb61f4f4c8c4213a/ckzg-2.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a13ce05bc4d2b93aa4f8aaecf9d785878f3d319a05e499268035a1ab1d464d52", size = 188496 }, + { url = "https://files.pythonhosted.org/packages/21/0a/0e9af80d3bed5fe4c7b83da2de1defb2a94e2913c7aba8f104ae4b1ac5ed/ckzg-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:516610ac84f414338b0c1dc41a423906503e34b6672450e50cf22a21a707e51f", size = 183480 }, + { url = "https://files.pythonhosted.org/packages/95/46/c6d2877a2c7137654204cb344d278858035cbf2b2fa29d666f6c48bcd843/ckzg-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:e28a995e3b2923b05adb023412943dfd3b1aa1ca4e3a93d2149dcfbc15de639f", size = 98787 }, ] [[package]] @@ -375,21 +375,21 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.12" +version = "7.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0c/d6/2b53ab3ee99f2262e6f0b8369a43f6d66658eab45510331c0b3d5c8c4272/coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2", size = 805941 } +sdist = { url = "https://files.pythonhosted.org/packages/02/36/465f5492443265e1278f9a82ffe6aeed3f1db779da0d6e7d4611a5cfb6af/coverage-7.7.0.tar.gz", hash = "sha256:cd879d4646055a573775a1cec863d00c9ff8c55860f8b17f6d8eee9140c06166", size = 809969 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/7f/4af2ed1d06ce6bee7eafc03b2ef748b14132b0bdae04388e451e4b2c529b/coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad", size = 208645 }, - { url = "https://files.pythonhosted.org/packages/dc/60/d19df912989117caa95123524d26fc973f56dc14aecdec5ccd7d0084e131/coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3", size = 208898 }, - { url = "https://files.pythonhosted.org/packages/bd/10/fecabcf438ba676f706bf90186ccf6ff9f6158cc494286965c76e58742fa/coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574", size = 242987 }, - { url = "https://files.pythonhosted.org/packages/4c/53/4e208440389e8ea936f5f2b0762dcd4cb03281a7722def8e2bf9dc9c3d68/coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985", size = 239881 }, - { url = "https://files.pythonhosted.org/packages/c4/47/2ba744af8d2f0caa1f17e7746147e34dfc5f811fb65fc153153722d58835/coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750", size = 242142 }, - { url = "https://files.pythonhosted.org/packages/e9/90/df726af8ee74d92ee7e3bf113bf101ea4315d71508952bd21abc3fae471e/coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea", size = 241437 }, - { url = "https://files.pythonhosted.org/packages/f6/af/995263fd04ae5f9cf12521150295bf03b6ba940d0aea97953bb4a6db3e2b/coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3", size = 239724 }, - { url = "https://files.pythonhosted.org/packages/1c/8e/5bb04f0318805e190984c6ce106b4c3968a9562a400180e549855d8211bd/coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a", size = 241329 }, - { url = "https://files.pythonhosted.org/packages/9e/9d/fa04d9e6c3f6459f4e0b231925277cfc33d72dfab7fa19c312c03e59da99/coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95", size = 211289 }, - { url = "https://files.pythonhosted.org/packages/53/40/53c7ffe3c0c3fff4d708bc99e65f3d78c129110d6629736faf2dbd60ad57/coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288", size = 212079 }, - { url = "https://files.pythonhosted.org/packages/fb/b2/f655700e1024dec98b10ebaafd0cedbc25e40e4abe62a3c8e2ceef4f8f0a/coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953", size = 200552 }, + { url = "https://files.pythonhosted.org/packages/b7/47/f7b870caa26082ff8033be074ac61dc175a6b0c965adf7b910f92a6d7cfe/coverage-7.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:056d3017ed67e7ddf266e6f57378ece543755a4c9231e997789ab3bd11392c94", size = 210907 }, + { url = "https://files.pythonhosted.org/packages/ea/eb/40b39bdc6c1da403257f0fcb2c1b2fd81ff9f66c13abbe3862f42780e1c1/coverage-7.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:33c1394d8407e2771547583b66a85d07ed441ff8fae5a4adb4237ad39ece60db", size = 211162 }, + { url = "https://files.pythonhosted.org/packages/53/08/42a2db41b4646d6261122773e222dd7105e2306526f2d7846de6fee808ec/coverage-7.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fbb7a0c3c21908520149d7751cf5b74eb9b38b54d62997b1e9b3ac19a8ee2fe", size = 245223 }, + { url = "https://files.pythonhosted.org/packages/78/2a/0ceb328a7e67e8639d5c7800b8161d4b5f489073ac8d5ac33b11eadee218/coverage-7.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb356e7ae7c2da13f404bf8f75be90f743c6df8d4607022e759f5d7d89fe83f8", size = 242114 }, + { url = "https://files.pythonhosted.org/packages/ba/68/42b13b849d40af1581830ff06c60f4ec84649764f4a58d5c6e20ae11cbd4/coverage-7.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce730d484038e97f27ea2dbe5d392ec5c2261f28c319a3bb266f6b213650135", size = 244371 }, + { url = "https://files.pythonhosted.org/packages/68/66/ab7c3b9fdbeb8bdd322f5b67b1886463834dba2014a534caba60fb0075ea/coverage-7.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aa4dff57fc21a575672176d5ab0ef15a927199e775c5e8a3d75162ab2b0c7705", size = 244134 }, + { url = "https://files.pythonhosted.org/packages/01/74/b833d299a479681957d6b238e16a0725586e1d56ec1e43658f3184550bb0/coverage-7.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b667b91f4f714b17af2a18e220015c941d1cf8b07c17f2160033dbe1e64149f0", size = 242353 }, + { url = "https://files.pythonhosted.org/packages/f9/c5/0ed656d65da39bbab8e8fc367dc3d465a7501fea0f2b1caccfb4f6361c9f/coverage-7.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:693d921621a0c8043bfdc61f7d4df5ea6d22165fe8b807cac21eb80dd94e4bbd", size = 243543 }, + { url = "https://files.pythonhosted.org/packages/87/b5/142bcff3828e4cce5d4c9ddc9222de1664464263acca09638e4eb0dbda7c/coverage-7.7.0-cp312-cp312-win32.whl", hash = "sha256:52fc89602cde411a4196c8c6894afb384f2125f34c031774f82a4f2608c59d7d", size = 213543 }, + { url = "https://files.pythonhosted.org/packages/29/74/99d226985def03284bad6a9aff27a1079a8881ec7523b5980b00a5260527/coverage-7.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ce8cf59e09d31a4915ff4c3b94c6514af4c84b22c4cc8ad7c3c546a86150a92", size = 214344 }, + { url = "https://files.pythonhosted.org/packages/2a/ac/60f409a448e5b0e9b8539716f683568aa5848c1be903cdbbc805a552cdf8/coverage-7.7.0-py3-none-any.whl", hash = "sha256:708f0a1105ef2b11c79ed54ed31f17e6325ac936501fc373f24be3e6a578146a", size = 202803 }, ] [[package]] @@ -489,6 +489,7 @@ dependencies = [ { name = "datamodel-code-generator" }, { name = "eth-abi" }, { name = "lru-dict" }, + { name = "mcp" }, { name = "orjson" }, { name = "prometheus-client" }, { name = "pycryptodome" }, @@ -555,6 +556,7 @@ requires-dist = [ { name = "datamodel-code-generator", specifier = "~=0.26" }, { name = "eth-abi", specifier = "~=5.0" }, { name = "lru-dict", specifier = "~=1.3" }, + { name = "mcp", specifier = ">=1.2.1" }, { name = "orjson", specifier = "~=3.10" }, { name = "prometheus-client", specifier = "~=0.20" }, { name = "pycryptodome", specifier = "~=3.20" }, @@ -794,6 +796,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/5c/e226de133afd8bb267ec27eead9ae3d784b95b39a287ed404caab39a5f50/genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7", size = 21470 }, ] +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + [[package]] name = "hexbytes" version = "1.3.0" @@ -803,6 +814,43 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/96/035871b535a728700d3cc5b94cf883706f345c5a088253f26f0bee0b7939/hexbytes-1.3.0-py3-none-any.whl", hash = "sha256:83720b529c6e15ed21627962938dc2dec9bb1010f17bbbd66bf1e6a8287d522c", size = 4902 }, ] +[[package]] +name = "httpcore" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, +] + +[[package]] +name = "httpx-sse" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 }, +] + [[package]] name = "idna" version = "3.10" @@ -832,11 +880,11 @@ wheels = [ [[package]] name = "iniconfig" -version = "2.0.0" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, ] [[package]] @@ -967,6 +1015,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/81/3ef15337c19d3e3432945aad738081a5f54c16885277c7dff300b5f85b24/marshmallow_oneofschema-3.1.1-py3-none-any.whl", hash = "sha256:ff4cb2a488785ee8edd521a765682c2c80c78b9dc48894124531bdfa1ec9303b", size = 5726 }, ] +[[package]] +name = "mcp" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpx" }, + { name = "httpx-sse" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "uvicorn" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/cc/5c5bb19f1a0f8f89a95e25cb608b0b07009e81fd4b031e519335404e1422/mcp-1.4.1.tar.gz", hash = "sha256:b9655d2de6313f9d55a7d1df62b3c3fe27a530100cc85bf23729145b0dba4c7a", size = 154942 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/0e/885f156ade60108e67bf044fada5269da68e29d758a10b0c513f4d85dd76/mcp-1.4.1-py3-none-any.whl", hash = "sha256:a7716b1ec1c054e76f49806f7d96113b99fc1166fc9244c2c6f19867cb75b593", size = 72448 }, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -1015,26 +1082,26 @@ wheels = [ [[package]] name = "multidict" -version = "6.1.0" +version = "6.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 } +sdist = { url = "https://files.pythonhosted.org/packages/82/4a/7874ca44a1c9b23796c767dd94159f6c17e31c0e7d090552a1c623247d82/multidict-6.2.0.tar.gz", hash = "sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8", size = 71066 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 }, - { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 }, - { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 }, - { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 }, - { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 }, - { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 }, - { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 }, - { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 }, - { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 }, - { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 }, - { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 }, - { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 }, - { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 }, - { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 }, - { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 }, - { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, + { url = "https://files.pythonhosted.org/packages/a4/e2/0153a8db878aef9b2397be81e62cbc3b32ca9b94e0f700b103027db9d506/multidict-6.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:437c33561edb6eb504b5a30203daf81d4a9b727e167e78b0854d9a4e18e8950b", size = 49204 }, + { url = "https://files.pythonhosted.org/packages/bb/9d/5ccb3224a976d1286f360bb4e89e67b7cdfb87336257fc99be3c17f565d7/multidict-6.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9f49585f4abadd2283034fc605961f40c638635bc60f5162276fec075f2e37a4", size = 29807 }, + { url = "https://files.pythonhosted.org/packages/62/32/ef20037f51b84b074a89bab5af46d4565381c3f825fc7cbfc19c1ee156be/multidict-6.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5dd7106d064d05896ce28c97da3f46caa442fe5a43bc26dfb258e90853b39b44", size = 30000 }, + { url = "https://files.pythonhosted.org/packages/97/81/b0a7560bfc3ec72606232cd7e60159e09b9cf29e66014d770c1315868fa2/multidict-6.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e25b11a0417475f093d0f0809a149aff3943c2c56da50fdf2c3c88d57fe3dfbd", size = 131820 }, + { url = "https://files.pythonhosted.org/packages/49/3b/768bfc0e41179fbccd3a22925329a11755b7fdd53bec66dbf6b8772f0bce/multidict-6.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac380cacdd3b183338ba63a144a34e9044520a6fb30c58aa14077157a033c13e", size = 136272 }, + { url = "https://files.pythonhosted.org/packages/71/ac/fd2be3fe98ff54e7739448f771ba730d42036de0870737db9ae34bb8efe9/multidict-6.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61d5541f27533f803a941d3a3f8a3d10ed48c12cf918f557efcbf3cd04ef265c", size = 135233 }, + { url = "https://files.pythonhosted.org/packages/93/76/1657047da771315911a927b364a32dafce4135b79b64208ce4ac69525c56/multidict-6.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:facaf11f21f3a4c51b62931feb13310e6fe3475f85e20d9c9fdce0d2ea561b87", size = 132861 }, + { url = "https://files.pythonhosted.org/packages/19/a5/9f07ffb9bf68b8aaa406c2abee27ad87e8b62a60551587b8e59ee91aea84/multidict-6.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:095a2eabe8c43041d3e6c2cb8287a257b5f1801c2d6ebd1dd877424f1e89cf29", size = 122166 }, + { url = "https://files.pythonhosted.org/packages/95/23/b5ce3318d9d6c8f105c3679510f9d7202980545aad8eb4426313bd8da3ee/multidict-6.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0cc398350ef31167e03f3ca7c19313d4e40a662adcb98a88755e4e861170bdd", size = 136052 }, + { url = "https://files.pythonhosted.org/packages/ce/5c/02cffec58ffe120873dce520af593415b91cc324be0345f534ad3637da4e/multidict-6.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7c611345bbe7cb44aabb877cb94b63e86f2d0db03e382667dbd037866d44b4f8", size = 130094 }, + { url = "https://files.pythonhosted.org/packages/49/f3/3b19a83f4ebf53a3a2a0435f3e447aa227b242ba3fd96a92404b31fb3543/multidict-6.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8cd1a0644ccaf27e9d2f6d9c9474faabee21f0578fe85225cc5af9a61e1653df", size = 140962 }, + { url = "https://files.pythonhosted.org/packages/cc/1a/c916b54fb53168c24cb6a3a0795fd99d0a59a0ea93fa9f6edeff5565cb20/multidict-6.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:89b3857652183b8206a891168af47bac10b970d275bba1f6ee46565a758c078d", size = 138082 }, + { url = "https://files.pythonhosted.org/packages/ef/1a/dcb7fb18f64b3727c61f432c1e1a0d52b3924016124e4bbc8a7d2e4fa57b/multidict-6.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:125dd82b40f8c06d08d87b3510beaccb88afac94e9ed4a6f6c71362dc7dbb04b", size = 136019 }, + { url = "https://files.pythonhosted.org/packages/fb/02/7695485375106f5c542574f70e1968c391f86fa3efc9f1fd76aac0af7237/multidict-6.2.0-cp312-cp312-win32.whl", hash = "sha256:76b34c12b013d813e6cb325e6bd4f9c984db27758b16085926bbe7ceeaace626", size = 26676 }, + { url = "https://files.pythonhosted.org/packages/3c/f5/f147000fe1f4078160157b15b0790fff0513646b0f9b7404bf34007a9b44/multidict-6.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:0b183a959fb88ad1be201de2c4bdf52fa8e46e6c185d76201286a97b6f5ee65c", size = 28899 }, + { url = "https://files.pythonhosted.org/packages/9c/fd/b247aec6add5601956d440488b7f23151d8343747e82c038af37b28d6098/multidict-6.2.0-py3-none-any.whl", hash = "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530", size = 10266 }, ] [[package]] @@ -1067,20 +1134,20 @@ wheels = [ [[package]] name = "numpy" -version = "2.2.3" +version = "2.2.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fb/90/8956572f5c4ae52201fdec7ba2044b2c882832dcec7d5d0922c9e9acf2de/numpy-2.2.3.tar.gz", hash = "sha256:dbdc15f0c81611925f382dfa97b3bd0bc2c1ce19d4fe50482cb0ddc12ba30020", size = 20262700 } +sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701 } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ec/43628dcf98466e087812142eec6d1c1a6c6bdfdad30a0aa07b872dc01f6f/numpy-2.2.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12c045f43b1d2915eca6b880a7f4a256f59d62df4f044788c8ba67709412128d", size = 20929458 }, - { url = "https://files.pythonhosted.org/packages/9b/c0/2f4225073e99a5c12350954949ed19b5d4a738f541d33e6f7439e33e98e4/numpy-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:87eed225fd415bbae787f93a457af7f5990b92a334e346f72070bf569b9c9c95", size = 14115299 }, - { url = "https://files.pythonhosted.org/packages/ca/fa/d2c5575d9c734a7376cc1592fae50257ec95d061b27ee3dbdb0b3b551eb2/numpy-2.2.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:712a64103d97c404e87d4d7c47fb0c7ff9acccc625ca2002848e0d53288b90ea", size = 5145723 }, - { url = "https://files.pythonhosted.org/packages/eb/dc/023dad5b268a7895e58e791f28dc1c60eb7b6c06fcbc2af8538ad069d5f3/numpy-2.2.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a5ae282abe60a2db0fd407072aff4599c279bcd6e9a2475500fc35b00a57c532", size = 6678797 }, - { url = "https://files.pythonhosted.org/packages/3f/19/bcd641ccf19ac25abb6fb1dcd7744840c11f9d62519d7057b6ab2096eb60/numpy-2.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5266de33d4c3420973cf9ae3b98b54a2a6d53a559310e3236c4b2b06b9c07d4e", size = 14067362 }, - { url = "https://files.pythonhosted.org/packages/39/04/78d2e7402fb479d893953fb78fa7045f7deb635ec095b6b4f0260223091a/numpy-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b787adbf04b0db1967798dba8da1af07e387908ed1553a0d6e74c084d1ceafe", size = 16116679 }, - { url = "https://files.pythonhosted.org/packages/d0/a1/e90f7aa66512be3150cb9d27f3d9995db330ad1b2046474a13b7040dfd92/numpy-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:34c1b7e83f94f3b564b35f480f5652a47007dd91f7c839f404d03279cc8dd021", size = 15264272 }, - { url = "https://files.pythonhosted.org/packages/dc/b6/50bd027cca494de4fa1fc7bf1662983d0ba5f256fa0ece2c376b5eb9b3f0/numpy-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4d8335b5f1b6e2bce120d55fb17064b0262ff29b459e8493d1785c18ae2553b8", size = 17880549 }, - { url = "https://files.pythonhosted.org/packages/96/30/f7bf4acb5f8db10a96f73896bdeed7a63373137b131ca18bd3dab889db3b/numpy-2.2.3-cp312-cp312-win32.whl", hash = "sha256:4d9828d25fb246bedd31e04c9e75714a4087211ac348cb39c8c5f99dbb6683fe", size = 6293394 }, - { url = "https://files.pythonhosted.org/packages/42/6e/55580a538116d16ae7c9aa17d4edd56e83f42126cb1dfe7a684da7925d2c/numpy-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:83807d445817326b4bcdaaaf8e8e9f1753da04341eceec705c001ff342002e5d", size = 12626357 }, + { url = "https://files.pythonhosted.org/packages/a2/30/182db21d4f2a95904cec1a6f779479ea1ac07c0647f064dea454ec650c42/numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", size = 20947156 }, + { url = "https://files.pythonhosted.org/packages/24/6d/9483566acfbda6c62c6bc74b6e981c777229d2af93c8eb2469b26ac1b7bc/numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", size = 14133092 }, + { url = "https://files.pythonhosted.org/packages/27/f6/dba8a258acbf9d2bed2525cdcbb9493ef9bae5199d7a9cb92ee7e9b2aea6/numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", size = 5163515 }, + { url = "https://files.pythonhosted.org/packages/62/30/82116199d1c249446723c68f2c9da40d7f062551036f50b8c4caa42ae252/numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", size = 6696558 }, + { url = "https://files.pythonhosted.org/packages/0e/b2/54122b3c6df5df3e87582b2e9430f1bdb63af4023c739ba300164c9ae503/numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", size = 14084742 }, + { url = "https://files.pythonhosted.org/packages/02/e2/e2cbb8d634151aab9528ef7b8bab52ee4ab10e076509285602c2a3a686e0/numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", size = 16134051 }, + { url = "https://files.pythonhosted.org/packages/8e/21/efd47800e4affc993e8be50c1b768de038363dd88865920439ef7b422c60/numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", size = 15578972 }, + { url = "https://files.pythonhosted.org/packages/04/1e/f8bb88f6157045dd5d9b27ccf433d016981032690969aa5c19e332b138c0/numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", size = 17898106 }, + { url = "https://files.pythonhosted.org/packages/2b/93/df59a5a3897c1f036ae8ff845e45f4081bb06943039ae28a3c1c7c780f22/numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", size = 6311190 }, + { url = "https://files.pythonhosted.org/packages/46/69/8c4f928741c2a8efa255fdc7e9097527c6dc4e4df147e3cadc5d9357ce85/numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", size = 12644305 }, ] [[package]] @@ -1145,11 +1212,11 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.3.6" +version = "4.3.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } +sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, + { url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499 }, ] [[package]] @@ -1247,22 +1314,22 @@ wheels = [ [[package]] name = "pycryptodome" -version = "3.21.0" +version = "3.22.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/52/13b9db4a913eee948152a079fe58d035bd3d1a519584155da8e786f767e6/pycryptodome-3.21.0.tar.gz", hash = "sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297", size = 4818071 } +sdist = { url = "https://files.pythonhosted.org/packages/44/e6/099310419df5ada522ff34ffc2f1a48a11b37fc6a76f51a6854c182dbd3e/pycryptodome-3.22.0.tar.gz", hash = "sha256:fd7ab568b3ad7b77c908d7c3f7e167ec5a8f035c64ff74f10d47a4edd043d723", size = 4917300 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/88/5e83de10450027c96c79dc65ac45e9d0d7a7fef334f39d3789a191f33602/pycryptodome-3.21.0-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2480ec2c72438430da9f601ebc12c518c093c13111a5c1644c82cdfc2e50b1e4", size = 2495937 }, - { url = "https://files.pythonhosted.org/packages/66/e1/8f28cd8cf7f7563319819d1e172879ccce2333781ae38da61c28fe22d6ff/pycryptodome-3.21.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:de18954104667f565e2fbb4783b56667f30fb49c4d79b346f52a29cb198d5b6b", size = 1634629 }, - { url = "https://files.pythonhosted.org/packages/6a/c1/f75a1aaff0c20c11df8dc8e2bf8057e7f73296af7dfd8cbb40077d1c930d/pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e", size = 2168708 }, - { url = "https://files.pythonhosted.org/packages/ea/66/6f2b7ddb457b19f73b82053ecc83ba768680609d56dd457dbc7e902c41aa/pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8", size = 2254555 }, - { url = "https://files.pythonhosted.org/packages/2c/2b/152c330732a887a86cbf591ed69bd1b489439b5464806adb270f169ec139/pycryptodome-3.21.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d85c1b613121ed3dbaa5a97369b3b757909531a959d229406a75b912dd51dd1", size = 2294143 }, - { url = "https://files.pythonhosted.org/packages/55/92/517c5c498c2980c1b6d6b9965dffbe31f3cd7f20f40d00ec4069559c5902/pycryptodome-3.21.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8898a66425a57bcf15e25fc19c12490b87bd939800f39a03ea2de2aea5e3611a", size = 2160509 }, - { url = "https://files.pythonhosted.org/packages/39/1f/c74288f54d80a20a78da87df1818c6464ac1041d10988bb7d982c4153fbc/pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:932c905b71a56474bff8a9c014030bc3c882cee696b448af920399f730a650c2", size = 2329480 }, - { url = "https://files.pythonhosted.org/packages/39/1b/d0b013bf7d1af7cf0a6a4fce13f5fe5813ab225313755367b36e714a63f8/pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:18caa8cfbc676eaaf28613637a89980ad2fd96e00c564135bf90bc3f0b34dd93", size = 2254397 }, - { url = "https://files.pythonhosted.org/packages/14/71/4cbd3870d3e926c34706f705d6793159ac49d9a213e3ababcdade5864663/pycryptodome-3.21.0-cp36-abi3-win32.whl", hash = "sha256:280b67d20e33bb63171d55b1067f61fbd932e0b1ad976b3a184303a3dad22764", size = 1775641 }, - { url = "https://files.pythonhosted.org/packages/43/1d/81d59d228381576b92ecede5cd7239762c14001a828bdba30d64896e9778/pycryptodome-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53", size = 1812863 }, - { url = "https://files.pythonhosted.org/packages/25/b3/09ff7072e6d96c9939c24cf51d3c389d7c345bf675420355c22402f71b68/pycryptodome-3.21.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2cb635b67011bc147c257e61ce864879ffe6d03342dc74b6045059dfbdedafca", size = 1691593 }, - { url = "https://files.pythonhosted.org/packages/a8/91/38e43628148f68ba9b68dedbc323cf409e537fd11264031961fd7c744034/pycryptodome-3.21.0-pp27-pypy_73-win32.whl", hash = "sha256:4c26a2f0dc15f81ea3afa3b0c87b87e501f235d332b7f27e2225ecb80c0b1cdd", size = 1765997 }, + { url = "https://files.pythonhosted.org/packages/1f/65/a05831c3e4bcd1bf6c2a034e399f74b3d6f30bb4e37e36b9c310c09dc8c0/pycryptodome-3.22.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:009e1c80eea42401a5bd5983c4bab8d516aef22e014a4705622e24e6d9d703c6", size = 2490637 }, + { url = "https://files.pythonhosted.org/packages/5c/76/ff3c2e7a60d17c080c4c6120ebaf60f38717cd387e77f84da4dcf7f64ff0/pycryptodome-3.22.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3b76fa80daeff9519d7e9f6d9e40708f2fce36b9295a847f00624a08293f4f00", size = 1635372 }, + { url = "https://files.pythonhosted.org/packages/cc/7f/cc5d6da0dbc36acd978d80a72b228e33aadaec9c4f91c93221166d8bdc05/pycryptodome-3.22.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a31fa5914b255ab62aac9265654292ce0404f6b66540a065f538466474baedbc", size = 2177456 }, + { url = "https://files.pythonhosted.org/packages/92/65/35f5063e68790602d892ad36e35ac723147232a9084d1999630045c34593/pycryptodome-3.22.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0092fd476701eeeb04df5cc509d8b739fa381583cda6a46ff0a60639b7cd70d", size = 2263744 }, + { url = "https://files.pythonhosted.org/packages/cc/67/46acdd35b1081c3dbc72dc466b1b95b80d2f64cad3520f994a9b6c5c7d00/pycryptodome-3.22.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d5b0ddc7cf69231736d778bd3ae2b3efb681ae33b64b0c92fb4626bb48bb89", size = 2303356 }, + { url = "https://files.pythonhosted.org/packages/3d/f9/a4f8a83384626098e3f55664519bec113002b9ef751887086ae63a53135a/pycryptodome-3.22.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f6cf6aa36fcf463e622d2165a5ad9963b2762bebae2f632d719dfb8544903cf5", size = 2176714 }, + { url = "https://files.pythonhosted.org/packages/88/65/e5f8c3a885f70a6e05c84844cd5542120576f4369158946e8cfc623a464d/pycryptodome-3.22.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:aec7b40a7ea5af7c40f8837adf20a137d5e11a6eb202cde7e588a48fb2d871a8", size = 2337329 }, + { url = "https://files.pythonhosted.org/packages/b8/2a/25e0be2b509c28375c7f75c7e8d8d060773f2cce4856a1654276e3202339/pycryptodome-3.22.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d21c1eda2f42211f18a25db4eaf8056c94a8563cd39da3683f89fe0d881fb772", size = 2262255 }, + { url = "https://files.pythonhosted.org/packages/41/58/60917bc4bbd91712e53ce04daf237a74a0ad731383a01288130672994328/pycryptodome-3.22.0-cp37-abi3-win32.whl", hash = "sha256:f02baa9f5e35934c6e8dcec91fcde96612bdefef6e442813b8ea34e82c84bbfb", size = 1763403 }, + { url = "https://files.pythonhosted.org/packages/55/f4/244c621afcf7867e23f63cfd7a9630f14cfe946c9be7e566af6c3915bcde/pycryptodome-3.22.0-cp37-abi3-win_amd64.whl", hash = "sha256:d086aed307e96d40c23c42418cbbca22ecc0ab4a8a0e24f87932eeab26c08627", size = 1794568 }, + { url = "https://files.pythonhosted.org/packages/cd/13/16d3a83b07f949a686f6cfd7cfc60e57a769ff502151ea140ad67b118e26/pycryptodome-3.22.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:98fd9da809d5675f3a65dcd9ed384b9dc67edab6a4cda150c5870a8122ec961d", size = 1700779 }, + { url = "https://files.pythonhosted.org/packages/13/af/16d26f7dfc5fd7696ea2c91448f937b51b55312b5bed44f777563e32a4fe/pycryptodome-3.22.0-pp27-pypy_73-win32.whl", hash = "sha256:37ddcd18284e6b36b0a71ea495a4c4dca35bb09ccc9bfd5b91bfaf2321f131c1", size = 1775230 }, ] [[package]] @@ -1304,6 +1371,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, ] +[[package]] +name = "pydantic-settings" +version = "2.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 }, +] + [[package]] name = "pygments" version = "2.19.1" @@ -1579,27 +1659,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.9.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/8e/fafaa6f15c332e73425d9c44ada85360501045d5ab0b81400076aff27cf6/ruff-0.9.10.tar.gz", hash = "sha256:9bacb735d7bada9cfb0f2c227d3658fc443d90a727b47f206fb33f52f3c0eac7", size = 3759776 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/b2/af7c2cc9e438cbc19fafeec4f20bfcd72165460fe75b2b6e9a0958c8c62b/ruff-0.9.10-py3-none-linux_armv6l.whl", hash = "sha256:eb4d25532cfd9fe461acc83498361ec2e2252795b4f40b17e80692814329e42d", size = 10049494 }, - { url = "https://files.pythonhosted.org/packages/6d/12/03f6dfa1b95ddd47e6969f0225d60d9d7437c91938a310835feb27927ca0/ruff-0.9.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:188a6638dab1aa9bb6228a7302387b2c9954e455fb25d6b4470cb0641d16759d", size = 10853584 }, - { url = "https://files.pythonhosted.org/packages/02/49/1c79e0906b6ff551fb0894168763f705bf980864739572b2815ecd3c9df0/ruff-0.9.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5284dcac6b9dbc2fcb71fdfc26a217b2ca4ede6ccd57476f52a587451ebe450d", size = 10155692 }, - { url = "https://files.pythonhosted.org/packages/5b/01/85e8082e41585e0e1ceb11e41c054e9e36fed45f4b210991052d8a75089f/ruff-0.9.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47678f39fa2a3da62724851107f438c8229a3470f533894b5568a39b40029c0c", size = 10369760 }, - { url = "https://files.pythonhosted.org/packages/a1/90/0bc60bd4e5db051f12445046d0c85cc2c617095c0904f1aa81067dc64aea/ruff-0.9.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99713a6e2766b7a17147b309e8c915b32b07a25c9efd12ada79f217c9c778b3e", size = 9912196 }, - { url = "https://files.pythonhosted.org/packages/66/ea/0b7e8c42b1ec608033c4d5a02939c82097ddcb0b3e393e4238584b7054ab/ruff-0.9.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524ee184d92f7c7304aa568e2db20f50c32d1d0caa235d8ddf10497566ea1a12", size = 11434985 }, - { url = "https://files.pythonhosted.org/packages/d5/86/3171d1eff893db4f91755175a6e1163c5887be1f1e2f4f6c0c59527c2bfd/ruff-0.9.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:df92aeac30af821f9acf819fc01b4afc3dfb829d2782884f8739fb52a8119a16", size = 12155842 }, - { url = "https://files.pythonhosted.org/packages/89/9e/700ca289f172a38eb0bca752056d0a42637fa17b81649b9331786cb791d7/ruff-0.9.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de42e4edc296f520bb84954eb992a07a0ec5a02fecb834498415908469854a52", size = 11613804 }, - { url = "https://files.pythonhosted.org/packages/f2/92/648020b3b5db180f41a931a68b1c8575cca3e63cec86fd26807422a0dbad/ruff-0.9.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d257f95b65806104b6b1ffca0ea53f4ef98454036df65b1eda3693534813ecd1", size = 13823776 }, - { url = "https://files.pythonhosted.org/packages/5e/a6/cc472161cd04d30a09d5c90698696b70c169eeba2c41030344194242db45/ruff-0.9.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b60dec7201c0b10d6d11be00e8f2dbb6f40ef1828ee75ed739923799513db24c", size = 11302673 }, - { url = "https://files.pythonhosted.org/packages/6c/db/d31c361c4025b1b9102b4d032c70a69adb9ee6fde093f6c3bf29f831c85c/ruff-0.9.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d838b60007da7a39c046fcdd317293d10b845001f38bcb55ba766c3875b01e43", size = 10235358 }, - { url = "https://files.pythonhosted.org/packages/d1/86/d6374e24a14d4d93ebe120f45edd82ad7dcf3ef999ffc92b197d81cdc2a5/ruff-0.9.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ccaf903108b899beb8e09a63ffae5869057ab649c1e9231c05ae354ebc62066c", size = 9886177 }, - { url = "https://files.pythonhosted.org/packages/00/62/a61691f6eaaac1e945a1f3f59f1eea9a218513139d5b6c2b8f88b43b5b8f/ruff-0.9.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f9567d135265d46e59d62dc60c0bfad10e9a6822e231f5b24032dba5a55be6b5", size = 10864747 }, - { url = "https://files.pythonhosted.org/packages/ee/94/2c7065e1d92a8a8a46d46d9c3cf07b0aa7e0a1e0153d74baa5e6620b4102/ruff-0.9.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5f202f0d93738c28a89f8ed9eaba01b7be339e5d8d642c994347eaa81c6d75b8", size = 11360441 }, - { url = "https://files.pythonhosted.org/packages/a7/8f/1f545ea6f9fcd7bf4368551fb91d2064d8f0577b3079bb3f0ae5779fb773/ruff-0.9.10-py3-none-win32.whl", hash = "sha256:bfb834e87c916521ce46b1788fbb8484966e5113c02df216680102e9eb960029", size = 10247401 }, - { url = "https://files.pythonhosted.org/packages/4f/18/fb703603ab108e5c165f52f5b86ee2aa9be43bb781703ec87c66a5f5d604/ruff-0.9.10-py3-none-win_amd64.whl", hash = "sha256:f2160eeef3031bf4b17df74e307d4c5fb689a6f3a26a2de3f7ef4044e3c484f1", size = 11366360 }, - { url = "https://files.pythonhosted.org/packages/35/85/338e603dc68e7d9994d5d84f24adbf69bae760ba5efd3e20f5ff2cec18da/ruff-0.9.10-py3-none-win_arm64.whl", hash = "sha256:5fd804c0327a5e5ea26615550e706942f348b197d5475ff34c19733aee4b2e69", size = 10436892 }, +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/77/2b/7ca27e854d92df5e681e6527dc0f9254c9dc06c8408317893cf96c851cdd/ruff-0.11.0.tar.gz", hash = "sha256:e55c620690a4a7ee6f1cccb256ec2157dc597d109400ae75bbf944fc9d6462e2", size = 3799407 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/40/3d0340a9e5edc77d37852c0cd98c5985a5a8081fc3befaeb2ae90aaafd2b/ruff-0.11.0-py3-none-linux_armv6l.whl", hash = "sha256:dc67e32bc3b29557513eb7eeabb23efdb25753684b913bebb8a0c62495095acb", size = 10098158 }, + { url = "https://files.pythonhosted.org/packages/ec/a9/d8f5abb3b87b973b007649ac7bf63665a05b2ae2b2af39217b09f52abbbf/ruff-0.11.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38c23fd9bdec4eb437b4c1e3595905a0a8edfccd63a790f818b28c78fe345639", size = 10879071 }, + { url = "https://files.pythonhosted.org/packages/ab/62/aaa198614c6211677913ec480415c5e6509586d7b796356cec73a2f8a3e6/ruff-0.11.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7c8661b0be91a38bd56db593e9331beaf9064a79028adee2d5f392674bbc5e88", size = 10247944 }, + { url = "https://files.pythonhosted.org/packages/9f/52/59e0a9f2cf1ce5e6cbe336b6dd0144725c8ea3b97cac60688f4e7880bf13/ruff-0.11.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6c0e8d3d2db7e9f6efd884f44b8dc542d5b6b590fc4bb334fdbc624d93a29a2", size = 10421725 }, + { url = "https://files.pythonhosted.org/packages/a6/c3/dcd71acc6dff72ce66d13f4be5bca1dbed4db678dff2f0f6f307b04e5c02/ruff-0.11.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c3156d3f4b42e57247275a0a7e15a851c165a4fc89c5e8fa30ea6da4f7407b8", size = 9954435 }, + { url = "https://files.pythonhosted.org/packages/a6/9a/342d336c7c52dbd136dee97d4c7797e66c3f92df804f8f3b30da59b92e9c/ruff-0.11.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:490b1e147c1260545f6d041c4092483e3f6d8eba81dc2875eaebcf9140b53905", size = 11492664 }, + { url = "https://files.pythonhosted.org/packages/84/35/6e7defd2d7ca95cc385ac1bd9f7f2e4a61b9cc35d60a263aebc8e590c462/ruff-0.11.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1bc09a7419e09662983b1312f6fa5dab829d6ab5d11f18c3760be7ca521c9329", size = 12207856 }, + { url = "https://files.pythonhosted.org/packages/22/78/da669c8731bacf40001c880ada6d31bcfb81f89cc996230c3b80d319993e/ruff-0.11.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcfa478daf61ac8002214eb2ca5f3e9365048506a9d52b11bea3ecea822bb844", size = 11645156 }, + { url = "https://files.pythonhosted.org/packages/ee/47/e27d17d83530a208f4a9ab2e94f758574a04c51e492aa58f91a3ed7cbbcb/ruff-0.11.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fbb2aed66fe742a6a3a0075ed467a459b7cedc5ae01008340075909d819df1e", size = 13884167 }, + { url = "https://files.pythonhosted.org/packages/9f/5e/42ffbb0a5d4b07bbc642b7d58357b4e19a0f4774275ca6ca7d1f7b5452cd/ruff-0.11.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92c0c1ff014351c0b0cdfdb1e35fa83b780f1e065667167bb9502d47ca41e6db", size = 11348311 }, + { url = "https://files.pythonhosted.org/packages/c8/51/dc3ce0c5ce1a586727a3444a32f98b83ba99599bb1ebca29d9302886e87f/ruff-0.11.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e4fd5ff5de5f83e0458a138e8a869c7c5e907541aec32b707f57cf9a5e124445", size = 10305039 }, + { url = "https://files.pythonhosted.org/packages/60/e0/475f0c2f26280f46f2d6d1df1ba96b3399e0234cf368cc4c88e6ad10dcd9/ruff-0.11.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:96bc89a5c5fd21a04939773f9e0e276308be0935de06845110f43fd5c2e4ead7", size = 9937939 }, + { url = "https://files.pythonhosted.org/packages/e2/d3/3e61b7fd3e9cdd1e5b8c7ac188bec12975c824e51c5cd3d64caf81b0331e/ruff-0.11.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a9352b9d767889ec5df1483f94870564e8102d4d7e99da52ebf564b882cdc2c7", size = 10923259 }, + { url = "https://files.pythonhosted.org/packages/30/32/cd74149ebb40b62ddd14bd2d1842149aeb7f74191fb0f49bd45c76909ff2/ruff-0.11.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:049a191969a10897fe052ef9cc7491b3ef6de79acd7790af7d7897b7a9bfbcb6", size = 11406212 }, + { url = "https://files.pythonhosted.org/packages/00/ef/033022a6b104be32e899b00de704d7c6d1723a54d4c9e09d147368f14b62/ruff-0.11.0-py3-none-win32.whl", hash = "sha256:3191e9116b6b5bbe187447656f0c8526f0d36b6fd89ad78ccaad6bdc2fad7df2", size = 10310905 }, + { url = "https://files.pythonhosted.org/packages/ed/8a/163f2e78c37757d035bd56cd60c8d96312904ca4a6deeab8442d7b3cbf89/ruff-0.11.0-py3-none-win_amd64.whl", hash = "sha256:c58bfa00e740ca0a6c43d41fb004cd22d165302f360aaa56f7126d544db31a21", size = 11411730 }, + { url = "https://files.pythonhosted.org/packages/4e/f7/096f6efabe69b49d7ca61052fc70289c05d8d35735c137ef5ba5ef423662/ruff-0.11.0-py3-none-win_arm64.whl", hash = "sha256:868364fc23f5aa122b00c6f794211e85f7e78f5dffdf7c590ab90b8c4e69b657", size = 10538956 }, ] [[package]] @@ -1640,15 +1720,15 @@ wheels = [ [[package]] name = "sentry-sdk" -version = "2.22.0" +version = "2.23.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/81/b6/662988ecd2345bf6c3a5c306a9a3590852742eff91d0a78a143398b816f3/sentry_sdk-2.22.0.tar.gz", hash = "sha256:b4bf43bb38f547c84b2eadcefbe389b36ef75f3f38253d7a74d6b928c07ae944", size = 303539 } +sdist = { url = "https://files.pythonhosted.org/packages/60/fd/2c5f7161dbea1fa03381f139c443b4524f3a15d58e50c96a65d19f454ba2/sentry_sdk-2.23.1.tar.gz", hash = "sha256:2288320465065f3f056630ce55936426204f96f63f1208edb79e033ed03774db", size = 316248 } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/7f/0e4459173e9671ba5f75a48dda2442bcc48a12c79e54e5789381c8c6a9bc/sentry_sdk-2.22.0-py2.py3-none-any.whl", hash = "sha256:3d791d631a6c97aad4da7074081a57073126c69487560c6f8bffcf586461de66", size = 325815 }, + { url = "https://files.pythonhosted.org/packages/4e/00/9a9a2ab9020ee824d787f7e82a539305bf926393fe139baedbcf34356770/sentry_sdk-2.23.1-py2.py3-none-any.whl", hash = "sha256:42ef3a6cc1db3d22cb2ab24163d75b23f291ad9892b1a8c44075ce809a32b191", size = 336327 }, ] [[package]] @@ -1797,6 +1877,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca", size = 44415 }, ] +[[package]] +name = "sse-starlette" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "starlette" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl", hash = "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99", size = 10120 }, +] + [[package]] name = "starknet-py" version = "0.25.0" @@ -1816,6 +1909,18 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/36/ea/2ec249b38dccd8391b714a0dce2172d6298d7e043b063e529d897622f88d/starknet_py-0.25.0.tar.gz", hash = "sha256:452f2c9ed5e235540209ec2042d22dcf79c6cec2a6850f5b518d61b3fada3706", size = 97660 } +[[package]] +name = "starlette" +version = "0.46.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/1b/52b27f2e13ceedc79a908e29eac426a63465a1a01248e5f24aa36a62aeb3/starlette-0.46.1.tar.gz", hash = "sha256:3c88d58ee4bd1bb807c0d1acb381838afc7752f9ddaec81bbe4383611d833230", size = 2580102 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/4b/528ccf7a982216885a1ff4908e886b8fb5f19862d1962f56a3fce2435a70/starlette-0.46.1-py3-none-any.whl", hash = "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227", size = 71995 }, +] + [[package]] name = "strict-rfc3339" version = "0.7" @@ -1890,11 +1995,11 @@ wheels = [ [[package]] name = "types-pytz" -version = "2025.1.0.20250204" +version = "2025.1.0.20250318" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/d2/2190c54d53c04491ad72a1df019c5dfa692e6ab6c2dba1be7b6c9d530e30/types_pytz-2025.1.0.20250204.tar.gz", hash = "sha256:00f750132769f1c65a4f7240bc84f13985b4da774bd17dfbe5d9cd442746bd49", size = 10352 } +sdist = { url = "https://files.pythonhosted.org/packages/d2/ab/3910b323908a848e7852c3d0b2bdf0f027cc293dc1650c8911b16cd32227/types_pytz-2025.1.0.20250318.tar.gz", hash = "sha256:97e0e35184c6fe14e3a5014512057f2c57bb0c6582d63c1cfcc4809f82180449", size = 10450 } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/50/65ffad73746f1d8b15992c030e0fd22965fd5ae2c0206dc28873343b3230/types_pytz-2025.1.0.20250204-py3-none-any.whl", hash = "sha256:32ca4a35430e8b94f6603b35beb7f56c32260ddddd4f4bb305fdf8f92358b87e", size = 10059 }, + { url = "https://files.pythonhosted.org/packages/c9/7c/c94c1c3c8f4d70ca205ac94be714cfbe723fa93fdb9a41ca608ddd21de39/types_pytz-2025.1.0.20250318-py3-none-any.whl", hash = "sha256:04dba4907c5415777083f9548693c6d9f80ec53adcaff55a38526a3f8ddcae04", size = 10063 }, ] [[package]] @@ -1970,6 +2075,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, ] +[[package]] +name = "uvicorn" +version = "0.34.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, +] + [[package]] name = "uvloop" version = "0.21.0"