diff --git a/.vscode/mcp.json b/.vscode/mcp.json
new file mode 100644
index 000000000..755e159f1
--- /dev/null
+++ b/.vscode/mcp.json
@@ -0,0 +1,9 @@
+{
+ "inputs": [],
+ "servers": {
+ "dipdup-sse": {
+ "type": "sse",
+ "url": "http://127.0.0.1:9999/sse"
+ }
+ }
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index de3df8c9e..2107a948c 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -2,7 +2,7 @@
"yaml.schemas": {
"schemas/dipdup-3.0.json": [
"**/dipdup*.y[a]ml",
- "tests/configs/*.yml"
+ "tests/configs/*.y[a]ml"
],
},
"files.associations": {
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 60daaa672..1b9176df3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,7 @@ The format is based on [Keep a Changelog], and this project adheres to [Semantic
Releases prior to 7.0 has been removed from this file to declutter search results; see the [archived copy](https://github.com/dipdup-io/dipdup/blob/8.0.0b5/CHANGELOG.md) for the full list.
-## [Unreleased]
+## [8.3.2] - 2025-04-17
### Added
@@ -17,6 +17,7 @@ Releases prior to 7.0 has been removed from this file to declutter search result
### Fixed
- cli: Fixed `new` command using incorrect template.
+- mcp: Fixed handling exceptions in MCP tools.
### Changed
@@ -696,7 +697,8 @@ Releases prior to 7.0 has been removed from this file to declutter search result
[semantic versioning]: https://semver.org/spec/v2.0.0.html
-[Unreleased]: https://github.com/dipdup-io/dipdup/compare/8.3.1...HEAD
+[Unreleased]: https://github.com/dipdup-io/dipdup/compare/8.3.2...HEAD
+[8.3.2]: https://github.com/dipdup-io/dipdup/compare/8.3.0...8.3.1
[8.3.1]: https://github.com/dipdup-io/dipdup/compare/8.3.0...8.3.1
[8.3.0]: https://github.com/dipdup-io/dipdup/compare/8.2.2...8.3.0
[8.2.2]: https://github.com/dipdup-io/dipdup/compare/8.2.1...8.2.2
diff --git a/docs/7.references/3.context.md b/docs/7.references/3.context.md
index b5c9b0b09..a89782dfd 100644
--- a/docs/7.references/3.context.md
+++ b/docs/7.references/3.context.md
@@ -69,7 +69,7 @@ description: "Context reference"
## dipdup.context.McpContext
-class dipdup.context.McpContext(config, package, datasources, transactions, logger, server)
+class dipdup.context.McpContext(config, package, datasources, transactions, logger, server, api)
Execution context of MCP tools, resources and prompts.
- Parameters:
@@ -80,6 +80,7 @@ description: "Context reference"
transactions (TransactionManager) – Transaction manager (low-level interface)
logger (Logger) – Context-aware logger instance
server (McpServer[Any]) – Running MCP server instance
+api (HttpDatasource) – DipDup API datasource
diff --git a/docs/8.examples/_demos_table.md b/docs/8.examples/_demos_table.md
index a424bf001..a2cb367ea 100644
--- a/docs/8.examples/_demos_table.md
+++ b/docs/8.examples/_demos_table.md
@@ -1,22 +1,22 @@
| name | network | description | source |
|-|-|-|-|
-| demo_blank | | Empty config for a fresh start | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_blank) |
-| demo_evm_events | EVM | ERC-20 token transfers (from event logs) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_evm_events) |
-| demo_evm_transactions | EVM | ERC-20 token transfers (from transactions) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_evm_transactions) |
-| demo_evm_uniswap | EVM | Uniswap V3 pools, positions, etc. (advanced, uses TimescaleDB) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_evm_uniswap) |
-| demo_starknet_events | Starknet | ERC-20 token transfers (from events) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_starknet_events) |
-| demo_substrate_events | Substrate | Substrate balance transfers | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_substrate_events) |
-| demo_tezos_auction | Tezos | NFT marketplace (TzColors) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_auction) |
-| demo_tezos_dao | Tezos | DAO registry (Homebase DAO) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_dao) |
-| demo_tezos_dex | Tezos | DEX balances and liquidity (Quipuswap) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_dex) |
-| demo_tezos_domains | Tezos | Domain name service (Tezos Domains) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_domains) |
-| demo_tezos_etherlink | Tezos | Etherlink smart rollup transactions | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_etherlink) |
-| demo_tezos_events | Tezos | Processing contract events | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_events) |
-| demo_tezos_factories | Tezos | Example of spawning indexes in runtime | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_factories) |
-| demo_tezos_head | Tezos | Processing head block metadata (realtime only) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_head) |
-| demo_tezos_nft_marketplace | Tezos | NFT marketplace (hic at nunc) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_nft_marketplace) |
-| demo_tezos_raw | Tezos | Process raw operations without filtering and typed payloads | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_raw) |
-| demo_tezos_token | Tezos | FA1.2 token contract operations | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_token) |
-| demo_tezos_token_balances | Tezos | FA1.2 token balances | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_token_balances) |
-| demo_tezos_token_transfers | Tezos | FA1.2 token transfers | [link](https://github.com/dipdup-io/dipdup/tree/8.3.1/src/demo_tezos_token_transfers) |
+| demo_blank | | Empty config for a fresh start | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_blank) |
+| demo_evm_events | EVM | ERC-20 token transfers (from event logs) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_evm_events) |
+| demo_evm_transactions | EVM | ERC-20 token transfers (from transactions) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_evm_transactions) |
+| demo_evm_uniswap | EVM | Uniswap V3 pools, positions, etc. (advanced, uses TimescaleDB) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_evm_uniswap) |
+| demo_starknet_events | Starknet | ERC-20 token transfers (from events) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_starknet_events) |
+| demo_substrate_events | Substrate | Substrate balance transfers | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_substrate_events) |
+| demo_tezos_auction | Tezos | NFT marketplace (TzColors) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_auction) |
+| demo_tezos_dao | Tezos | DAO registry (Homebase DAO) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_dao) |
+| demo_tezos_dex | Tezos | DEX balances and liquidity (Quipuswap) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_dex) |
+| demo_tezos_domains | Tezos | Domain name service (Tezos Domains) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_domains) |
+| demo_tezos_etherlink | Tezos | Etherlink smart rollup transactions | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_etherlink) |
+| demo_tezos_events | Tezos | Processing contract events | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_events) |
+| demo_tezos_factories | Tezos | Example of spawning indexes in runtime | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_factories) |
+| demo_tezos_head | Tezos | Processing head block metadata (realtime only) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_head) |
+| demo_tezos_nft_marketplace | Tezos | NFT marketplace (hic at nunc) | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_nft_marketplace) |
+| demo_tezos_raw | Tezos | Process raw operations without filtering and typed payloads | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_raw) |
+| demo_tezos_token | Tezos | FA1.2 token contract operations | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_token) |
+| demo_tezos_token_balances | Tezos | FA1.2 token balances | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_token_balances) |
+| demo_tezos_token_transfers | Tezos | FA1.2 token transfers | [link](https://github.com/dipdup-io/dipdup/tree/8.3.2/src/demo_tezos_token_transfers) |
diff --git a/docs/9.release-notes/_8.0_changelog.md b/docs/9.release-notes/_8.0_changelog.md
index ea9876d8c..e0555feed 100644
--- a/docs/9.release-notes/_8.0_changelog.md
+++ b/docs/9.release-notes/_8.0_changelog.md
@@ -6,7 +6,6 @@
- cli: Added `--pre` flag to `self` group commands to install pre-release versions.
- cli: Added `--raw` option to `config export` command to dump config preserving the original structure.
- cli: Added `-C` option, a shorthand for `-c . -c configs/dipdup..yaml`.
-- cli: Added `init --no-base` option to skip creating the base template.
- cli: Added `package verify` command to check the package consistency.
- cli: Added full project migration support for 3.0 spec.
- cli: Added spec_version 3.0 support to `migrate` command.
@@ -14,7 +13,6 @@
- database: Added `dipdup_status` view to the schema.
- env: Added `DIPDUP_JSON_LOG` environment variable to enable JSON logging.
- env: Added `DIPDUP_LOW_MEMORY` variable to reduce the size of caches and buffers.
-- env: Added `DIPDUP_NO_BASE` environment variable to skip creating the base template.
- env: Added `DIPDUP_PACKAGE_PATH` environment variable to override discovered package path.
- package: Added built-in `batch` handler to modify higher-level indexing logic.
- starknet.events: Added `starknet.events` index kind to process Starknet events.
@@ -27,7 +25,6 @@
- cli: Don't save reports for successful test runs.
- cli: Don't update existing installation in `self install` command unless asked to.
- cli: Fixed `--pre` installer flag.
-- cli: Fixed `new` command using incorrect template.
- cli: Fixed env files not being loaded in some commands.
- cli: Fixed errors raised when the project package is invalid.
- cli: Fixed progress estimation when there are indexes with `last_level` option set.
@@ -57,7 +54,6 @@
### Changed
- api: `/performance` endpoint response format has been changed.
-- cli: `init --base` option is now enabled by default.
- config: Index configs accept `datasources` list instead of `datasource` field.
- config: Index kinds have been renamed and grouped by the network.
- config: Index template values now can be any JSON-serializable object.
diff --git a/docs/9.release-notes/_8.3_changelog.md b/docs/9.release-notes/_8.3_changelog.md
index cd1de93a1..402048388 100644
--- a/docs/9.release-notes/_8.3_changelog.md
+++ b/docs/9.release-notes/_8.3_changelog.md
@@ -3,9 +3,12 @@
### Added
+- cli: Added `init --no-base` option to skip creating the base template.
- cli: Apply ruff linting and formating on init.
- config: Added `api_url` and `compatibility` fields to MCP config.
+- env: Added `DIPDUP_NO_BASE` environment variable to skip creating the base template.
- mcp: Added Model Context Protocol (MCP) server implementation.
+- mcp: Added `ctx.api` datasource and `ctx.call_api` helper to server context.
- mcp: Added built-in resources for accessing indexer configuration and metrics.
- mcp: Added support for exposing custom tools and resources via `@dipdup.mcp` decorators.
@@ -13,8 +16,10 @@
- api: Fixed configuring uvicorn logging.
- api: Strip secret fields from API responses.
+- cli: Fixed `new` command using incorrect template.
- cli: Fixed logging indexer status.
- mcp: Expose resources as tools for clients that don't support MCP resources yet.
+- mcp: Fixed handling exceptions in MCP tools.
- package: Create package marker even if helper symlink is present.
- project: Fixed built sdist/wheel artifacts which contained unrelated files.
- project: Fixed generation of compose manifest and configs for MCP environment.
@@ -22,6 +27,7 @@
### Changed
- api: Built-in management API is now using Starlette instead of plain aiohttp.
+- cli: `init --base` option is now enabled by default.
- cli: `install.py` script and `dipdup self` commands use `uv tool` instead of `pipx`.
- cli: `new` command uses default values for some `replay.yaml` fields.
- project: Replace `black` with `ruff` as default formatter.
diff --git a/pyproject.toml b/pyproject.toml
index c0a35fd12..ac2e77d0c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,7 +1,7 @@
[project]
name = "dipdup"
description = "Modular framework for creating selective indexers and featureful backends for dapps"
-version = "8.3.1"
+version = "8.3.2"
license = { text = "MIT" }
authors = [
{ name = "Lev Gorodetskii", email = "dipdup@drsr.io" },
diff --git a/requirements.txt b/requirements.txt
index 9ffd7fb46..cc2cc84e8 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -231,9 +231,9 @@ h11==0.14.0 \
hexbytes==1.3.0 \
--hash=sha256:4a61840c24b0909a6534350e2d28ee50159ca1c9e89ce275fd31c110312cf684 \
--hash=sha256:83720b529c6e15ed21627962938dc2dec9bb1010f17bbbd66bf1e6a8287d522c
-httpcore==1.0.7 \
- --hash=sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c \
- --hash=sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd
+httpcore==1.0.8 \
+ --hash=sha256:5254cf149bcb5f75e9d1b2b9f729ea4a4b883d1ad7379fc632b727cec23674be \
+ --hash=sha256:86e94505ed24ea06514883fd44d2bc02d90e77e7979c8eb71b90f41d364a1bad
httpx==0.28.1 \
--hash=sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc \
--hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad
@@ -316,24 +316,26 @@ msgpack==1.1.0 \
--hash=sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b \
--hash=sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d \
--hash=sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e
-multidict==6.3.2 \
- --hash=sha256:029bbd7d782251a78975214b78ee632672310f9233d49531fc93e8e99154af25 \
- --hash=sha256:0d50eff89aa4d145a5486b171a2177042d08ea5105f813027eb1050abe91839f \
- --hash=sha256:13bec31375235a68457ab887ce1bbf4f59d5810d838ae5d7e5b416242e1f3ed4 \
- --hash=sha256:1fcab18e65cc555ac29981a581518c23311f2b1e72d8f658f9891590465383be \
- --hash=sha256:347eea2852ab7f697cc5ed9b1aae96b08f8529cca0c6468f747f0781b1842898 \
- --hash=sha256:430120c6ce3715a9c6075cabcee557daccbcca8ba25a9fedf05c7bf564532f2d \
- --hash=sha256:643e57b403d3e240045a3681f9e6a04d35a33eddc501b4cbbbdbc9c70122e7bc \
- --hash=sha256:68acd51fa94e63312b8ddf84bfc9c3d3442fe1f9988bbe1b6c703043af8867fe \
- --hash=sha256:71409d4579f716217f23be2f5e7afca5ca926aaeb398aa11b72d793bff637a1f \
- --hash=sha256:7cafdafb44c4e646118410368307693e49d19167e5f119cbe3a88697d2d1a636 \
- --hash=sha256:9ca57a841ffcf712e47875d026aa49d6e67f9560624d54b51628603700d5d287 \
- --hash=sha256:9d17b37b9715b30605b5bab1460569742d0c309e5c20079263b440f5d7746e7e \
- --hash=sha256:c1035eea471f759fa853dd6e76aaa1e389f93b3e1403093fa0fd3ab4db490678 \
- --hash=sha256:c3b6d7620e6e90c6d97eaf3a63bf7fbd2ba253aab89120a4a9c660bf2d675391 \
- --hash=sha256:d1e0ba1ce1b8cc79117196642d95f4365e118eaf5fb85f57cdbcc5a25640b2a4 \
- --hash=sha256:d7db41e3b56817d9175264e5fe00192fbcb8e1265307a59f53dede86161b150e \
- --hash=sha256:e4d3f8e57027dcda84a1aa181501c15c45eab9566eb6fcc274cbd1e7561224f8
+multidict==6.4.3 \
+ --hash=sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db \
+ --hash=sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713 \
+ --hash=sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676 \
+ --hash=sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1 \
+ --hash=sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde \
+ --hash=sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec \
+ --hash=sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a \
+ --hash=sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc \
+ --hash=sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07 \
+ --hash=sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9 \
+ --hash=sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a \
+ --hash=sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427 \
+ --hash=sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3 \
+ --hash=sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124 \
+ --hash=sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c \
+ --hash=sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731 \
+ --hash=sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507 \
+ --hash=sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae \
+ --hash=sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054
mypy-extensions==1.0.0 \
--hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \
--hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782
@@ -514,25 +516,25 @@ ruamel-yaml-clib==0.2.12 ; platform_python_implementation == 'CPython' \
--hash=sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d \
--hash=sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31 \
--hash=sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5
-ruff==0.11.4 \
- --hash=sha256:0e9365a7dff9b93af933dab8aebce53b72d8f815e131796268709890b4a83270 \
- --hash=sha256:126b1bf13154aa18ae2d6c3c5efe144ec14b97c60844cfa6eb960c2a05188222 \
- --hash=sha256:193e6fac6eb60cc97b9f728e953c21cc38a20077ed64f912e9d62b97487f3f2d \
- --hash=sha256:3f171605f65f4fc49c87f41b456e882cd0c89e4ac9d58e149a2b07930e1d466f \
- --hash=sha256:51a6494209cacca79e121e9b244dc30d3414dac8cc5afb93f852173a2ecfc906 \
- --hash=sha256:5a9fa1c69c7815e39fcfb3646bbfd7f528fa8e2d4bebdcf4c2bd0fa037a255fb \
- --hash=sha256:5d94bb1cc2fc94a769b0eb975344f1b1f3d294da1da9ddbb5a77665feb3a3019 \
- --hash=sha256:7a37ca937e307ea18156e775a6ac6e02f34b99e8c23fe63c1996185a4efe0751 \
- --hash=sha256:7af4e5f69b7c138be8dcffa5b4a061bf6ba6a3301f632a6bce25d45daff9bc99 \
- --hash=sha256:8c1747d903447d45ca3d40c794d1a56458c51e5cc1bc77b7b64bd2cf0b1626cc \
- --hash=sha256:995071203d0fe2183fc7a268766fd7603afb9996785f086b0d76edee8755c896 \
- --hash=sha256:d435db6b9b93d02934cf61ef332e66af82da6d8c69aefdea5994c89997c7a0fc \
- --hash=sha256:d9f4a761ecbde448a2d3e12fb398647c7f0bf526dbc354a643ec505965824ed2 \
- --hash=sha256:e8806daaf9dfa881a0ed603f8a0e364e4f11b6ed461b56cae2b1c0cab0645304 \
- --hash=sha256:ebf99ea9af918878e6ce42098981fc8c1db3850fef2f1ada69fb1dcdb0f8e79e \
- --hash=sha256:edad2eac42279df12e176564a23fc6f4aaeeb09abba840627780b1bb11a9d223 \
- --hash=sha256:f103a848be9ff379fc19b5d656c1f911d0a0b4e3e0424f9532ececf319a4296e \
- --hash=sha256:f45bd2fb1a56a5a85fae3b95add03fb185a0b30cf47f5edc92aa0355ca1d7407
+ruff==0.11.5 \
+ --hash=sha256:0947c0a1afa75dcb5db4b34b070ec2bccee869d40e6cc8ab25aca11a7d527794 \
+ --hash=sha256:2561294e108eb648e50f210671cc56aee590fb6167b594144401532138c66c7b \
+ --hash=sha256:3068befab73620b8a0cc2431bd46b3cd619bc17d6f7695a3e1bb166b652c382a \
+ --hash=sha256:4bfd80a6ec559a5eeb96c33f832418bf0fb96752de0539905cf7b0cc1d31d779 \
+ --hash=sha256:56145ee1478582f61c08f21076dc59153310d606ad663acc00ea3ab5b2125f82 \
+ --hash=sha256:67e241b4314f4eacf14a601d586026a962f4002a475aa702c69980a38087aa4e \
+ --hash=sha256:6c6dc38af3cfe2863213ea25b6dc616d679205732dc0fb673356c2d69608f800 \
+ --hash=sha256:80b4df4d335a80315ab9afc81ed1cff62be112bd165e162b5eed8ac55bfc8470 \
+ --hash=sha256:81be52e7519f3d1a0beadcf8e974715b2dfc808ae8ec729ecfc79bddf8dbb783 \
+ --hash=sha256:ac12884b9e005c12d0bd121f56ccf8033e1614f736f766c118ad60780882a077 \
+ --hash=sha256:ad871ff74b5ec9caa66cb725b85d4ef89b53f8170f47c3406e32ef040400b038 \
+ --hash=sha256:b2a7cedf47244f431fd11aa5a7e2806dda2e0c365873bda7834e8f7d785ae159 \
+ --hash=sha256:cae2e2439cb88853e421901ec040a758960b576126dab520fa08e9de431d1bef \
+ --hash=sha256:e268da7b40f56e3eca571508a7e567e794f9bfcc0f412c4b607931d3af9c4afe \
+ --hash=sha256:e5f66f8f1e8c9fc594cbd66fbc5f246a8d91f916cb9667e80208663ec3728304 \
+ --hash=sha256:e6cf918390cfe46d240732d4d72fa6e18e528ca1f60e318a10835cf2fa3dc19f \
+ --hash=sha256:ef39f19cb8ec98cbc762344921e216f3857a06c47412030374fffd413fb8fd3a \
+ --hash=sha256:f5da2e710a9641828e09aa98b92c9ebbc60518fdf3921241326ca3e8f8e55b8b
scalecodec==1.2.11 \
--hash=sha256:99a2cdbfccdcaf22bd86b86da55a730a2855514ad2309faef4a4a93ac6cbeb8d \
--hash=sha256:d15c94965f617caa25096f83a45f5f73031d05e6ee08d6039969f0a64fc35de1
@@ -579,9 +581,9 @@ typeguard==4.4.2 \
types-requests==2.32.0.20250328 \
--hash=sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2 \
--hash=sha256:c9e67228ea103bd811c96984fac36ed2ae8da87a36a633964a21f199d60baf32
-typing-extensions==4.13.1 \
- --hash=sha256:4b6cf02909eb5495cfbc3f6e8fd49217e6cc7944e145cdda8caa3734777f9e69 \
- --hash=sha256:98795af00fb9640edec5b8e31fc647597b4691f099ad75f469a2616be1a76dff
+typing-extensions==4.13.2 \
+ --hash=sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c \
+ --hash=sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef
typing-inspect==0.9.0 \
--hash=sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f \
--hash=sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78
@@ -591,9 +593,9 @@ tzdata==2025.2 ; sys_platform == 'win32' \
tzlocal==5.3.1 \
--hash=sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd \
--hash=sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d
-urllib3==2.3.0 \
- --hash=sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df \
- --hash=sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d
+urllib3==2.4.0 \
+ --hash=sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466 \
+ --hash=sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813
uvicorn==0.34.0 \
--hash=sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4 \
--hash=sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9
diff --git a/src/demo_blank/Makefile b/src/demo_blank/Makefile
index bf5239ee4..19a0c30ca 100644
--- a/src/demo_blank/Makefile
+++ b/src/demo_blank/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_blank/pyproject.toml b/src/demo_blank/pyproject.toml
index 74ccb8c0c..567723d74 100644
--- a/src/demo_blank/pyproject.toml
+++ b/src/demo_blank/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_blank"
version = "0.0.1"
diff --git a/src/demo_evm_events/Makefile b/src/demo_evm_events/Makefile
index 671c7fc25..48aad38f6 100644
--- a/src/demo_evm_events/Makefile
+++ b/src/demo_evm_events/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_evm_events/pyproject.toml b/src/demo_evm_events/pyproject.toml
index 70ab2d1a1..665c71429 100644
--- a/src/demo_evm_events/pyproject.toml
+++ b/src/demo_evm_events/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_evm_events"
version = "0.0.1"
diff --git a/src/demo_evm_events/types/eth_usdt/evm_events/transfer.py b/src/demo_evm_events/types/eth_usdt/evm_events/transfer.py
index 0756054cc..9b2896912 100644
--- a/src/demo_evm_events/types/eth_usdt/evm_events/transfer.py
+++ b/src/demo_evm_events/types/eth_usdt/evm_events/transfer.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_transactions/Makefile b/src/demo_evm_transactions/Makefile
index ce576fbe7..9d482870d 100644
--- a/src/demo_evm_transactions/Makefile
+++ b/src/demo_evm_transactions/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_evm_transactions/pyproject.toml b/src/demo_evm_transactions/pyproject.toml
index 4d61218d9..78058c956 100644
--- a/src/demo_evm_transactions/pyproject.toml
+++ b/src/demo_evm_transactions/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_evm_transactions"
version = "0.0.1"
diff --git a/src/demo_evm_transactions/types/eth_usdt/evm_transactions/transfer.py b/src/demo_evm_transactions/types/eth_usdt/evm_transactions/transfer.py
index e3115d974..46b25d958 100644
--- a/src/demo_evm_transactions/types/eth_usdt/evm_transactions/transfer.py
+++ b/src/demo_evm_transactions/types/eth_usdt/evm_transactions/transfer.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_uniswap/Makefile b/src/demo_evm_uniswap/Makefile
index 8d6193513..bb92cddb0 100644
--- a/src/demo_evm_uniswap/Makefile
+++ b/src/demo_evm_uniswap/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_evm_uniswap/pyproject.toml b/src/demo_evm_uniswap/pyproject.toml
index 602036edf..b769b666b 100644
--- a/src/demo_evm_uniswap/pyproject.toml
+++ b/src/demo_evm_uniswap/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_evm_uniswap"
version = "0.0.1"
diff --git a/src/demo_evm_uniswap/types/factory/evm_events/pool_created.py b/src/demo_evm_uniswap/types/factory/evm_events/pool_created.py
index 2d7b37961..55b7360bb 100644
--- a/src/demo_evm_uniswap/types/factory/evm_events/pool_created.py
+++ b/src/demo_evm_uniswap/types/factory/evm_events/pool_created.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_uniswap/types/pool/evm_events/burn.py b/src/demo_evm_uniswap/types/pool/evm_events/burn.py
index f14adc014..75bebee27 100644
--- a/src/demo_evm_uniswap/types/pool/evm_events/burn.py
+++ b/src/demo_evm_uniswap/types/pool/evm_events/burn.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_uniswap/types/pool/evm_events/collect.py b/src/demo_evm_uniswap/types/pool/evm_events/collect.py
index e5da768c3..a3b4b8fa2 100644
--- a/src/demo_evm_uniswap/types/pool/evm_events/collect.py
+++ b/src/demo_evm_uniswap/types/pool/evm_events/collect.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_uniswap/types/pool/evm_events/flash.py b/src/demo_evm_uniswap/types/pool/evm_events/flash.py
index 0c425f103..8b10fd34f 100644
--- a/src/demo_evm_uniswap/types/pool/evm_events/flash.py
+++ b/src/demo_evm_uniswap/types/pool/evm_events/flash.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_uniswap/types/pool/evm_events/initialize.py b/src/demo_evm_uniswap/types/pool/evm_events/initialize.py
index a94b7a88b..8ef77d592 100644
--- a/src/demo_evm_uniswap/types/pool/evm_events/initialize.py
+++ b/src/demo_evm_uniswap/types/pool/evm_events/initialize.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_uniswap/types/pool/evm_events/mint.py b/src/demo_evm_uniswap/types/pool/evm_events/mint.py
index e7926e3d2..488d25b92 100644
--- a/src/demo_evm_uniswap/types/pool/evm_events/mint.py
+++ b/src/demo_evm_uniswap/types/pool/evm_events/mint.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_uniswap/types/pool/evm_events/swap.py b/src/demo_evm_uniswap/types/pool/evm_events/swap.py
index 648348883..0ca065819 100644
--- a/src/demo_evm_uniswap/types/pool/evm_events/swap.py
+++ b/src/demo_evm_uniswap/types/pool/evm_events/swap.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_uniswap/types/position_manager/evm_events/collect.py b/src/demo_evm_uniswap/types/position_manager/evm_events/collect.py
index 1e5d4e37d..a65c33fe6 100644
--- a/src/demo_evm_uniswap/types/position_manager/evm_events/collect.py
+++ b/src/demo_evm_uniswap/types/position_manager/evm_events/collect.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_uniswap/types/position_manager/evm_events/decrease_liquidity.py b/src/demo_evm_uniswap/types/position_manager/evm_events/decrease_liquidity.py
index 74c843b8e..c402eb733 100644
--- a/src/demo_evm_uniswap/types/position_manager/evm_events/decrease_liquidity.py
+++ b/src/demo_evm_uniswap/types/position_manager/evm_events/decrease_liquidity.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_uniswap/types/position_manager/evm_events/increase_liquidity.py b/src/demo_evm_uniswap/types/position_manager/evm_events/increase_liquidity.py
index 1308f3a1c..90dde38db 100644
--- a/src/demo_evm_uniswap/types/position_manager/evm_events/increase_liquidity.py
+++ b/src/demo_evm_uniswap/types/position_manager/evm_events/increase_liquidity.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_evm_uniswap/types/position_manager/evm_events/transfer.py b/src/demo_evm_uniswap/types/position_manager/evm_events/transfer.py
index cf2f7638b..68b4a1cb0 100644
--- a/src/demo_evm_uniswap/types/position_manager/evm_events/transfer.py
+++ b/src/demo_evm_uniswap/types/position_manager/evm_events/transfer.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_starknet_events/Makefile b/src/demo_starknet_events/Makefile
index 2b51e735e..3e9599e16 100644
--- a/src/demo_starknet_events/Makefile
+++ b/src/demo_starknet_events/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_starknet_events/pyproject.toml b/src/demo_starknet_events/pyproject.toml
index a64ecd737..d2cf63eeb 100644
--- a/src/demo_starknet_events/pyproject.toml
+++ b/src/demo_starknet_events/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_starknet_events"
version = "0.0.1"
diff --git a/src/demo_starknet_events/types/stark_usdt/starknet_events/transfer.py b/src/demo_starknet_events/types/stark_usdt/starknet_events/transfer.py
index f91e925d9..9973dd70a 100644
--- a/src/demo_starknet_events/types/stark_usdt/starknet_events/transfer.py
+++ b/src/demo_starknet_events/types/stark_usdt/starknet_events/transfer.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_substrate_events/Makefile b/src/demo_substrate_events/Makefile
index 175e4d608..63cff58f9 100644
--- a/src/demo_substrate_events/Makefile
+++ b/src/demo_substrate_events/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_substrate_events/pyproject.toml b/src/demo_substrate_events/pyproject.toml
index e37a078dc..cec9e649c 100644
--- a/src/demo_substrate_events/pyproject.toml
+++ b/src/demo_substrate_events/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_substrate_events"
version = "0.0.1"
diff --git a/src/demo_substrate_events/types/assethub/substrate_events/assets_transferred/v601.py b/src/demo_substrate_events/types/assethub/substrate_events/assets_transferred/v601.py
index de54781e5..564f41b8c 100644
--- a/src/demo_substrate_events/types/assethub/substrate_events/assets_transferred/v601.py
+++ b/src/demo_substrate_events/types/assethub/substrate_events/assets_transferred/v601.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_auction/Makefile b/src/demo_tezos_auction/Makefile
index 365a80462..d114083cf 100644
--- a/src/demo_tezos_auction/Makefile
+++ b/src/demo_tezos_auction/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_auction/pyproject.toml b/src/demo_tezos_auction/pyproject.toml
index d280c4359..9ee75d21f 100644
--- a/src/demo_tezos_auction/pyproject.toml
+++ b/src/demo_tezos_auction/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_auction"
version = "0.0.1"
diff --git a/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/bid.py b/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/bid.py
index 147bb2491..5b4265f17 100644
--- a/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/bid.py
+++ b/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/bid.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/create_auction.py b/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/create_auction.py
index ed0eb6ca2..fc54abe91 100644
--- a/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/create_auction.py
+++ b/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/create_auction.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/withdraw.py b/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/withdraw.py
index d111fcb75..4e0b129c1 100644
--- a/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/withdraw.py
+++ b/src/demo_tezos_auction/types/tzcolors_auction/tezos_parameters/withdraw.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_auction/types/tzcolors_auction/tezos_storage.py b/src/demo_tezos_auction/types/tzcolors_auction/tezos_storage.py
index abc42e6cb..9c2e9b2b7 100644
--- a/src/demo_tezos_auction/types/tzcolors_auction/tezos_storage.py
+++ b/src/demo_tezos_auction/types/tzcolors_auction/tezos_storage.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dao/Makefile b/src/demo_tezos_dao/Makefile
index 64e552241..a8bb0a1be 100644
--- a/src/demo_tezos_dao/Makefile
+++ b/src/demo_tezos_dao/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_dao/pyproject.toml b/src/demo_tezos_dao/pyproject.toml
index 20faf8b5c..aa5a4916f 100644
--- a/src/demo_tezos_dao/pyproject.toml
+++ b/src/demo_tezos_dao/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_dao"
version = "0.0.1"
diff --git a/src/demo_tezos_dao/types/registry/tezos_parameters/propose.py b/src/demo_tezos_dao/types/registry/tezos_parameters/propose.py
index cbcd2f9c4..833265ab1 100644
--- a/src/demo_tezos_dao/types/registry/tezos_parameters/propose.py
+++ b/src/demo_tezos_dao/types/registry/tezos_parameters/propose.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dao/types/registry/tezos_storage.py b/src/demo_tezos_dao/types/registry/tezos_storage.py
index dec78e326..5dceb0442 100644
--- a/src/demo_tezos_dao/types/registry/tezos_storage.py
+++ b/src/demo_tezos_dao/types/registry/tezos_storage.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/Makefile b/src/demo_tezos_dex/Makefile
index 5172e3ee4..17eb05581 100644
--- a/src/demo_tezos_dex/Makefile
+++ b/src/demo_tezos_dex/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_dex/pyproject.toml b/src/demo_tezos_dex/pyproject.toml
index 43d05b3bf..ea11f9956 100644
--- a/src/demo_tezos_dex/pyproject.toml
+++ b/src/demo_tezos_dex/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_dex"
version = "0.0.1"
diff --git a/src/demo_tezos_dex/types/fa12_token/tezos_parameters/transfer.py b/src/demo_tezos_dex/types/fa12_token/tezos_parameters/transfer.py
index 335793b2b..7f226caad 100644
--- a/src/demo_tezos_dex/types/fa12_token/tezos_parameters/transfer.py
+++ b/src/demo_tezos_dex/types/fa12_token/tezos_parameters/transfer.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/fa12_token/tezos_storage.py b/src/demo_tezos_dex/types/fa12_token/tezos_storage.py
index 92d04cf53..a6ba02577 100644
--- a/src/demo_tezos_dex/types/fa12_token/tezos_storage.py
+++ b/src/demo_tezos_dex/types/fa12_token/tezos_storage.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/fa2_token/tezos_parameters/transfer.py b/src/demo_tezos_dex/types/fa2_token/tezos_parameters/transfer.py
index bdd81cbee..4dd1b7e34 100644
--- a/src/demo_tezos_dex/types/fa2_token/tezos_parameters/transfer.py
+++ b/src/demo_tezos_dex/types/fa2_token/tezos_parameters/transfer.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/fa2_token/tezos_storage.py b/src/demo_tezos_dex/types/fa2_token/tezos_storage.py
index 259be34db..1a479d0e2 100644
--- a/src/demo_tezos_dex/types/fa2_token/tezos_storage.py
+++ b/src/demo_tezos_dex/types/fa2_token/tezos_storage.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/divest_liquidity.py b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/divest_liquidity.py
index 820a98c4f..ed142b605 100644
--- a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/divest_liquidity.py
+++ b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/divest_liquidity.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/invest_liquidity.py b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/invest_liquidity.py
index 5c9dd25ab..7dabce536 100644
--- a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/invest_liquidity.py
+++ b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/invest_liquidity.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/tez_to_token_payment.py b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/tez_to_token_payment.py
index 61789d12a..87b735cd0 100644
--- a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/tez_to_token_payment.py
+++ b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/tez_to_token_payment.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/token_to_tez_payment.py b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/token_to_tez_payment.py
index aad79fec5..8ccdcf4cb 100644
--- a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/token_to_tez_payment.py
+++ b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/token_to_tez_payment.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/transfer.py b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/transfer.py
index 335793b2b..7f226caad 100644
--- a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/transfer.py
+++ b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/transfer.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/withdraw_profit.py b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/withdraw_profit.py
index d3a9efc13..a2690fe4c 100644
--- a/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/withdraw_profit.py
+++ b/src/demo_tezos_dex/types/quipu_fa12/tezos_parameters/withdraw_profit.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa12/tezos_storage.py b/src/demo_tezos_dex/types/quipu_fa12/tezos_storage.py
index 548104eee..2a1773838 100644
--- a/src/demo_tezos_dex/types/quipu_fa12/tezos_storage.py
+++ b/src/demo_tezos_dex/types/quipu_fa12/tezos_storage.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/divest_liquidity.py b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/divest_liquidity.py
index 820a98c4f..ed142b605 100644
--- a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/divest_liquidity.py
+++ b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/divest_liquidity.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/invest_liquidity.py b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/invest_liquidity.py
index 5c9dd25ab..7dabce536 100644
--- a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/invest_liquidity.py
+++ b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/invest_liquidity.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/tez_to_token_payment.py b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/tez_to_token_payment.py
index 61789d12a..87b735cd0 100644
--- a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/tez_to_token_payment.py
+++ b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/tez_to_token_payment.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/token_to_tez_payment.py b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/token_to_tez_payment.py
index aad79fec5..8ccdcf4cb 100644
--- a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/token_to_tez_payment.py
+++ b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/token_to_tez_payment.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/transfer.py b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/transfer.py
index bdd81cbee..4dd1b7e34 100644
--- a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/transfer.py
+++ b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/transfer.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/withdraw_profit.py b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/withdraw_profit.py
index d3a9efc13..a2690fe4c 100644
--- a/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/withdraw_profit.py
+++ b/src/demo_tezos_dex/types/quipu_fa2/tezos_parameters/withdraw_profit.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_dex/types/quipu_fa2/tezos_storage.py b/src/demo_tezos_dex/types/quipu_fa2/tezos_storage.py
index 904d38c0a..56944ad4d 100644
--- a/src/demo_tezos_dex/types/quipu_fa2/tezos_storage.py
+++ b/src/demo_tezos_dex/types/quipu_fa2/tezos_storage.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_domains/Makefile b/src/demo_tezos_domains/Makefile
index afbb69be9..5d44679c6 100644
--- a/src/demo_tezos_domains/Makefile
+++ b/src/demo_tezos_domains/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_domains/pyproject.toml b/src/demo_tezos_domains/pyproject.toml
index ca6c1bea0..61f731265 100644
--- a/src/demo_tezos_domains/pyproject.toml
+++ b/src/demo_tezos_domains/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_domains"
version = "0.0.1"
diff --git a/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_expiry_map_key.py b/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_expiry_map_key.py
index 3adcad6ce..d56b99319 100644
--- a/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_expiry_map_key.py
+++ b/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_expiry_map_key.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_expiry_map_value.py b/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_expiry_map_value.py
index 314d7c75a..ff1ed77cc 100644
--- a/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_expiry_map_value.py
+++ b/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_expiry_map_value.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_records_key.py b/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_records_key.py
index c26ca07f0..631bbee02 100644
--- a/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_records_key.py
+++ b/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_records_key.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_records_value.py b/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_records_value.py
index 32b50b9d2..a0bebf31e 100644
--- a/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_records_value.py
+++ b/src/demo_tezos_domains/types/name_registry/tezos_big_maps/store_records_value.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_events/Makefile b/src/demo_tezos_events/Makefile
index 6c3e7b3ab..28d261fc2 100644
--- a/src/demo_tezos_events/Makefile
+++ b/src/demo_tezos_events/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_events/pyproject.toml b/src/demo_tezos_events/pyproject.toml
index 8cc581b64..a9843f1a4 100644
--- a/src/demo_tezos_events/pyproject.toml
+++ b/src/demo_tezos_events/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_events"
version = "0.0.1"
diff --git a/src/demo_tezos_events/types/events_contract/tezos_events/move.py b/src/demo_tezos_events/types/events_contract/tezos_events/move.py
index 547955479..d3f798df5 100644
--- a/src/demo_tezos_events/types/events_contract/tezos_events/move.py
+++ b/src/demo_tezos_events/types/events_contract/tezos_events/move.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_events/types/events_contract/tezos_events/roll.py b/src/demo_tezos_events/types/events_contract/tezos_events/roll.py
index b7942db71..5a9a2d336 100644
--- a/src/demo_tezos_events/types/events_contract/tezos_events/roll.py
+++ b/src/demo_tezos_events/types/events_contract/tezos_events/roll.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_factories/Makefile b/src/demo_tezos_factories/Makefile
index a8e058f04..a32369adf 100644
--- a/src/demo_tezos_factories/Makefile
+++ b/src/demo_tezos_factories/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_factories/pyproject.toml b/src/demo_tezos_factories/pyproject.toml
index 0df031bcb..71e5811f4 100644
--- a/src/demo_tezos_factories/pyproject.toml
+++ b/src/demo_tezos_factories/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_factories"
version = "0.0.1"
diff --git a/src/demo_tezos_factories/types/factory/tezos_storage.py b/src/demo_tezos_factories/types/factory/tezos_storage.py
index 6d6cfab97..aaad7f7cd 100644
--- a/src/demo_tezos_factories/types/factory/tezos_storage.py
+++ b/src/demo_tezos_factories/types/factory/tezos_storage.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_factories/types/token/tezos_parameters/transfer.py b/src/demo_tezos_factories/types/token/tezos_parameters/transfer.py
index bdd81cbee..4dd1b7e34 100644
--- a/src/demo_tezos_factories/types/token/tezos_parameters/transfer.py
+++ b/src/demo_tezos_factories/types/token/tezos_parameters/transfer.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_factories/types/token/tezos_storage.py b/src/demo_tezos_factories/types/token/tezos_storage.py
index c21a236f8..3797a6907 100644
--- a/src/demo_tezos_factories/types/token/tezos_storage.py
+++ b/src/demo_tezos_factories/types/token/tezos_storage.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_head/Makefile b/src/demo_tezos_head/Makefile
index 5e9f45214..8a50f4a67 100644
--- a/src/demo_tezos_head/Makefile
+++ b/src/demo_tezos_head/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_head/pyproject.toml b/src/demo_tezos_head/pyproject.toml
index 9cd177128..37769188c 100644
--- a/src/demo_tezos_head/pyproject.toml
+++ b/src/demo_tezos_head/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_head"
version = "0.0.1"
diff --git a/src/demo_tezos_nft_marketplace/Makefile b/src/demo_tezos_nft_marketplace/Makefile
index 23812558d..4fc86412d 100644
--- a/src/demo_tezos_nft_marketplace/Makefile
+++ b/src/demo_tezos_nft_marketplace/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_nft_marketplace/pyproject.toml b/src/demo_tezos_nft_marketplace/pyproject.toml
index dcb6b93bc..cfab26537 100644
--- a/src/demo_tezos_nft_marketplace/pyproject.toml
+++ b/src/demo_tezos_nft_marketplace/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_nft_marketplace"
version = "0.0.1"
diff --git a/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/cancel_swap.py b/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/cancel_swap.py
index 3c2326b5a..9d7893041 100644
--- a/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/cancel_swap.py
+++ b/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/cancel_swap.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/collect.py b/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/collect.py
index 7bfc8b1ea..6e6a706b0 100644
--- a/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/collect.py
+++ b/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/collect.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/mint_objkt.py b/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/mint_objkt.py
index 9f0e6f87f..9b5abbd35 100644
--- a/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/mint_objkt.py
+++ b/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/mint_objkt.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/swap.py b/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/swap.py
index 5566eade4..39b4c471e 100644
--- a/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/swap.py
+++ b/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_parameters/swap.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_storage.py b/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_storage.py
index 11423523a..a2611d842 100644
--- a/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_storage.py
+++ b/src/demo_tezos_nft_marketplace/types/hen_minter/tezos_storage.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_nft_marketplace/types/hen_objkts/tezos_parameters/mint.py b/src/demo_tezos_nft_marketplace/types/hen_objkts/tezos_parameters/mint.py
index 070dcb5e3..8c1c2b449 100644
--- a/src/demo_tezos_nft_marketplace/types/hen_objkts/tezos_parameters/mint.py
+++ b/src/demo_tezos_nft_marketplace/types/hen_objkts/tezos_parameters/mint.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_nft_marketplace/types/hen_objkts/tezos_storage.py b/src/demo_tezos_nft_marketplace/types/hen_objkts/tezos_storage.py
index 7c4504e71..850645268 100644
--- a/src/demo_tezos_nft_marketplace/types/hen_objkts/tezos_storage.py
+++ b/src/demo_tezos_nft_marketplace/types/hen_objkts/tezos_storage.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_raw/Makefile b/src/demo_tezos_raw/Makefile
index bc7b6a623..0a1a121b1 100644
--- a/src/demo_tezos_raw/Makefile
+++ b/src/demo_tezos_raw/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_raw/pyproject.toml b/src/demo_tezos_raw/pyproject.toml
index f7fd5196c..4f74c0081 100644
--- a/src/demo_tezos_raw/pyproject.toml
+++ b/src/demo_tezos_raw/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_raw"
version = "0.0.1"
diff --git a/src/demo_tezos_token/Makefile b/src/demo_tezos_token/Makefile
index 587b3eddd..041c2e51a 100644
--- a/src/demo_tezos_token/Makefile
+++ b/src/demo_tezos_token/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_token/pyproject.toml b/src/demo_tezos_token/pyproject.toml
index 9d33f1300..d797cceae 100644
--- a/src/demo_tezos_token/pyproject.toml
+++ b/src/demo_tezos_token/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_token"
version = "0.0.1"
diff --git a/src/demo_tezos_token/types/tzbtc/tezos_parameters/mint.py b/src/demo_tezos_token/types/tzbtc/tezos_parameters/mint.py
index a7c6895f2..9efb44476 100644
--- a/src/demo_tezos_token/types/tzbtc/tezos_parameters/mint.py
+++ b/src/demo_tezos_token/types/tzbtc/tezos_parameters/mint.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_token/types/tzbtc/tezos_parameters/transfer.py b/src/demo_tezos_token/types/tzbtc/tezos_parameters/transfer.py
index 335793b2b..7f226caad 100644
--- a/src/demo_tezos_token/types/tzbtc/tezos_parameters/transfer.py
+++ b/src/demo_tezos_token/types/tzbtc/tezos_parameters/transfer.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_token/types/tzbtc/tezos_storage.py b/src/demo_tezos_token/types/tzbtc/tezos_storage.py
index 5b04090ac..00c2bdd38 100644
--- a/src/demo_tezos_token/types/tzbtc/tezos_storage.py
+++ b/src/demo_tezos_token/types/tzbtc/tezos_storage.py
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
from __future__ import annotations
diff --git a/src/demo_tezos_token_balances/Makefile b/src/demo_tezos_token_balances/Makefile
index 5e9adc07a..431fa477e 100644
--- a/src/demo_tezos_token_balances/Makefile
+++ b/src/demo_tezos_token_balances/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_token_balances/pyproject.toml b/src/demo_tezos_token_balances/pyproject.toml
index 3bae6847a..c1d466793 100644
--- a/src/demo_tezos_token_balances/pyproject.toml
+++ b/src/demo_tezos_token_balances/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_token_balances"
version = "0.0.1"
diff --git a/src/demo_tezos_token_transfers/Makefile b/src/demo_tezos_token_transfers/Makefile
index 209b5aef1..723231514 100644
--- a/src/demo_tezos_token_transfers/Makefile
+++ b/src/demo_tezos_token_transfers/Makefile
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
.PHONY: $(MAKECMDGOALS)
MAKEFLAGS += --no-print-directory
##
diff --git a/src/demo_tezos_token_transfers/pyproject.toml b/src/demo_tezos_token_transfers/pyproject.toml
index 6d31a53e4..f671cde4e 100644
--- a/src/demo_tezos_token_transfers/pyproject.toml
+++ b/src/demo_tezos_token_transfers/pyproject.toml
@@ -1,4 +1,4 @@
-# generated by DipDup 8.3.1
+# generated by DipDup 8.3.2
[project]
name = "demo_tezos_token_transfers"
version = "0.0.1"
diff --git a/src/dipdup/api.py b/src/dipdup/api.py
index 214a0c5f1..1b13467cb 100644
--- a/src/dipdup/api.py
+++ b/src/dipdup/api.py
@@ -1,6 +1,5 @@
import functools
import logging
-import traceback
from collections.abc import Awaitable
from collections.abc import Callable
@@ -12,6 +11,7 @@
import dipdup.performance
from dipdup.context import DipDupContext
+from dipdup.exceptions import Error
_logger = logging.getLogger(__name__)
@@ -24,21 +24,24 @@ def _method_wrapper(
async def resolved_method(request: Request) -> Response:
try:
return await method(ctx, request)
+ except Error as e:
+ return Response(str(e), status_code=400)
except Exception as e:
- error_msg = f'ERROR: {e}\n'
- error_msg += ''.join(traceback.format_exception(type(e), e, e.__traceback__))
+ _logger.exception('Unhandled exception in API method')
return Response(str(e), status_code=500)
return resolved_method
async def _add_index(ctx: 'DipDupContext', request: Request) -> Response:
- await ctx.add_index(**request.query_params)
+ json = await request.json()
+ await ctx.add_index(**json)
return Response()
async def _add_contract(ctx: 'DipDupContext', request: Request) -> Response:
- await ctx.add_contract(**request.query_params)
+ json = await request.json()
+ await ctx.add_contract(**json)
return Response()
@@ -65,5 +68,7 @@ async def create_api(ctx: DipDupContext) -> Starlette:
Route('/add_contract', _method_wrapper(ctx, _add_contract), methods=['POST']),
Route('/config', _method_wrapper(ctx, _config), methods=['GET']),
]
-
- return Starlette(routes=routes)
+ return Starlette(
+ debug=True,
+ routes=routes,
+ )
diff --git a/src/dipdup/cli.py b/src/dipdup/cli.py
index a0b912a82..56b81fe6b 100644
--- a/src/dipdup/cli.py
+++ b/src/dipdup/cli.py
@@ -34,7 +34,7 @@
'config', # this one too
}
-# NOTE: Click commands from `aerich` we use as is for database migration
+# NOTE: Click commands from `aerich` we use as is for database migration
AERICH_CMDS = {
'history',
'heads',
@@ -634,17 +634,21 @@ async def handle_sse(request: Any) -> None:
logging.getLogger('uvicorn').setLevel(logging.INFO)
logging.getLogger('mcp').setLevel(logging.INFO)
- async with AsyncExitStack() as stack:
- # NOTE: Create, but doesn't initialize (no WS loop)
- await dipdup._create_datasources()
- await dipdup._set_up_database(stack)
+ async def wrapper() -> None:
+ async with AsyncExitStack() as stack:
+ # NOTE: Create, but don't initialize (no WS loop)
+ await dipdup._create_datasources()
+ await dipdup._set_up_database(stack)
+
+ # NOTE: Not available in `ctx.datasources`, but directly as `ctx.api`
+ await stack.enter_async_context(api_datasource)
- # NOTE: Not available in `ctx.datasources`, but directly as `ctx.api`
- await stack.enter_async_context(api_datasource)
+ await server.serve()
- # NOTE: Run MCP in a separate thread to avoid blocking the DB connection
- portal = stack.enter_context(from_thread.start_blocking_portal())
- portal.call(server.serve)
+ # NOTE: Run MCP in a separate thread to avoid blocking the DB connection
+ # FIXME: SIGINT ignored
+ with from_thread.start_blocking_portal() as portal:
+ portal.call(wrapper)
@hasura.command(name='configure')
diff --git a/src/dipdup/context.py b/src/dipdup/context.py
index 64ad6e55c..8fe19ec3c 100644
--- a/src/dipdup/context.py
+++ b/src/dipdup/context.py
@@ -974,14 +974,29 @@ async def call_api(
path: str,
params: dict[str, Any] | None = None,
) -> str:
- _logger.info('Calling API: %s %s', method, path)
+ from mcp.shared.exceptions import McpError
+ from mcp.types import ErrorData
+ _logger.info('Calling API: %s %s', method, path)
res = await self.api.request(
method=method,
url=path.lstrip('/'),
json={k: v for k, v in (params or {}).items() if v is not None},
raw=True,
)
- if res.status != 200:
- return f'ERROR: {res.status} {res.reason}'
- return await res.text() # type: ignore[no-any-return]
+ if res.status == 200:
+ return await res.text() # type: ignore[no-any-return]
+
+ raise McpError(
+ ErrorData(
+ code=res.status,
+ message=await res.text(),
+ data=str(
+ {
+ 'method': method,
+ 'path': path,
+ 'params': params,
+ }
+ ),
+ )
+ )
diff --git a/src/dipdup/dipdup.py b/src/dipdup/dipdup.py
index 1b850a751..34182bbf0 100644
--- a/src/dipdup/dipdup.py
+++ b/src/dipdup/dipdup.py
@@ -197,7 +197,7 @@ def is_oneshot(self) -> bool:
from dipdup.config.tezos_head import TezosHeadIndexConfig
# NOTE: Empty config means indexes will be spawned later via API.
- if not self._indexes:
+ if not self._indexes or self._ctx.config.api:
return False
if not self._ctx._pending_indexes.empty():
@@ -861,7 +861,6 @@ async def _set_up_api(self, stack: AsyncExitStack) -> None:
)
import uvicorn
- from anyio import from_thread
from dipdup.api import create_api
@@ -878,9 +877,13 @@ async def _set_up_api(self, stack: AsyncExitStack) -> None:
@asynccontextmanager
async def _api_wrapper() -> AsyncIterator[None]:
- with from_thread.start_blocking_portal() as portal:
- portal.start_task_soon(server.serve)
+ with suppress(KeyboardInterrupt, CancelledError):
+ api_task = create_task(
+ server.serve(),
+ name='api:server',
+ )
yield
+ api_task.cancel()
await stack.enter_async_context(_api_wrapper())
diff --git a/src/dipdup/mcp.py b/src/dipdup/mcp.py
index d7017988e..52c3df391 100644
--- a/src/dipdup/mcp.py
+++ b/src/dipdup/mcp.py
@@ -20,7 +20,6 @@
_logger = logging.getLogger(__name__)
-_ctx: McpContext | None = None
import mcp.server
import mcp.types as types
@@ -29,6 +28,24 @@
from collections.abc import Iterable
+# NOTE: Global context management
+_ctx: McpContext | None = None
+
+
+def get_ctx() -> McpContext:
+ global _ctx
+ if _ctx is None:
+ raise FrameworkException('DipDup MCP context is not initialized')
+ return _ctx
+
+
+def set_ctx(ctx: McpContext) -> None:
+ global _ctx
+ if _ctx is not None:
+ raise FrameworkException('DipDup MCP context is already initialized')
+ _ctx = ctx
+
+
# NOTE: Resource and tool callbacks
@@ -89,7 +106,7 @@ async def _tool_api_add_contract(
code_hash: str | int | None = None,
) -> str:
ctx = get_ctx()
- await ctx.call_api(
+ return await ctx.call_api(
method='post',
path='/add_contract',
params={
@@ -100,7 +117,6 @@ async def _tool_api_add_contract(
'code_hash': code_hash,
},
)
- return await _tool_api_config()
async def _tool_api_add_index(
@@ -111,7 +127,7 @@ async def _tool_api_add_index(
last_level: int | None = None,
) -> str:
ctx = get_ctx()
- await ctx.call_api(
+ return await ctx.call_api(
method='post',
path='/add_index',
params={
@@ -122,7 +138,6 @@ async def _tool_api_add_index(
'last_level': last_level,
},
)
- return await _tool_api_config()
# NOTE: Built-in tools and resources
@@ -163,22 +178,6 @@ async def _tool_api_add_index(
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')
@@ -213,6 +212,9 @@ async def list_resource_templates() -> list[types.ResourceTemplate]:
@server.call_tool() # type: ignore[no-untyped-call,misc]
async def call_tool(name: str, arguments: dict[str, Any]) -> list[types.TextContent]:
+ from mcp.shared.exceptions import McpError
+ from mcp.types import ErrorData
+
if name in _user_tools_fn:
fn = _user_tools_fn[name]
elif name in DIPDUP_TOOLS_FN:
@@ -225,15 +227,21 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[types.TextCont
res = await fn(**arguments)
return [types.TextContent(type='text', text=res)]
except Exception as e:
- res = f'ERROR: {e}\n'
- res += ''.join(traceback.format_exception(type(e), e, e.__traceback__))
- _logger.error(res, exc_info=e)
-
- return [types.TextContent(type='text', text=res)]
+ _logger.exception('Error while calling tool `%s`', name)
+ raise McpError(
+ ErrorData(
+ code=-1,
+ message=str(e),
+ data=''.join(traceback.format_exception(type(e), e, e.__traceback__)),
+ )
+ ) from e
@server.read_resource() # type: ignore[no-untyped-call,misc]
async def read_resource(uri: AnyUrl) -> str:
+ from mcp.shared.exceptions import McpError
+ from mcp.types import ErrorData
+
if uri.scheme != 'dipdup':
raise ValueError(f'Invalid scheme: {uri.scheme}')
@@ -253,10 +261,14 @@ async def read_resource(uri: AnyUrl) -> str:
# FIXME: mimeType is always `text/plain`
return json_dumps(res, None).decode()
except Exception as e:
- error_msg = f'ERROR: {e}\n'
- error_msg += ''.join(traceback.format_exception(type(e), e, e.__traceback__))
- _logger.error(error_msg, exc_info=e)
- return error_msg
+ _logger.exception('Error while calling tool `%s`', name)
+ raise McpError(
+ ErrorData(
+ code=-1,
+ message=str(e),
+ data=''.join(traceback.format_exception(type(e), e, e.__traceback__)),
+ )
+ ) from e
def tool(
diff --git a/tests/configs/asdf.yml b/tests/configs/asdf.yaml
similarity index 100%
rename from tests/configs/asdf.yml
rename to tests/configs/asdf.yaml
diff --git a/tests/configs/test_evm.yml b/tests/configs/common_evm.yaml
similarity index 100%
rename from tests/configs/test_evm.yml
rename to tests/configs/common_evm.yaml
diff --git a/tests/configs/test_postgres.yaml b/tests/configs/common_postgres.yaml
similarity index 100%
rename from tests/configs/test_postgres.yaml
rename to tests/configs/common_postgres.yaml
diff --git a/tests/configs/test_postgres_immune.yaml b/tests/configs/common_postgres_immune.yaml
similarity index 100%
rename from tests/configs/test_postgres_immune.yaml
rename to tests/configs/common_postgres_immune.yaml
diff --git a/tests/configs/test_sqlite.yaml b/tests/configs/common_sqlite.yaml
similarity index 100%
rename from tests/configs/test_sqlite.yaml
rename to tests/configs/common_sqlite.yaml
diff --git a/tests/configs/test_sqlite_immune.yaml b/tests/configs/common_sqlite_immune.yaml
similarity index 100%
rename from tests/configs/test_sqlite_immune.yaml
rename to tests/configs/common_sqlite_immune.yaml
diff --git a/tests/configs/common_starknet.yaml b/tests/configs/common_starknet.yaml
new file mode 100644
index 000000000..66001b750
--- /dev/null
+++ b/tests/configs/common_starknet.yaml
@@ -0,0 +1,7 @@
+datasources:
+ subsquid:
+ kind: starknet.subsquid
+ url: ${SUBSQUID_URL:-https://v2.archive.subsquid.io/network/starknet-mainnet}
+ node:
+ kind: starknet.node
+ url: ${NODE_URL:-https://starknet-mainnet.g.alchemy.com/v2}/${ALCHEMY_API_KEY:-''}
diff --git a/tests/configs/demo_substrate_events.yml b/tests/configs/common_substrate.yaml
similarity index 51%
rename from tests/configs/demo_substrate_events.yml
rename to tests/configs/common_substrate.yaml
index 63d921666..a9bdafff7 100644
--- a/tests/configs/demo_substrate_events.yml
+++ b/tests/configs/common_substrate.yaml
@@ -1,11 +1,3 @@
-spec_version: 3.0
-package: demo_substrate_events
-
-runtimes:
- assethub:
- kind: substrate
- type_registry: statemint
-
datasources:
subsquid:
kind: substrate.subsquid
@@ -17,17 +9,3 @@ datasources:
kind: substrate.node
url: https://statemint.api.onfinality.io/rpc?apikey=${ONFINALITY_API_KEY:-''}
ws_url: wss://statemint.api.onfinality.io/ws?apikey=${ONFINALITY_API_KEY:-''}
-
-indexes:
- assethub_transfers:
- kind: substrate.events
- runtime: assethub
- datasources:
- - subsquid
- - subscan
- - node
- handlers:
- - callback: on_transfer
- name: Assets.Transferred
- first_level: 7836000
- last_level: 7836100
diff --git a/tests/configs/common_tezos.yaml b/tests/configs/common_tezos.yaml
new file mode 100644
index 000000000..cc96e496e
--- /dev/null
+++ b/tests/configs/common_tezos.yaml
@@ -0,0 +1,2 @@
+# NOTE: Do not refactor test Tezos configs! This file is a placeholder.
+{}
diff --git a/tests/configs/demo_evm_events.yml b/tests/configs/demo_evm_events.yaml
similarity index 100%
rename from tests/configs/demo_evm_events.yml
rename to tests/configs/demo_evm_events.yaml
diff --git a/tests/configs/demo_evm_events_node.yml b/tests/configs/demo_evm_events_node.yaml
similarity index 100%
rename from tests/configs/demo_evm_events_node.yml
rename to tests/configs/demo_evm_events_node.yaml
diff --git a/tests/configs/demo_evm_transactions.yml b/tests/configs/demo_evm_transactions.yaml
similarity index 100%
rename from tests/configs/demo_evm_transactions.yml
rename to tests/configs/demo_evm_transactions.yaml
diff --git a/tests/configs/demo_evm_transactions_node.yml b/tests/configs/demo_evm_transactions_node.yaml
similarity index 100%
rename from tests/configs/demo_evm_transactions_node.yml
rename to tests/configs/demo_evm_transactions_node.yaml
diff --git a/tests/configs/demo_starknet_events.yml b/tests/configs/demo_starknet_events.yaml
similarity index 63%
rename from tests/configs/demo_starknet_events.yml
rename to tests/configs/demo_starknet_events.yaml
index 4164d2507..4c0833f99 100644
--- a/tests/configs/demo_starknet_events.yml
+++ b/tests/configs/demo_starknet_events.yaml
@@ -1,14 +1,6 @@
spec_version: 3.0
package: demo_starknet_events
-datasources:
- subsquid:
- kind: starknet.subsquid
- url: ${SUBSQUID_URL:-https://v2.archive.subsquid.io/network/starknet-mainnet}
- node:
- kind: starknet.node
- url: ${NODE_URL:-https://starknet-mainnet.g.alchemy.com/v2}/${ALCHEMY_API_KEY:-''}
-
contracts:
stark_usdt:
kind: starknet
diff --git a/tests/configs/demo_substrate_events.yaml b/tests/configs/demo_substrate_events.yaml
new file mode 100644
index 000000000..e51665621
--- /dev/null
+++ b/tests/configs/demo_substrate_events.yaml
@@ -0,0 +1,21 @@
+spec_version: 3.0
+package: demo_substrate_events
+
+runtimes:
+ assethub:
+ kind: substrate
+ type_registry: statemint
+
+indexes:
+ assethub_transfers:
+ kind: substrate.events
+ runtime: assethub
+ datasources:
+ - subsquid
+ - subscan
+ - node
+ handlers:
+ - callback: on_transfer
+ name: Assets.Transferred
+ first_level: 7836000
+ last_level: 7836100
diff --git a/tests/configs/demo_tezos_auction.yml b/tests/configs/demo_tezos_auction.yaml
similarity index 100%
rename from tests/configs/demo_tezos_auction.yml
rename to tests/configs/demo_tezos_auction.yaml
diff --git a/tests/configs/demo_tezos_dao.yml b/tests/configs/demo_tezos_dao.yaml
similarity index 100%
rename from tests/configs/demo_tezos_dao.yml
rename to tests/configs/demo_tezos_dao.yaml
diff --git a/tests/configs/demo_tezos_dex.yml b/tests/configs/demo_tezos_dex.yaml
similarity index 100%
rename from tests/configs/demo_tezos_dex.yml
rename to tests/configs/demo_tezos_dex.yaml
diff --git a/tests/configs/demo_tezos_domains.yml b/tests/configs/demo_tezos_domains.yaml
similarity index 100%
rename from tests/configs/demo_tezos_domains.yml
rename to tests/configs/demo_tezos_domains.yaml
diff --git a/tests/configs/demo_tezos_events.yml b/tests/configs/demo_tezos_events.yaml
similarity index 100%
rename from tests/configs/demo_tezos_events.yml
rename to tests/configs/demo_tezos_events.yaml
diff --git a/tests/configs/demo_tezos_factories.yml b/tests/configs/demo_tezos_factories.yaml
similarity index 100%
rename from tests/configs/demo_tezos_factories.yml
rename to tests/configs/demo_tezos_factories.yaml
diff --git a/tests/configs/demo_tezos_nft_marketplace.yml b/tests/configs/demo_tezos_nft_marketplace.yaml
similarity index 100%
rename from tests/configs/demo_tezos_nft_marketplace.yml
rename to tests/configs/demo_tezos_nft_marketplace.yaml
diff --git a/tests/configs/demo_tezos_raw.yml b/tests/configs/demo_tezos_raw.yaml
similarity index 100%
rename from tests/configs/demo_tezos_raw.yml
rename to tests/configs/demo_tezos_raw.yaml
diff --git a/tests/configs/demo_tezos_token.yml b/tests/configs/demo_tezos_token.yaml
similarity index 100%
rename from tests/configs/demo_tezos_token.yml
rename to tests/configs/demo_tezos_token.yaml
diff --git a/tests/configs/demo_tezos_token_balances.yml b/tests/configs/demo_tezos_token_balances.yaml
similarity index 100%
rename from tests/configs/demo_tezos_token_balances.yml
rename to tests/configs/demo_tezos_token_balances.yaml
diff --git a/tests/configs/demo_tezos_token_transfers.yml b/tests/configs/demo_tezos_token_transfers.yaml
similarity index 100%
rename from tests/configs/demo_tezos_token_transfers.yml
rename to tests/configs/demo_tezos_token_transfers.yaml
diff --git a/tests/configs/demo_tezos_token_transfers_2.yml b/tests/configs/demo_tezos_token_transfers_2.yaml
similarity index 100%
rename from tests/configs/demo_tezos_token_transfers_2.yml
rename to tests/configs/demo_tezos_token_transfers_2.yaml
diff --git a/tests/configs/demo_tezos_token_transfers_3.yml b/tests/configs/demo_tezos_token_transfers_3.yaml
similarity index 100%
rename from tests/configs/demo_tezos_token_transfers_3.yml
rename to tests/configs/demo_tezos_token_transfers_3.yaml
diff --git a/tests/configs/demo_tezos_token_transfers_4.yml b/tests/configs/demo_tezos_token_transfers_4.yaml
similarity index 100%
rename from tests/configs/demo_tezos_token_transfers_4.yml
rename to tests/configs/demo_tezos_token_transfers_4.yaml
diff --git a/tests/configs/dipdup.yml b/tests/configs/dipdup.yaml
similarity index 100%
rename from tests/configs/dipdup.yml
rename to tests/configs/dipdup.yaml
diff --git a/tests/configs/hen_subjkt.yml b/tests/configs/hen_subjkt.yaml
similarity index 100%
rename from tests/configs/hen_subjkt.yml
rename to tests/configs/hen_subjkt.yaml
diff --git a/tests/configs/hjkl.yml b/tests/configs/hjkl.yaml
similarity index 100%
rename from tests/configs/hjkl.yml
rename to tests/configs/hjkl.yaml
diff --git a/tests/configs/kolibri_ovens.yml b/tests/configs/kolibri_ovens.yaml
similarity index 100%
rename from tests/configs/kolibri_ovens.yml
rename to tests/configs/kolibri_ovens.yaml
diff --git a/tests/configs/operation_filters.yml b/tests/configs/operation_filters.yaml
similarity index 100%
rename from tests/configs/operation_filters.yml
rename to tests/configs/operation_filters.yaml
diff --git a/tests/configs/qwer.yml b/tests/configs/qwer.yaml
similarity index 100%
rename from tests/configs/qwer.yml
rename to tests/configs/qwer.yaml
diff --git a/tests/configs/rewq.yml b/tests/configs/rewq.yaml
similarity index 100%
rename from tests/configs/rewq.yml
rename to tests/configs/rewq.yaml
diff --git a/tests/configs/yupana.yml b/tests/configs/yupana.yaml
similarity index 100%
rename from tests/configs/yupana.yml
rename to tests/configs/yupana.yaml
diff --git a/tests/configs/zxcv.yml b/tests/configs/zxcv.yaml
similarity index 100%
rename from tests/configs/zxcv.yml
rename to tests/configs/zxcv.yaml
diff --git a/tests/test_config/test_config.py b/tests/test_config/test_config.py
index d5d645138..21ba16eb3 100644
--- a/tests/test_config/test_config.py
+++ b/tests/test_config/test_config.py
@@ -24,7 +24,7 @@
TEST_CONFIGS = Path(__file__).parent.parent / 'configs'
-@pytest.fixture(params=Path.glob(TEST_CONFIGS, 'demo_*.yml'))
+@pytest.fixture(params=Path.glob(TEST_CONFIGS, 'demo_*.yaml'))
def test_dipdup_config(request: SubRequest) -> Generator[Path, None, None]:
yield request.param
@@ -102,10 +102,10 @@ async def test_reserved_keywords() -> None:
)
# FIXME: Can't use `from_` field alias in dataclasses
- raw_config, _ = DipDupYAMLConfig.load(paths=[TEST_CONFIGS / 'demo_tezos_token_transfers_4.yml'])
+ raw_config, _ = DipDupYAMLConfig.load(paths=[TEST_CONFIGS / 'demo_tezos_token_transfers_4.yaml'])
assert raw_config['indexes']['tzbtc_holders_mainnet']['handlers'][1]['from_'] == 'tzbtc_mainnet'
- config = DipDupConfig.load([TEST_CONFIGS / 'demo_tezos_token_transfers_4.yml'])
+ config = DipDupConfig.load([TEST_CONFIGS / 'demo_tezos_token_transfers_4.yaml'])
assert config.indexes['tzbtc_holders_mainnet'].handlers[1].from_ == 'tzbtc_mainnet' # type: ignore[misc,union-attr]
diff --git a/tests/test_config/test_custom_config.py b/tests/test_config/test_custom_config.py
index ceaad3acc..d7a86d9e9 100644
--- a/tests/test_config/test_custom_config.py
+++ b/tests/test_config/test_custom_config.py
@@ -20,11 +20,11 @@
class TestCustomConfig:
@pytest.fixture(scope='session')
def dummy_config_path(self) -> Path:
- return Path(__file__).parent.parent / 'configs' / 'dipdup.yml'
+ return Path(__file__).parent.parent / 'configs' / 'dipdup.yaml'
@staticmethod
def appended_config_path(dummy_config_path: str, tmp_path_factory: TempPathFactory, append_raw: str) -> str:
- config_file = tmp_path_factory.mktemp('config') / 'dipdup.yml'
+ config_file = tmp_path_factory.mktemp('config') / 'dipdup.yaml'
config_raw = Path(dummy_config_path).read_text()
config_file.write_text(config_raw + append_raw)
diff --git a/tests/test_demos.py b/tests/test_demos.py
index 4a89a28ca..9745ed099 100644
--- a/tests/test_demos.py
+++ b/tests/test_demos.py
@@ -188,76 +188,76 @@ async def assert_run_etherlink() -> None:
test_args = ('config', 'package', 'cmd', 'assert_fn')
test_params = (
# NOTE: Tezos
- ('demo_tezos_auction.yml', 'demo_tezos_auction', 'run', assert_run_auction),
- ('demo_tezos_auction.yml', 'demo_tezos_auction', 'init', None),
- ('demo_tezos_dao.yml', 'demo_tezos_dao', 'run', assert_run_dao),
- ('demo_tezos_dao.yml', 'demo_tezos_dao', 'init', None),
- ('demo_tezos_dex.yml', 'demo_tezos_dex', 'run', assert_run_dex),
- ('demo_tezos_dex.yml', 'demo_tezos_dex', 'init', None),
+ ('demo_tezos_auction', 'demo_tezos_auction', 'run', assert_run_auction),
+ ('demo_tezos_auction', 'demo_tezos_auction', 'init', None),
+ ('demo_tezos_dao', 'demo_tezos_dao', 'run', assert_run_dao),
+ ('demo_tezos_dao', 'demo_tezos_dao', 'init', None),
+ ('demo_tezos_dex', 'demo_tezos_dex', 'run', assert_run_dex),
+ ('demo_tezos_dex', 'demo_tezos_dex', 'init', None),
# FIXME: Mystery of the century! F821 Undefined name `BigMapDiff` in GHA. Probably cache related.
- # ('demo_tezos_domains.yml', 'demo_tezos_domains', 'run', assert_run_domains),
- # ('demo_tezos_domains.yml', 'demo_tezos_domains', 'init', None),
- ('demo_tezos_etherlink.yml', 'demo_tezos_etherlink', 'run', assert_run_etherlink),
- ('demo_tezos_etherlink.yml', 'demo_tezos_etherlink', 'init', None),
- ('demo_tezos_events.yml', 'demo_tezos_events', 'run', assert_run_events),
- ('demo_tezos_events.yml', 'demo_tezos_events', 'init', None),
- ('demo_tezos_factories.yml', 'demo_tezos_factories', 'run', assert_run_factories),
- ('demo_tezos_factories.yml', 'demo_tezos_factories', 'init', None),
- ('demo_tezos_nft_marketplace.yml', 'demo_tezos_nft_marketplace', 'run', assert_run_nft_marketplace),
- ('demo_tezos_nft_marketplace.yml', 'demo_tezos_nft_marketplace', 'init', None),
+ # ('demo_tezos_domains', 'demo_tezos_domains', 'run', assert_run_domains),
+ # ('demo_tezos_domains', 'demo_tezos_domains', 'init', None),
+ ('demo_tezos_etherlink', 'demo_tezos_etherlink', 'run', assert_run_etherlink),
+ ('demo_tezos_etherlink', 'demo_tezos_etherlink', 'init', None),
+ ('demo_tezos_events', 'demo_tezos_events', 'run', assert_run_events),
+ ('demo_tezos_events', 'demo_tezos_events', 'init', None),
+ ('demo_tezos_factories', 'demo_tezos_factories', 'run', assert_run_factories),
+ ('demo_tezos_factories', 'demo_tezos_factories', 'init', None),
+ ('demo_tezos_nft_marketplace', 'demo_tezos_nft_marketplace', 'run', assert_run_nft_marketplace),
+ ('demo_tezos_nft_marketplace', 'demo_tezos_nft_marketplace', 'init', None),
(
- 'demo_tezos_token_transfers.yml',
+ 'demo_tezos_token_transfers',
'demo_tezos_token_transfers',
'run',
partial(assert_run_token_transfers, 4, '-0.01912431'),
),
- ('demo_tezos_raw.yml', 'demo_tezos_raw', 'run', assert_run_raw),
- ('demo_tezos_raw.yml', 'demo_tezos_raw', 'init', None),
- ('demo_tezos_token.yml', 'demo_tezos_token', 'run', assert_run_token),
- ('demo_tezos_token.yml', 'demo_tezos_token', 'init', None),
- ('demo_tezos_token_balances.yml', 'demo_tezos_token_balances', 'run', assert_run_balances),
- ('demo_tezos_token_balances.yml', 'demo_tezos_token_balances', 'init', None),
+ ('demo_tezos_raw', 'demo_tezos_raw', 'run', assert_run_raw),
+ ('demo_tezos_raw', 'demo_tezos_raw', 'init', None),
+ ('demo_tezos_token', 'demo_tezos_token', 'run', assert_run_token),
+ ('demo_tezos_token', 'demo_tezos_token', 'init', None),
+ ('demo_tezos_token_balances', 'demo_tezos_token_balances', 'run', assert_run_balances),
+ ('demo_tezos_token_balances', 'demo_tezos_token_balances', 'init', None),
# TODO: Too many token transfer runs
- ('demo_tezos_token_transfers.yml', 'demo_tezos_token_transfers', 'init', None),
+ ('demo_tezos_token_transfers', 'demo_tezos_token_transfers', 'init', None),
(
- 'demo_tezos_token_transfers_2.yml',
+ 'demo_tezos_token_transfers_2',
'demo_tezos_token_transfers',
'run',
partial(assert_run_token_transfers, 12, '0.26554711'),
),
(
- 'demo_tezos_token_transfers_3.yml',
+ 'demo_tezos_token_transfers_3',
'demo_tezos_token_transfers',
'run',
partial(assert_run_token_transfers, 9, '0.15579888'),
),
# FIXME: Reenable after fixing fetcher
# (
- # 'demo_tezos_token_transfers_4.yml',
+ # 'demo_tezos_token_transfers_4',
# 'demo_tezos_token_transfers',
# 'run',
# partial(assert_run_token_transfers, 2, '-0.02302128'),
# ),
# NOTE: EVM indexes
- ('demo_evm_events.yml:test_evm.yml', 'demo_evm_events', 'run', assert_run_evm_events),
- ('demo_evm_events.yml:test_evm.yml', 'demo_evm_events', 'init', None),
- ('demo_evm_transactions.yml:test_evm.yml', 'demo_evm_transactions', 'run', assert_run_evm_transactions),
- ('demo_evm_transactions.yml:test_evm.yml', 'demo_evm_transactions', 'init', None),
+ ('demo_evm_events', 'demo_evm_events', 'run', assert_run_evm_events),
+ ('demo_evm_events', 'demo_evm_events', 'init', None),
+ ('demo_evm_transactions', 'demo_evm_transactions', 'run', assert_run_evm_transactions),
+ ('demo_evm_transactions', 'demo_evm_transactions', 'init', None),
# NOTE: EVM indexes with node only
- ('demo_evm_events_node.yml:test_evm.yml', 'demo_evm_events', 'run', assert_run_evm_events),
- ('demo_evm_transactions_node.yml:test_evm.yml', 'demo_evm_transactions', 'run', assert_run_evm_transactions),
+ ('demo_evm_events_node', 'demo_evm_events', 'run', assert_run_evm_events),
+ ('demo_evm_transactions_node', 'demo_evm_transactions', 'run', assert_run_evm_transactions),
# NOTE: Starknet indexes
- ('demo_starknet_events.yml', 'demo_starknet_events', 'run', assert_run_starknet_events),
- ('demo_starknet_events.yml', 'demo_starknet_events', 'init', None),
+ ('demo_starknet_events', 'demo_starknet_events', 'run', assert_run_starknet_events),
+ ('demo_starknet_events', 'demo_starknet_events', 'init', None),
# NOTE: Substrate indexes
- ('demo_substrate_events.yml', 'demo_substrate_events', 'run', assert_run_substrate_events),
- ('demo_substrate_events.yml', 'demo_substrate_events', 'init', None),
+ ('demo_substrate_events', 'demo_substrate_events', 'run', assert_run_substrate_events),
+ ('demo_substrate_events', 'demo_substrate_events', 'init', None),
# NOTE: Smoke tests for small tools
- ('demo_tezos_dex.yml', 'demo_tezos_dex', ('config', 'env', '--compose', '--internal'), None),
- ('demo_tezos_dex.yml', 'demo_tezos_dex', ('config', 'export', '--full'), None),
- ('demo_tezos_dex.yml', 'demo_tezos_dex', ('package', 'tree'), None),
- ('demo_tezos_dex.yml', 'demo_tezos_dex', ('report', 'ls'), None),
- ('demo_tezos_dex.yml', 'demo_tezos_dex', ('schema', 'export'), None),
+ ('demo_tezos_dex', 'demo_tezos_dex', ('config', 'env', '--compose', '--internal'), None),
+ ('demo_tezos_dex', 'demo_tezos_dex', ('config', 'export', '--full'), None),
+ ('demo_tezos_dex', 'demo_tezos_dex', ('package', 'tree'), None),
+ ('demo_tezos_dex', 'demo_tezos_dex', ('report', 'ls'), None),
+ ('demo_tezos_dex', 'demo_tezos_dex', ('schema', 'export'), None),
)
@@ -269,9 +269,20 @@ async def test_run_init(
assert_fn: Callable[[], Awaitable[None]] | None,
) -> None:
config_paths = []
- for path in config.split(':'):
- config_paths.append(TEST_CONFIGS / path)
- config_paths.append(TEST_CONFIGS / 'test_sqlite.yaml')
+ config_paths.append(TEST_CONFIGS / f'{config}.yaml')
+
+ if 'evm_' in config:
+ config_paths.append(TEST_CONFIGS / 'common_evm.yaml')
+ elif 'starknet_' in config:
+ config_paths.append(TEST_CONFIGS / 'common_starknet.yaml')
+ elif 'substrate_' in config:
+ config_paths.append(TEST_CONFIGS / 'common_substrate.yaml')
+ elif 'tezos_' in config:
+ config_paths.append(TEST_CONFIGS / 'common_tezos.yaml')
+ else:
+ raise NotImplementedError
+
+ config_paths.append(TEST_CONFIGS / 'common_sqlite.yaml')
if 'evm' in config and not {'ALCHEMY_API_KEY', 'ETHERSCAN_API_KEY'} <= set(os.environ):
pytest.skip('EVM tests require ALCHEMY_API_KEY and ETHERSCAN_API_KEY environment variables')
diff --git a/tests/test_dipdup.py b/tests/test_dipdup.py
index 39bb33b96..7c1ea22df 100644
--- a/tests/test_dipdup.py
+++ b/tests/test_dipdup.py
@@ -31,7 +31,7 @@ async def _create_index(hash_: str) -> None:
class IndexStateTest:
def __init__(self) -> None:
- name = 'demo_tezos_nft_marketplace.yml'
+ name = 'demo_tezos_nft_marketplace.yaml'
config_path = Path(__file__).parent / 'configs' / name
self.config = DipDupConfig.load([config_path])
self.config.database = SqliteDatabaseConfig(kind='sqlite')
diff --git a/tests/test_hasura.py b/tests/test_hasura.py
index bd70d112b..acaf66bc5 100644
--- a/tests/test_hasura.py
+++ b/tests/test_hasura.py
@@ -30,7 +30,7 @@ async def test_configure_hasura() -> None:
if os.uname().sysname != 'Linux' or 'microsoft' in os.uname().release: # check for WSL, Windows, mac and else
pytest.skip('Test is not supported for os archetecture', allow_module_level=True)
- config_path = Path(__file__).parent / 'configs' / 'demo_tezos_nft_marketplace.yml'
+ config_path = Path(__file__).parent / 'configs' / 'demo_tezos_nft_marketplace.yaml'
config = DipDupConfig.load([config_path])
config.database = await run_postgres_container()
diff --git a/tests/test_index/test_tzkt_operations.py b/tests/test_index/test_tzkt_operations.py
index 8e6125744..e208c002c 100644
--- a/tests/test_index/test_tzkt_operations.py
+++ b/tests/test_index/test_tzkt_operations.py
@@ -31,7 +31,7 @@ async def tzkt() -> AsyncIterator[TezosTzktDatasource]:
@pytest.fixture
def index_config() -> TezosOperationsIndexConfig:
- config = DipDupConfig.load([TEST_CONFIGS / 'operation_filters.yml'], True)
+ config = DipDupConfig.load([TEST_CONFIGS / 'operation_filters.yaml'], True)
config.initialize()
return cast('TezosOperationsIndexConfig', config.indexes['test'])
@@ -124,7 +124,7 @@ async def test_get_transaction_filters(tzkt: TezosTzktDatasource, index_config:
async def test_get_sync_level() -> None:
- config = DipDupConfig.load([TEST_CONFIGS / 'demo_tezos_token.yml'], True)
+ config = DipDupConfig.load([TEST_CONFIGS / 'demo_tezos_token.yaml'], True)
async with AsyncExitStack() as stack:
dipdup = await create_dummy_dipdup(config, stack)
index = await spawn_index(dipdup, 'tzbtc_holders_mainnet')
@@ -149,7 +149,7 @@ async def test_get_sync_level() -> None:
async def test_realtime() -> None:
from demo_tezos_token import models
- config = DipDupConfig.load([TEST_CONFIGS / 'demo_tezos_token.yml'], True)
+ config = DipDupConfig.load([TEST_CONFIGS / 'demo_tezos_token.yaml'], True)
async with AsyncExitStack() as stack:
dipdup = await create_dummy_dipdup(config, stack)
await dipdup._set_up_datasources(stack)
diff --git a/tests/test_schema.py b/tests/test_schema.py
index c6354bd70..91e5c6a4a 100644
--- a/tests/test_schema.py
+++ b/tests/test_schema.py
@@ -23,8 +23,8 @@
async def test_schema_sqlite() -> None:
package = 'demo_tezos_domains'
- config_path = TEST_CONFIGS / f'{package}.yml'
- env_config_path = TEST_CONFIGS / 'test_sqlite.yaml'
+ config_path = TEST_CONFIGS / f'{package}.yaml'
+ env_config_path = TEST_CONFIGS / 'common_sqlite.yaml'
async with AsyncExitStack() as stack:
tmp_package_path, env = await stack.enter_async_context(
@@ -69,8 +69,8 @@ def tortoise() -> AbstractAsyncContextManager[None]:
async def test_schema_sqlite_immune() -> None:
package = 'demo_tezos_domains'
- config_path = TEST_CONFIGS / f'{package}.yml'
- env_config_path = TEST_CONFIGS / 'test_sqlite_immune.yaml'
+ config_path = TEST_CONFIGS / f'{package}.yaml'
+ env_config_path = TEST_CONFIGS / 'common_sqlite_immune.yaml'
async with AsyncExitStack() as stack:
tmp_package_path, env = await stack.enter_async_context(
@@ -115,8 +115,8 @@ def tortoise() -> AbstractAsyncContextManager[None]:
async def test_schema_postgres() -> None:
package = 'demo_tezos_domains'
- config_path = TEST_CONFIGS / f'{package}.yml'
- env_config_path = TEST_CONFIGS / 'test_postgres.yaml'
+ config_path = TEST_CONFIGS / f'{package}.yaml'
+ env_config_path = TEST_CONFIGS / 'common_postgres.yaml'
async with AsyncExitStack() as stack:
database_config = await run_postgres_container()
@@ -156,8 +156,8 @@ def tortoise() -> AbstractAsyncContextManager[None]:
async def test_schema_postgres_immune() -> None:
package = 'demo_tezos_domains'
- config_path = TEST_CONFIGS / f'{package}.yml'
- env_config_path = TEST_CONFIGS / 'test_postgres_immune.yaml'
+ config_path = TEST_CONFIGS / f'{package}.yaml'
+ env_config_path = TEST_CONFIGS / 'common_postgres_immune.yaml'
async with AsyncExitStack() as stack:
database_config = await run_postgres_container()
diff --git a/uv.lock b/uv.lock
index c0b38fe9d..753f08358 100644
--- a/uv.lock
+++ b/uv.lock
@@ -474,7 +474,7 @@ wheels = [
[[package]]
name = "dipdup"
-version = "8.3.1"
+version = "8.3.2"
source = { editable = "." }
dependencies = [
{ name = "aiohttp" },
@@ -814,15 +814,15 @@ wheels = [
[[package]]
name = "httpcore"
-version = "1.0.7"
+version = "1.0.8"
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 }
+sdist = { url = "https://files.pythonhosted.org/packages/9f/45/ad3e1b4d448f22c0cff4f5692f5ed0666658578e358b8d58a19846048059/httpcore-1.0.8.tar.gz", hash = "sha256:86e94505ed24ea06514883fd44d2bc02d90e77e7979c8eb71b90f41d364a1bad", size = 85385 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 },
+ { url = "https://files.pythonhosted.org/packages/18/8d/f052b1e336bb2c1fc7ed1aaed898aa570c0b61a09707b108979d9fc6e308/httpcore-1.0.8-py3-none-any.whl", hash = "sha256:5254cf149bcb5f75e9d1b2b9f729ea4a4b883d1ad7379fc632b727cec23674be", size = 78732 },
]
[[package]]
@@ -1080,26 +1080,28 @@ wheels = [
[[package]]
name = "multidict"
-version = "6.3.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/fa/2d/6e0d6771cadd5ad14d13193cc8326dc0b341cc1659c306cbfce7a5058fff/multidict-6.3.2.tar.gz", hash = "sha256:c1035eea471f759fa853dd6e76aaa1e389f93b3e1403093fa0fd3ab4db490678", size = 88060 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/83/ae/bd7518193b4374484c04ba0f6522d0572dc17fcd53d238deb3cb3643c858/multidict-6.3.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d1e0ba1ce1b8cc79117196642d95f4365e118eaf5fb85f57cdbcc5a25640b2a4", size = 62680 },
- { url = "https://files.pythonhosted.org/packages/59/e0/a0a9247c32f385ac4c1afefe9c3f2271fb8e235aad72332d42384c41b9cb/multidict-6.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:029bbd7d782251a78975214b78ee632672310f9233d49531fc93e8e99154af25", size = 37366 },
- { url = "https://files.pythonhosted.org/packages/c3/fa/8c23cdd4492d59bea0e762662285f2163766e69e5ea715fe6a03a8670660/multidict-6.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7db41e3b56817d9175264e5fe00192fbcb8e1265307a59f53dede86161b150e", size = 36103 },
- { url = "https://files.pythonhosted.org/packages/87/35/3bcc3616cb54d3a327b1d26dbec284c3eb7b179e8a78a6075852dbb51dac/multidict-6.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcab18e65cc555ac29981a581518c23311f2b1e72d8f658f9891590465383be", size = 248231 },
- { url = "https://files.pythonhosted.org/packages/b8/c3/17ddbfd6fc3eed9ab7326a43651e1a97da73f7acc69b78a7bb04b59c073d/multidict-6.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d50eff89aa4d145a5486b171a2177042d08ea5105f813027eb1050abe91839f", size = 259423 },
- { url = "https://files.pythonhosted.org/packages/1f/67/64b18180e8f559cc93efaaaac2fe0746b9c978560866b6fdd626d3237129/multidict-6.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:643e57b403d3e240045a3681f9e6a04d35a33eddc501b4cbbbdbc9c70122e7bc", size = 256204 },
- { url = "https://files.pythonhosted.org/packages/21/f6/e81a8e4817c2d32787b33ae58c72dc3fe08e0ba8e56e660a225df3cb8619/multidict-6.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d17b37b9715b30605b5bab1460569742d0c309e5c20079263b440f5d7746e7e", size = 249663 },
- { url = "https://files.pythonhosted.org/packages/3e/e8/44ca66758df031a8119483cf5385e2ff3b09b9c6df8f3396d626c325b553/multidict-6.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68acd51fa94e63312b8ddf84bfc9c3d3442fe1f9988bbe1b6c703043af8867fe", size = 232236 },
- { url = "https://files.pythonhosted.org/packages/93/76/d2faabbac582dc100a4d7ecf7d0ab8dd2aadf7f10d5d5a19e9932cf63a2e/multidict-6.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:347eea2852ab7f697cc5ed9b1aae96b08f8529cca0c6468f747f0781b1842898", size = 252638 },
- { url = "https://files.pythonhosted.org/packages/63/37/f5a6ea10dab96491b7300be940f86a5490dc474d18473c438f2550b78da3/multidict-6.3.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4d3f8e57027dcda84a1aa181501c15c45eab9566eb6fcc274cbd1e7561224f8", size = 247917 },
- { url = "https://files.pythonhosted.org/packages/d4/b1/2c32b684763b69becbaaa61b7af8a45a6f757fc82d9b4b123ca90cb69f75/multidict-6.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9ca57a841ffcf712e47875d026aa49d6e67f9560624d54b51628603700d5d287", size = 261754 },
- { url = "https://files.pythonhosted.org/packages/cd/f2/badedad94e1731debe56d076c9e61a1658c5e9d65dfa9c1ee74d1e3d31d7/multidict-6.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7cafdafb44c4e646118410368307693e49d19167e5f119cbe3a88697d2d1a636", size = 256389 },
- { url = "https://files.pythonhosted.org/packages/c6/3a/0a3488be2e5a6499f512e748d31e8fb90b753eb35793ecf390b9d8548e66/multidict-6.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:430120c6ce3715a9c6075cabcee557daccbcca8ba25a9fedf05c7bf564532f2d", size = 251902 },
- { url = "https://files.pythonhosted.org/packages/fe/44/62f76d0a5d836b96168f39a402a75dd3114d0df3cbb5669e0310034b71be/multidict-6.3.2-cp312-cp312-win32.whl", hash = "sha256:13bec31375235a68457ab887ce1bbf4f59d5810d838ae5d7e5b416242e1f3ed4", size = 35101 },
- { url = "https://files.pythonhosted.org/packages/8f/a4/7aaf2313e1766710010c35f9d738fd6309fb71a758f8c0e81853b90afb3d/multidict-6.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:c3b6d7620e6e90c6d97eaf3a63bf7fbd2ba253aab89120a4a9c660bf2d675391", size = 38479 },
- { url = "https://files.pythonhosted.org/packages/aa/c1/7832c95a50641148b567b5366dd3354489950dcfd01c8fc28472bec63b9a/multidict-6.3.2-py3-none-any.whl", hash = "sha256:71409d4579f716217f23be2f5e7afca5ca926aaeb398aa11b72d793bff637a1f", size = 10347 },
+version = "6.4.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019 },
+ { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925 },
+ { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008 },
+ { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374 },
+ { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869 },
+ { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949 },
+ { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032 },
+ { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517 },
+ { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291 },
+ { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982 },
+ { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823 },
+ { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714 },
+ { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739 },
+ { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809 },
+ { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934 },
+ { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242 },
+ { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635 },
+ { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400 },
]
[[package]]
@@ -1658,27 +1660,27 @@ wheels = [
[[package]]
name = "ruff"
-version = "0.11.4"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/e8/5b/3ae20f89777115944e89c2d8c2e795dcc5b9e04052f76d5347e35e0da66e/ruff-0.11.4.tar.gz", hash = "sha256:f45bd2fb1a56a5a85fae3b95add03fb185a0b30cf47f5edc92aa0355ca1d7407", size = 3933063 }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/9c/db/baee59ac88f57527fcbaad3a7b309994e42329c6bc4d4d2b681a3d7b5426/ruff-0.11.4-py3-none-linux_armv6l.whl", hash = "sha256:d9f4a761ecbde448a2d3e12fb398647c7f0bf526dbc354a643ec505965824ed2", size = 10106493 },
- { url = "https://files.pythonhosted.org/packages/c1/d6/9a0962cbb347f4ff98b33d699bf1193ff04ca93bed4b4222fd881b502154/ruff-0.11.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8c1747d903447d45ca3d40c794d1a56458c51e5cc1bc77b7b64bd2cf0b1626cc", size = 10876382 },
- { url = "https://files.pythonhosted.org/packages/3a/8f/62bab0c7d7e1ae3707b69b157701b41c1ccab8f83e8501734d12ea8a839f/ruff-0.11.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:51a6494209cacca79e121e9b244dc30d3414dac8cc5afb93f852173a2ecfc906", size = 10237050 },
- { url = "https://files.pythonhosted.org/packages/09/96/e296965ae9705af19c265d4d441958ed65c0c58fc4ec340c27cc9d2a1f5b/ruff-0.11.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f171605f65f4fc49c87f41b456e882cd0c89e4ac9d58e149a2b07930e1d466f", size = 10424984 },
- { url = "https://files.pythonhosted.org/packages/e5/56/644595eb57d855afed6e54b852e2df8cd5ca94c78043b2f29bdfb29882d5/ruff-0.11.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebf99ea9af918878e6ce42098981fc8c1db3850fef2f1ada69fb1dcdb0f8e79e", size = 9957438 },
- { url = "https://files.pythonhosted.org/packages/86/83/9d3f3bed0118aef3e871ded9e5687fb8c5776bde233427fd9ce0a45db2d4/ruff-0.11.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edad2eac42279df12e176564a23fc6f4aaeeb09abba840627780b1bb11a9d223", size = 11547282 },
- { url = "https://files.pythonhosted.org/packages/40/e6/0c6e4f5ae72fac5ccb44d72c0111f294a5c2c8cc5024afcb38e6bda5f4b3/ruff-0.11.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f103a848be9ff379fc19b5d656c1f911d0a0b4e3e0424f9532ececf319a4296e", size = 12182020 },
- { url = "https://files.pythonhosted.org/packages/b5/92/4aed0e460aeb1df5ea0c2fbe8d04f9725cccdb25d8da09a0d3f5b8764bf8/ruff-0.11.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:193e6fac6eb60cc97b9f728e953c21cc38a20077ed64f912e9d62b97487f3f2d", size = 11679154 },
- { url = "https://files.pythonhosted.org/packages/1b/d3/7316aa2609f2c592038e2543483eafbc62a0e1a6a6965178e284808c095c/ruff-0.11.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7af4e5f69b7c138be8dcffa5b4a061bf6ba6a3301f632a6bce25d45daff9bc99", size = 13905985 },
- { url = "https://files.pythonhosted.org/packages/63/80/734d3d17546e47ff99871f44ea7540ad2bbd7a480ed197fe8a1c8a261075/ruff-0.11.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:126b1bf13154aa18ae2d6c3c5efe144ec14b97c60844cfa6eb960c2a05188222", size = 11348343 },
- { url = "https://files.pythonhosted.org/packages/04/7b/70fc7f09a0161dce9613a4671d198f609e653d6f4ff9eee14d64c4c240fb/ruff-0.11.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8806daaf9dfa881a0ed603f8a0e364e4f11b6ed461b56cae2b1c0cab0645304", size = 10308487 },
- { url = "https://files.pythonhosted.org/packages/1a/22/1cdd62dabd678d75842bf4944fd889cf794dc9e58c18cc547f9eb28f95ed/ruff-0.11.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5d94bb1cc2fc94a769b0eb975344f1b1f3d294da1da9ddbb5a77665feb3a3019", size = 9929091 },
- { url = "https://files.pythonhosted.org/packages/9f/20/40e0563506332313148e783bbc1e4276d657962cc370657b2fff20e6e058/ruff-0.11.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:995071203d0fe2183fc7a268766fd7603afb9996785f086b0d76edee8755c896", size = 10924659 },
- { url = "https://files.pythonhosted.org/packages/b5/41/eef9b7aac8819d9e942f617f9db296f13d2c4576806d604aba8db5a753f1/ruff-0.11.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7a37ca937e307ea18156e775a6ac6e02f34b99e8c23fe63c1996185a4efe0751", size = 11428160 },
- { url = "https://files.pythonhosted.org/packages/ff/61/c488943414fb2b8754c02f3879de003e26efdd20f38167ded3fb3fc1cda3/ruff-0.11.4-py3-none-win32.whl", hash = "sha256:0e9365a7dff9b93af933dab8aebce53b72d8f815e131796268709890b4a83270", size = 10311496 },
- { url = "https://files.pythonhosted.org/packages/b6/2b/2a1c8deb5f5dfa3871eb7daa41492c4d2b2824a74d2b38e788617612a66d/ruff-0.11.4-py3-none-win_amd64.whl", hash = "sha256:5a9fa1c69c7815e39fcfb3646bbfd7f528fa8e2d4bebdcf4c2bd0fa037a255fb", size = 11399146 },
- { url = "https://files.pythonhosted.org/packages/4f/03/3aec4846226d54a37822e4c7ea39489e4abd6f88388fba74e3d4abe77300/ruff-0.11.4-py3-none-win_arm64.whl", hash = "sha256:d435db6b9b93d02934cf61ef332e66af82da6d8c69aefdea5994c89997c7a0fc", size = 10450306 },
+version = "0.11.5"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/45/71/5759b2a6b2279bb77fe15b1435b89473631c2cd6374d45ccdb6b785810be/ruff-0.11.5.tar.gz", hash = "sha256:cae2e2439cb88853e421901ec040a758960b576126dab520fa08e9de431d1bef", size = 3976488 }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/23/db/6efda6381778eec7f35875b5cbefd194904832a1153d68d36d6b269d81a8/ruff-0.11.5-py3-none-linux_armv6l.whl", hash = "sha256:2561294e108eb648e50f210671cc56aee590fb6167b594144401532138c66c7b", size = 10103150 },
+ { url = "https://files.pythonhosted.org/packages/44/f2/06cd9006077a8db61956768bc200a8e52515bf33a8f9b671ee527bb10d77/ruff-0.11.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac12884b9e005c12d0bd121f56ccf8033e1614f736f766c118ad60780882a077", size = 10898637 },
+ { url = "https://files.pythonhosted.org/packages/18/f5/af390a013c56022fe6f72b95c86eb7b2585c89cc25d63882d3bfe411ecf1/ruff-0.11.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4bfd80a6ec559a5eeb96c33f832418bf0fb96752de0539905cf7b0cc1d31d779", size = 10236012 },
+ { url = "https://files.pythonhosted.org/packages/b8/ca/b9bf954cfed165e1a0c24b86305d5c8ea75def256707f2448439ac5e0d8b/ruff-0.11.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0947c0a1afa75dcb5db4b34b070ec2bccee869d40e6cc8ab25aca11a7d527794", size = 10415338 },
+ { url = "https://files.pythonhosted.org/packages/d9/4d/2522dde4e790f1b59885283f8786ab0046958dfd39959c81acc75d347467/ruff-0.11.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ad871ff74b5ec9caa66cb725b85d4ef89b53f8170f47c3406e32ef040400b038", size = 9965277 },
+ { url = "https://files.pythonhosted.org/packages/e5/7a/749f56f150eef71ce2f626a2f6988446c620af2f9ba2a7804295ca450397/ruff-0.11.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6cf918390cfe46d240732d4d72fa6e18e528ca1f60e318a10835cf2fa3dc19f", size = 11541614 },
+ { url = "https://files.pythonhosted.org/packages/89/b2/7d9b8435222485b6aac627d9c29793ba89be40b5de11584ca604b829e960/ruff-0.11.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56145ee1478582f61c08f21076dc59153310d606ad663acc00ea3ab5b2125f82", size = 12198873 },
+ { url = "https://files.pythonhosted.org/packages/00/e0/a1a69ef5ffb5c5f9c31554b27e030a9c468fc6f57055886d27d316dfbabd/ruff-0.11.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e5f66f8f1e8c9fc594cbd66fbc5f246a8d91f916cb9667e80208663ec3728304", size = 11670190 },
+ { url = "https://files.pythonhosted.org/packages/05/61/c1c16df6e92975072c07f8b20dad35cd858e8462b8865bc856fe5d6ccb63/ruff-0.11.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80b4df4d335a80315ab9afc81ed1cff62be112bd165e162b5eed8ac55bfc8470", size = 13902301 },
+ { url = "https://files.pythonhosted.org/packages/79/89/0af10c8af4363304fd8cb833bd407a2850c760b71edf742c18d5a87bb3ad/ruff-0.11.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3068befab73620b8a0cc2431bd46b3cd619bc17d6f7695a3e1bb166b652c382a", size = 11350132 },
+ { url = "https://files.pythonhosted.org/packages/b9/e1/ecb4c687cbf15164dd00e38cf62cbab238cad05dd8b6b0fc68b0c2785e15/ruff-0.11.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5da2e710a9641828e09aa98b92c9ebbc60518fdf3921241326ca3e8f8e55b8b", size = 10312937 },
+ { url = "https://files.pythonhosted.org/packages/cf/4f/0e53fe5e500b65934500949361e3cd290c5ba60f0324ed59d15f46479c06/ruff-0.11.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ef39f19cb8ec98cbc762344921e216f3857a06c47412030374fffd413fb8fd3a", size = 9936683 },
+ { url = "https://files.pythonhosted.org/packages/04/a8/8183c4da6d35794ae7f76f96261ef5960853cd3f899c2671961f97a27d8e/ruff-0.11.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b2a7cedf47244f431fd11aa5a7e2806dda2e0c365873bda7834e8f7d785ae159", size = 10950217 },
+ { url = "https://files.pythonhosted.org/packages/26/88/9b85a5a8af21e46a0639b107fcf9bfc31da4f1d263f2fc7fbe7199b47f0a/ruff-0.11.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:81be52e7519f3d1a0beadcf8e974715b2dfc808ae8ec729ecfc79bddf8dbb783", size = 11404521 },
+ { url = "https://files.pythonhosted.org/packages/fc/52/047f35d3b20fd1ae9ccfe28791ef0f3ca0ef0b3e6c1a58badd97d450131b/ruff-0.11.5-py3-none-win32.whl", hash = "sha256:e268da7b40f56e3eca571508a7e567e794f9bfcc0f412c4b607931d3af9c4afe", size = 10320697 },
+ { url = "https://files.pythonhosted.org/packages/b9/fe/00c78010e3332a6e92762424cf4c1919065707e962232797d0b57fd8267e/ruff-0.11.5-py3-none-win_amd64.whl", hash = "sha256:6c6dc38af3cfe2863213ea25b6dc616d679205732dc0fb673356c2d69608f800", size = 11378665 },
+ { url = "https://files.pythonhosted.org/packages/43/7c/c83fe5cbb70ff017612ff36654edfebec4b1ef79b558b8e5fd933bab836b/ruff-0.11.5-py3-none-win_arm64.whl", hash = "sha256:67e241b4314f4eacf14a601d586026a962f4002a475aa702c69980a38087aa4e", size = 10460287 },
]
[[package]]
@@ -2024,11 +2026,11 @@ wheels = [
[[package]]
name = "typing-extensions"
-version = "4.13.1"
+version = "4.13.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/76/ad/cd3e3465232ec2416ae9b983f27b9e94dc8171d56ac99b345319a9475967/typing_extensions-4.13.1.tar.gz", hash = "sha256:98795af00fb9640edec5b8e31fc647597b4691f099ad75f469a2616be1a76dff", size = 106633 }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/df/c5/e7a0b0f5ed69f94c8ab7379c599e6036886bffcde609969a5325f47f1332/typing_extensions-4.13.1-py3-none-any.whl", hash = "sha256:4b6cf02909eb5495cfbc3f6e8fd49217e6cc7944e145cdda8caa3734777f9e69", size = 45739 },
+ { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 },
]
[[package]]
@@ -2067,11 +2069,11 @@ wheels = [
[[package]]
name = "urllib3"
-version = "2.3.0"
+version = "2.4.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 }
+sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 },
+ { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 },
]
[[package]]