diff --git a/.github/workflows/push_docker_images.yml b/.github/workflows/push_docker_images.yml new file mode 100644 index 0000000..0133f15 --- /dev/null +++ b/.github/workflows/push_docker_images.yml @@ -0,0 +1,104 @@ +name: Temporary Push Docker Images + +on: + workflow_dispatch: + inputs: + branch: + description: 'Branch to build from' + required: true + default: 'main' + push: + tags: + - 'dev.*' + pull_request: + branches: + - main + +jobs: + publish-packages: + name: Push Packages + runs-on: ubuntu-20.04 + strategy: + matrix: + os: [ubuntu-latest] + python-version: ["3.10"] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-versions }} + - uses: addnab/docker-run-action@v3 + with: + image: valory/open-autonomy-user:latest + options: -v ${{ github.workspace }}:/work + run: | + echo "Pushing Packages" + cd /work + export AUTHOR=$(grep 'service' packages/packages.json | awk -F/ '{print $2}' | head -1) + autonomy init --reset --author $AUTHOR --ipfs --remote + autonomy push-all + publish-images: + name: Publish Docker Images + runs-on: ubuntu-20.04 + needs: + - "publish-packages" + strategy: + matrix: + os: [ubuntu-latest] + python-version: ["3.10"] + env: + DOCKER_USER: ${{secrets.DOCKER_USER}} + DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Set up tag and vars + uses: addnab/docker-run-action@v3 + with: + image: valory/open-autonomy-user:latest + options: -v ${{ github.workspace }}:/work + run: | + echo "Setting Tag Images" + cd /work + apt-get update && apt-get install git -y || exit 1 + git config --global --add safe.directory /work + export TAG=$(git describe --exact-match --tags $(git rev-parse HEAD)) || exit 1 + if [ $? -eq 0 ]; then + export TAG=`echo $TAG | sed 's/^v//'` + else + echo "You are not on a tagged branch" + exit 1 + fi + echo VERSION=$TAG> env.sh + echo AUTHOR=$(grep 'service/' packages/packages.json | awk -F/ '{print $2}' | head -1) >> env.sh + echo SERVICE=$(grep 'service/' packages/packages.json | awk -F/ '{print $3}' | head -1) >> env.sh + echo AGENT=$(grep 'agent/' packages/packages.json | awk -F/ '{print $3}' | head -1) >> env.sh + echo DEFAULT_IMAGE_TAG=$(cat packages/packages.json | grep agent/ | awk -F: '{print $2}' | tr -d '", ' | head -n 1) >> env.sh + cat env.sh + - uses: addnab/docker-run-action@v3 + name: Build Images + with: + image: valory/open-autonomy-user:latest + options: -v ${{ github.workspace }}:/work + shell: bash + run: | + echo "Building Docker Images" + cd /work + source env.sh || exit 1 + echo "Building images for $AUTHOR for service $SERVICE" + autonomy init --reset --author $AUTHOR --ipfs --remote + autonomy fetch $AUTHOR/$SERVICE --service --local || exit 1 + cd $SERVICE || exit 1 + autonomy build-image || exit 1 + autonomy build-image --version $VERSION || exit 1 + - name: Docker login + run: | + echo $DOCKER_PASSWORD | docker login -u $DOCKER_USER --password-stdin + - name: Docker Push + run: | + source env.sh + echo "Pushing $DOCKER_USER/oar-$AGENT:$VERSION" + echo "Pushing $DOCKER_USER/oar-$AGENT:$DEFAULT_IMAGE_TAG" + docker push $DOCKER_USER/oar-$AGENT:$VERSION + docker push $DOCKER_USER/oar-$AGENT:$DEFAULT_IMAGE_TAG diff --git a/.gitignore b/.gitignore index 7a9ed03..050e6ac 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ packages/open_aea optimus assets.json current_pool.json +gas_costs.json Pipfile.lock packages/valory/agents/* diff --git a/.gitleaksignore b/.gitleaksignore index defb646..c452daf 100644 --- a/.gitleaksignore +++ b/.gitleaksignore @@ -258,6 +258,8 @@ f162f6e9ce964277d59ff703f905ce4d7e514339:packages/valory/contracts/staking_token 293094bdd1180c1f29da321ab6ffc9f661e00d17:packages/valory/contracts/staking_token/contract.yaml:generic-api-key:10 d82b489e8772df10d476d6ebb3fb6527e525e1cf:packages/valory/contracts/staking_token/contract.yaml:generic-api-key:10 c44680132c9ee15749aa0e9b78e68de64c8012a6:packages/valory/skills/liquidity_trader_abci/behaviours.py:generic-api-key:2921 +70f1bad61ecef39d2004e54b7ca396ebaaaa5531:packages/valory/contracts/staking_token/contract.yaml:generic-api-key:10 +34591764415f2fbc959e41feb4b7aaef733285aa:packages/valory/services/optimus_pearl/service.yaml:generic-api-key:44 c1df2c40d616f55da657d42be6aaeb9d5569772d:packages/valory/agents/optimus/aea-config.yaml:generic-api-key:146 c022bdff65530d1dc6a037b3d173e3989a51daec:packages/valory/skills/abstract_round_abci/tests/data/dummy_abci/skill.yaml:generic-api-key:73 c022bdff65530d1dc6a037b3d173e3989a51daec:packages/valory/skills/market_data_fetcher_abci/skill.yaml:generic-api-key:78 @@ -267,4 +269,4 @@ c022bdff65530d1dc6a037b3d173e3989a51daec:packages/valory/skills/reset_pause_abci c022bdff65530d1dc6a037b3d173e3989a51daec:packages/valory/skills/strategy_evaluator_abci/skill.yaml:generic-api-key:101 c022bdff65530d1dc6a037b3d173e3989a51daec:packages/valory/skills/trader_decision_maker_abci/skill.yaml:generic-api-key:76 c022bdff65530d1dc6a037b3d173e3989a51daec:packages/valory/skills/transaction_settlement_abci/skill.yaml:generic-api-key:93 -34591764415f2fbc959e41feb4b7aaef733285aa:packages/valory/services/optimus_pearl/service.yaml:generic-api-key:44 +62bdc4f7ebebea4695e415915e773fd680baeb26:packages/valory/contracts/staking_token/contract.yaml:generic-api-key:10 diff --git a/.spelling b/.spelling index 728b0ae..fe65046 100644 --- a/.spelling +++ b/.spelling @@ -38,3 +38,26 @@ uniswap v0.1.0 v0.2.0 optimus-agent +Optimus +Ethereum-Mainnet +Ethereum +SLIPPAGE_FOR_SWAP +LiFi +Merkl +DEXs +KPIs +url +tx +uppercase +v0.2.1 +v0.2.2 +v0.2.3 +v0.2.4 +v0.2.5 +v0.2.6 +v0.2.7 +v0.2.8 +v0.2.9 +relayer +release.yaml + diff --git a/HISTORY.md b/HISTORY.md index 61adf28..3e6734a 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -2,11 +2,54 @@ ## v0.1.0 - [Release Date: 2024-09-06] -- **feat/uniswap**: Added support for Uniswap integration. -- **feat/claim reward**: Introduced the feature for claiming rewards. -- **v0.1.0 release**: Initial version of the project. -- **fix: claim rewards**: Fixed an issue with claiming rewards. +- Feat/uniswap +- Feat/claim reward +- fix: claim rewards + +## v0.2.0 - [Release Date: 2024-09-09] + +- Fix/unlocking staking rewards + +## v0.2.1 - [Release Date: 2024-09-18] + +- Fix/staking +- Fix/include all campaigns + +## v0.2.2 - [Release Date: 2024-09-20] + +- Fix/vanity tx + +## v0.2.3 + +- fix: resolve CI failures +- chore: add release.yaml + +## v0.2.4 + +- chore: bump to autonomy@v0.16.1 +- fix: remove gas overrides + +## v0.2.5 + +- Fix/swap profitability +- Implements logic in the Optimus agent to proceed with a bridge or swap transaction only if the relayer fee is less than 2% of the amount being bridged or swapped, and the gas fees are less than 25% of the amount being traded. + +## v0.2.6 + +- Fix/route selection +- fix: update url +- fix: add check for zero address +- fix: remove retries for status check +- Enhanced the reliability and efficiency of token swaps and bridges. +- Introduced fallback mechanisms for failed routes and cost-efficiency checks to control gas and swap/bridge fees. +- Optimized route selection to reduce complexity and retries, improving transaction success and cost-effectiveness. + +## v0.2.7 + +- adds gas cost tracker + +## v0.2.8 + +- fix: make allowed chains configurable -## v0.2.0 - [Release Date: 2024-09-06] -- **Unlocking Staking Rewards**: Added logic to unlock staking rewards based on meeting a daily minimum transaction threshold on the Optimism network diff --git a/README.md b/README.md index 8e3214f..ea65335 100644 --- a/README.md +++ b/README.md @@ -1 +1,124 @@ -# optimus-agent +## Optimus service + +**Supported Chains:** +The Optimus service currently operates on the following chains: +- Optimism +- Base +- Ethereum +- Mode + +**Supported DEXs:** +The Optimus service trades on the following decentralized exchanges (DEXs): +- Balancer +- Uniswap + +**Operational Process:** +Within a typical epoch of 24 hours, the Optimus service performs the following tasks: + +1. **Opportunity Identification:** It identifies trading opportunities through campaigns advertised on the Merkl platform across the supported DEXs. + +2. **Liquidity Pool Investment:** When a suitable liquidity pool is found, the service takes the following actions: + - **First Opportunity:** If this is the first opportunity encountered, the service will add liquidity to the pool if its Annual Percentage Rate (APR) is higher than 5%. + - **Subsequent Opportunities:** If the service has already invested in a liquidity pool, it will consider the next opportunity only if its APR exceeds that of the previously invested pool. + +3. **Transaction Tracking:** The service tracks the number of transactions performed on the Optimism chain, which serves as key performance indicators (KPIs) for Olas Staking Rewards. + +The Optimus service is an [agent service](https://docs.autonolas.network/open-autonomy/get_started/what_is_an_agent_service/) (or autonomous service) based on the [Open Autonomy framework](https://docs.autonolas.network/open-autonomy/). Below we show you how to prepare your environment, how to prepare the agent keys, and how to configure and run the service. + +## Prepare the environment + +- System requirements: + + - Python `== 3.10` + - [Poetry](https://python-poetry.org/docs/) `>=1.4.0` + - [Docker Engine](https://docs.docker.com/engine/install/) + - [Docker Compose](https://docs.docker.com/compose/install/) + +- Clone this repository: + + git clone https://github.com/valory-xyz/optimus.git + +- Create a development environment: + + poetry install && poetry shell + +- Configure the Open Autonomy framework: + + autonomy init --reset --author valory --remote --ipfs --ipfs-node "/dns/registry.autonolas.tech/tcp/443/https" + +- Pull packages required to run the service: + + autonomy packages sync --update-packages + +## Prepare the keys and the Safe + +1. You need a **Gnosis keypair** to run the service. + +First, prepare the `keys.json` file with the Gnosis keypair of your agent. (Replace the uppercase placeholders below): + + cat > keys.json << EOF + [ + { + "address": "YOUR_AGENT_ADDRESS", + "private_key": "YOUR_AGENT_PRIVATE_KEY" + } + ] + EOF + +2. You need to deploy **[Safes](https://safe.global/) on the following networks - Ethereum-Mainnet, Optimism, Base, Mode** + +3. You need to provide some funds ETH and USDC both to your Safe address on Ethereum-Mainnet, and some ETH to your agent across all the chains (Ethereum-Mainnet, Optimism, Base, Mode) to cover for gas fees. + +4. You will need your Tenderly Access Key, Tenderly account Slug, and Tenderly Project Slug. Get one at https://dashboard.tenderly.co/ under settings. + +5. You will need also need Coingecko API Key. Get one at https://www.coingecko.com/ under My Account -> Developer's Dashboard. + +## Configure the service + +Set up the following environment variables, to run the service. **Please read their description below**. + +```bash +export ETHEREUM_LEDGER_RPC=INSERT_YOUR_ETHEREUM_RPC +export OPTIMISM_LEDGER_RPC=INSERT_YOUR_OPTIMISM_RPC +export BASE_LEDGER_RPC=INSERT_YOUR_BASE_RPC +export MODE_LEDGER_RPC=INSERT_YOUR_MODE_RPC + +export ALL_PARTICIPANTS='["YOUR_AGENT_ADDRESS"]' +export SAFE_CONTRACT_ADDRESSES='{ethereum:"YOUR_SAFE_ADDRESS_ON_ETHEREUM","optimism":"YOUR_SAFE_ADDRESS_ON_OPTIMISM","base":"YOUR_SAFE_ADDRESS_ON_BASE","mode":"YOUR_SAFE_ADDRESS_ON_MODE"}' + +export SLIPPAGE_FOR_SWAP=0.09 +export TENDERLY_ACCESS_KEY=YOUR_TENDERLY_ACCESS_KEY +export TENDERLY_ACCOUNT_SLUG=YOUR_TENDERLY_ACCOUNT_SLUG +export TENDERLY_PROJECT_SLUG=YOUR_TENDERLY_PROJECT_SLUG +export COINGECKO_API_KEY=YOUR_COINGECKO_API_KEY +``` + +Note - We provide default value for SLIPPAGE_FOR_SWAP, but feel free to experiment with different values. It indicates the allowed slippage when bridging/swapping assets using LiFi. + +## Run the service +Once you have configured (exported) the environment variables, you are in position to run the service. + +- Fetch the service: + + ```bash + autonomy fetch --local --service valory/optimus && cd optimus + ``` + +- Build the Docker image: + + ```bash + autonomy build-image + ``` + +- Copy your `keys.json` file prepared [in the previous section](#prepare-the-keys-and-the-safe) in the same directory: + + ```bash + cp path/to/keys.json . + ``` + +- Build the deployment with a single agent and run: + + ```bash + autonomy deploy build --n 1 -ltm + autonomy deploy run --build-dir abci_build/ + ``` diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..2b5fdca --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,34 @@ +# Security Policy + +This document outlines security procedures and general policies for the `optimus` project. + +## Supported Versions + +The following table shows which versions of `optimus` are currently being supported with security updates. + +| Version | Supported | +|---------|--------------------| +| `n/a` | :white_check_mark: | +| `n/a` | :x: | + +## Reporting a Vulnerability + +The `optimus` team and community take all security bugs in `optimus` seriously. Thank you for improving the security of `optimus`. We appreciate your efforts and responsible disclosure and will make every effort to acknowledge your contributions. + +Report security bugs by emailing `info@valory.xyz`. + +The lead maintainer will acknowledge your email within 48 hours, and will send a more detailed response within 48 hours indicating the next steps in handling your report. After the initial reply to your report, the security team will endeavour to keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance. + +Report security bugs in third-party modules to the person or team maintaining the module. + +## Disclosure Policy + +When the security team receives a security bug report, they will assign it to a primary handler. This person will coordinate the fix and release process, involving the following steps: + +- Confirm the problem and determine the affected versions. +- Audit code to find any potential similar problems. +- Prepare fixes for all releases still under maintenance. These fixes will be released as fast as possible to PyPI. + +## Comments on this Policy + +If you have suggestions on how this process could be improved please submit a pull request. diff --git a/packages/packages.json b/packages/packages.json index 135b67b..a046739 100644 --- a/packages/packages.json +++ b/packages/packages.json @@ -1,17 +1,20 @@ { "dev": { - "contract/valory/balancer_weighted_pool/0.1.0": "bafybeidyjlrlq3jrbackewedwt5irokhjupxgpqfgur2ri426cap2oqt7a", - "contract/valory/balancer_vault/0.1.0": "bafybeie6twptrkqddget7pjijzob2c4jqmrrtpkwombneh35xx56djz4ru", - "contract/valory/erc20/0.1.0": "bafybeiav4gh7lxfnwp4f7oorkbvjxrdsgjgyhl43rgbblaugtl76zlx7vy", - "contract/valory/uniswap_v3_non_fungible_position_manager/0.1.0": "bafybeigadr3nyx6tkrual7oqn2qiup35addfevromxjzzlvkiukpyhtz6y", - "contract/valory/uniswap_v3_pool/0.1.0": "bafybeih64nqgwlverl2tubnkymtlvewngn2pthzzfjewvxpk7dt2im6gza", - "contract/valory/merkl_distributor/0.1.0": "bafybeihaqsvmncuzmwv2r6iuzc5t7ur6ugdhephz7ydftypksjidpsylbq", - "contract/valory/staking_token/0.1.0": "bafybeifrvtkofw5c26b3irm6izqfdpik6vpjhm6hqwcdzx333h6vhdanai", - "contract/valory/staking_activity_checker/0.1.0": "bafybeibjzsi2r5b6xd4iwl4wbwldptnynryzsdpifym4mkv32ynswx22ou", - "skill/valory/liquidity_trader_abci/0.1.0": "bafybeihtca6gtyjibj6wkrcdmx3fb3a3bkpdgsphwevkatagxrbqvh6fd4", - "skill/valory/optimus_abci/0.1.0": "bafybeihgnn7xj733xul4365blhexm2ory5i6mlkwxgixkbxorbmejq3x4a", - "agent/valory/optimus/0.1.0": "bafybeie5vm4ucwtouxocxtd2aj6kvnrqsfngg32rhewvnzkfxnshqalepy", - "service/valory/optimus/0.1.0": "bafybeibzujtdlgsft3hnjmboa5yfni7vqc2iocjlyti5nadc55jxj3kxbu" + "custom/valory/merkl_pools_search/0.1.0": "bafybeibywngxfy5e2crtkvgfvad2ciepg3qk3h54eg3vbjoxwvf2j55wzq", + "custom/valory/max_apr_selection/0.1.0": "bafybeiheh23wgnrzq42epjpsuawi5cp6l4363z74slhlwkckb3gfem4w3y", + "custom/valory/balancer_pools_search/0.1.0": "bafybeifqhttehbw4oukwbl24l5uzinzlioaq6o4wx4uh3hr3vpe6vr223i", + "contract/valory/balancer_weighted_pool/0.1.0": "bafybeib755ksie5yv4wn6jl7i3bpshlhscf4bzsabqrbahm6b3m5ixzmbi", + "contract/valory/balancer_vault/0.1.0": "bafybeidgdivmrm77yotgpnn567ayzhoqa6hufrijy2cj2b7w5wa63otzq4", + "contract/valory/erc20/0.1.0": "bafybeied2jjdqbcmddaop5b364brpoxatxcypj3gfvpov2ts4c4shoybee", + "contract/valory/uniswap_v3_non_fungible_position_manager/0.1.0": "bafybeiht7qjxkamjmq22o74f5faz3wqpb3cx2grl2t4zc2zxqjkzitc22a", + "contract/valory/uniswap_v3_pool/0.1.0": "bafybeieafb3ldbbshtbfqqwblc5gzcwq4nkxgyjz3n3vvcb3jfxzfgchya", + "contract/valory/merkl_distributor/0.1.0": "bafybeiegvzycswa7kdimhnjvhrtbrzu3zycnianhrdizq5i53ql7jf5poa", + "contract/valory/staking_token/0.1.0": "bafybeic4ug4p22q4hsh5z4hhjrishvnswino2fsleqsgdxlusd5h2x5hwy", + "contract/valory/staking_activity_checker/0.1.0": "bafybeidziyf4o763sw3fqlqjbpz3thrupuwx44barj72zj7tjnxbvkhoxa", + "skill/valory/liquidity_trader_abci/0.1.0": "bafybeidfg3auronrhdd6yxrkqkeop5vjh4vqzhiuhghtlvnupe26rwepre", + "skill/valory/optimus_abci/0.1.0": "bafybeiapa3ry65ojs7byjz2t3sqdzmclrhjgurclenofubkhyqou4mgoca", + "agent/valory/optimus/0.1.0": "bafybeidzci2f4vux7bmflcpvzhbh36xximi2gw2kyednhh4xb4aseec2eq", + "service/valory/optimus/0.1.0": "bafybeierrvod33ljm2lmuzmdc4bdyke57jlylpa3dwvnnbxsdu7z23f5um" }, "third_party": { "protocol/open_aea/signing/1.0.0": "bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi", @@ -22,21 +25,21 @@ "protocol/valory/acn/1.1.0": "bafybeidluaoeakae3exseupaea4i3yvvk5vivyt227xshjlffywwxzcxqe", "protocol/valory/ipfs/0.1.0": "bafybeiftxi2qhreewgsc5wevogi7yc5g6hbcbo4uiuaibauhv3nhfcdtvm", "protocol/valory/tendermint/0.1.0": "bafybeig4mi3vmlv5zpbjbfuzcgida6j5f2nhrpedxicmrrfjweqc5r7cra", - "contract/valory/service_registry/0.1.0": "bafybeihafe524ilngwzavkhwz4er56p7nyar26lfm7lrksfiqvvzo3kdcq", - "contract/valory/gnosis_safe_proxy_factory/0.1.0": "bafybeicpcpyurm7gxir2gnlsgzeirzomkhcbnzr5txk67zdf4mmg737rtu", + "contract/valory/service_registry/0.1.0": "bafybeidipx4cmchxdu5i2v67rno7muie7ckjhmasaj64tv2vtj4fveklxi", + "contract/valory/gnosis_safe_proxy_factory/0.1.0": "bafybeifr4xpmzeb5hvpgd6h4nxlsu3ef2c3f6l5bgs34vym5ok6vllwhmy", "contract/valory/multisend/0.1.0": "bafybeig5byt5urg2d2bsecufxe5ql7f4mezg3mekfleeh32nmuusx66p4y", - "contract/valory/gnosis_safe/0.1.0": "bafybeib375xmvcplw7ageic2np3hq4yqeijrvd5kl7rrdnyvswats6ngmm", - "connection/valory/abci/0.1.0": "bafybeiejymu4ul62zx6weoibnlsrfprfpjnplhjefz6sr6izgdr4sajlnu", + "contract/valory/gnosis_safe/0.1.0": "bafybeihtqcpqthb37msgqabpzcc2xc3l3yzkp5pl2sodeghqyzzzyuevgi", + "connection/valory/abci/0.1.0": "bafybeie2bc44r2ddspeg4v7minuievvjykomcukuf5ryevom6fajno25gy", "connection/valory/http_client/0.23.0": "bafybeihi772xgzpqeipp3fhmvpct4y6e6tpjp4sogwqrnf3wqspgeilg4u", - "connection/valory/ipfs/0.1.0": "bafybeiegnapkvkamis47v5ioza2haerrjdzzb23rptpmcydyneas7jc2wm", + "connection/valory/ipfs/0.1.0": "bafybeias6633a2337nhq6nn5ikq4jaig47v63nxv2ixkjr6qqrqaywqara", "connection/valory/ledger/0.19.0": "bafybeigntoericenpzvwejqfuc3kqzo2pscs76qoygg5dbj6f4zxusru5e", "connection/valory/p2p_libp2p_client/0.1.0": "bafybeid3xg5k2ol5adflqloy75ibgljmol6xsvzvezebsg7oudxeeolz7e", "connection/valory/http_server/0.22.0": "bafybeihpgu56ovmq4npazdbh6y6ru5i7zuv6wvdglpxavsckyih56smu7m", - "skill/valory/abstract_abci/0.1.0": "bafybeidz54kvxhbdmpruzguuzzq7bjg4pekjb5amqobkxoy4oqknnobopu", - "skill/valory/reset_pause_abci/0.1.0": "bafybeif4lgvbzsmzljesxbphycdv52ka7qnihyjrjpfaseclxadcmm6yiq", - "skill/valory/registration_abci/0.1.0": "bafybeiffipsowrqrkhjoexem7ern5ob4fabgif7wa6gtlszcoaop2e3oey", - "skill/valory/abstract_round_abci/0.1.0": "bafybeiajjzuh6vf23crp55humonknirvv2f4s3dmdlfzch6tc5ow52pcgm", - "skill/valory/termination_abci/0.1.0": "bafybeiekkpo5qef5zaeagm3si6v45qxcojvtjqe4a5ceccvk4q7k3xi3bi", - "skill/valory/transaction_settlement_abci/0.1.0": "bafybeielv6eivt2z6nforq43xewl2vmpfwpdu2s2vfogobziljnwsclmlm" + "skill/valory/abstract_abci/0.1.0": "bafybeif2naoydlrqkdpnig34uejedwgurjwyvmbpcz53tif7pyukfdophq", + "skill/valory/reset_pause_abci/0.1.0": "bafybeiezfedmmseox3ce5aucxsiszdmvskrwwbtpb2a3vw3sbmc5jt7nri", + "skill/valory/registration_abci/0.1.0": "bafybeiagi6e2h7kochmlemy5c5yk6hwn37tfxiqvk2en74jhowsdwlmrny", + "skill/valory/abstract_round_abci/0.1.0": "bafybeigjddhk7epta7xpnfvv426xedff5abh4xlkwi6cqgp4vkutgkvydm", + "skill/valory/termination_abci/0.1.0": "bafybeiea67epwwgngp7b3wavs6hpkaxv6etyaps6g6325bchfnf354mibq", + "skill/valory/transaction_settlement_abci/0.1.0": "bafybeifmgmwdkx4esemxjacjwzqkqymkuklb5nehkwqkx7v335fllgswcq" } } \ No newline at end of file diff --git a/packages/valory/agents/optimus/aea-config.yaml b/packages/valory/agents/optimus/aea-config.yaml index 3032b50..9dead04 100644 --- a/packages/valory/agents/optimus/aea-config.yaml +++ b/packages/valory/agents/optimus/aea-config.yaml @@ -8,21 +8,21 @@ fingerprint: __init__.py: bafybeigx5mdvnamsqfum5ut7htok2y5vsnu7lrvms5gfvqi7hmv7sfbo3a fingerprint_ignore_patterns: [] connections: -- valory/abci:0.1.0:bafybeiejymu4ul62zx6weoibnlsrfprfpjnplhjefz6sr6izgdr4sajlnu +- valory/abci:0.1.0:bafybeie2bc44r2ddspeg4v7minuievvjykomcukuf5ryevom6fajno25gy - valory/http_client:0.23.0:bafybeihi772xgzpqeipp3fhmvpct4y6e6tpjp4sogwqrnf3wqspgeilg4u - valory/http_server:0.22.0:bafybeihpgu56ovmq4npazdbh6y6ru5i7zuv6wvdglpxavsckyih56smu7m -- valory/ipfs:0.1.0:bafybeiegnapkvkamis47v5ioza2haerrjdzzb23rptpmcydyneas7jc2wm +- valory/ipfs:0.1.0:bafybeias6633a2337nhq6nn5ikq4jaig47v63nxv2ixkjr6qqrqaywqara - valory/ledger:0.19.0:bafybeigntoericenpzvwejqfuc3kqzo2pscs76qoygg5dbj6f4zxusru5e - valory/p2p_libp2p_client:0.1.0:bafybeid3xg5k2ol5adflqloy75ibgljmol6xsvzvezebsg7oudxeeolz7e contracts: -- valory/gnosis_safe:0.1.0:bafybeib375xmvcplw7ageic2np3hq4yqeijrvd5kl7rrdnyvswats6ngmm -- valory/gnosis_safe_proxy_factory:0.1.0:bafybeicpcpyurm7gxir2gnlsgzeirzomkhcbnzr5txk67zdf4mmg737rtu +- valory/gnosis_safe:0.1.0:bafybeihtqcpqthb37msgqabpzcc2xc3l3yzkp5pl2sodeghqyzzzyuevgi +- valory/gnosis_safe_proxy_factory:0.1.0:bafybeifr4xpmzeb5hvpgd6h4nxlsu3ef2c3f6l5bgs34vym5ok6vllwhmy - valory/multisend:0.1.0:bafybeig5byt5urg2d2bsecufxe5ql7f4mezg3mekfleeh32nmuusx66p4y -- valory/service_registry:0.1.0:bafybeihafe524ilngwzavkhwz4er56p7nyar26lfm7lrksfiqvvzo3kdcq -- valory/balancer_weighted_pool:0.1.0:bafybeidyjlrlq3jrbackewedwt5irokhjupxgpqfgur2ri426cap2oqt7a -- valory/balancer_vault:0.1.0:bafybeie6twptrkqddget7pjijzob2c4jqmrrtpkwombneh35xx56djz4ru -- valory/uniswap_v3_non_fungible_position_manager:0.1.0:bafybeigadr3nyx6tkrual7oqn2qiup35addfevromxjzzlvkiukpyhtz6y -- valory/uniswap_v3_pool:0.1.0:bafybeih64nqgwlverl2tubnkymtlvewngn2pthzzfjewvxpk7dt2im6gza +- valory/service_registry:0.1.0:bafybeidipx4cmchxdu5i2v67rno7muie7ckjhmasaj64tv2vtj4fveklxi +- valory/balancer_weighted_pool:0.1.0:bafybeib755ksie5yv4wn6jl7i3bpshlhscf4bzsabqrbahm6b3m5ixzmbi +- valory/balancer_vault:0.1.0:bafybeidgdivmrm77yotgpnn567ayzhoqa6hufrijy2cj2b7w5wa63otzq4 +- valory/uniswap_v3_non_fungible_position_manager:0.1.0:bafybeiht7qjxkamjmq22o74f5faz3wqpb3cx2grl2t4zc2zxqjkzitc22a +- valory/uniswap_v3_pool:0.1.0:bafybeieafb3ldbbshtbfqqwblc5gzcwq4nkxgyjz3n3vvcb3jfxzfgchya protocols: - open_aea/signing:1.0.0:bafybeihv62fim3wl2bayavfcg3u5e5cxu3b7brtu4cn5xoxd6lqwachasi - valory/abci:0.1.0:bafybeiaqmp7kocbfdboksayeqhkbrynvlfzsx4uy4x6nohywnmaig4an7u @@ -33,14 +33,18 @@ protocols: - valory/ledger_api:1.0.0:bafybeihdk6psr4guxmbcrc26jr2cbgzpd5aljkqvpwo64bvaz7tdti2oni - valory/tendermint:0.1.0:bafybeig4mi3vmlv5zpbjbfuzcgida6j5f2nhrpedxicmrrfjweqc5r7cra skills: -- valory/abstract_abci:0.1.0:bafybeidz54kvxhbdmpruzguuzzq7bjg4pekjb5amqobkxoy4oqknnobopu -- valory/abstract_round_abci:0.1.0:bafybeiajjzuh6vf23crp55humonknirvv2f4s3dmdlfzch6tc5ow52pcgm -- valory/liquidity_trader_abci:0.1.0:bafybeihtca6gtyjibj6wkrcdmx3fb3a3bkpdgsphwevkatagxrbqvh6fd4 -- valory/optimus_abci:0.1.0:bafybeihgnn7xj733xul4365blhexm2ory5i6mlkwxgixkbxorbmejq3x4a -- valory/registration_abci:0.1.0:bafybeiffipsowrqrkhjoexem7ern5ob4fabgif7wa6gtlszcoaop2e3oey -- valory/reset_pause_abci:0.1.0:bafybeif4lgvbzsmzljesxbphycdv52ka7qnihyjrjpfaseclxadcmm6yiq -- valory/termination_abci:0.1.0:bafybeiekkpo5qef5zaeagm3si6v45qxcojvtjqe4a5ceccvk4q7k3xi3bi -- valory/transaction_settlement_abci:0.1.0:bafybeielv6eivt2z6nforq43xewl2vmpfwpdu2s2vfogobziljnwsclmlm +- valory/abstract_abci:0.1.0:bafybeif2naoydlrqkdpnig34uejedwgurjwyvmbpcz53tif7pyukfdophq +- valory/abstract_round_abci:0.1.0:bafybeigjddhk7epta7xpnfvv426xedff5abh4xlkwi6cqgp4vkutgkvydm +- valory/liquidity_trader_abci:0.1.0:bafybeidfg3auronrhdd6yxrkqkeop5vjh4vqzhiuhghtlvnupe26rwepre +- valory/optimus_abci:0.1.0:bafybeiapa3ry65ojs7byjz2t3sqdzmclrhjgurclenofubkhyqou4mgoca +- valory/registration_abci:0.1.0:bafybeiagi6e2h7kochmlemy5c5yk6hwn37tfxiqvk2en74jhowsdwlmrny +- valory/reset_pause_abci:0.1.0:bafybeiezfedmmseox3ce5aucxsiszdmvskrwwbtpb2a3vw3sbmc5jt7nri +- valory/termination_abci:0.1.0:bafybeiea67epwwgngp7b3wavs6hpkaxv6etyaps6g6325bchfnf354mibq +- valory/transaction_settlement_abci:0.1.0:bafybeifmgmwdkx4esemxjacjwzqkqymkuklb5nehkwqkx7v335fllgswcq +customs: +- valory/merkl_pools_search:0.1.0:bafybeibywngxfy5e2crtkvgfvad2ciepg3qk3h54eg3vbjoxwvf2j55wzq +- valory/max_apr_selection:0.1.0:bafybeiheh23wgnrzq42epjpsuawi5cp6l4363z74slhlwkckb3gfem4w3y +- valory/balancer_pools_search:0.1.0:bafybeifqhttehbw4oukwbl24l5uzinzlioaq6o4wx4uh3hr3vpe6vr223i default_ledger: ethereum required_ledgers: - ethereum @@ -72,7 +76,7 @@ logging_config: skill_exception_policy: stop_and_exit dependencies: open-aea-ledger-ethereum: - version: ==1.57.0 + version: ==1.60.0 default_connection: null --- public_id: valory/abci:0.1.0 @@ -102,6 +106,14 @@ config: chain_id: ${int:10} poa_chain: ${bool:false} default_gas_price_strategy: ${str:eip1559} + mode: + address: ${str:https://virtual.mode.rpc.tenderly.co/f1d63db5-da55-4383-bbed-54a6edbb0ee2} + chain_id: ${int:34443} + poa_chain: ${bool:false} + default_gas_price_strategy: ${str:eip1559} + gas_price_strategies: + eip1559: + fee_history_percentile: 50 --- public_id: valory/p2p_libp2p_client:0.1.0 type: connection @@ -139,7 +151,7 @@ models: requests_per_minute: ${int:30} credits: ${int:10000} rate_limited_code: ${int:429} - chain_to_platform_id_mapping: ${str:{"optimism":"optimistic-ethereum","base":"base","ethereum":"ethereum"}} + chain_to_platform_id_mapping: ${str:{"optimism":"optimistic-ethereum","base":"base","ethereum":"ethereum","mode":"mode"}} params: args: cleanup_history_depth: 1 @@ -200,39 +212,36 @@ models: slash_threshold_amount: ${int:10000000000000000} light_slash_unit_amount: ${int:5000000000000000} serious_slash_unit_amount: ${int:8000000000000000} - multisend_batch_size: ${int:50} - ipfs_address: ${str:https://gateway.autonolas.tech/ipfs/} - default_chain_id: ${str:optimism} termination_from_block: ${int:34088325} allowed_dexs: ${list:["balancerPool", "UniswapV3"]} initial_assets: ${str:{"ethereum":{"0x0000000000000000000000000000000000000000":"ETH","0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48":"USDC"}}} - safe_contract_addresses: ${str:{"ethereum":"0x0000000000000000000000000000000000000000","base":"0x07e27E181Df065141ee90a4DD43cE4113bc9853C","optimism":"0x07e27E181Df065141ee90a4DD43cE4113bc9853C"}} - merkl_fetch_campaigns_args: ${str:{"url":"https://api.merkl.xyz/v3/campaigns","creator":"","live":"true"}} + safe_contract_addresses: ${str:{"ethereum":"0x0000000000000000000000000000000000000000","base":"0x07e27E181Df065141ee90a4DD43cE4113bc9853C","optimism":"0x07e27E181Df065141ee90a4DD43cE4113bc9853C","mode":"0x0000000000000000000000000000000000000000"}} + merkl_fetch_campaigns_args: ${str:{"url":"https://api.merkl.xyz/v3/campaigns","creator":"","live":"false"}} allowed_chains: ${list:["optimism","base"]} gas_reserve: ${str:{"ethereum":1000,"optimism":1000,"base":1000}} round_threshold: ${int:0} apr_threshold: ${int:5} min_balance_multiplier: ${int:5} - multisend_contract_addresses: ${str:{"ethereum":"0x998739BFdAAdde7C933B942a68053933098f9EDa","optimism":"0xbE5b0013D2712DC4faF07726041C27ecFdBC35AD","base":"0x998739BFdAAdde7C933B942a68053933098f9EDa"}} + multisend_contract_addresses: ${str:{"ethereum":"0x998739BFdAAdde7C933B942a68053933098f9EDa","optimism":"0xbE5b0013D2712DC4faF07726041C27ecFdBC35AD","base":"0x998739BFdAAdde7C933B942a68053933098f9EDa","mode":"0x998739BFdAAdde7C933B942a68053933098f9EDa"}} lifi_advance_routes_url: ${str:https://li.quest/v1/advanced/routes} lifi_fetch_step_transaction_url: ${str:https://li.quest/v1/advanced/stepTransaction} lifi_check_status_url: ${str:https://li.quest/v1/status} lifi_fetch_tools_url: ${str:https://li.quest/v1/tools} slippage_for_swap: ${float:0.09} - balancer_vault_contract_addresses: ${str:{"optimism":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","base":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"}} + balancer_vault_contract_addresses: ${str:{"optimism":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","base":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","mode":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"}} uniswap_position_manager_contract_addresses: ${str:{"optimism":"0xC36442b4a4522E871399CD717aBDD847Ab11FE88","base":"0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1"}} - chain_to_chain_key_mapping: ${str:{"ethereum":"eth","optimism":"opt","base":"bas"}} + chain_to_chain_key_mapping: ${str:{"ethereum":"eth","optimism":"opt","base":"bas","mode":"mod"}} waiting_period_for_status_check: ${int:10} max_num_of_retries: ${int:5} reward_claiming_time_period: ${int:28800} - merkl_distributor_contract_addresses: ${str:{"optimism":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae","base":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae"}} + merkl_distributor_contract_addresses: ${str:{"optimism":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae","base":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae","mode":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae"}} intermediate_tokens: ${str:{"ethereum":{"0x0000000000000000000000000000000000000000":{"symbol":"ETH","liquidity_provider":"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"},"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2":{"symbol":"WETH","liquidity_provider":"0xF04a5cC80B1E94C69B48f5ee68a08CD2F09A7c3E"},"0xdAC17F958D2ee523a2206206994597C13D831ec7":{"symbol":"USDT","liquidity_provider":"0xcEe284F754E854890e311e3280b767F80797180d"},"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48":{"symbol":"USDC","liquidity_provider":"0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640"},"0x6B175474E89094C44Da98b954EedeAC495271d0F":{"symbol":"DAI","liquidity_provider":"0x517F9dD285e75b599234F7221227339478d0FcC8"},"0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84":{"symbol":"stETH","liquidity_provider":"0x4028DAAC072e492d34a3Afdbef0ba7e35D8b55C4"},"0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0":{"symbol":"wstETH","liquidity_provider":"0x109830a1AAaD605BbF02a9dFA7B0B92EC2FB7dAa"},"0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599":{"symbol":"WBTC","liquidity_provider":"0xCBCdF9626bC03E24f779434178A73a0B4bad62eD"},"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984":{"symbol":"UNI","liquidity_provider":"0x1d42064Fc4Beb5F8aAF85F4617AE8b3b5B8Bd801"}},"optimism":{"0x0000000000000000000000000000000000000000":{"symbol":"ETH","liquidity_provider":"0x4200000000000000000000000000000000000006"},"0x7F5c764cBc14f9669B88837ca1490cCa17c31607":{"symbol":"USDC.e","liquidity_provider":"0xD1F1baD4c9E6c44DeC1e9bF3B94902205c5Cd6C3"},"0x4200000000000000000000000000000000000006":{"symbol":"WETH","liquidity_provider":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"},"0x94b008aA00579c1307B0EF2c499aD98a8ce58e58":{"symbol":"USDT","liquidity_provider":"0xA73C628eaf6e283E26A7b1f8001CF186aa4c0E8E"},"0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1":{"symbol":"DAI","liquidity_provider":"0x03aF20bDAaFfB4cC0A521796a223f7D85e2aAc31"},"0x1F32b1c2345538c0c6f582fCB022739c4A194Ebb":{"symbol":"wstETH","liquidity_provider":"0x04F6C85A1B00F6D9B75f91FD23835974Cc07E65c"},"0x68f180fcCe6836688e9084f035309E29Bf0A2095":{"symbol":"WBTC","liquidity_provider":"0x078f358208685046a11C85e8ad32895DED33A249"},"0x76FB31fb4af56892A25e32cFC43De717950c9278":{"symbol":"AAVE","liquidity_provider":"0xf329e36C7bF6E5E86ce2150875a84Ce77f477375"},"0x4200000000000000000000000000000000000042":{"symbol":"OP","liquidity_provider":"0x2A82Ae142b2e62Cb7D10b55E323ACB1Cab663a26"}},"base":{"0x0000000000000000000000000000000000000000":{"symbol":"ETH","liquidity_provider":"0xd0b53D9277642d899DF5C87A3966A349A798F224"},"0x4200000000000000000000000000000000000006":{"symbol":"WETH","liquidity_provider":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"},"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913":{"symbol":"USDC","liquidity_provider":"0x0B0A5886664376F59C351ba3f598C8A8B4D0A6f3"},"0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA":{"symbol":"USDbC","liquidity_provider":"0x0B25c51637c43decd6CC1C1e3da4518D54ddb528"},"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb":{"symbol":"DAI","liquidity_provider":"0x927860797d07b1C46fbBe7f6f73D45C7E1BFBb27"},"0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452":{"symbol":"wstETH","liquidity_provider":"0x99CBC45ea5bb7eF3a5BC08FB1B7E56bB2442Ef0D"},"0xB6fe221Fe9EeF5aBa221c348bA20A1Bf5e73624c":{"symbol":"rETH","liquidity_provider":"0x95Fa1ddc9a78273f795e67AbE8f1Cd2Cd39831fF"},"0x532f27101965dd16442E59d40670FaF5eBB142E4":{"symbol":"BRETT","liquidity_provider":"0xBA3F945812a83471d709BCe9C3CA699A19FB46f7"}}}} merkl_user_rewards_url: ${str:https://api.merkl.xyz/v3/userRewards} tenderly_bundle_simulation_url: ${str:https://api.tenderly.co/api/v1/account/{tenderly_account_slug}/project/{tenderly_project_slug}/simulate-bundle} tenderly_access_key: ${str:access_key} tenderly_account_slug: ${str:account_slug} tenderly_project_slug: ${str:project_slug} - chain_to_chain_id_mapping: ${str:{"optimism":10,"base":8453,"ethereum":1}} + chain_to_chain_id_mapping: ${str:{"optimism":10,"base":8453,"ethereum":1,"mode":34443}} staking_token_contract_address: ${str:0x88996bbdE7f982D93214881756840cE2c77C4992} staking_activity_checker_contract_address: ${str:0x7Fd1F4b764fA41d19fe3f63C85d12bf64d2bbf68} staking_threshold_period: ${int:5} @@ -243,5 +252,15 @@ models: min_swap_amount_threshold: ${int:10} max_fee_percentage: ${float:0.02} max_gas_percentage: ${float:0.25} - balancer_graphql_endpoints: ${str:{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest"}} + balancer_graphql_endpoints: ${str:{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest","mode":"https://api.studio.thegraph.com/query/75376/balancer-mode-v2/version/latest"}} + target_investment_chains: ${list:["optimism","base","mode"]} + staking_chain: ${str:""} + gas_params: + max_fee_per_gas: ${int:20000000} + max_priority_fee_per_gas: ${int:3000000} + file_hash_to_strategies: ${str:{"bafybeifg4aub2bpqw4s6xasrho4t4doxnkostdss4fatxgzege23h7dg7u":"merkl_pools_search","bafybeifqkyvivtkhyin27gpde5vdvu2nwuatuqrhkj5tl52zc3gobokjyy":"max_apr_selection","bafybeiac6zo7nhfjl5ypxzxsrv5gjaoaejefpmjbktallgq2ll3i6e5zmm":"balancer_pools_search"}} + strategies_kwargs: ${str:{"merkl_pools_search":{"balancer_graphql_endpoints":{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest","mode":"https://api.studio.thegraph.com/query/75376/balancer-mode-v2/version/latest"},"merkl_fetch_campaign_args":{"url":"https://api.merkl.xyz/v3/campaigns","creator":"","live":"false"}},"balancer_pools_search":{"graphql_endpoint":"https://api-v3.balancer.fi/"}}} + selected_strategies: ${list:["merkl_pools_search","balancer_pools_search"]} + selected_protocols: ${list:["BALANCER","UNISWAP_V3"]} + selected_hyper_strategy: ${str:max_apr_selection} service_endpoint_base: ${str:https://optimus.staging.autonolas.tech/} diff --git a/packages/valory/contracts/balancer_vault/contract.yaml b/packages/valory/contracts/balancer_vault/contract.yaml index c825ece..e12f600 100644 --- a/packages/valory/contracts/balancer_vault/contract.yaml +++ b/packages/valory/contracts/balancer_vault/contract.yaml @@ -16,7 +16,7 @@ contract_interface_paths: ethereum: build/Vault.json dependencies: open-aea-ledger-ethereum: - version: ==1.57.0 + version: ==1.60.0 web3: version: <7,>=6.0.0 eth_abi: diff --git a/packages/valory/contracts/balancer_weighted_pool/contract.yaml b/packages/valory/contracts/balancer_weighted_pool/contract.yaml index 17f56ad..1988df2 100644 --- a/packages/valory/contracts/balancer_weighted_pool/contract.yaml +++ b/packages/valory/contracts/balancer_weighted_pool/contract.yaml @@ -16,6 +16,6 @@ contract_interface_paths: ethereum: build/WeightedPool.json dependencies: open-aea-ledger-ethereum: - version: ==1.57.0 + version: ==1.60.0 web3: version: <7,>=6.0.0 diff --git a/packages/valory/contracts/erc20/contract.yaml b/packages/valory/contracts/erc20/contract.yaml index 10da005..1f38397 100644 --- a/packages/valory/contracts/erc20/contract.yaml +++ b/packages/valory/contracts/erc20/contract.yaml @@ -21,9 +21,9 @@ dependencies: eth_typing: {} hexbytes: {} open-aea-ledger-ethereum: - version: ==1.57.0 + version: ==1.60.0 open-aea-test-autonomy: - version: ==0.16.1 + version: ==0.18.3 packaging: {} requests: version: <2.31.2,>=2.28.1 diff --git a/packages/valory/contracts/merkl_distributor/contract.yaml b/packages/valory/contracts/merkl_distributor/contract.yaml index e117085..db779ec 100644 --- a/packages/valory/contracts/merkl_distributor/contract.yaml +++ b/packages/valory/contracts/merkl_distributor/contract.yaml @@ -16,7 +16,7 @@ contract_interface_paths: ethereum: build/Distributor.json dependencies: open-aea-ledger-ethereum: - version: ==1.57.0 + version: ==1.60.0 web3: version: <7,>=6.0.0 eth_abi: diff --git a/packages/valory/contracts/staking_activity_checker/contract.yaml b/packages/valory/contracts/staking_activity_checker/contract.yaml index 023dfec..8538116 100644 --- a/packages/valory/contracts/staking_activity_checker/contract.yaml +++ b/packages/valory/contracts/staking_activity_checker/contract.yaml @@ -16,8 +16,8 @@ contract_interface_paths: ethereum: build/StakingActivityChecker.json dependencies: open-aea-ledger-ethereum: - version: ==1.57.0 + version: ==1.60.0 open-aea-test-autonomy: - version: ==0.16.1 + version: ==0.18.3 web3: version: <7,>=6.0.0 diff --git a/packages/valory/contracts/staking_token/contract.yaml b/packages/valory/contracts/staking_token/contract.yaml index d02421a..83f188d 100644 --- a/packages/valory/contracts/staking_token/contract.yaml +++ b/packages/valory/contracts/staking_token/contract.yaml @@ -16,8 +16,8 @@ contract_interface_paths: ethereum: build/StakingToken.json dependencies: open-aea-ledger-ethereum: - version: ==1.57.0 + version: ==1.60.0 open-aea-test-autonomy: - version: ==0.16.1 + version: ==0.18.3 web3: version: <7,>=6.0.0 diff --git a/packages/valory/contracts/uniswap_v3_non_fungible_position_manager/contract.yaml b/packages/valory/contracts/uniswap_v3_non_fungible_position_manager/contract.yaml index f151fdd..d16baf1 100644 --- a/packages/valory/contracts/uniswap_v3_non_fungible_position_manager/contract.yaml +++ b/packages/valory/contracts/uniswap_v3_non_fungible_position_manager/contract.yaml @@ -16,6 +16,6 @@ contract_interface_paths: ethereum: build/NonfungiblePositionManager.json dependencies: open-aea-ledger-ethereum: - version: ==1.57.0 + version: ==1.60.0 web3: version: <7,>=6.0.0 diff --git a/packages/valory/contracts/uniswap_v3_pool/contract.yaml b/packages/valory/contracts/uniswap_v3_pool/contract.yaml index 1908f68..394dc6b 100644 --- a/packages/valory/contracts/uniswap_v3_pool/contract.yaml +++ b/packages/valory/contracts/uniswap_v3_pool/contract.yaml @@ -16,6 +16,6 @@ contract_interface_paths: ethereum: build/UniswapV3Pool.json dependencies: open-aea-ledger-ethereum: - version: ==1.57.0 + version: ==1.60.0 web3: version: <7,>=6.0.0 diff --git a/packages/valory/customs/__init__.py b/packages/valory/customs/__init__.py new file mode 100644 index 0000000..4a216a6 --- /dev/null +++ b/packages/valory/customs/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +"""This module contains the custom packages authored by Valory AG.""" diff --git a/packages/valory/customs/balancer_pools_search/__init__.py b/packages/valory/customs/balancer_pools_search/__init__.py new file mode 100644 index 0000000..1ed0bca --- /dev/null +++ b/packages/valory/customs/balancer_pools_search/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +"""This module contains a strategy that returns the highest APR yielding liquidity pool over Balancer""" diff --git a/packages/valory/customs/balancer_pools_search/balancer_pools_search.py b/packages/valory/customs/balancer_pools_search/balancer_pools_search.py new file mode 100644 index 0000000..1712acb --- /dev/null +++ b/packages/valory/customs/balancer_pools_search/balancer_pools_search.py @@ -0,0 +1,160 @@ +import requests +from typing import ( + Dict, + Union, + Any, + List +) +# Supported pool types and their mappings +SUPPORTED_POOL_TYPES = { + "WEIGHTED": "Weighted", + "COMPOSABLE_STABLE": "ComposableStable", + "LIQUIDITY_BOOTSTRAPING": "LiquidityBootstrapping", + "META_STABLE": "MetaStable", + "STABLE": "Stable", + "INVESTMENT": "Investment" +} + +REQUIRED_FIELDS = ("chains", "apr_threshold", "graphql_endpoint") +BALANCER = "balancerPool" + +def check_missing_fields(kwargs: Dict[str, Any]) -> List[str]: + """Check for missing fields and return them, if any.""" + missing = [] + for field in REQUIRED_FIELDS: + if kwargs.get(field, None) is None: + missing.append(field) + return missing + +def remove_irrelevant_fields(kwargs: Dict[str, Any]) -> Dict[str, Any]: + """Remove the irrelevant fields from the given kwargs.""" + return {key: value for key, value in kwargs.items() if key in REQUIRED_FIELDS} + +def run_query(query, graphql_endpoint, variables=None) -> Dict[str, Any]: + headers = { + 'Content-Type': 'application/json', + } + payload = { + 'query': query, + 'variables': variables or {} + } + + response = requests.post(graphql_endpoint, json=payload, headers=headers) + if response.status_code != 200: + return {"error": f"GraphQL query failed with status code {response.status_code}"} + + result = response.json() + + if 'errors' in result: + return {"error": f"GraphQL Errors: {result['errors']}"} + + return result['data'] + +def get_best_pool(chains, apr_threshold, graphql_endpoint) -> Dict[str, Any]: + # Ensure all chain names are uppercase + chain_names = [chain.upper() for chain in chains] + chain_list_str = ', '.join(chain_names) + + # Build the GraphQL query with the specified chain names + graphql_query = f""" + {{ + poolGetPools(where: {{chainIn: [{chain_list_str}]}}) {{ + id + address + chain + type + poolTokens {{ + address + symbol + }} + dynamicData {{ + aprItems {{ + type + apr + }} + }} + }} + }} + """ + + # Execute the GraphQL query + data = run_query(graphql_query, graphql_endpoint) + if "error" in data: + return data + + # Extract pools from the response + pools = data.get("poolGetPools", []) + # Filter pools by supported types and those with exactly two tokens + filtered_pools = [] + for pool in pools: + pool_type = pool.get('type') + mapped_type = SUPPORTED_POOL_TYPES.get(pool_type) + if mapped_type and len(pool.get('poolTokens', [])) == 2: + pool['type'] = mapped_type # Update pool type to the mapped type + filtered_pools.append(pool) + + best_pool = None + highest_apr = 0 + for pool in filtered_pools: + total_apr = get_total_apr(pool) + if total_apr > (apr_threshold / 100) and total_apr > highest_apr: + highest_apr = total_apr + best_pool = pool + + if best_pool is None: + return {"error": "No suitable pool found."} + + total_apr = get_total_apr(best_pool) + + dex_type = BALANCER + chain = best_pool['chain'].lower() + apr = total_apr * 100 + pool_address = best_pool['address'] + pool_id = best_pool['id'] + pool_type = best_pool['type'] + + pool_tokens = best_pool['poolTokens'] + token0 = pool_tokens[0].get('address') + token1 = pool_tokens[1].get('address') + token0_symbol = pool_tokens[0].get('symbol') + token1_symbol = pool_tokens[1].get('symbol') + + pool_token_dict = { + "token0": token0, + "token1": token1, + "token0_symbol": token0_symbol, + "token1_symbol": token1_symbol, + } + + # Check for missing token information + if any(v is None for v in pool_token_dict.values()): + return {"error": "Missing token information in the pool."} + + result = { + "dex_type": dex_type, + "chain": chain, + "apr": apr, + "pool_address": pool_address, + "pool_id": pool_id, + "pool_type": pool_type, + **pool_token_dict, + } + + return result + +def get_total_apr(pool) -> float: + apr_items = pool.get('dynamicData', {}).get('aprItems', []) + filtered_apr_items = [ + item for item in apr_items + if item['type'] not in {"IB_YIELD", "MERKL", "SWAP_FEE", "SWAP_FEE_7D", "SWAP_FEE_30D"} + ] + return sum(item['apr'] for item in filtered_apr_items) + +def run(*_args, **kwargs) -> Dict[str, Union[bool, str]]: + """Run the strategy.""" + missing = check_missing_fields(kwargs) + if len(missing) > 0: + return {"error": f"Required kwargs {missing} were not provided."} + + kwargs = remove_irrelevant_fields(kwargs) + return get_best_pool(**kwargs) \ No newline at end of file diff --git a/packages/valory/customs/balancer_pools_search/component.yaml b/packages/valory/customs/balancer_pools_search/component.yaml new file mode 100644 index 0000000..8c17e43 --- /dev/null +++ b/packages/valory/customs/balancer_pools_search/component.yaml @@ -0,0 +1,17 @@ +name: balancer_pools_search +author: valory +version: 0.1.0 +type: custom +description: A strategy that returns the highest APR yielding liquidity pool over + Balancer +license: Apache-2.0 +aea_version: '>=1.0.0, <2.0.0' +fingerprint: + __init__.py: bafybeievwo2yoa6vekod333ttto66vpc27lm6wepspnhwyrqxtjx7djzw4 + balancer_pools_search.py: bafybeicvjhqn7k3pqsnceykkliaty27ka4xqmlajos5abahk4lj34ahg4m +fingerprint_ignore_patterns: [] +entry_point: balancer_pools_search.py +callable: run +dependencies: + requests: + version: <2.31.2,>=2.28.1 diff --git a/packages/valory/customs/max_apr_selection/__init__.py b/packages/valory/customs/max_apr_selection/__init__.py new file mode 100644 index 0000000..eeff753 --- /dev/null +++ b/packages/valory/customs/max_apr_selection/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +"""This module contains a strategy that selects the best yielding strategy based on APR""" diff --git a/packages/valory/customs/max_apr_selection/component.yaml b/packages/valory/customs/max_apr_selection/component.yaml new file mode 100644 index 0000000..c5eefee --- /dev/null +++ b/packages/valory/customs/max_apr_selection/component.yaml @@ -0,0 +1,14 @@ +name: max_apr_selection +author: valory +version: 0.1.0 +type: custom +description: A strategy that selects the best yielding strategy based on APR +license: Apache-2.0 +aea_version: '>=1.0.0, <2.0.0' +fingerprint: + __init__.py: bafybeiebxffqdqb67sa4w2xmmo5q3bnjflr2xeu4xsx3ynrsepf5js2cja + max_apr_selection.py: bafybeicce54ylc533vik2erdyraso6xkle7i77nymsjdfasqggeuoqro2y +fingerprint_ignore_patterns: [] +entry_point: max_apr_selection.py +callable: run +dependencies: {} diff --git a/packages/valory/customs/max_apr_selection/max_apr_selection.py b/packages/valory/customs/max_apr_selection/max_apr_selection.py new file mode 100644 index 0000000..d0de6a2 --- /dev/null +++ b/packages/valory/customs/max_apr_selection/max_apr_selection.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023-2024 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ + +"""This module contains a strategy that selects the best yielding strategy based on APR""" + +from enum import Enum +from typing import ( + Any, + Dict, + List, + Union, +) + +REQUIRED_FIELDS = ("trading_opportunities",) + + +def check_missing_fields(kwargs: Dict[str, Any]) -> List[str]: + """Check for missing fields and return them, if any.""" + missing = [] + for field in REQUIRED_FIELDS: + if kwargs.get(field, None) is None: + missing.append(field) + return missing + +def remove_irrelevant_fields(kwargs: Dict[str, Any]) -> Dict[str, Any]: + """Remove the irrelevant fields from the given kwargs.""" + return {key: value for key, value in kwargs.items() if key in REQUIRED_FIELDS} + +def select_best_opportunity( + trading_opportunities: List[Any] +) -> Dict[str, Union[bool, str]]: + """Select the best trading opportunity""" + selected_opportunity = None + highest_apr = -float("inf") + for trading_opportunity in trading_opportunities: + if trading_opportunity is not None: + apr = trading_opportunity.get("apr", 0) + if apr > highest_apr: + highest_apr = apr + selected_opportunity = trading_opportunity + + return selected_opportunity + +def run(*_args, **kwargs) -> Dict[str, Union[bool, str]]: + """Run the strategy.""" + missing = check_missing_fields(kwargs) + if len(missing) > 0: + return {"error": f"Required kwargs {missing} were not provided."} + + kwargs = remove_irrelevant_fields(kwargs) + return select_best_opportunity(**kwargs) \ No newline at end of file diff --git a/packages/valory/skills/liquidity_trader_abci/strategy_behaviour.py b/packages/valory/customs/merkl_pools_search/__init__.py similarity index 53% rename from packages/valory/skills/liquidity_trader_abci/strategy_behaviour.py rename to packages/valory/customs/merkl_pools_search/__init__.py index adf8a82..9a63d7e 100644 --- a/packages/valory/skills/liquidity_trader_abci/strategy_behaviour.py +++ b/packages/valory/customs/merkl_pools_search/__init__.py @@ -17,26 +17,4 @@ # # ------------------------------------------------------------------------------ -"""This package contains the implemenatation of the StrategyBehaviour interface.""" - -from abc import ABC, abstractmethod -from typing import Any, Dict, Generator - -from packages.valory.skills.abstract_round_abci.behaviours import BaseBehaviour - - -class StrategyBehaviour(BaseBehaviour, ABC): - """StrategyBehaviour""" - - def __init__(self, **kwargs: Any) -> None: - """Initialize `StrategyBehaviour`.""" - super().__init__(**kwargs) - - @abstractmethod - def get_decision(self) -> Dict[str, str]: - """Get the decision on whether to enter a pool or not""" - pass - - def async_act(self) -> Generator[Any, None, None]: - """Async act""" - pass +"""This module contains a strategy that returns the highest APR yielding liquidity pool over Balancer and Uniswap using Merkl""" diff --git a/packages/valory/customs/merkl_pools_search/component.yaml b/packages/valory/customs/merkl_pools_search/component.yaml new file mode 100644 index 0000000..29b3727 --- /dev/null +++ b/packages/valory/customs/merkl_pools_search/component.yaml @@ -0,0 +1,17 @@ +name: merkl_pools_search +author: valory +version: 0.1.0 +type: custom +description: A strategy that returns the highest APR yielding liquidity pool over + Balancer and Uniswap using Merkl +license: Apache-2.0 +aea_version: '>=1.0.0, <2.0.0' +fingerprint: + __init__.py: bafybeie7iwdt5re7i7lxal5wrzy4yxxi4v3te6tgp7j7aantyyihib7fpi + merkl_pools_search.py: bafybeigyqng6cbxchwdnnq6yuu34lldqsxbgzfudreg5baldfgrntl2u4q +fingerprint_ignore_patterns: [] +entry_point: merkl_pools_search.py +callable: run +dependencies: + requests: + version: <2.31.2,>=2.28.1 diff --git a/packages/valory/customs/merkl_pools_search/merkl_pools_search.py b/packages/valory/customs/merkl_pools_search/merkl_pools_search.py new file mode 100644 index 0000000..e2af0d5 --- /dev/null +++ b/packages/valory/customs/merkl_pools_search/merkl_pools_search.py @@ -0,0 +1,248 @@ +import json +import requests +from enum import Enum +from typing import Any, Dict, List, Optional, Union +from urllib.parse import urlencode + +CAMPAIGN_TYPES = [1, 2] +HTTP_OK = [200, 201] +REQUIRED_FIELDS = ("chains", "apr_threshold", "protocols", "balancer_graphql_endpoints", "merkl_fetch_campaign_args", "chain_to_chain_id_mapping", "current_pool") + +class DexTypes(Enum): + """DexTypes""" + BALANCER = "balancerPool" + UNISWAP_V3 = "UniswapV3" + +def check_missing_fields(kwargs: Dict[str, Any]) -> List[str]: + """Check for missing fields and return them, if any.""" + missing = [] + for field in REQUIRED_FIELDS: + if kwargs.get(field, None) is None: + missing.append(field) + return missing + +def remove_irrelevant_fields(kwargs: Dict[str, Any]) -> Dict[str, Any]: + """Remove the irrelevant fields from the given kwargs.""" + filtered_kwargs = {key: value for key, value in kwargs.items() if key in REQUIRED_FIELDS} + return filtered_kwargs + +def highest_apr_opportunity( + balancer_graphql_endpoints: Dict[str, Any], + merkl_fetch_campaign_args: Dict[str, Any], + chains: List[str], + protocols: List[str], + chain_to_chain_id_mapping: Dict[str, Any], + apr_threshold: float, + current_pool: Optional[str] +) -> Dict[str, Any]: + """Get the highest APR yielding opportunity over given protocols using Merkl API.""" + + def fetch_all_pools() -> Dict[str, Any]: + """Fetch all pools based on allowed chains.""" + if not chains: + return {"error": "No chain selected for investment!"} + + chain_ids = ",".join( + str(chain_to_chain_id_mapping[chain]) + for chain in chains + ) + base_url = merkl_fetch_campaign_args.get("url") + creator = merkl_fetch_campaign_args.get("creator") + live = merkl_fetch_campaign_args.get("live", "true") + + query_params = { + "chainIds": chain_ids, + "creatorTag": creator, + "live": live, + "types": CAMPAIGN_TYPES, + } + api_url = f"{base_url}?{urlencode(query_params, doseq=True)}" + + response = requests.get(api_url, headers={"accept": "application/json"}) + + if response.status_code not in HTTP_OK: + return {"error": f"Could not retrieve data from url {api_url}. Status code {response.status_code}. Error Message: {response.text}"} + + try: + result = json.loads(response.text) + return result + except (ValueError, TypeError) as e: + return {"error": f"Could not parse response from api, the following error was encountered {type(e).__name__}: {e}"} + + def filter_eligible_pools(all_pools: Dict[str, Any]) -> Union[List[Dict[str, Any]], Dict[str, str]]: + """Filter pools based on allowed assets and LP pools and sort by APR.""" + eligible_pools = [] + allowed_dex_types = [DexTypes[protocol.upper()].value for protocol in protocols] + for chain_id, campaigns in all_pools.items(): + for campaign_list in campaigns.values(): + for campaign in campaign_list.values(): + dex_type = campaign.get("type") or campaign.get("ammName") + if dex_type not in allowed_dex_types: + continue + + campaign_apr = campaign.get("apr", 0) + if not campaign_apr or campaign_apr <= 0 or campaign_apr <= apr_threshold: + continue + + campaign_pool_address = campaign.get("mainParameter") + if not campaign_pool_address or campaign_pool_address == current_pool: + continue + + chain = next( + ( + k + for k, v in chain_to_chain_id_mapping.items() + if v == int(chain_id) + ), + None, + ) + eligible_pools.append({ + "dex_type": dex_type, + "chain": chain, + "campaign": campaign, + "apr": campaign_apr + }) + + if not eligible_pools: + return {"error": "No eligible pools found."} + + # Sort eligible pools by APR in descending order + eligible_pools.sort(key=lambda x: x["apr"], reverse=True) + return eligible_pools + + def determine_highest_apr_pool(eligible_pools: List[Dict[str, Any]]) -> Dict[str, Any]: + """Determine the pool with the highest APR from the eligible pools.""" + for pool_info in eligible_pools: + dex_type = pool_info["dex_type"] + chain = pool_info["chain"] + campaign = pool_info["campaign"] + apr = pool_info["apr"] + + highest_apr_pool = extract_pool_info(dex_type, chain, apr, campaign) + if "error" in highest_apr_pool: + continue + + # Check the number of tokens for the highest APR pool if it's a Balancer pool + if dex_type == DexTypes.BALANCER.value: + pool_id = highest_apr_pool.get("pool_id") + if highest_apr_pool.get("pool_type") is None: + continue + tokensList = fetch_balancer_pool_info(pool_id, chain, detail="tokensList") + if "error" in tokensList or len(tokensList) != 2: + continue + + return highest_apr_pool + + return {"error": "No highest APR pool found."} + + def extract_pool_info(dex_type, chain, apr, campaign) -> Dict[str, Any]: + """Extract pool info from campaign data.""" + pool_address = campaign.get("mainParameter") + if not pool_address: + return {"error": "Pool address not found in campaign."} + + pool_token_dict = {} + pool_id = None + pool_type = None + + if dex_type == DexTypes.BALANCER.value: + type_info = campaign.get("typeInfo", {}) + pool_id = type_info.get("poolId") + pool_tokens = type_info.get("poolTokens", {}) + pool_token_items = list(pool_tokens.items()) + if len(pool_token_items) < 2 or any( + token.get("symbol") is None for _, token in pool_token_items + ): + return {"error": "Invalid pool tokens found in campaign."} + + pool_type = fetch_balancer_pool_info(pool_id, chain, detail="poolType") + if "error" in pool_type: + return pool_type + + pool_token_dict = { + "token0": pool_token_items[0][0], + "token1": pool_token_items[1][0], + "token0_symbol": pool_token_items[0][1].get("symbol"), + "token1_symbol": pool_token_items[1][1].get("symbol"), + } + + elif dex_type == DexTypes.UNISWAP_V3.value: + pool_info = campaign.get("campaignParameters", {}) + if not pool_info: + return {"error": "No pool tokens info present in campaign."} + + pool_token_dict = { + "token0": pool_info.get("token0"), + "token1": pool_info.get("token1"), + "token0_symbol": pool_info.get("symbolToken0"), + "token1_symbol": pool_info.get("symbolToken1"), + "pool_fee": pool_info.get("poolFee"), + } + + if any(v is None for v in pool_token_dict.values()): + return {"error": "Invalid pool tokens found in campaign."} + + return { + "dex_type": dex_type, + "chain": chain, + "apr": apr, + "pool_address": pool_address, + "pool_id": pool_id, + "pool_type": pool_type, + **pool_token_dict + } + + def fetch_balancer_pool_info(pool_id: str, chain: str, detail: str) -> Dict[str, Any]: + """Fetch the pool type for a Balancer pool using a GraphQL query.""" + query = f""" + query {{ + pools(where: {{ id: "{pool_id}" }}) {{ + id + {detail} + }} + }} + """ + + url = balancer_graphql_endpoints.get(chain) + if not url: + return {"error": f"GraphQL endpoint not found for chain {chain}."} + + response = requests.post( + url, + json={"query": query}, + headers={"Content-Type": "application/json"}, + ) + if response.status_code not in HTTP_OK: + return {"error": f"Could not retrieve data from GraphQL endpoint. Status code {response.status_code}."} + + try: + res = json.loads(response.text) + if res is None: + return {"error": "No data returned from GraphQL endpoint."} + + pools = res.get("data", {}).get("pools", []) + if pools: + return {detail: pools[0].get(detail)} + return {"error": "No pools found in GraphQL response."} + except json.JSONDecodeError: + return {"error": "Failed to decode JSON response from GraphQL endpoint."} + + all_pools = fetch_all_pools() + if "error" in all_pools: + return all_pools + + eligible_pools = filter_eligible_pools(all_pools) + if "error" in eligible_pools: + return eligible_pools + + highest_apr_pool = determine_highest_apr_pool(eligible_pools) + return highest_apr_pool + +def run(*_args, **kwargs) -> Dict[str, Union[bool, str]]: + """Run the strategy.""" + missing = check_missing_fields(kwargs) + if len(missing) > 0: + return {"error": f"Required kwargs {missing} were not provided."} + + kwargs = remove_irrelevant_fields(kwargs) + return highest_apr_opportunity(**kwargs) diff --git a/packages/valory/services/optimus/service.yaml b/packages/valory/services/optimus/service.yaml index 5ed2096..f5f81ae 100644 --- a/packages/valory/services/optimus/service.yaml +++ b/packages/valory/services/optimus/service.yaml @@ -6,7 +6,7 @@ aea_version: '>=1.0.0, <2.0.0' license: Apache-2.0 fingerprint: {} fingerprint_ignore_patterns: [] -agent: valory/optimus:0.1.0:bafybeie5vm4ucwtouxocxtd2aj6kvnrqsfngg32rhewvnzkfxnshqalepy +agent: valory/optimus:0.1.0:bafybeidzci2f4vux7bmflcpvzhbh36xximi2gw2kyednhh4xb4aseec2eq number_of_agents: 1 deployment: agent: @@ -74,9 +74,7 @@ models: tenderly_account_slug: ${TENDERLY_ACCOUNT_SLUG:str:account_slug} tenderly_project_slug: ${TENDERLY_PROJECT_SLUG:str:project_slug} tendermint_p2p_url: ${TENDERMINT_P2P_URL_0:str:optimism_tm_0:26656} - service_endpoint_base: ${SERVICE_ENDPOINT_BASE:str:https://optimism.autonolas.tech/} - multisend_batch_size: ${MULTISEND_BATCH_SIZE:int:5} - safe_contract_addresses: ${SAFE_CONTRACT_ADDRESSES:str:{"ethereum":"0x0000000000000000000000000000000000000000","base":"0x0000000000000000000000000000000000000000","optimism":"0x0000000000000000000000000000000000000000"}} + safe_contract_addresses: ${SAFE_CONTRACT_ADDRESSES:str:{"ethereum":"0x0000000000000000000000000000000000000000","base":"0x0000000000000000000000000000000000000000","optimism":"0x0000000000000000000000000000000000000000","mode":"0x0000000000000000000000000000000000000000"}} staking_token_contract_address: ${STAKING_TOKEN_CONTRACT_ADDRESS:str:0x88996bbdE7f982D93214881756840cE2c77C4992} staking_activity_checker_contract_address: ${STAKING_ACTIVITY_CHECKER_CONTRACT_ADDRESS:str:0x7Fd1F4b764fA41d19fe3f63C85d12bf64d2bbf68} staking_threshold_period: ${STAKING_THRESHOLD_PERIOD:int:5} @@ -84,12 +82,22 @@ models: assets_info_filename: ${ASSETS_INFO_FILENAME:str:assets.json} pool_info_filename: ${POOL_INFO_FILENAME:str:current_pool.json} gas_cost_info_filename: ${GAS_COST_INFO_FILENAME:str:gas_costs.json} - merkl_fetch_campaigns_args: ${MERKL_FETCH_CAMPAIGNS_ARGS:str:{"url":"https://api.merkl.xyz/v3/campaigns","creator":"","live":"true"}} + merkl_fetch_campaigns_args: ${MERKL_FETCH_CAMPAIGNS_ARGS:str:{"url":"https://api.merkl.xyz/v3/campaigns","creator":"","live":"false"}} min_swap_amount_threshold: ${MIN_SWAP_AMOUNT_THRESHOLD:int:10} max_fee_percentage: ${MAX_FEE_PERCENTAGE:float:0.02} max_gas_percentage: ${MAX_GAS_PERCENTAGE:float:0.25} - balancer_graphql_endpoints: ${BALANCER_GRAPHQL_ENDPOINTS:str:{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest"}} - allowed_chains: ${ALLOWED_CHAINS:list:["optimism","base"]} + balancer_graphql_endpoints: ${BALANCER_GRAPHQL_ENDPOINTS:str:{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest","mode":"https://api.studio.thegraph.com/query/75376/balancer-mode-v2/version/latest"}} + allowed_chains: ${ALLOWED_CHAINS:list:["base","optimism","mode"]} + target_investment_chains: ${TARGET_INVESTMENT_CHAINS:list:["base","optimism","mode"]} + staking_chain: ${STAKING_CHAIN:str:""} + initial_assets: ${INITIAL_ASSETS:str:{"ethereum":{"0x0000000000000000000000000000000000000000":"ETH","0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48":"USDC"}}} + file_hash_to_strategies: ${FILE_HASH_TO_STRATEGIES:str:{"bafybeibywngxfy5e2crtkvgfvad2ciepg3qk3h54eg3vbjoxwvf2j55wzq":"merkl_pools_search","bafybeiheh23wgnrzq42epjpsuawi5cp6l4363z74slhlwkckb3gfem4w3y":"max_apr_selection","bafybeifqhttehbw4oukwbl24l5uzinzlioaq6o4wx4uh3hr3vpe6vr223i":"balancer_pools_search"}} + strategies_kwargs: ${STRATEGIES_KWARGS:str:{"merkl_pools_search":{"balancer_graphql_endpoints":{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest","mode":"https://api.studio.thegraph.com/query/75376/balancer-mode-v2/version/latest"},"merkl_fetch_campaign_args":{"url":"https://api.merkl.xyz/v3/campaigns","creator":"","live":"false"}},"balancer_pools_search":{"graphql_endpoint":"https://api-v3.balancer.fi/"}}} + selected_strategies: ${SELECTED_STRATEGIES:list:["merkl_pools_search","balancer_pools_search"]} + selected_protocols: ${SELECTED_PROTOCOLS:list:["BALANCER","UNISWAP_V3"]} + selected_hyper_strategy: ${SELECTED_HYPER_STRATEGY:str:max_apr_selection} + apr_threshold: ${APR_THRESHOLD:int:5} + service_endpoint_base: ${SERVICE_ENDPOINT_BASE:str:https://optimism.autonolas.tech/} coingecko: args: token_price_endpoint: ${COINGECKO_TOKEN_PRICE_ENDPOINT:str:https://api.coingecko.com/api/v3/simple/token_price/{asset_platform_id}?contract_addresses={token_address}&vs_currencies=usd} @@ -98,7 +106,7 @@ models: requests_per_minute: ${COINGECKO_REQUESTS_PER_MINUTE:int:30} credits: ${COINGECKO_CREDITS:int:10000} rate_limited_code: ${COINGECKO_RATE_LIMITED_CODE:int:429} - chain_to_platform_id_mapping: ${COINGECKO_CHAIN_TO_PLATFORM_ID_MAPPING:str:{"optimism":"optimistic-ethereum","base":"base","ethereum":"ethereum"}} + chain_to_platform_id_mapping: ${COINGECKO_CHAIN_TO_PLATFORM_ID_MAPPING:str:{"optimism":"optimistic-ethereum","base":"base","ethereum":"ethereum","mode":"mode"}} --- public_id: valory/ledger:0.19.0 type: connection @@ -119,6 +127,14 @@ config: chain_id: ${OPTIMISM_LEDGER_CHAIN_ID:int:10} poa_chain: ${OPTIMISM_LEDGER_IS_POA_CHAIN:bool:false} default_gas_price_strategy: ${OPTIMISM_LEDGER_PRICING:str:eip1559} + mode: + address: ${MODE_LEDGER_RPC:str:https://virtual.mode.rpc.tenderly.co/f1d63db5-da55-4383-bbed-54a6edbb0ee2} + chain_id: ${MODE_LEDGER_CHAIN_ID:int:34443} + poa_chain: ${MODE_LEDGER_IS_POA_CHAIN:bool:false} + default_gas_price_strategy: ${MODE_LEDGER_PRICING:str:eip1559} + gas_price_strategies: + eip1559: + fee_history_percentile: ${FEE_HISTORY_PERCENTILE:50} --- public_id: valory/p2p_libp2p_client:0.1.0 type: connection diff --git a/packages/valory/skills/liquidity_trader_abci/behaviours.py b/packages/valory/skills/liquidity_trader_abci/behaviours.py index 71a915a..df4a54f 100644 --- a/packages/valory/skills/liquidity_trader_abci/behaviours.py +++ b/packages/valory/skills/liquidity_trader_abci/behaviours.py @@ -39,6 +39,8 @@ from urllib.parse import urlencode from aea.configurations.data_types import PublicId +from aea.protocols.base import Message +from aea.protocols.dialogue.base import Dialogue from eth_abi import decode from eth_utils import keccak, to_bytes, to_hex @@ -57,12 +59,16 @@ ) from packages.valory.contracts.staking_token.contract import StakingTokenContract from packages.valory.protocols.contract_api import ContractApiMessage +from packages.valory.protocols.ipfs import IpfsMessage from packages.valory.protocols.ledger_api import LedgerApiMessage from packages.valory.skills.abstract_round_abci.base import AbstractRound from packages.valory.skills.abstract_round_abci.behaviours import ( AbstractRoundBehaviour, BaseBehaviour, ) +from packages.valory.skills.liquidity_trader_abci.io_.loader import ( + ComponentPackageLoader, +) from packages.valory.skills.liquidity_trader_abci.models import ( Coingecko, Params, @@ -92,9 +98,6 @@ StakingState, SynchronizedData, ) -from packages.valory.skills.liquidity_trader_abci.strategies.simple_strategy import ( - SimpleStrategyBehaviour, -) from packages.valory.skills.transaction_settlement_abci.payload_tools import ( hash_payload_to_hex, ) @@ -114,7 +117,6 @@ MAX_RETRIES_FOR_ROUTES = 3 HTTP_OK = [200, 201] UTF8 = "utf-8" -STAKING_CHAIN = "optimism" CAMPAIGN_TYPES = [1, 2] INTEGRATOR = "valory" WAITING_PERIOD_FOR_BALANCE_TO_REFLECT = 5 @@ -202,9 +204,7 @@ def update_data(self, new_data: dict): self.data = new_data -class LiquidityTraderBaseBehaviour( - BalancerPoolBehaviour, UniswapPoolBehaviour, SimpleStrategyBehaviour, ABC -): +class LiquidityTraderBaseBehaviour(BalancerPoolBehaviour, UniswapPoolBehaviour, ABC): """Base behaviour for the liquidity_trader_abci skill.""" def __init__(self, **kwargs: Any) -> None: @@ -221,7 +221,7 @@ def __init__(self, **kwargs: Any) -> None: self.pools[DexTypes.BALANCER.value] = BalancerPoolBehaviour self.pools[DexTypes.UNISWAP_V3.value] = UniswapPoolBehaviour self.service_staking_state = StakingState.UNSTAKED - self.strategy = SimpleStrategyBehaviour + self._inflight_strategy_req: Optional[str] = None self.gas_cost_tracker = GasCostTracker( file_path=self.params.store_path / self.params.gas_cost_info_filename ) @@ -340,11 +340,13 @@ def _get_asset_balances(self) -> Generator[None, None, Optional[Dict[str, Any]]] for asset_address, asset_symbol in assets.items(): if asset_address == ZERO_ADDRESS: balance = yield from self._get_native_balance(chain, account) + decimal = 18 else: balance = yield from self._get_token_balance( chain, account, asset_address ) balance = 0 if balance is None else balance + decimal = yield from self._get_token_decimals(chain, asset_address) asset_balances_dict[chain].append( { @@ -358,7 +360,7 @@ def _get_asset_balances(self) -> Generator[None, None, Optional[Dict[str, Any]]] ) self.context.logger.info( - f"Balance of account {account} on {chain} chain for {asset_symbol}: {balance}" + f"Balance of account {account} on {chain} for {asset_symbol}: {self._convert_to_token_units(balance, decimal)}" ) return asset_balances_dict @@ -424,6 +426,11 @@ def _get_token_decimals( ) return decimals + def _convert_to_token_units(self, amount: int, token_decimal: int = 18) -> str: + """Convert smallest unit to token's base unit.""" + value = amount / 10**token_decimal + return f"{value:.{token_decimal}f}" + def _store_data(self, data: Any, attribute: str, filepath: str) -> None: """Generic method to store data as JSON.""" if data is None: @@ -514,7 +521,9 @@ def _calculate_min_num_of_safe_tx_required( self.round_sequence.last_round_transition_timestamp.timestamp() ) - last_ts_checkpoint = yield from self._get_ts_checkpoint(chain=STAKING_CHAIN) + last_ts_checkpoint = yield from self._get_ts_checkpoint( + chain=self.params.staking_chain + ) if last_ts_checkpoint is None: return None @@ -601,8 +610,10 @@ def _is_staking_kpi_met(self) -> Generator[None, None, Optional[bool]]: multisig_nonces_since_last_cp = ( yield from self._get_multisig_nonces_since_last_cp( - chain=STAKING_CHAIN, - multisig=self.params.safe_contract_addresses.get(STAKING_CHAIN), + chain=self.params.staking_chain, + multisig=self.params.safe_contract_addresses.get( + self.params.staking_chain + ), ) ) if multisig_nonces_since_last_cp is None: @@ -715,46 +726,55 @@ class CallCheckpointBehaviour( def async_act(self) -> Generator: """Do the action.""" with self.context.benchmark_tool.measure(self.behaviour_id).local(): - yield from self._get_service_staking_state(chain="optimism") checkpoint_tx_hex = None min_num_of_safe_tx_required = None - if self.service_staking_state == StakingState.STAKED: - min_num_of_safe_tx_required = ( - yield from self._calculate_min_num_of_safe_tx_required( - chain=STAKING_CHAIN - ) - ) - if min_num_of_safe_tx_required is None: - self.context.logger.error( - "Error calculating min number of safe tx required." - ) - else: - self.context.logger.info( - f"The minimum number of safe tx required to unlock rewards are {min_num_of_safe_tx_required}" - ) - is_checkpoint_reached = yield from self._check_if_checkpoint_reached( - chain=STAKING_CHAIN + + if not self.params.staking_chain: + self.context.logger.warning("Service has not been staked on any chain!") + self.service_staking_state = StakingState.UNSTAKED + else: + yield from self._get_service_staking_state( + chain=self.params.staking_chain ) - if is_checkpoint_reached: - self.context.logger.info( - "Checkpoint reached! Preparing checkpoint tx.." + if self.service_staking_state == StakingState.STAKED: + min_num_of_safe_tx_required = ( + yield from self._calculate_min_num_of_safe_tx_required( + chain=self.params.staking_chain + ) ) - checkpoint_tx_hex = yield from self._prepare_checkpoint_tx( - chain=STAKING_CHAIN + if min_num_of_safe_tx_required is None: + self.context.logger.error( + "Error calculating min number of safe tx required." + ) + else: + self.context.logger.info( + f"The minimum number of safe tx required to unlock rewards are {min_num_of_safe_tx_required}" + ) + is_checkpoint_reached = ( + yield from self._check_if_checkpoint_reached( + chain=self.params.staking_chain + ) ) - elif self.service_staking_state == StakingState.EVICTED: - self.context.logger.error("Service has been evicted!") + if is_checkpoint_reached: + self.context.logger.info( + "Checkpoint reached! Preparing checkpoint tx.." + ) + checkpoint_tx_hex = yield from self._prepare_checkpoint_tx( + chain=self.params.staking_chain + ) + elif self.service_staking_state == StakingState.EVICTED: + self.context.logger.error("Service has been evicted!") - else: - self.context.logger.error("Service has not been staked") + else: + self.context.logger.error("Service has not been staked") tx_submitter = self.matching_round.auto_round_id() payload = CallCheckpointPayload( self.context.agent_address, tx_submitter, checkpoint_tx_hex, - self.params.safe_contract_addresses.get(STAKING_CHAIN), - STAKING_CHAIN, + self.params.safe_contract_addresses.get(self.params.staking_chain), + self.params.staking_chain, self.service_staking_state.value, min_num_of_safe_tx_required, ) @@ -853,9 +873,9 @@ def async_act(self) -> Generator: ) multisig_nonces_since_last_cp = ( yield from self._get_multisig_nonces_since_last_cp( - chain=STAKING_CHAIN, + chain=self.params.staking_chain, multisig=self.params.safe_contract_addresses.get( - STAKING_CHAIN + self.params.staking_chain ), ) ) @@ -872,7 +892,7 @@ def async_act(self) -> Generator: ) self.context.logger.info("Preparing vanity tx..") vanity_tx_hex = yield from self._prepare_vanity_tx( - chain=STAKING_CHAIN + chain=self.params.staking_chain ) self.context.logger.info(f"tx hash: {vanity_tx_hex}") @@ -881,8 +901,8 @@ def async_act(self) -> Generator: self.context.agent_address, tx_submitter, vanity_tx_hex, - self.params.safe_contract_addresses.get(STAKING_CHAIN), - STAKING_CHAIN, + self.params.safe_contract_addresses.get(self.params.staking_chain), + self.params.staking_chain, is_staking_kpi_met, ) @@ -958,19 +978,20 @@ class EvaluateStrategyBehaviour(LiquidityTraderBaseBehaviour): """Behaviour that finds the opportunity and builds actions.""" matching_round: Type[AbstractRound] = EvaluateStrategyRound - highest_apr_pool = None + selected_opportunity = None + trading_opportunities = [] def async_act(self) -> Generator: """Async act""" with self.context.benchmark_tool.measure(self.behaviour_id).local(): - yield from self.find_highest_apr_pool() + yield from self.fetch_all_trading_opportunities() + self.execute_hyper_strategy() actions = [] - if self.highest_apr_pool is not None: - invest_in_pool = self.strategy.get_decision( - self, pool_apr=self.highest_apr_pool.get("apr") + if self.selected_opportunity is not None: + self.context.logger.info( + f"Selected opportunity: {self.selected_opportunity}" ) - if invest_in_pool: - actions = yield from self.get_order_of_transactions() + actions = yield from self.get_order_of_transactions() self.context.logger.info(f"Actions: {actions}") serialized_actions = json.dumps(actions) @@ -983,325 +1004,149 @@ def async_act(self) -> Generator: self.set_done() - def find_highest_apr_pool(self) -> Generator[None, None, None]: - """Find the pool with the highest APR.""" - all_pools = yield from self._fetch_all_pools() - if not all_pools: - self.context.logger.info("No pools found.") - return + def execute_hyper_strategy(self) -> None: + """Executes hyper strategy""" - eligible_pools = self._filter_eligible_pools(all_pools) - if not eligible_pools: - self.context.logger.info("No eligible pools found.") - return - self.highest_apr_pool = yield from self._determine_highest_apr_pool( - eligible_pools - ) - - if self.highest_apr_pool: - self.context.logger.info(f"Highest APR pool found: {self.highest_apr_pool}") - else: - self.context.logger.warning("No pools with APR found.") - - def _fetch_all_pools(self) -> Generator[None, None, Optional[Dict[str, Any]]]: - """Fetch all pools based on allowed chains.""" - chain_ids = ",".join( - str(self.params.chain_to_chain_id_mapping[chain]) - for chain in self.params.allowed_chains - ) - base_url = self.params.merkl_fetch_campaigns_args.get("url") - creator = self.params.merkl_fetch_campaigns_args.get("creator") - live = self.params.merkl_fetch_campaigns_args.get("live", "true") - - params = { - "chainIds": chain_ids, - "creatorTag": creator, - "live": live, - "types": CAMPAIGN_TYPES, + hyper_strategy = self.params.selected_hyper_strategy + kwargs = { + "strategy": hyper_strategy, + "trading_opportunities": self.trading_opportunities, } - api_url = f"{base_url}?{urlencode(params, doseq=True)}" - self.context.logger.info(f"Fetching campaigns from {api_url}") + self.context.logger.info(f"Evaluating hyper strategy: {hyper_strategy}") + self.selected_opportunity = self.execute_strategy(**kwargs) + self.context.logger.info(f"Selected opportunity: {self.selected_opportunity}") - response = yield from self.get_http_response( - method="GET", - url=api_url, - headers={"accept": "application/json"}, - ) + def fetch_all_trading_opportunities(self) -> Generator[None, None, None]: + """Fetches all the trading opportunities""" + yield from self.download_strategies() + strategies = self.params.selected_strategies.copy() + tried_strategies: Set[str] = set() - if response.status_code not in HTTP_OK: - self.context.logger.error( - f"Could not retrieve data from url {api_url}. Status code {response.status_code}. Error Message: {response.body}" + while True: + next_strategy = strategies.pop(0) + self.context.logger.info(f"Evaluating strategy: {next_strategy}") + kwargs: Dict[str, Any] = self.params.strategies_kwargs.get( + next_strategy, {} ) - return None - - try: - return json.loads(response.body) - except (ValueError, TypeError) as e: - self.context.logger.error( - f"Could not parse response from api, the following error was encountered {type(e).__name__}: {e}" + kwargs.update( + { + "strategy": next_strategy, + "chains": self.params.target_investment_chains, + "protocols": self.params.selected_protocols, + "chain_to_chain_id_mapping": self.params.chain_to_chain_id_mapping, + "apr_threshold": self.current_pool.get("apr") + if self.current_pool + else self.params.apr_threshold, + "current_pool": self.current_pool.get("address") + if self.current_pool + else "", + } ) - return None - - def _filter_eligible_pools(self, all_pools: Dict[str, Any]) -> Dict[str, Any]: - """Filter pools based on allowed assets and LP pools.""" - eligible_pools = defaultdict(lambda: defaultdict(list)) - allowed_dexs = self.params.allowed_dexs - - for chain_id, campaigns in all_pools.items(): - for campaign_list in campaigns.values(): - for campaign in campaign_list.values(): - dex_type = campaign.get("type") or campaign.get("ammName") - if not dex_type or dex_type not in allowed_dexs: - continue - - campaign_apr = campaign.get("apr", 0) - if ( - not campaign_apr - or campaign_apr <= 0 - or campaign_apr <= self.current_pool.get("apr", 0) - ): - continue - - campaign_pool_address = campaign.get("mainParameter") - if ( - not campaign_pool_address - or campaign_pool_address == self.current_pool.get("address") - ): - continue - - chain = next( - ( - k - for k, v in self.params.chain_to_chain_id_mapping.items() - if v == int(chain_id) - ), - None, + opportunity = self.execute_strategy(**kwargs) + if opportunity is not None: + if "error" in opportunity: + self.context.logger.error( + f"Error in strategy {next_strategy}: {opportunity['error']}" ) - eligible_pools[dex_type][chain].append(campaign) - - return eligible_pools - - def _determine_highest_apr_pool( - self, eligible_pools: Dict[str, Any] - ) -> Generator[None, None, Optional[Dict[str, Any]]]: - """Determine the pool with the highest APR from the eligible pools.""" - - highest_apr_pool = None - highest_apr_pool_info = None - while eligible_pools: - highest_apr = -float("inf") - for dex_type, chains in eligible_pools.items(): - for chain, campaigns in chains.items(): - for campaign in campaigns: - apr = campaign.get("apr", 0) or 0 - if apr > highest_apr: - highest_apr = apr - highest_apr_pool_info = (dex_type, chain, campaign) - - if highest_apr_pool_info: - dex_type, chain, campaign = highest_apr_pool_info - highest_apr_pool = yield from self._extract_pool_info( - dex_type, chain, highest_apr, campaign + else: + self.trading_opportunities.append(opportunity) + else: + self.context.logger.warning( + f"No opportunity found using {next_strategy} strategy" ) - # Check the number of tokens for the highest APR pool if it's a Balancer pool - if dex_type == DexTypes.BALANCER.value: - pool_id = highest_apr_pool.get("pool_id") - if highest_apr_pool.get("pool_type") is None: - self.context.logger.error( - f"Pool type not found for pool {pool_id}" - ) - continue - tokensList = yield from self._fetch_balancer_pool_info( - pool_id, chain, detail="tokensList" - ) - if not tokensList or len(tokensList) != 2: - num_of_tokens = len(tokensList) if tokensList else None - self.context.logger.warning( - f"Balancer pool {pool_id} has {num_of_tokens} tokens, currently we support pools with only 2 tokens" - ) - self.context.logger.info("Searching for another pool") - highest_apr_pool = None - highest_apr_pool_info = None - - # Remove the invalid pool from eligible pools and continue searching - eligible_pools[dex_type][chain].remove(campaign) - if not eligible_pools[dex_type][chain]: - del eligible_pools[dex_type][chain] + tried_strategies.add(next_strategy) + remaining_strategies = set(strategies) - tried_strategies + if len(remaining_strategies) == 0: + break - if not eligible_pools[dex_type]: - del eligible_pools[dex_type] + next_strategy = remaining_strategies.pop() - continue + self.context.logger.info( + f"All available opportunities: {self.trading_opportunities}" + ) - return highest_apr_pool + def download_next_strategy(self) -> None: + """Download the strategies one by one.""" + if self._inflight_strategy_req is not None: + # there already is a req in flight + return + if len(self.shared_state.strategy_to_filehash) == 0: + # no strategies pending to be fetched + return + for strategy, file_hash in self.shared_state.strategy_to_filehash.items(): + self.context.logger.info(f"Fetching {strategy} strategy...") + ipfs_msg, message = self._build_ipfs_get_file_req(file_hash) + self._inflight_strategy_req = strategy + self.send_message(ipfs_msg, message, self._handle_get_strategy) + return - self.context.logger.warning("No eligible pools found.") - return None + def download_strategies(self) -> Generator: + """Download all the strategies, if not yet downloaded.""" + while len(self.shared_state.strategy_to_filehash) > 0: + self.download_next_strategy() + yield from self.sleep(self.params.sleep_time) - def _extract_pool_info( - self, dex_type, chain, apr, campaign + def execute_strategy( + self, *args: Any, **kwargs: Any ) -> Generator[None, None, Optional[Dict[str, Any]]]: - """Extract pool info from campaign data.""" - pool_address = campaign.get("mainParameter") - if not pool_address: - self.context.logger.error(f"Missing pool address in campaign {campaign}") - return None - - pool_token_dict = {} - pool_id = None - pool_type = None - - if dex_type == DexTypes.BALANCER.value: - type_info = campaign.get("typeInfo", {}) - pool_id = type_info.get("poolId") - pool_tokens = type_info.get("poolTokens", {}) - pool_token_items = list(pool_tokens.items()) - if len(pool_token_items) < 2 or any( - token.get("symbol") is None for _, token in pool_token_items - ): - self.context.logger.error( - f"Invalid pool tokens found in campaign {pool_token_items}" - ) - return None + """Execute the strategy and return the results.""" - pool_type = yield from self._fetch_balancer_pool_info( - pool_id, chain, detail="poolType" - ) - pool_token_dict = { - "token0": pool_token_items[0][0], - "token1": pool_token_items[1][0], - "token0_symbol": pool_token_items[0][1].get("symbol"), - "token1_symbol": pool_token_items[1][1].get("symbol"), - } - - elif dex_type == DexTypes.UNISWAP_V3.value: - pool_info = campaign.get("campaignParameters", {}) - if not pool_info: - self.context.logger.error( - f"No pool tokens info present in campaign {campaign}" - ) - return None - - pool_token_dict = { - "token0": pool_info.get("token0"), - "token1": pool_info.get("token1"), - "token0_symbol": pool_info.get("symbolToken0"), - "token1_symbol": pool_info.get("symbolToken1"), - "pool_fee": pool_info.get("poolFee"), - } - - if any(v is None for v in pool_token_dict.values()): - self.context.logger.error( - f"Invalid pool tokens found in campaign {pool_token_dict}" - ) + strategy = kwargs.pop("strategy", None) + if strategy is None: + self.context.logger.error(f"No trading strategy was given in {kwargs=}!") return None - return { - "dex_type": dex_type, - "chain": chain, - "apr": apr, - "pool_address": pool_address, - "pool_id": pool_id, - "pool_type": pool_type, - **pool_token_dict, - } - - def _fetch_balancer_pool_info( - self, pool_id: str, chain: str, detail: str - ) -> Generator[None, None, Optional[Any]]: - """Fetch the pool type for a Balancer pool using a GraphQL query.""" - - def to_content(query: str) -> bytes: - """Convert the given query string to payload content.""" - finalized_query = {"query": query} - encoded_query = json.dumps(finalized_query, sort_keys=True).encode("utf-8") - return encoded_query - - query = f""" - query {{ - pools(where: {{ id: "{pool_id}" }}) {{ # noqa: B028 - id - {detail} - }} - }} - """ - - url = self.params.balancer_graphql_endpoints.get(chain) - if not url: - self.context.logger.error(f"No graphql endpoint found for chain {chain}") + strategy = self.strategy_exec(strategy) + if strategy is None: + self.context.logger.error(f"No executable was found for {strategy=}!") return None - response = yield from self.get_http_response( - content=to_content(query), - method="POST", - url=url, - headers={"Content-Type": "application/json"}, - ) - if response.status_code not in HTTP_OK: + strategy_exec, callable_method = strategy + if callable_method in globals(): + del globals()[callable_method] + + exec(strategy_exec, globals()) # pylint: disable=W0122 # nosec + method = globals().get(callable_method, None) + if method is None: self.context.logger.error( - f"Received status code {response.status_code} from the API. Response: {response.body}" + f"No {callable_method!r} method was found in {strategy} executable." ) return None - try: - res = json.loads(response.body) - if res is None: - self.context.logger.error( - f"Could not get pool type for pool ID {pool_id}" - ) - return None + return method(*args, **kwargs) - pools = res.get("data", {}).get("pools", []) - if pools: - self.context.logger.info( - f"{detail} for pool {pool_id}: {pools[0].get(detail)}" - ) - return pools[0].get(detail) - return None - except json.JSONDecodeError as e: - self.context.logger.error(f"Error decoding JSON response: {str(e)}") - return None + def strategy_exec(self, strategy: str) -> Optional[Tuple[str, str]]: + """Get the executable strategy file's content.""" + return self.shared_state.strategies_executables.get(strategy, None) - def _filter_campaigns(self, chain, campaigns, filtered_pools): - """Filter campaigns based on allowed assets and LP pools""" - allowed_dexs = self.params.allowed_dexs - - for campaign_list in campaigns.values(): - for campaign in campaign_list.values(): - dex_type = ( - campaign.get("type") - if campaign.get("type") - else campaign.get("ammName") - ) - if not dex_type: - continue - - campaign_apr = campaign.get("apr") - if not campaign_apr: - continue + def send_message( + self, msg: Message, dialogue: Dialogue, callback: Callable + ) -> None: + """Send a message.""" + self.context.outbox.put_message(message=msg) + nonce = dialogue.dialogue_label.dialogue_reference[0] + self.shared_state.req_to_callback[nonce] = callback + self.shared_state.in_flight_req = True + + def _handle_get_strategy(self, message: IpfsMessage, _: Dialogue) -> None: + """Handle get strategy response.""" + strategy_req = self._inflight_strategy_req + if strategy_req is None: + self.context.logger.error(f"No strategy request to handle for {message=}.") + return - campaign_type = campaign.get("campaignType") - if not campaign_type: - continue + # store the executable and remove the hash from the mapping because we have downloaded it + _component_yaml, strategy_exec, callable_method = ComponentPackageLoader.load( + message.files + ) - # The pool apr should be greater than the current pool apr - if dex_type in allowed_dexs: - # type 1 and 2 stand for ERC20 and Concentrated liquidity campaigns respectively - # https://docs.merkl.xyz/integrate-merkl/integrate-merkl-to-your-app#merkl-api - if campaign_type in CAMPAIGN_TYPES: - if not campaign_apr > self.current_pool.get("apr", 0.0): - self.context.logger.info( - "APR does not exceed the current pool APR" - ) - continue - campaign_pool_address = campaign.get("mainParameter") - if not campaign_pool_address: - continue - current_pool_address = self.current_pool.get("address") - # The pool should not be the current pool - if campaign_pool_address != current_pool_address: - filtered_pools[dex_type][chain].append(campaign) + self.shared_state.strategies_executables[strategy_req] = ( + strategy_exec, + callable_method, + ) + self.shared_state.strategy_to_filehash.pop(strategy_req) + self._inflight_strategy_req = None def get_order_of_transactions( self, @@ -1311,7 +1156,7 @@ def get_order_of_transactions( if self._can_claim_rewards(): # check current reward - allowed_chains = self.params.allowed_chains + allowed_chains = self.params.target_investment_chains # we can claim all our token rewards at once # hence we build only one action per chain for chain in allowed_chains: @@ -1363,6 +1208,7 @@ def get_order_of_transactions( def _get_top_tokens_by_value(self) -> Generator[None, None, Optional[List[Any]]]: """Get tokens over min balance""" token_balances = [] + eligibility_factor = 0.8 for position in self.synchronized_data.positions: chain = position.get("chain") for asset in position.get("assets", {}): @@ -1401,7 +1247,10 @@ def _get_top_tokens_by_value(self) -> Generator[None, None, Optional[List[Any]]] tokens = [] for token_data in token_balances: - if token_data["value"] >= self.params.min_swap_amount_threshold: + if ( + token_data["value"] + >= eligibility_factor * self.params.min_swap_amount_threshold + ): tokens.append(token_data) if len(tokens) == 2: self.context.logger.info( @@ -1591,18 +1440,18 @@ def _build_bridge_swap_actions( ) -> List[Dict[str, Any]]: """Build bridge and swap actions for the given tokens.""" # TO-DO: Add logic to handle swaps when there is a balance for only one token. - if not self.highest_apr_pool: + if not self.selected_opportunity: self.context.logger.error("No pool present.") return None bridge_swap_actions = [] # Get the highest APR pool's tokens - dest_token0_address = self.highest_apr_pool.get("token0") - dest_token1_address = self.highest_apr_pool.get("token1") - dest_token0_symbol = self.highest_apr_pool.get("token0_symbol") - dest_token1_symbol = self.highest_apr_pool.get("token1_symbol") - dest_chain = self.highest_apr_pool.get("chain") + dest_token0_address = self.selected_opportunity.get("token0") + dest_token1_address = self.selected_opportunity.get("token1") + dest_token0_symbol = self.selected_opportunity.get("token0_symbol") + dest_token1_symbol = self.selected_opportunity.get("token1_symbol") + dest_chain = self.selected_opportunity.get("chain") if ( not dest_token0_address @@ -1612,7 +1461,7 @@ def _build_bridge_swap_actions( or not dest_chain ): self.context.logger.error( - f"Incomplete data in highest APR pool {self.highest_apr_pool}" + f"Incomplete data in highest APR pool {self.selected_opportunity}" ) return None @@ -1715,21 +1564,21 @@ def _build_bridge_swap_actions( def _build_enter_pool_action(self) -> Dict[str, Any]: """Build action for entering the pool with the highest APR.""" - if not self.highest_apr_pool: + if not self.selected_opportunity: self.context.logger.error("No pool present.") return None return { "action": Action.ENTER_POOL.value, - "dex_type": self.highest_apr_pool.get("dex_type"), - "chain": self.highest_apr_pool.get("chain"), + "dex_type": self.selected_opportunity.get("dex_type"), + "chain": self.selected_opportunity.get("chain"), "assets": [ - self.highest_apr_pool.get("token0"), - self.highest_apr_pool.get("token1"), + self.selected_opportunity.get("token0"), + self.selected_opportunity.get("token1"), ], - "pool_address": self.highest_apr_pool.get("pool_address"), - "apr": self.highest_apr_pool.get("apr"), - "pool_type": self.highest_apr_pool.get("pool_type"), + "pool_address": self.selected_opportunity.get("pool_address"), + "apr": self.selected_opportunity.get("apr"), + "pool_type": self.selected_opportunity.get("pool_type"), } def _build_claim_reward_action( @@ -2097,9 +1946,15 @@ def _execute_route_step( routes[to_execute_route_index] ) if not is_profitable: - self.context.logger.error( - "Route not profitable. Switching to next route.." - ) + if is_profitable is None: + self.context.logger.error( + "Error calculating profitability of route. Switching to next route.." + ) + if is_profitable is False: + self.context.logger.error( + "Route not profitable. Switching to next route.." + ) + return Event.UPDATE.value, { "last_executed_route_index": to_execute_route_index, "last_executed_step_index": None, @@ -2205,6 +2060,10 @@ def _prepare_next_action( elif next_action == Action.FIND_BRIDGE_ROUTE: routes = yield from self.fetch_routes(positions, next_action_details) + if not routes: + self.context.logger.error("Error fetching routes") + return Event.DONE.value, {} + if self.synchronized_data.max_allowed_steps_in_a_route: routes = [ route @@ -2212,11 +2071,13 @@ def _prepare_next_action( if len(route.get("steps", [])) <= self.synchronized_data.max_allowed_steps_in_a_route ] + if not routes: + self.context.logger.error( + f"Needed routes with equal to or less than {self.synchronized_data.max_allowed_steps_in_a_route} steps, none found!" + ) + return Event.DONE.value, {} serialized_routes = json.dumps(routes) - if not routes: - self.context.logger.error("Error fetching routes") - return Event.DONE.value, {} return Event.UPDATE.value, { "routes": serialized_routes, @@ -2649,6 +2510,9 @@ def check_if_route_is_profitable( ) -> Generator[None, None, Tuple[Optional[bool], Optional[float], Optional[float]]]: """Checks if the entire route is profitable""" step_transactions = yield from self._get_step_transactions_data(route) + if not step_transactions: + return None, None, None + total_gas_cost = 0 total_fee = 0 total_fee += sum(float(tx_info.get("fee", 0)) for tx_info in step_transactions) @@ -2771,9 +2635,7 @@ def _build_multisend_tx( self, positions, tx_info ) -> Generator[None, None, Optional[str]]: multisend_txs = [] - amount = self._get_balance( - tx_info.get("from_chain"), tx_info.get("source_token"), positions - ) + amount = tx_info.get("amount") if tx_info.get("source_token") != ZERO_ADDRESS: approval_tx_payload = yield from self.get_approval_tx_hash( @@ -2821,6 +2683,9 @@ def _get_step_transactions_data( for step in steps: step = self._set_step_addresses(step) tx_info = yield from self._get_step_transaction(step) + if tx_info is None: + self.context.logger.error("Error fetching step transaction data") + return None step_transactions.append(tx_info) return step_transactions @@ -2842,7 +2707,9 @@ def _get_step_transaction( if response.status_code not in HTTP_OK: response = json.loads(response.body) - self.context.logger.error(f"Error encountered: {response['message']}") + self.context.logger.error( + f"[LiFi API Error Message] Error encountered: {response['message']}" + ) return None try: @@ -3016,7 +2883,9 @@ def round_down_amount(amount: int, decimals: int) -> int: if routes_response.status_code != 200: response = json.loads(routes_response.body) - self.context.logger.error(f"Error encountered: {response['message']}") + self.context.logger.error( + f"[LiFi API Error Message] Error encountered: {response['message']}" + ) return None try: @@ -3030,7 +2899,9 @@ def round_down_amount(amount: int, decimals: int) -> int: routes = routes_response.get("routes", []) if not routes: - self.context.logger.error("No routes available for this pair") + self.context.logger.error( + "[LiFi API Error Message] No routes available for this pair" + ) return None return routes diff --git a/packages/valory/skills/liquidity_trader_abci/fsm_specification.yaml b/packages/valory/skills/liquidity_trader_abci/fsm_specification.yaml index cb93863..e28bb43 100644 --- a/packages/valory/skills/liquidity_trader_abci/fsm_specification.yaml +++ b/packages/valory/skills/liquidity_trader_abci/fsm_specification.yaml @@ -4,6 +4,7 @@ alphabet_in: - DONE - ERROR - NEXT_CHECKPOINT_NOT_REACHED_YET +- NONE - NO_MAJORITY - ROUND_TIMEOUT - SERVICE_EVICTED @@ -46,6 +47,7 @@ states: transition_func: (CallCheckpointRound, DONE): CheckStakingKPIMetRound (CallCheckpointRound, NEXT_CHECKPOINT_NOT_REACHED_YET): CheckStakingKPIMetRound + (CallCheckpointRound, NONE): CallCheckpointRound (CallCheckpointRound, NO_MAJORITY): CallCheckpointRound (CallCheckpointRound, ROUND_TIMEOUT): CallCheckpointRound (CallCheckpointRound, SERVICE_EVICTED): GetPositionsRound @@ -53,6 +55,7 @@ transition_func: (CallCheckpointRound, SETTLE): FinishedCallCheckpointRound (CheckStakingKPIMetRound, DONE): GetPositionsRound (CheckStakingKPIMetRound, ERROR): GetPositionsRound + (CheckStakingKPIMetRound, NONE): CheckStakingKPIMetRound (CheckStakingKPIMetRound, NO_MAJORITY): CheckStakingKPIMetRound (CheckStakingKPIMetRound, ROUND_TIMEOUT): CheckStakingKPIMetRound (CheckStakingKPIMetRound, SETTLE): FinishedCheckStakingKPIMetRound @@ -60,19 +63,25 @@ transition_func: (CheckStakingKPIMetRound, STAKING_KPI_NOT_MET): GetPositionsRound (DecisionMakingRound, DONE): FinishedDecisionMakingRound (DecisionMakingRound, ERROR): FinishedDecisionMakingRound + (DecisionMakingRound, NONE): DecisionMakingRound (DecisionMakingRound, NO_MAJORITY): DecisionMakingRound (DecisionMakingRound, ROUND_TIMEOUT): DecisionMakingRound (DecisionMakingRound, SETTLE): FinishedTxPreparationRound (DecisionMakingRound, UPDATE): DecisionMakingRound (EvaluateStrategyRound, DONE): DecisionMakingRound + (EvaluateStrategyRound, NONE): EvaluateStrategyRound (EvaluateStrategyRound, NO_MAJORITY): EvaluateStrategyRound (EvaluateStrategyRound, ROUND_TIMEOUT): EvaluateStrategyRound (EvaluateStrategyRound, WAIT): FinishedEvaluateStrategyRound (GetPositionsRound, DONE): EvaluateStrategyRound + (GetPositionsRound, NONE): GetPositionsRound (GetPositionsRound, NO_MAJORITY): GetPositionsRound (GetPositionsRound, ROUND_TIMEOUT): GetPositionsRound (PostTxSettlementRound, ACTION_EXECUTED): DecisionMakingRound (PostTxSettlementRound, CHECKPOINT_TX_EXECUTED): CallCheckpointRound + (PostTxSettlementRound, DONE): PostTxSettlementRound + (PostTxSettlementRound, NONE): PostTxSettlementRound + (PostTxSettlementRound, NO_MAJORITY): PostTxSettlementRound (PostTxSettlementRound, ROUND_TIMEOUT): PostTxSettlementRound (PostTxSettlementRound, UNRECOGNIZED): FailedMultiplexerRound (PostTxSettlementRound, VANITY_TX_EXECUTED): CheckStakingKPIMetRound diff --git a/packages/valory/skills/liquidity_trader_abci/handlers.py b/packages/valory/skills/liquidity_trader_abci/handlers.py index 8ea78f6..0cb7d7f 100644 --- a/packages/valory/skills/liquidity_trader_abci/handlers.py +++ b/packages/valory/skills/liquidity_trader_abci/handlers.py @@ -19,18 +19,19 @@ """This module contains the handlers for the skill of LiquidityTraderAbciApp.""" +from typing import cast + +from packages.valory.protocols.ipfs import IpfsMessage from packages.valory.skills.abstract_round_abci.handlers import ( ABCIRoundHandler as BaseABCIRoundHandler, ) +from packages.valory.skills.abstract_round_abci.handlers import AbstractResponseHandler from packages.valory.skills.abstract_round_abci.handlers import ( ContractApiHandler as BaseContractApiHandler, ) from packages.valory.skills.abstract_round_abci.handlers import ( HttpHandler as BaseHttpHandler, ) -from packages.valory.skills.abstract_round_abci.handlers import ( - IpfsHandler as BaseIpfsHandler, -) from packages.valory.skills.abstract_round_abci.handlers import ( LedgerApiHandler as BaseLedgerApiHandler, ) @@ -40,6 +41,7 @@ from packages.valory.skills.abstract_round_abci.handlers import ( TendermintHandler as BaseTendermintHandler, ) +from packages.valory.skills.liquidity_trader_abci.models import SharedState ABCIHandler = BaseABCIRoundHandler @@ -48,4 +50,34 @@ LedgerApiHandler = BaseLedgerApiHandler ContractApiHandler = BaseContractApiHandler TendermintHandler = BaseTendermintHandler -IpfsHandler = BaseIpfsHandler + + +class IpfsHandler(AbstractResponseHandler): + """IPFS message handler.""" + + SUPPORTED_PROTOCOL = IpfsMessage.protocol_id + allowed_response_performatives = frozenset({IpfsMessage.Performative.IPFS_HASH}) + custom_support_performative = IpfsMessage.Performative.FILES + + @property + def shared_state(self) -> SharedState: + """Get the parameters.""" + return cast(SharedState, self.context.state) + + def handle(self, message: IpfsMessage) -> None: + """ + Implement the reaction to an IPFS message. + + :param message: the message + :return: None + """ + self.context.logger.debug(f"Received message: {message}") + self.shared_state.in_flight_req = False + + if message.performative != self.custom_support_performative: + return super().handle(message) + + dialogue = self.context.ipfs_dialogues.update(message) + nonce = dialogue.dialogue_label.dialogue_reference[0] + callback = self.shared_state.req_to_callback.pop(nonce) + callback(message, dialogue) diff --git a/packages/valory/skills/liquidity_trader_abci/io_/__init__.py b/packages/valory/skills/liquidity_trader_abci/io_/__init__.py new file mode 100644 index 0000000..fd05584 --- /dev/null +++ b/packages/valory/skills/liquidity_trader_abci/io_/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ +"""This module contains helper classes for IPFS interaction.""" diff --git a/packages/valory/skills/liquidity_trader_abci/io_/loader.py b/packages/valory/skills/liquidity_trader_abci/io_/loader.py new file mode 100644 index 0000000..885b321 --- /dev/null +++ b/packages/valory/skills/liquidity_trader_abci/io_/loader.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# ------------------------------------------------------------------------------ +# +# Copyright 2023 Valory AG +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ------------------------------------------------------------------------------ +"""This module contains helper classes for IPFS interaction.""" +from typing import Dict + +import yaml + +from packages.valory.skills.abstract_round_abci.io_.store import SupportedObjectType + + +class ComponentPackageLoader: + """Component package loader.""" + + @staticmethod + def load(serialized_objects: Dict[str, str]) -> SupportedObjectType: + """ + Load a custom component package. + + :param serialized_objects: the serialized objects. + :return: the component.yaml, entry_point.py and callable as tuple. + """ + # the package MUST contain a component.yaml file + if "component.yaml" not in serialized_objects: + raise ValueError( + "Invalid component package. " + "The package MUST contain a component.yaml." + ) + + # load the component.yaml file + component_yaml = yaml.safe_load(serialized_objects["component.yaml"]) + if "entry_point" not in component_yaml or "callable" not in component_yaml: + raise ValueError( + "Invalid component package. " + "The component.yaml file MUST contain the 'entry_point' and 'callable' keys." + ) + + # the name of the script that needs to be executed + entry_point_name = component_yaml["entry_point"] + + # load the script + if entry_point_name not in serialized_objects: + raise ValueError( + f"Invalid component package. " + f"{entry_point_name} is not present in the component package." + ) + entry_point = serialized_objects[entry_point_name] + # the method that needs to be called + callable_method = component_yaml["callable"] + + return component_yaml, entry_point, callable_method diff --git a/packages/valory/skills/liquidity_trader_abci/models.py b/packages/valory/skills/liquidity_trader_abci/models.py index fe6eae3..202368d 100644 --- a/packages/valory/skills/liquidity_trader_abci/models.py +++ b/packages/valory/skills/liquidity_trader_abci/models.py @@ -23,9 +23,9 @@ from datetime import datetime from pathlib import Path from time import time -from typing import Any, Dict, List, Optional +from typing import Any, Callable, Dict, List, Optional, Tuple -from aea.skills.base import Model +from aea.skills.base import Model, SkillContext from packages.valory.skills.abstract_round_abci.models import BaseParams from packages.valory.skills.abstract_round_abci.models import ( @@ -47,6 +47,29 @@ class SharedState(BaseSharedState): abci_app_cls = LiquidityTraderAbciApp + def __init__(self, *args: Any, skill_context: SkillContext, **kwargs: Any) -> None: + """Initialize the state.""" + super().__init__(*args, skill_context=skill_context, **kwargs) + self.strategy_to_filehash: Dict[str, str] = {} + self.strategies_executables: Dict[str, Tuple[str, str]] = {} + self.in_flight_req: bool = False + self.req_to_callback: Dict[str, Callable] = {} + + def setup(self) -> None: + """Set up the model.""" + super().setup() + params = self.context.params + self.strategy_to_filehash = { + value: key for key, value in params.file_hash_to_strategies.items() + } + strategy_exec = self.strategy_to_filehash.keys() + for selected_strategy in params.selected_strategies: + if selected_strategy not in strategy_exec: + raise ValueError( + f"The selected trading strategy {selected_strategy} " + f"is not in the strategies' executables {strategy_exec}." + ) + Requests = BaseRequests BenchmarkTool = BaseBenchmarkTool @@ -259,6 +282,25 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: self.balancer_graphql_endpoints = json.loads( self._ensure("balancer_graphql_endpoints", kwargs, str) ) + self.target_investment_chains: List[str] = self._ensure( + "target_investment_chains", kwargs, List[str] + ) + self.staking_chain: Optional[str] = self._ensure( + "staking_chain", kwargs, Optional[str] + ) + self.selected_strategies: List[str] = self._ensure( + "selected_strategies", kwargs, List[str] + ) + self.file_hash_to_strategies = json.loads( + self._ensure("file_hash_to_strategies", kwargs, str) + ) + self.strategies_kwargs = json.loads( + self._ensure("strategies_kwargs", kwargs, str) + ) + self.selected_protocols = self._ensure("selected_protocols", kwargs, List[str]) + self.selected_hyper_strategy = self._ensure( + "selected_hyper_strategy", kwargs, str + ) super().__init__(*args, **kwargs) def get_store_path(self, kwargs: Dict) -> Path: diff --git a/packages/valory/skills/liquidity_trader_abci/rounds.py b/packages/valory/skills/liquidity_trader_abci/rounds.py index e7d2182..91ea8b4 100644 --- a/packages/valory/skills/liquidity_trader_abci/rounds.py +++ b/packages/valory/skills/liquidity_trader_abci/rounds.py @@ -61,6 +61,7 @@ class Event(Enum): ERROR = "error" NEXT_CHECKPOINT_NOT_REACHED_YET = "next_checkpoint_not_reached_yet" NO_MAJORITY = "no_majority" + NONE = "none" ROUND_TIMEOUT = "round_timeout" SERVICE_EVICTED = "service_evicted" SERVICE_NOT_STAKED = "service_not_staked" @@ -163,6 +164,16 @@ def participant_to_staking_kpi(self) -> DeserializedCollection: """Get the participants to the CheckStakingKPIMet round.""" return self._get_deserialized("participant_to_staking_kpi") + @property + def participant_to_decision_making(self) -> DeserializedCollection: + """Get the participants to the DecisionMaking round.""" + return self._get_deserialized("participant_to_decision_making") + + @property + def participant_to_post_tx_settlement(self) -> DeserializedCollection: + """Get the participants to the PostTxSettlement round.""" + return self._get_deserialized("participant_to_post_tx_settlement") + @property def is_staking_kpi_met(self) -> Optional[bool]: """Get kpi met for the day.""" @@ -224,6 +235,7 @@ class CallCheckpointRound(CollectSameUntilThresholdRound): payload_class = CallCheckpointPayload done_event: Enum = Event.DONE no_majority_event: Enum = Event.NO_MAJORITY + none_event: Enum = Event.NONE selection_key = ( get_name(SynchronizedData.tx_submitter), get_name(SynchronizedData.most_voted_tx_hash), @@ -274,6 +286,7 @@ class CheckStakingKPIMetRound(CollectSameUntilThresholdRound): synchronized_data_class = SynchronizedData done_event: Enum = Event.DONE no_majority_event: Enum = Event.NO_MAJORITY + none_event: Enum = Event.NONE collection_key = get_name(SynchronizedData.participant_to_staking_kpi) selection_key = ( get_name(SynchronizedData.tx_submitter), @@ -313,6 +326,7 @@ class GetPositionsRound(CollectSameUntilThresholdRound): synchronized_data_class = SynchronizedData done_event = Event.DONE no_majority_event = Event.NO_MAJORITY + none_event: Enum = Event.NONE collection_key = get_name(SynchronizedData.participant_to_positions_round) selection_key = get_name(SynchronizedData.positions) @@ -327,6 +341,8 @@ class EvaluateStrategyRound(CollectSameUntilThresholdRound): payload_class = EvaluateStrategyPayload synchronized_data_class = SynchronizedData done_event = Event.DONE + none_event: Enum = Event.NONE + no_majority_event = Event.NO_MAJORITY collection_key = get_name(SynchronizedData.participant_to_actions_round) selection_key = get_name(SynchronizedData.actions) @@ -357,6 +373,10 @@ class DecisionMakingRound(CollectSameUntilThresholdRound): settle_event = Event.SETTLE update_event = Event.UPDATE error_event = Event.ERROR + none_event: Enum = Event.NONE + no_majority_event = Event.NO_MAJORITY + collection_key = get_name(SynchronizedData.participant_to_decision_making) + selection_key = (get_name(SynchronizedData.chain_id),) def end_block(self) -> Optional[Tuple[BaseSynchronizedData, Event]]: """Process the end of the block.""" @@ -400,6 +420,11 @@ class PostTxSettlementRound(CollectSameUntilThresholdRound): payload_class = PostTxSettlementPayload synchronized_data_class = SynchronizedData + done_event = Event.DONE + none_event: Enum = Event.NONE + no_majority_event = Event.NO_MAJORITY + collection_key = get_name(SynchronizedData.participant_to_post_tx_settlement) + selection_key = (get_name(SynchronizedData.chain_id),) def end_block(self) -> Optional[Tuple[BaseSynchronizedData, Enum]]: """Process the end of the block.""" @@ -466,6 +491,7 @@ class LiquidityTraderAbciApp(AbciApp[Event]): Event.SERVICE_EVICTED: GetPositionsRound, Event.ROUND_TIMEOUT: CallCheckpointRound, Event.NO_MAJORITY: CallCheckpointRound, + Event.NONE: CallCheckpointRound, }, CheckStakingKPIMetRound: { Event.DONE: GetPositionsRound, @@ -475,17 +501,20 @@ class LiquidityTraderAbciApp(AbciApp[Event]): Event.NO_MAJORITY: CheckStakingKPIMetRound, Event.STAKING_KPI_NOT_MET: GetPositionsRound, Event.ERROR: GetPositionsRound, + Event.NONE: CheckStakingKPIMetRound, }, GetPositionsRound: { Event.DONE: EvaluateStrategyRound, Event.NO_MAJORITY: GetPositionsRound, Event.ROUND_TIMEOUT: GetPositionsRound, + Event.NONE: GetPositionsRound, }, EvaluateStrategyRound: { Event.DONE: DecisionMakingRound, Event.NO_MAJORITY: EvaluateStrategyRound, Event.ROUND_TIMEOUT: EvaluateStrategyRound, Event.WAIT: FinishedEvaluateStrategyRound, + Event.NONE: EvaluateStrategyRound, }, DecisionMakingRound: { Event.DONE: FinishedDecisionMakingRound, @@ -494,6 +523,7 @@ class LiquidityTraderAbciApp(AbciApp[Event]): Event.ROUND_TIMEOUT: DecisionMakingRound, Event.SETTLE: FinishedTxPreparationRound, Event.UPDATE: DecisionMakingRound, + Event.NONE: DecisionMakingRound, }, PostTxSettlementRound: { Event.ACTION_EXECUTED: DecisionMakingRound, @@ -501,6 +531,9 @@ class LiquidityTraderAbciApp(AbciApp[Event]): Event.VANITY_TX_EXECUTED: CheckStakingKPIMetRound, Event.ROUND_TIMEOUT: PostTxSettlementRound, Event.UNRECOGNIZED: FailedMultiplexerRound, + Event.DONE: PostTxSettlementRound, + Event.NONE: PostTxSettlementRound, + Event.NO_MAJORITY: PostTxSettlementRound, }, FinishedEvaluateStrategyRound: {}, FinishedTxPreparationRound: {}, diff --git a/packages/valory/skills/liquidity_trader_abci/skill.yaml b/packages/valory/skills/liquidity_trader_abci/skill.yaml index 217b966..9d14b54 100644 --- a/packages/valory/skills/liquidity_trader_abci/skill.yaml +++ b/packages/valory/skills/liquidity_trader_abci/skill.yaml @@ -7,37 +7,38 @@ license: Apache-2.0 aea_version: '>=1.0.0, <2.0.0' fingerprint: __init__.py: bafybeia7bn2ahqqwkf63ptje6rfnftuwrsp33sswgpcbh5osbesxxr6g4m - behaviours.py: bafybeidjzfcuxv7nazzflbzwzb7qiihxkyjcvhx6762v6il6evert33epi + behaviours.py: bafybeif62wbf2sf4hfwwujdvk3qhu7paw6oa77mahyoe5in65ki7m46b74 dialogues.py: bafybeiay23otskx2go5xhtgdwfw2kd6rxd62sxxdu3njv7hageorl5zxzm - fsm_specification.yaml: bafybeiabbiulb7k6xkjysulmy6o4ugnhxlpp5jiaeextvwj65q4ttadoeq - handlers.py: bafybeidxw2lvgiifmo4siobpwuwbxscuifrdo3gnkjyn6bgexotj5f7zf4 - models.py: bafybeicfw4yk5atz456qt6urbkyhmav2lbchy3bu3rcv2zezmsqj2zxk3y + fsm_specification.yaml: bafybeie3vom7fwl5ho6xanje3r7tab7y3a5ij5gs6qvjh2uavbpitffyzu + handlers.py: bafybeih2zlmkyntlr7zx4mokqkmpcw7qczfbo47g766kndbv7zv7oqjv6e + io_/__init__.py: bafybeifxgmmwjqzezzn3e6keh2bfo4cyo7y5dq2ept3stfmgglbrzfl5rq + io_/loader.py: bafybeiaoi7rnmpoyreuhwdo3biudqnjnrc25eu54ehyvsnynlkbzk7r6ti + models.py: bafybeiawwchc6n64uifd6aubc74mfsgamhkzcwc5ufq75a65d25ympcdgu payloads.py: bafybeie5tbx3lqcklwfqdqft5t33oluvkltnbjqavhj3ddjjblocyq62qm pool_behaviour.py: bafybeiaheuesscgqzwjbpyrezgwpdbdfurlmfwbc462qv6rblwwxlx5dpm pools/balancer.py: bafybeigznhgv7ylo5dvlhxcqikhiuqlqtnx3ikv4tszyvkl2lpcuqgoa5u pools/uniswap.py: bafybeigmqptgmjaxscszohfusgxsexqyx4awuyw7p4g5l7k2qpeyq7vdcu - rounds.py: bafybeifncouov6hhpfx2yihtapl5lgn5rn3nojhifwsdlclrtgv7bnldfu - strategies/simple_strategy.py: bafybeiasu2nchowx6leksjllpuum4ckezxoj4o2m4sstavblplvvutmvzm - strategy_behaviour.py: bafybeidk6sorg47kuuubamcccksi65x3txldyo7y2hm5opbye2ghmz2ljy + rounds.py: bafybeidbh4cetttbn4nvti6ftwlrgfnfs5xtuo3i26qfphodrlcaqlibra fingerprint_ignore_patterns: [] connections: [] contracts: -- valory/gnosis_safe:0.1.0:bafybeib375xmvcplw7ageic2np3hq4yqeijrvd5kl7rrdnyvswats6ngmm -- valory/balancer_weighted_pool:0.1.0:bafybeidyjlrlq3jrbackewedwt5irokhjupxgpqfgur2ri426cap2oqt7a -- valory/balancer_vault:0.1.0:bafybeie6twptrkqddget7pjijzob2c4jqmrrtpkwombneh35xx56djz4ru -- valory/erc20:0.1.0:bafybeiav4gh7lxfnwp4f7oorkbvjxrdsgjgyhl43rgbblaugtl76zlx7vy +- valory/gnosis_safe:0.1.0:bafybeihtqcpqthb37msgqabpzcc2xc3l3yzkp5pl2sodeghqyzzzyuevgi +- valory/balancer_weighted_pool:0.1.0:bafybeib755ksie5yv4wn6jl7i3bpshlhscf4bzsabqrbahm6b3m5ixzmbi +- valory/balancer_vault:0.1.0:bafybeidgdivmrm77yotgpnn567ayzhoqa6hufrijy2cj2b7w5wa63otzq4 +- valory/erc20:0.1.0:bafybeied2jjdqbcmddaop5b364brpoxatxcypj3gfvpov2ts4c4shoybee - valory/multisend:0.1.0:bafybeig5byt5urg2d2bsecufxe5ql7f4mezg3mekfleeh32nmuusx66p4y -- valory/uniswap_v3_non_fungible_position_manager:0.1.0:bafybeigadr3nyx6tkrual7oqn2qiup35addfevromxjzzlvkiukpyhtz6y -- valory/uniswap_v3_pool:0.1.0:bafybeih64nqgwlverl2tubnkymtlvewngn2pthzzfjewvxpk7dt2im6gza -- valory/merkl_distributor:0.1.0:bafybeihaqsvmncuzmwv2r6iuzc5t7ur6ugdhephz7ydftypksjidpsylbq -- valory/staking_token:0.1.0:bafybeifrvtkofw5c26b3irm6izqfdpik6vpjhm6hqwcdzx333h6vhdanai -- valory/staking_activity_checker:0.1.0:bafybeibjzsi2r5b6xd4iwl4wbwldptnynryzsdpifym4mkv32ynswx22ou +- valory/uniswap_v3_non_fungible_position_manager:0.1.0:bafybeiht7qjxkamjmq22o74f5faz3wqpb3cx2grl2t4zc2zxqjkzitc22a +- valory/uniswap_v3_pool:0.1.0:bafybeieafb3ldbbshtbfqqwblc5gzcwq4nkxgyjz3n3vvcb3jfxzfgchya +- valory/merkl_distributor:0.1.0:bafybeiegvzycswa7kdimhnjvhrtbrzu3zycnianhrdizq5i53ql7jf5poa +- valory/staking_token:0.1.0:bafybeic4ug4p22q4hsh5z4hhjrishvnswino2fsleqsgdxlusd5h2x5hwy +- valory/staking_activity_checker:0.1.0:bafybeidziyf4o763sw3fqlqjbpz3thrupuwx44barj72zj7tjnxbvkhoxa protocols: - valory/contract_api:1.0.0:bafybeidgu7o5llh26xp3u3ebq3yluull5lupiyeu6iooi2xyymdrgnzq5i - valory/ledger_api:1.0.0:bafybeihdk6psr4guxmbcrc26jr2cbgzpd5aljkqvpwo64bvaz7tdti2oni +- valory/ipfs:0.1.0:bafybeiftxi2qhreewgsc5wevogi7yc5g6hbcbo4uiuaibauhv3nhfcdtvm skills: -- valory/abstract_round_abci:0.1.0:bafybeiajjzuh6vf23crp55humonknirvv2f4s3dmdlfzch6tc5ow52pcgm -- valory/transaction_settlement_abci:0.1.0:bafybeielv6eivt2z6nforq43xewl2vmpfwpdu2s2vfogobziljnwsclmlm +- valory/abstract_round_abci:0.1.0:bafybeigjddhk7epta7xpnfvv426xedff5abh4xlkwi6cqgp4vkutgkvydm +- valory/transaction_settlement_abci:0.1.0:bafybeifmgmwdkx4esemxjacjwzqkqymkuklb5nehkwqkx7v335fllgswcq behaviours: main: args: {} @@ -109,6 +110,7 @@ models: voting_power: '10' history_check_timeout: 1205 ipfs_domain_name: null + ipfs_address: https://gateway.autonolas.tech/ipfs/ keeper_allowed_retries: 3 keeper_timeout: 30.0 max_attempts: 10 @@ -143,31 +145,31 @@ models: serious_slash_unit_amount: 8000000000000000 tx_timeout: 10.0 validate_timeout: 1205 - multisend_batch_size: 50 multisend_address: '0x80f29f3f7e10C80CBcF11A74B1AC631397C5a385' allowed_dexs: - balancerPool initial_assets: '{"ethereum":{"0x0000000000000000000000000000000000000000":"eth","0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48":"usdc"}}' - safe_contract_addresses: '{"ethereum":"0x0000000000000000000000000000000000000000","arbitrum":"0x0000000000000000000000000000000000000000","optimism":"0x0000000000000000000000000000000000000000"}' + safe_contract_addresses: '{"ethereum":"0x0000000000000000000000000000000000000000","arbitrum":"0x0000000000000000000000000000000000000000","optimism":"0x0000000000000000000000000000000000000000","mode":"0x0000000000000000000000000000000000000000"}' allowed_chains: - base - optimism + - mode gas_reserve: '{"ethereum":1,"optimism":10,"arbitrum":42161}' round_threshold: 5 apr_threshold: 5 min_balance_multiplier: 5 - multisend_contract_addresses: '{"ethereum":"0xA238CBeb142c10Ef7Ad8442C6D1f9E89e07e7761","optimism":"0xbE5b0013D2712DC4faF07726041C27ecFdBC35AD"}' + multisend_contract_addresses: '{"ethereum":"0xA238CBeb142c10Ef7Ad8442C6D1f9E89e07e7761","optimism":"0xbE5b0013D2712DC4faF07726041C27ecFdBC35AD","base":"0x998739BFdAAdde7C933B942a68053933098f9EDa","mode":"0x998739BFdAAdde7C933B942a68053933098f9EDa"}' lifi_advance_routes_url: https://li.quest/v1/advanced/routes lifi_fetch_step_transaction_url: https://li.quest/v1/advanced/stepTransaction lifi_check_status_url: https://li.quest/v1/status slippage_for_swap: 0.08 - balancer_vault_contract_addresses: '{"optimism":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","base":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"}' + balancer_vault_contract_addresses: '{"optimism":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","base":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","mode":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"}' uniswap_position_manager_contract_addresses: '{"optimism":"0xC36442b4a4522E871399CD717aBDD847Ab11FE88","base":"0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1"}' - chain_to_chain_key_mapping: '{"optimism":"opt","base":"bas"}' + chain_to_chain_key_mapping: '{"optimism":"opt","base":"bas","mode":"mod"}' waiting_period_for_status_check: 5 max_num_of_retries: 5 reward_claiming_time_period: 28800 - merkl_distributor_contract_addresses: '{"optimism":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae","base":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae"}' + merkl_distributor_contract_addresses: '{"optimism":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae","base":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae","mode":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae"}' intermediate_tokens: '{"ethereum":{"0x0000000000000000000000000000000000000000":{"symbol":"ETH","liquidity_provider":"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"},"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2":{"symbol":"WETH","liquidity_provider":"0xF04a5cC80B1E94C69B48f5ee68a08CD2F09A7c3E"},"0xdAC17F958D2ee523a2206206994597C13D831ec7":{"symbol":"USDT","liquidity_provider":"0xcEe284F754E854890e311e3280b767F80797180d"},"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48":{"symbol":"USDC","liquidity_provider":"0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640"},"0x6B175474E89094C44Da98b954EedeAC495271d0F":{"symbol":"DAI","liquidity_provider":"0x517F9dD285e75b599234F7221227339478d0FcC8"},"0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84":{"symbol":"stETH","liquidity_provider":"0x4028DAAC072e492d34a3Afdbef0ba7e35D8b55C4"},"0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0":{"symbol":"wstETH","liquidity_provider":"0x109830a1AAaD605BbF02a9dFA7B0B92EC2FB7dAa"},"0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599":{"symbol":"WBTC","liquidity_provider":"0xCBCdF9626bC03E24f779434178A73a0B4bad62eD"},"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984":{"symbol":"UNI","liquidity_provider":"0x1d42064Fc4Beb5F8aAF85F4617AE8b3b5B8Bd801"}},"optimism":{"0x0000000000000000000000000000000000000000":{"symbol":"ETH","liquidity_provider":"0x4200000000000000000000000000000000000006"},"0x7F5c764cBc14f9669B88837ca1490cCa17c31607":{"symbol":"USDC.e","liquidity_provider":"0xD1F1baD4c9E6c44DeC1e9bF3B94902205c5Cd6C3"},"0x4200000000000000000000000000000000000006":{"symbol":"WETH","liquidity_provider":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"},"0x94b008aA00579c1307B0EF2c499aD98a8ce58e58":{"symbol":"USDT","liquidity_provider":"0xA73C628eaf6e283E26A7b1f8001CF186aa4c0E8E"},"0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1":{"symbol":"DAI","liquidity_provider":"0x03aF20bDAaFfB4cC0A521796a223f7D85e2aAc31"},"0x1F32b1c2345538c0c6f582fCB022739c4A194Ebb":{"symbol":"wstETH","liquidity_provider":"0x04F6C85A1B00F6D9B75f91FD23835974Cc07E65c"},"0x68f180fcCe6836688e9084f035309E29Bf0A2095":{"symbol":"WBTC","liquidity_provider":"0x078f358208685046a11C85e8ad32895DED33A249"},"0x76FB31fb4af56892A25e32cFC43De717950c9278":{"symbol":"AAVE","liquidity_provider":"0xf329e36C7bF6E5E86ce2150875a84Ce77f477375"},"0x4200000000000000000000000000000000000042":{"symbol":"OP","liquidity_provider":"0x2A82Ae142b2e62Cb7D10b55E323ACB1Cab663a26"}},"base":{"0x0000000000000000000000000000000000000000":{"symbol":"ETH","liquidity_provider":"0xd0b53D9277642d899DF5C87A3966A349A798F224"},"0x4200000000000000000000000000000000000006":{"symbol":"WETH","liquidity_provider":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"},"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913":{"symbol":"USDC","liquidity_provider":"0x0B0A5886664376F59C351ba3f598C8A8B4D0A6f3"},"0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA":{"symbol":"USDbC","liquidity_provider":"0x0B25c51637c43decd6CC1C1e3da4518D54ddb528"},"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb":{"symbol":"DAI","liquidity_provider":"0x927860797d07b1C46fbBe7f6f73D45C7E1BFBb27"},"0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452":{"symbol":"wstETH","liquidity_provider":"0x99CBC45ea5bb7eF3a5BC08FB1B7E56bB2442Ef0D"},"0xB6fe221Fe9EeF5aBa221c348bA20A1Bf5e73624c":{"symbol":"rETH","liquidity_provider":"0x95Fa1ddc9a78273f795e67AbE8f1Cd2Cd39831fF"},"0x532f27101965dd16442E59d40670FaF5eBB142E4":{"symbol":"BRETT","liquidity_provider":"0xBA3F945812a83471d709BCe9C3CA699A19FB46f7"}}}' lifi_fetch_tools_url: https://li.quest/v1/tools merkl_user_rewards_url: https://api.merkl.xyz/v3/userRewards @@ -175,7 +177,7 @@ models: tenderly_access_key: access_key tenderly_account_slug: account_slug tenderly_project_slug: project_slug - chain_to_chain_id_mapping: '{"optimism":10,"base":8453,"ethereum":1}' + chain_to_chain_id_mapping: '{"optimism":10,"base":8453,"ethereum":1,"mode":34443}' staking_token_contract_address: '0x63C2c53c09dE534Dd3bc0b7771bf976070936bAC' staking_activity_checker_contract_address: '0x7Fd1F4b764fA41d19fe3f63C85d12bf64d2bbf68' staking_threshold_period: 5 @@ -187,7 +189,24 @@ models: min_swap_amount_threshold: 10 max_fee_percentage: 0.02 max_gas_percentage: 0.1 - balancer_graphql_endpoints: '{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest"}' + balancer_graphql_endpoints: '{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest","mode":"https://api.studio.thegraph.com/query/75376/balancer-mode-v2/version/latest"}' + target_investment_chains: + - base + - optimism + - mode + staking_chain: optimism + gas_params: + max_fee_per_gas: 20000000 + max_priority_fee_per_gas: 3000000 + file_hash_to_strategies: '{"bafybeiez4r4yv3so2j33opdywov6y7sbl65j5ew5n53vidqzhj2jicu3yy":"merkl_pools_search","bafybeighu2qmxopdbgk6orx45fea3ka7jwf657ihasem6jexpmg7xpe7ha":"max_apr_selection"}' + strategies_kwargs: '{"merkl_pools_search":[["balancer_graphql_endpoints",{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest","mode":"https://api.studio.thegraph.com/query/75376/balancer-mode-v2/version/latest"}],["merkl_fetch_campaign_args",{"url":"https://api.merkl.xyz/v3/campaigns","creator":"","live":"false"}]]}' + selected_strategies: + - merkl_pools_search + selected_protocols: + - balancer + - uniswap + selected_hyper_strategy: max_apr_selection + service_endpoint_base: https://optimus.staging.autonolas.tech/ class_name: Params coingecko: args: @@ -197,7 +216,7 @@ models: requests_per_minute: 30 credits: 10000 rate_limited_code: 429 - chain_to_platform_id_mapping: '{"optimism":"optimistic-ethereum","base":"base","ethereum":"ethereum"}' + chain_to_platform_id_mapping: '{"optimism":"optimistic-ethereum","base":"base","ethereum":"ethereum","mode":"mode"}' class_name: Coingecko requests: args: {} @@ -217,5 +236,7 @@ dependencies: eth_abi: version: ==4.0.0 eth_utils: {} + pyyaml: + version: <=6.0.1,>=3.10 is_abstract: true customs: [] diff --git a/packages/valory/skills/liquidity_trader_abci/strategies/simple_strategy.py b/packages/valory/skills/liquidity_trader_abci/strategies/simple_strategy.py deleted file mode 100644 index 89e457e..0000000 --- a/packages/valory/skills/liquidity_trader_abci/strategies/simple_strategy.py +++ /dev/null @@ -1,45 +0,0 @@ -"""This package contains the implemenatation of the SimpleStrategyBehaviour class.""" - -from abc import ABC -from typing import Any - -from packages.valory.skills.liquidity_trader_abci.strategy_behaviour import ( - StrategyBehaviour, -) - - -class SimpleStrategyBehaviour(StrategyBehaviour, ABC): - """SimpleStrategyBehaviour""" - - def __init__(self, **kwargs: Any) -> None: - """Initialize the simple strategy behaviour.""" - super().__init__(**kwargs) - - def get_decision(self, **kwargs: Any) -> bool: - """Get decision on whether to enter a pool""" - pool_apr = kwargs.get("pool_apr") - """Get decision""" - - if not pool_apr: - self.context.logger.error("Pool APR cannot be None") - return False - - if not self._is_apr_threshold_exceeded(pool_apr): - return False - - # TO-DO: Decide on the correct method/logic for maintaining the period number for the last transaction. - # if not self._is_round_threshold_exceeded(): # noqa: E800 - # self.context.logger.info("Round threshold not exceeded") # noqa: E800 - # return False # noqa: E800 - - return True - - def _is_apr_threshold_exceeded(self, pool_apr) -> bool: - """Check if the highest APR exceeds the threshold""" - if pool_apr > self.params.apr_threshold: - return True - else: - self.context.logger.info( - f"APR of selected pool that is {pool_apr} does not exceed APR threshold {self.params.apr_threshold}." - ) - return False diff --git a/packages/valory/skills/optimus_abci/fsm_specification.yaml b/packages/valory/skills/optimus_abci/fsm_specification.yaml index 81b20ff..9d164ed 100644 --- a/packages/valory/skills/optimus_abci/fsm_specification.yaml +++ b/packages/valory/skills/optimus_abci/fsm_specification.yaml @@ -58,6 +58,7 @@ states: transition_func: (CallCheckpointRound, DONE): CheckStakingKPIMetRound (CallCheckpointRound, NEXT_CHECKPOINT_NOT_REACHED_YET): CheckStakingKPIMetRound + (CallCheckpointRound, NONE): CallCheckpointRound (CallCheckpointRound, NO_MAJORITY): CallCheckpointRound (CallCheckpointRound, ROUND_TIMEOUT): CallCheckpointRound (CallCheckpointRound, SERVICE_EVICTED): GetPositionsRound @@ -71,6 +72,7 @@ transition_func: (CheckLateTxHashesRound, NO_MAJORITY): ResetAndPauseRound (CheckStakingKPIMetRound, DONE): GetPositionsRound (CheckStakingKPIMetRound, ERROR): GetPositionsRound + (CheckStakingKPIMetRound, NONE): CheckStakingKPIMetRound (CheckStakingKPIMetRound, NO_MAJORITY): CheckStakingKPIMetRound (CheckStakingKPIMetRound, ROUND_TIMEOUT): CheckStakingKPIMetRound (CheckStakingKPIMetRound, SETTLE): RandomnessTransactionSubmissionRound @@ -87,11 +89,13 @@ transition_func: (CollectSignatureRound, ROUND_TIMEOUT): CollectSignatureRound (DecisionMakingRound, DONE): ResetAndPauseRound (DecisionMakingRound, ERROR): ResetAndPauseRound + (DecisionMakingRound, NONE): DecisionMakingRound (DecisionMakingRound, NO_MAJORITY): DecisionMakingRound (DecisionMakingRound, ROUND_TIMEOUT): DecisionMakingRound (DecisionMakingRound, SETTLE): RandomnessTransactionSubmissionRound (DecisionMakingRound, UPDATE): DecisionMakingRound (EvaluateStrategyRound, DONE): DecisionMakingRound + (EvaluateStrategyRound, NONE): EvaluateStrategyRound (EvaluateStrategyRound, NO_MAJORITY): EvaluateStrategyRound (EvaluateStrategyRound, ROUND_TIMEOUT): EvaluateStrategyRound (EvaluateStrategyRound, WAIT): ResetAndPauseRound @@ -102,14 +106,19 @@ transition_func: (FinalizationRound, FINALIZE_TIMEOUT): SelectKeeperTransactionSubmissionBAfterTimeoutRound (FinalizationRound, INSUFFICIENT_FUNDS): SelectKeeperTransactionSubmissionBRound (GetPositionsRound, DONE): EvaluateStrategyRound + (GetPositionsRound, NONE): GetPositionsRound (GetPositionsRound, NO_MAJORITY): GetPositionsRound (GetPositionsRound, ROUND_TIMEOUT): GetPositionsRound (PostTxSettlementRound, ACTION_EXECUTED): DecisionMakingRound (PostTxSettlementRound, CHECKPOINT_TX_EXECUTED): CallCheckpointRound + (PostTxSettlementRound, DONE): PostTxSettlementRound + (PostTxSettlementRound, NONE): PostTxSettlementRound + (PostTxSettlementRound, NO_MAJORITY): PostTxSettlementRound (PostTxSettlementRound, ROUND_TIMEOUT): PostTxSettlementRound (PostTxSettlementRound, UNRECOGNIZED): ResetAndPauseRound (PostTxSettlementRound, VANITY_TX_EXECUTED): CheckStakingKPIMetRound (RandomnessTransactionSubmissionRound, DONE): SelectKeeperTransactionSubmissionARound + (RandomnessTransactionSubmissionRound, NONE): RandomnessTransactionSubmissionRound (RandomnessTransactionSubmissionRound, NO_MAJORITY): RandomnessTransactionSubmissionRound (RandomnessTransactionSubmissionRound, ROUND_TIMEOUT): RandomnessTransactionSubmissionRound (RegistrationRound, DONE): CallCheckpointRound diff --git a/packages/valory/skills/optimus_abci/handlers.py b/packages/valory/skills/optimus_abci/handlers.py index 066ac94..b6965d3 100644 --- a/packages/valory/skills/optimus_abci/handlers.py +++ b/packages/valory/skills/optimus_abci/handlers.py @@ -41,9 +41,6 @@ from packages.valory.skills.abstract_round_abci.handlers import ( HttpHandler as BaseHttpHandler, ) -from packages.valory.skills.abstract_round_abci.handlers import ( - IpfsHandler as BaseIpfsHandler, -) from packages.valory.skills.abstract_round_abci.handlers import ( LedgerApiHandler as BaseLedgerApiHandler, ) @@ -53,6 +50,9 @@ from packages.valory.skills.abstract_round_abci.handlers import ( TendermintHandler as BaseTendermintHandler, ) +from packages.valory.skills.liquidity_trader_abci.handlers import ( + IpfsHandler as BaseIpfsHandler, +) from packages.valory.skills.liquidity_trader_abci.rounds import SynchronizedData from packages.valory.skills.optimus_abci.dialogues import HttpDialogue, HttpDialogues from packages.valory.skills.optimus_abci.models import SharedState diff --git a/packages/valory/skills/optimus_abci/skill.yaml b/packages/valory/skills/optimus_abci/skill.yaml index 17e6260..5a90d26 100644 --- a/packages/valory/skills/optimus_abci/skill.yaml +++ b/packages/valory/skills/optimus_abci/skill.yaml @@ -10,8 +10,8 @@ fingerprint: behaviours.py: bafybeig3agtm256pl7rekx3i3kbz6h5hrnneu44f4pzkqp4mwtdxuob54e composition.py: bafybeigxpycqh7xnqwdj5eg2ln6kqchbwvwuvzjtpwhgylr6qb56ooo7wu dialogues.py: bafybeiafoomno5pn6qrx43jxf2opxkil5eg4nod6jhd5oqwwplfz4x6dke - fsm_specification.yaml: bafybeiehe6ps7xi7i7tu4mduid7vbvszhsiu5juyard24i3nhtqgljpcza - handlers.py: bafybeialrna77uoojfkq6m3liu6iewey4cvowkvkeaih54krp4bhnyhvum + fsm_specification.yaml: bafybeihzhlhigw5qcncirnnxpazcb4qbvpgk6emms4vi2wtgyzfomkr53a + handlers.py: bafybeicyu4bsubv2rnrhnx76wjt23oqbhaqihjaulrlshxygwicv4ml5la models.py: bafybeieeq64gdcpri2lcj3yvrvsp6edgg52vx53shqd3wxskekhhn2s5xy fingerprint_ignore_patterns: [] connections: @@ -20,12 +20,12 @@ contracts: [] protocols: - valory/http:1.0.0:bafybeifugzl63kfdmwrxwphrnrhj7bn6iruxieme3a4ntzejf6kmtuwmae skills: -- valory/abstract_round_abci:0.1.0:bafybeiajjzuh6vf23crp55humonknirvv2f4s3dmdlfzch6tc5ow52pcgm -- valory/registration_abci:0.1.0:bafybeiffipsowrqrkhjoexem7ern5ob4fabgif7wa6gtlszcoaop2e3oey -- valory/reset_pause_abci:0.1.0:bafybeif4lgvbzsmzljesxbphycdv52ka7qnihyjrjpfaseclxadcmm6yiq -- valory/termination_abci:0.1.0:bafybeiekkpo5qef5zaeagm3si6v45qxcojvtjqe4a5ceccvk4q7k3xi3bi -- valory/liquidity_trader_abci:0.1.0:bafybeihtca6gtyjibj6wkrcdmx3fb3a3bkpdgsphwevkatagxrbqvh6fd4 -- valory/transaction_settlement_abci:0.1.0:bafybeielv6eivt2z6nforq43xewl2vmpfwpdu2s2vfogobziljnwsclmlm +- valory/abstract_round_abci:0.1.0:bafybeigjddhk7epta7xpnfvv426xedff5abh4xlkwi6cqgp4vkutgkvydm +- valory/registration_abci:0.1.0:bafybeiagi6e2h7kochmlemy5c5yk6hwn37tfxiqvk2en74jhowsdwlmrny +- valory/reset_pause_abci:0.1.0:bafybeiezfedmmseox3ce5aucxsiszdmvskrwwbtpb2a3vw3sbmc5jt7nri +- valory/termination_abci:0.1.0:bafybeiea67epwwgngp7b3wavs6hpkaxv6etyaps6g6325bchfnf354mibq +- valory/liquidity_trader_abci:0.1.0:bafybeidfg3auronrhdd6yxrkqkeop5vjh4vqzhiuhghtlvnupe26rwepre +- valory/transaction_settlement_abci:0.1.0:bafybeifmgmwdkx4esemxjacjwzqkqymkuklb5nehkwqkx7v335fllgswcq behaviours: main: args: {} @@ -131,35 +131,32 @@ models: slash_threshold_amount: 10000000000000000 light_slash_unit_amount: 5000000000000000 serious_slash_unit_amount: 8000000000000000 - default_chain_id: ethereum - multisend_batch_size: 50 multisend_address: '0x80f29f3f7e10C80CBcF11A74B1AC631397C5a385' tx_timeout: 10.0 - ipfs_address: https://gateway.autonolas.tech/ipfs/ - service_endpoint_base: https://optimus.staging.autonolas.tech/ allowed_dexs: - balancerPool initial_assets: '{"ethereum":{"0x0000000000000000000000000000000000000000":"eth","0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48":"usdc"}}' - safe_contract_addresses: '{"ethereum":"0x0000000000000000000000000000000000000000","arbitrum":"0x0000000000000000000000000000000000000000","optimism":"0x0000000000000000000000000000000000000000"}' + safe_contract_addresses: '{"ethereum":"0x0000000000000000000000000000000000000000","arbitrum":"0x0000000000000000000000000000000000000000","optimism":"0x0000000000000000000000000000000000000000","mode":"0x0000000000000000000000000000000000000000"}' allowed_chains: - base - optimism + - mode gas_reserve: '{"ethereum":1,"optimism":10,"arbitrum":42161}' round_threshold: 5 apr_threshold: 5 min_balance_multiplier: 5 - multisend_contract_addresses: '{"ethereum":"0xA238CBeb142c10Ef7Ad8442C6D1f9E89e07e7761","optimism":"0xbE5b0013D2712DC4faF07726041C27ecFdBC35AD"}' + multisend_contract_addresses: '{"ethereum":"0xA238CBeb142c10Ef7Ad8442C6D1f9E89e07e7761","optimism":"0xbE5b0013D2712DC4faF07726041C27ecFdBC35AD","base":"0x998739BFdAAdde7C933B942a68053933098f9EDa","mode":"0x998739BFdAAdde7C933B942a68053933098f9EDa"}' lifi_advance_routes_url: https://li.quest/v1/advanced/routes lifi_fetch_step_transaction_url: https://li.quest/v1/advanced/stepTransaction lifi_check_status_url: https://li.quest/v1/status slippage_for_swap: 0.08 - balancer_vault_contract_addresses: '{"optimism":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","base":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"}' + balancer_vault_contract_addresses: '{"optimism":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","base":"0xBA12222222228d8Ba445958a75a0704d566BF2C8","mode":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"}' uniswap_position_manager_contract_addresses: '{"optimism":"0xC36442b4a4522E871399CD717aBDD847Ab11FE88","base":"0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1"}' - chain_to_chain_key_mapping: '{"optimism":"opt","base":"bas"}' + chain_to_chain_key_mapping: '{"optimism":"opt","base":"bas","mode":"mod"}' waiting_period_for_status_check: 5 max_num_of_retries: 5 reward_claiming_time_period: 28800 - merkl_distributor_contract_addresses: '{"optimism":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae","base":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae"}' + merkl_distributor_contract_addresses: '{"optimism":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae","base":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae","mode":"0x3Ef3D8bA38EBe18DB133cEc108f4D14CE00Dd9Ae"}' intermediate_tokens: '{"ethereum":{"0x0000000000000000000000000000000000000000":{"symbol":"ETH","liquidity_provider":"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"},"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2":{"symbol":"WETH","liquidity_provider":"0xF04a5cC80B1E94C69B48f5ee68a08CD2F09A7c3E"},"0xdAC17F958D2ee523a2206206994597C13D831ec7":{"symbol":"USDT","liquidity_provider":"0xcEe284F754E854890e311e3280b767F80797180d"},"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48":{"symbol":"USDC","liquidity_provider":"0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640"},"0x6B175474E89094C44Da98b954EedeAC495271d0F":{"symbol":"DAI","liquidity_provider":"0x517F9dD285e75b599234F7221227339478d0FcC8"},"0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84":{"symbol":"stETH","liquidity_provider":"0x4028DAAC072e492d34a3Afdbef0ba7e35D8b55C4"},"0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0":{"symbol":"wstETH","liquidity_provider":"0x109830a1AAaD605BbF02a9dFA7B0B92EC2FB7dAa"},"0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599":{"symbol":"WBTC","liquidity_provider":"0xCBCdF9626bC03E24f779434178A73a0B4bad62eD"},"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984":{"symbol":"UNI","liquidity_provider":"0x1d42064Fc4Beb5F8aAF85F4617AE8b3b5B8Bd801"}},"optimism":{"0x0000000000000000000000000000000000000000":{"symbol":"ETH","liquidity_provider":"0x4200000000000000000000000000000000000006"},"0x7F5c764cBc14f9669B88837ca1490cCa17c31607":{"symbol":"USDC.e","liquidity_provider":"0xD1F1baD4c9E6c44DeC1e9bF3B94902205c5Cd6C3"},"0x4200000000000000000000000000000000000006":{"symbol":"WETH","liquidity_provider":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"},"0x94b008aA00579c1307B0EF2c499aD98a8ce58e58":{"symbol":"USDT","liquidity_provider":"0xA73C628eaf6e283E26A7b1f8001CF186aa4c0E8E"},"0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1":{"symbol":"DAI","liquidity_provider":"0x03aF20bDAaFfB4cC0A521796a223f7D85e2aAc31"},"0x1F32b1c2345538c0c6f582fCB022739c4A194Ebb":{"symbol":"wstETH","liquidity_provider":"0x04F6C85A1B00F6D9B75f91FD23835974Cc07E65c"},"0x68f180fcCe6836688e9084f035309E29Bf0A2095":{"symbol":"WBTC","liquidity_provider":"0x078f358208685046a11C85e8ad32895DED33A249"},"0x76FB31fb4af56892A25e32cFC43De717950c9278":{"symbol":"AAVE","liquidity_provider":"0xf329e36C7bF6E5E86ce2150875a84Ce77f477375"},"0x4200000000000000000000000000000000000042":{"symbol":"OP","liquidity_provider":"0x2A82Ae142b2e62Cb7D10b55E323ACB1Cab663a26"}},"base":{"0x0000000000000000000000000000000000000000":{"symbol":"ETH","liquidity_provider":"0xd0b53D9277642d899DF5C87A3966A349A798F224"},"0x4200000000000000000000000000000000000006":{"symbol":"WETH","liquidity_provider":"0xBA12222222228d8Ba445958a75a0704d566BF2C8"},"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913":{"symbol":"USDC","liquidity_provider":"0x0B0A5886664376F59C351ba3f598C8A8B4D0A6f3"},"0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA":{"symbol":"USDbC","liquidity_provider":"0x0B25c51637c43decd6CC1C1e3da4518D54ddb528"},"0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb":{"symbol":"DAI","liquidity_provider":"0x927860797d07b1C46fbBe7f6f73D45C7E1BFBb27"},"0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452":{"symbol":"wstETH","liquidity_provider":"0x99CBC45ea5bb7eF3a5BC08FB1B7E56bB2442Ef0D"},"0xB6fe221Fe9EeF5aBa221c348bA20A1Bf5e73624c":{"symbol":"rETH","liquidity_provider":"0x95Fa1ddc9a78273f795e67AbE8f1Cd2Cd39831fF"},"0x532f27101965dd16442E59d40670FaF5eBB142E4":{"symbol":"BRETT","liquidity_provider":"0xBA3F945812a83471d709BCe9C3CA699A19FB46f7"}}}' lifi_fetch_tools_url: https://li.quest/v1/tools merkl_user_rewards_url: https://api.merkl.xyz/v3/userRewards @@ -167,7 +164,7 @@ models: tenderly_access_key: access_key tenderly_account_slug: account_slug tenderly_project_slug: project_slug - chain_to_chain_id_mapping: '{"optimism":10,"base":8453,"ethereum":1}' + chain_to_chain_id_mapping: '{"optimism":10,"base":8453,"ethereum":1,"mode":34443}' staking_token_contract_address: '0x63C2c53c09dE534Dd3bc0b7771bf976070936bAC' staking_activity_checker_contract_address: '0x7Fd1F4b764fA41d19fe3f63C85d12bf64d2bbf68' staking_threshold_period: 5 @@ -179,7 +176,24 @@ models: max_fee_percentage: 0.02 max_gas_percentage: 0.1 merkl_fetch_campaigns_args: '{"url":"https://api.merkl.xyz/v3/campaigns","creator":"","live":"true"}' - balancer_graphql_endpoints: '{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest"}' + balancer_graphql_endpoints: '{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest","mode":"https://api.studio.thegraph.com/query/75376/balancer-mode-v2/version/latest"}' + target_investment_chains: + - base + - optimism + - mode + gas_params: + max_fee_per_gas: 20000000 + max_priority_fee_per_gas: 3000000 + staking_chain: optimism + file_hash_to_strategies: '{"bafybeiez4r4yv3so2j33opdywov6y7sbl65j5ew5n53vidqzhj2jicu3yy":"merkl_pools_search","bafybeighu2qmxopdbgk6orx45fea3ka7jwf657ihasem6jexpmg7xpe7ha":"max_apr_selection"}' + strategies_kwargs: '{"merkl_pools_search":[["balancer_graphql_endpoints",{"optimism":"https://api.studio.thegraph.com/query/75376/balancer-optimism-v2/version/latest","base":"https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest","mode":"https://api.studio.thegraph.com/query/75376/balancer-mode-v2/version/latest"}],["merkl_fetch_campaign_args",{"url":"https://api.merkl.xyz/v3/campaigns","creator":"","live":"false"}]]}' + selected_strategies: + - merkl_pools_search + selected_protocols: + - balancer + - uniswap + selected_hyper_strategy: max_apr_selection + service_endpoint_base: https://optimus.staging.autonolas.tech/ class_name: Params coingecko: args: @@ -189,7 +203,7 @@ models: requests_per_minute: 30 credits: 10000 rate_limited_code: 429 - chain_to_platform_id_mapping: '{"optimism":"optimistic-ethereum","base":"base","ethereum":"ethereum"}' + chain_to_platform_id_mapping: '{"optimism":"optimistic-ethereum","base":"base","ethereum":"ethereum","mode":"mode"}' class_name: Coingecko randomness_api: args: diff --git a/poetry.lock b/poetry.lock index 82b42ae..3322e01 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,112 +13,98 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.10" +version = "3.11.4" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, - {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, - {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, - {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, - {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, - {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, - {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, - {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, - {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, - {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, - {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, - {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, - {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, - {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, - {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, - {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, - {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, - {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, - {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, - {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, - {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, - {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, - {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, - {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, - {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, - {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, - {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, - {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, - {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, - {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, - {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, + {file = "aiohttp-3.11.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60f8206818e3582c999c999c799ab068e14f1870ade47d1fe8536dbfd88010b"}, + {file = "aiohttp-3.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e5786e5926f888ce3a996d38d9c9b8f9306f399edb1f1ca3ce7760dab9b1043c"}, + {file = "aiohttp-3.11.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:262e45dbd7f1829bcb024259f65b2cf69d1ef5b37626af6955a1c487613aeb3a"}, + {file = "aiohttp-3.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:696adff3594bd449e0fe287441062bdc6f5300928426275b39ed27884ba083a7"}, + {file = "aiohttp-3.11.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd1411ecfc070af4df129e81fe42c799d95d81c29c22d2c3e4341d974c38f1a"}, + {file = "aiohttp-3.11.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06defa9017ab50d215446ebbee294e07eb2fcee72d9a909a08192cfacbd43a08"}, + {file = "aiohttp-3.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bc936d10b8fa3f2aa66e59e034085208b588442263400ddb042703d0db99421"}, + {file = "aiohttp-3.11.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:769457243dc4bc902d376cd14c5c7ec234a4faadb4f283dc2738f004cce9a9e1"}, + {file = "aiohttp-3.11.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a360c18b2cb391fec9585ba1efc55150e2fbc6100308113117dfea521e810d8"}, + {file = "aiohttp-3.11.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3e9fd9c11299d6d230eb2669fd1ed0238d33970e36b495b0432ace7f157fc931"}, + {file = "aiohttp-3.11.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0ccbe8ece8a7796ef41b86a3240034c5918d9b324c2ae48fa0be33565e297c64"}, + {file = "aiohttp-3.11.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:9a8b6b3c788a8a6f88f5ce23d729cfde7a2ccebbeb09db0822ef266de0445a27"}, + {file = "aiohttp-3.11.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cbe3e356523d0b336543996f92a0e65f760be82447db21c95c60392c8075ff5c"}, + {file = "aiohttp-3.11.4-cp310-cp310-win32.whl", hash = "sha256:a54424050d1eb36edfef913b1bc8552d52a37864c0ea7df3e1e764663e11053a"}, + {file = "aiohttp-3.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:a51f983d91edae7777b5a2af8e5d83224ba01284502c6874a17647ad6cbf0211"}, + {file = "aiohttp-3.11.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:89261fee04715083ef3b5a0d222b094021793c1728b8ff21da361c79f6384095"}, + {file = "aiohttp-3.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4ef6eb1367046fb22085f10c5c84ea2efd0d836ad8088306d652ab1d743faf9e"}, + {file = "aiohttp-3.11.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d68bb99bc6a4b0a3eceb95a246f5a0262e600e094b5178c2b1ab0f4bcbae6729"}, + {file = "aiohttp-3.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a550b4ff70d06c15057d75ddad89a3e7c496e0609d28c567c20b61cd1265c0a6"}, + {file = "aiohttp-3.11.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b41e0fb3b415beccd6d0c6e5f3ee34b7952cd76120a1db3e45507b83dc5ef81"}, + {file = "aiohttp-3.11.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8feffa8396724116be5bc05bf4fcba0c738cbe908c82a95f71371e32b28cd2ca"}, + {file = "aiohttp-3.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dd5b7947e23a08c70d4c1924809b91211f14136ffd13d303dc487913cfebfeb"}, + {file = "aiohttp-3.11.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab5c6a521b156edef13a57a6d524903c547573ff8101e3d1bbe9ee1b97267973"}, + {file = "aiohttp-3.11.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:010bc9606f798eda8ef071759c7b163893071502bcaedc7d5dc49f9d8f12e553"}, + {file = "aiohttp-3.11.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e7d182164aebad4e2faf2742ee7486d4af73d933461adbd8f183ac9b1837323c"}, + {file = "aiohttp-3.11.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:88e681c0d17bb285d2ccbb73ae77ef86339b632ee7967044c2284411120b9730"}, + {file = "aiohttp-3.11.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0d2cea21ec05b832e9f6a2390b23d32ce5575f6cf4812bd171d4493f59c101fe"}, + {file = "aiohttp-3.11.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:635397b5b4de2397f8136f8fd15c8ebee560e36473195c7aa992ffb8e46acdd3"}, + {file = "aiohttp-3.11.4-cp311-cp311-win32.whl", hash = "sha256:cb2d5a24586b508f658ddd710f7d4b7e4f5656cb5d569aeb1f432c1c3704347a"}, + {file = "aiohttp-3.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:ee081375d10fa2f3f7b0d050c8b9c1ae23190e1d9be256035bf8a41059c4df3a"}, + {file = "aiohttp-3.11.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5cd60673be31449c63f59886f3581478bbdfaddd87e7394a4d73ad134d9be9b9"}, + {file = "aiohttp-3.11.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ff6105856ae688b29d5daaede1256f5e02e9d5cb3059f8f5ef55d975c2e6992"}, + {file = "aiohttp-3.11.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b169507c98b924fd68b82ae366c285daf6d22456835294c329c3226d61e1f69d"}, + {file = "aiohttp-3.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec84106c8b7ff347be06bf579c298a23b6d1d2225c57273a8cd502f257125d4"}, + {file = "aiohttp-3.11.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03d53b0888f984f4f0c216a37577ee7e7b1ed1dac89cdd2fde61bf2ccb32009b"}, + {file = "aiohttp-3.11.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:822dedad93947fcb1096cc41ee8fd32e9f652777561a37c740e5335699f01cea"}, + {file = "aiohttp-3.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aef239c307f3a3f830933d612c0aef4ad4b3aa9ce5233a0954262a00f5c379f1"}, + {file = "aiohttp-3.11.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49eb5a0338f141ef32299d48f1415486f47953d37b0c7fa6d778b73b66f3a7e2"}, + {file = "aiohttp-3.11.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7be4efe60e9bddf78ee165a296e80170147282081e1366f0580cf4cc0fb1182f"}, + {file = "aiohttp-3.11.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66e83a9a1131f0060aaedcc57f1a7e489898b6c3607eededccc7a9f80b95bdb4"}, + {file = "aiohttp-3.11.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a7986fb988314fd2225c1ecab45fd457e1f2c097dcc3c0aacd2a7aec7486beb6"}, + {file = "aiohttp-3.11.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a34c30e1461da3a69c5bdcfce44418b6f969e1e68ebf367edfa5eaab380abf7a"}, + {file = "aiohttp-3.11.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cb4c676ab99ca2dd231928d481e19cd540155dff36e70e613179c4927bd520b8"}, + {file = "aiohttp-3.11.4-cp312-cp312-win32.whl", hash = "sha256:d40d9a740053cb7fef72442fa7bd699060ff4c710971ebdb8dd7c8b36417570f"}, + {file = "aiohttp-3.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:365df6cf2ad144479ba0e0b58abdc5276923676d34da4c1c45613a80d2aac130"}, + {file = "aiohttp-3.11.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f307632f3eaa676f8c2f5df11e4c00ad47dfa79b06cb2fa39156a4e9c6821bdb"}, + {file = "aiohttp-3.11.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cc2d64b1747efa183ced57b6bce53c9ea8e16e53419e389051b2a214ad0ed051"}, + {file = "aiohttp-3.11.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f37ece590451ecffc815f2eb41f07191d1a31a0404361d1ae2ed532e05c86da4"}, + {file = "aiohttp-3.11.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b10b316413c80a4dcc5228c092a8d019e4b75d4efbca8988cb5b67ae9fa56881"}, + {file = "aiohttp-3.11.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:beaed1b2d03033dd301a7b67430f03c8255d6856a269c20995a0292de596519e"}, + {file = "aiohttp-3.11.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:518578d6821c942362daa14a56f26b739abeede6e408b0b83e27dfcde17730f7"}, + {file = "aiohttp-3.11.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1e09bc44a1abbd96f55d15330d6cab80459cb8b06a0b656efd712ce47a3710d"}, + {file = "aiohttp-3.11.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae8480148d696dae49126e97568333fc01493069ad46a94b82f69c7a33197ea"}, + {file = "aiohttp-3.11.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b71aab89800fa2eaeb28923ee05e7e56c28dab4ebdba524db06e963431bf6192"}, + {file = "aiohttp-3.11.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:821c9c640d3dc456c6a7b005e38bc5af05326b6a08ce91a068719934d108a1bb"}, + {file = "aiohttp-3.11.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d60255f3ed71aa14a2e75383543ca31bd362fdc7f0d2eafc060d85a9051598df"}, + {file = "aiohttp-3.11.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9788781f57fb732426ae74b9955b899e677ce42b848e60a11be29358fb20c976"}, + {file = "aiohttp-3.11.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94acecf2eee13a45f627ed25a28f5a7f2db66b90ff94cd7a1e9cc1ad32cddd43"}, + {file = "aiohttp-3.11.4-cp313-cp313-win32.whl", hash = "sha256:d0fd6510c6d67d08ec80d9ba10cd340a8cfb0dd33436c858ed38d4564abb27c7"}, + {file = "aiohttp-3.11.4-cp313-cp313-win_amd64.whl", hash = "sha256:474f7266a61d1c3218ef4ec0325747884b2d5a13fab5bff5dd3b55d9c849406a"}, + {file = "aiohttp-3.11.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfe8646a24856624c1eb7649da99333f0d7e75d9cf7c155ea870957d24b7c63c"}, + {file = "aiohttp-3.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e69d9869df50dd591228c62fbb3923d6124517d6bfc47a804492813888b497be"}, + {file = "aiohttp-3.11.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb4f1fe110332651c00d2df160978cf1be70896ed9e612ff7c7e67955091b2c4"}, + {file = "aiohttp-3.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d97668595bf03299148ea968fed2195cc76ad063aeec8161731aa6a5dbc2f675"}, + {file = "aiohttp-3.11.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c0b3378dc294ad6ec6c038ed57164165e0b83ef5f61eee72f6eefccd7df34b8"}, + {file = "aiohttp-3.11.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0898a77298dc24eef368511d98e551e0b2db293fa9b40c982f4d5ab4d8d2a3a"}, + {file = "aiohttp-3.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ecdf43ddde709c336a655c8b3858c56af8f7402de2572001a5a99f7bebf2f78"}, + {file = "aiohttp-3.11.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bf9c139dfa004b65d2d71906abc593dcafe78a508f33d56c1ca9d87b18337f"}, + {file = "aiohttp-3.11.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2d978a95e4b58ef1fd937fbe347ab397c79ba24e17912595b54faafb88b9b937"}, + {file = "aiohttp-3.11.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e32517c01905e0f4e665c3f3a495868ad996a32c243fcd917587d740253d589"}, + {file = "aiohttp-3.11.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4275160583df18158e0d6789797ad314a14ae611b98933fbe7d7a1c3dcc6bad4"}, + {file = "aiohttp-3.11.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1ff7afc3c461bd9217e2b8a90ddbe5edd94687d5a331c4ae6166dca5876d1a4b"}, + {file = "aiohttp-3.11.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:83bd5aa621b732a0ca1aa3490abd2b010247c4677371a804431935aeedf26e74"}, + {file = "aiohttp-3.11.4-cp39-cp39-win32.whl", hash = "sha256:542a4610571b0affc6e13dda9357235f5f1f2ad9859acc69b188eb53901292d6"}, + {file = "aiohttp-3.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:a468b1b9d5499cbfd0411f5d28adbe651c90508540fdaefb4b7a2171a837a88d"}, + {file = "aiohttp-3.11.4.tar.gz", hash = "sha256:9d95cce8bb010597b3f2217155befe4708e0538d3548aa08d640ebf54e3f57cb"}, ] [package.dependencies] aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" -async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.12.0,<2.0" +propcache = ">=0.2.0" +yarl = ">=1.17.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -183,13 +169,13 @@ files = [ [[package]] name = "async-timeout" -version = "4.0.3" +version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] [[package]] @@ -837,73 +823,73 @@ requests = "*" [[package]] name = "coverage" -version = "7.6.4" +version = "7.6.7" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, - {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, - {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, - {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, - {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, - {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, - {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, - {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, - {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, - {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, - {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, - {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, - {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, - {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, - {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, - {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, - {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, - {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, - {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, - {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, - {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, - {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, - {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, - {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, - {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, - {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, + {file = "coverage-7.6.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:108bb458827765d538abcbf8288599fee07d2743357bdd9b9dad456c287e121e"}, + {file = "coverage-7.6.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c973b2fe4dc445cb865ab369df7521df9c27bf40715c837a113edaa2aa9faf45"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c6b24007c4bcd0b19fac25763a7cac5035c735ae017e9a349b927cfc88f31c1"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acbb8af78f8f91b3b51f58f288c0994ba63c646bc1a8a22ad072e4e7e0a49f1c"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad32a981bcdedb8d2ace03b05e4fd8dace8901eec64a532b00b15217d3677dd2"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:34d23e28ccb26236718a3a78ba72744212aa383141961dd6825f6595005c8b06"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e25bacb53a8c7325e34d45dddd2f2fbae0dbc230d0e2642e264a64e17322a777"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af05bbba896c4472a29408455fe31b3797b4d8648ed0a2ccac03e074a77e2314"}, + {file = "coverage-7.6.7-cp310-cp310-win32.whl", hash = "sha256:796c9b107d11d2d69e1849b2dfe41730134b526a49d3acb98ca02f4985eeff7a"}, + {file = "coverage-7.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:987a8e3da7da4eed10a20491cf790589a8e5e07656b6dc22d3814c4d88faf163"}, + {file = "coverage-7.6.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469"}, + {file = "coverage-7.6.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4"}, + {file = "coverage-7.6.7-cp311-cp311-win32.whl", hash = "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2"}, + {file = "coverage-7.6.7-cp311-cp311-win_amd64.whl", hash = "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f"}, + {file = "coverage-7.6.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f07ff574986bc3edb80e2c36391678a271d555f91fd1d332a1e0f4b5ea4b6ea9"}, + {file = "coverage-7.6.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:49ed5ee4109258973630c1f9d099c7e72c5c36605029f3a91fe9982c6076c82b"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3e8796434a8106b3ac025fd15417315d7a58ee3e600ad4dbcfddc3f4b14342c"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3b925300484a3294d1c70f6b2b810d6526f2929de954e5b6be2bf8caa1f12c1"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c42ec2c522e3ddd683dec5cdce8e62817afb648caedad9da725001fa530d354"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0266b62cbea568bd5e93a4da364d05de422110cbed5056d69339bd5af5685433"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e5f2a0f161d126ccc7038f1f3029184dbdf8f018230af17ef6fd6a707a5b881f"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c132b5a22821f9b143f87446805e13580b67c670a548b96da945a8f6b4f2efbb"}, + {file = "coverage-7.6.7-cp312-cp312-win32.whl", hash = "sha256:7c07de0d2a110f02af30883cd7dddbe704887617d5c27cf373362667445a4c76"}, + {file = "coverage-7.6.7-cp312-cp312-win_amd64.whl", hash = "sha256:fd49c01e5057a451c30c9b892948976f5d38f2cbd04dc556a82743ba8e27ed8c"}, + {file = "coverage-7.6.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46f21663e358beae6b368429ffadf14ed0a329996248a847a4322fb2e35d64d3"}, + {file = "coverage-7.6.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40cca284c7c310d622a1677f105e8507441d1bb7c226f41978ba7c86979609ab"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77256ad2345c29fe59ae861aa11cfc74579c88d4e8dbf121cbe46b8e32aec808"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87ea64b9fa52bf395272e54020537990a28078478167ade6c61da7ac04dc14bc"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d608a7808793e3615e54e9267519351c3ae204a6d85764d8337bd95993581a8"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdd94501d65adc5c24f8a1a0eda110452ba62b3f4aeaba01e021c1ed9cb8f34a"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82c809a62e953867cf57e0548c2b8464207f5f3a6ff0e1e961683e79b89f2c55"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb684694e99d0b791a43e9fc0fa58efc15ec357ac48d25b619f207c41f2fd384"}, + {file = "coverage-7.6.7-cp313-cp313-win32.whl", hash = "sha256:963e4a08cbb0af6623e61492c0ec4c0ec5c5cf74db5f6564f98248d27ee57d30"}, + {file = "coverage-7.6.7-cp313-cp313-win_amd64.whl", hash = "sha256:14045b8bfd5909196a90da145a37f9d335a5d988a83db34e80f41e965fb7cb42"}, + {file = "coverage-7.6.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f2c7a045eef561e9544359a0bf5784b44e55cefc7261a20e730baa9220c83413"}, + {file = "coverage-7.6.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dd4e4a49d9c72a38d18d641135d2fb0bdf7b726ca60a103836b3d00a1182acd"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c95e0fa3d1547cb6f021ab72f5c23402da2358beec0a8e6d19a368bd7b0fb37"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f63e21ed474edd23f7501f89b53280014436e383a14b9bd77a648366c81dce7b"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead9b9605c54d15be228687552916c89c9683c215370c4a44f1f217d2adcc34d"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0573f5cbf39114270842d01872952d301027d2d6e2d84013f30966313cadb529"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e2c8e3384c12dfa19fa9a52f23eb091a8fad93b5b81a41b14c17c78e23dd1d8b"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:70a56a2ec1869e6e9fa69ef6b76b1a8a7ef709972b9cc473f9ce9d26b5997ce3"}, + {file = "coverage-7.6.7-cp313-cp313t-win32.whl", hash = "sha256:dbba8210f5067398b2c4d96b4e64d8fb943644d5eb70be0d989067c8ca40c0f8"}, + {file = "coverage-7.6.7-cp313-cp313t-win_amd64.whl", hash = "sha256:dfd14bcae0c94004baba5184d1c935ae0d1231b8409eb6c103a5fd75e8ecdc56"}, + {file = "coverage-7.6.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37a15573f988b67f7348916077c6d8ad43adb75e478d0910957394df397d2874"}, + {file = "coverage-7.6.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b6cce5c76985f81da3769c52203ee94722cd5d5889731cd70d31fee939b74bf0"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ab9763d291a17b527ac6fd11d1a9a9c358280adb320e9c2672a97af346ac2c"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cf96ceaa275f071f1bea3067f8fd43bec184a25a962c754024c973af871e1b7"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee9cf6b0134d6f932d219ce253ef0e624f4fa588ee64830fcba193269e4daa3"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2bc3e45c16564cc72de09e37413262b9f99167803e5e48c6156bccdfb22c8327"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:623e6965dcf4e28a3debaa6fcf4b99ee06d27218f46d43befe4db1c70841551c"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850cfd2d6fc26f8346f422920ac204e1d28814e32e3a58c19c91980fa74d8289"}, + {file = "coverage-7.6.7-cp39-cp39-win32.whl", hash = "sha256:c296263093f099da4f51b3dff1eff5d4959b527d4f2f419e16508c5da9e15e8c"}, + {file = "coverage-7.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:90746521206c88bdb305a4bf3342b1b7316ab80f804d40c536fc7d329301ee13"}, + {file = "coverage-7.6.7-pp39.pp310-none-any.whl", hash = "sha256:0ddcb70b3a3a57581b450571b31cb774f23eb9519c2aaa6176d3a84c9fc57671"}, + {file = "coverage-7.6.7.tar.gz", hash = "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24"}, ] [package.dependencies] @@ -1480,13 +1466,13 @@ files = [ [[package]] name = "googleapis-common-protos" -version = "1.65.0" +version = "1.66.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis_common_protos-1.65.0-py2.py3-none-any.whl", hash = "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63"}, - {file = "googleapis_common_protos-1.65.0.tar.gz", hash = "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0"}, + {file = "googleapis_common_protos-1.66.0-py2.py3-none-any.whl", hash = "sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed"}, + {file = "googleapis_common_protos-1.66.0.tar.gz", hash = "sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c"}, ] [package.dependencies] @@ -2098,18 +2084,18 @@ nicer-shell = ["ipython"] [[package]] name = "open-aea" -version = "1.57.0" +version = "1.60.0" description = "Open Autonomous Economic Agent framework (without vendor lock-in)" optional = false python-versions = ">=3.8" files = [ - {file = "open_aea-1.57.0-py3-none-any.whl", hash = "sha256:19714577414fa7ce7c9a43e4dd9d7849189b77b158a3d60e75cb43a7ea0eecd5"}, - {file = "open_aea-1.57.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:a56d0b6dfa5bcdcf24d0edd167bf0e90c205bb6f20b59bcee0975a8dbd1811fe"}, - {file = "open_aea-1.57.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:a03df0c0e8354a8a0d940969252dbdf633f9b5698ce499e1cd30f694f7635151"}, - {file = "open_aea-1.57.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fb3c78c7877bcd41d33b3bd5ee51f2cfe62efa2a07f193838133c771fff5237"}, - {file = "open_aea-1.57.0-py3-none-win32.whl", hash = "sha256:a068d8710d3e235499ae866d167825bca1b56314f255b05591b2e362c1f9b3a6"}, - {file = "open_aea-1.57.0-py3-none-win_amd64.whl", hash = "sha256:eb2ef61a7e7d74f4b99fc27fdbad7350320c18528f85678fe1a6503736ef2de5"}, - {file = "open_aea-1.57.0.tar.gz", hash = "sha256:7cef260f56a4214752ea6242d43cf20a7488815f7e2de53ff2836b57a650a385"}, + {file = "open_aea-1.60.0-py3-none-any.whl", hash = "sha256:7463b95973d1594bfc6aa8bd5f561f9a683dcec2adb06c44084c896325f2f5ea"}, + {file = "open_aea-1.60.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:bf3ca4803a61d78133e130d74e0a7c02007318ff4ec4450a980e604ee83d8941"}, + {file = "open_aea-1.60.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:e94db427beb8f77e51cc2c8f0482fcb0b12464d62a59b3a50bd5594d21d22d6a"}, + {file = "open_aea-1.60.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:85b7695f80c528336d3af4c052c7bcd3413101e9034c507d6246304de9d16220"}, + {file = "open_aea-1.60.0-py3-none-win32.whl", hash = "sha256:fc3d49277f526d709340ef6d8839d7a7293ef948e01b7eaaf875ffb302d8d3aa"}, + {file = "open_aea-1.60.0-py3-none-win_amd64.whl", hash = "sha256:ee5a2584adc9cd7508903796e9b34fd6ca54f194449ad0da2ebf003226a0144b"}, + {file = "open_aea-1.60.0.tar.gz", hash = "sha256:531a1a985bdf385b3332232920876c9056c88b8d6d3ab37c7b5c10a15493cce6"}, ] [package.dependencies] @@ -2137,13 +2123,13 @@ test-tools = ["click (>=8.1.0,<9)", "coverage (>=6.4.4,<8.0.0)", "jsonschema (>= [[package]] name = "open-aea-cli-ipfs" -version = "1.57.0" +version = "1.60.0" description = "CLI extension for open AEA framework wrapping IPFS functionality." optional = false python-versions = "*" files = [ - {file = "open_aea_cli_ipfs-1.57.0-py3-none-any.whl", hash = "sha256:6cbefd42a682f1f0c116e527f728998f61a9bc930995acdd754b5335e54ad97d"}, - {file = "open_aea_cli_ipfs-1.57.0.tar.gz", hash = "sha256:8254a1ecef4e7e3dbc9ba990243413963a0d5055b336c1ce6f2e0ae4ddaa25ce"}, + {file = "open_aea_cli_ipfs-1.60.0-py3-none-any.whl", hash = "sha256:d32493650d4d86210cfd56848748d8a3ef9eb439cd064153a3efd4a961eaf31a"}, + {file = "open_aea_cli_ipfs-1.60.0.tar.gz", hash = "sha256:e90bc224ebc47bfd56a5f34739300ab8b8615e077072b5a202af398b92028d50"}, ] [package.dependencies] @@ -2153,13 +2139,13 @@ pytest = ">=7.0.0,<7.3.0" [[package]] name = "open-aea-ledger-cosmos" -version = "1.57.0" +version = "1.60.0" description = "Python package wrapping the public and private key cryptography and ledger api of Cosmos." optional = false python-versions = "*" files = [ - {file = "open_aea_ledger_cosmos-1.57.0-py3-none-any.whl", hash = "sha256:dfedc58ae4cebd938b51834f3eca5e2c8ffce95661a84212c3c4b6341e8952d4"}, - {file = "open_aea_ledger_cosmos-1.57.0.tar.gz", hash = "sha256:35ae99e188a256bfcb06d510d161643922d6ed1e639eed92b3b5f7ee3576d5bf"}, + {file = "open_aea_ledger_cosmos-1.60.0-py3-none-any.whl", hash = "sha256:53a1c8a04a12a9e18a03a7ecc1988efef6e3712cf6408ae4c46c18d8d66fba31"}, + {file = "open_aea_ledger_cosmos-1.60.0.tar.gz", hash = "sha256:df48bf695de632b768baf968e6de66e27d7350af2edfac715a5635389d891b75"}, ] [package.dependencies] @@ -2171,13 +2157,13 @@ pycryptodome = ">=3.10.1,<4.0.0" [[package]] name = "open-aea-ledger-ethereum" -version = "1.57.0" +version = "1.60.0" description = "Python package wrapping the public and private key cryptography and ledger api of Ethereum." optional = false python-versions = "*" files = [ - {file = "open_aea_ledger_ethereum-1.57.0-py3-none-any.whl", hash = "sha256:8ad775344baa77fc6b8e5a92edfa6d7e32f3361a885113379733e7ce4e4d6405"}, - {file = "open_aea_ledger_ethereum-1.57.0.tar.gz", hash = "sha256:7c16858ad751db3906ec72046c821ad5b057c5e47edbc951da99c52714fb8c5e"}, + {file = "open_aea_ledger_ethereum-1.60.0-py3-none-any.whl", hash = "sha256:0026ae8faa987f651234d3d125998a445b414a65847a121fd033f49b99de0bf0"}, + {file = "open_aea_ledger_ethereum-1.60.0.tar.gz", hash = "sha256:932219edff66500f29f17ab47d487f2995e4770456031cfbacfc0eea94571c6c"}, ] [package.dependencies] @@ -2188,30 +2174,30 @@ web3 = ">=6.0.0,<7" [[package]] name = "open-aea-test-autonomy" -version = "0.16.1" +version = "0.18.3" description = "Plugin containing test tools for open-autonomy packages." optional = false python-versions = "*" files = [ - {file = "open_aea_test_autonomy-0.16.1-py3-none-any.whl", hash = "sha256:4d6538604d4f93dc5d35782e19c5732357cc09c63ac62551895fb441a2153af3"}, - {file = "open_aea_test_autonomy-0.16.1.tar.gz", hash = "sha256:041630e24bb5fe88fd9eaddca5c4c6f268338fbd3561f6867f33c3aea5a99d5a"}, + {file = "open_aea_test_autonomy-0.18.3-py3-none-any.whl", hash = "sha256:e5a188220b8dc10268e7f7d28159cc63d97dea2a9ff3b533dbf83e0ac9bd184e"}, + {file = "open_aea_test_autonomy-0.18.3.tar.gz", hash = "sha256:72c400cae3bf38035964bfc2befe65502d63fabe2139f3375ca299e08cc2d9ee"}, ] [package.dependencies] docker = "6.1.2" -open-aea = {version = ">=1.57.0,<2.0.0", extras = ["all"]} -open-aea-ledger-ethereum = ">=1.57.0,<2.0.0" +open-aea = {version = ">=1.60.0,<2.0.0", extras = ["all"]} +open-aea-ledger-ethereum = ">=1.60.0,<2.0.0" pytest = "7.2.1" [[package]] name = "open-autonomy" -version = "0.16.1" +version = "0.18.3" description = "A framework for the creation of autonomous agent services." optional = false python-versions = ">=3.8" files = [ - {file = "open_autonomy-0.16.1-py3-none-any.whl", hash = "sha256:fec8611e0730d24debf53ed1f6a238a178eb8afc6ada422fbbb027b628e5ef72"}, - {file = "open_autonomy-0.16.1.tar.gz", hash = "sha256:bc670251a5d5859a807f9a7f5a1437c073a0a4b4060378f713a63d6fcb6930e7"}, + {file = "open_autonomy-0.18.3-py3-none-any.whl", hash = "sha256:bc26908a73c8a72c42ec44cdd7d8ddbc6a52688fddd02328aedf83cfc7e5bbc2"}, + {file = "open_autonomy-0.18.3.tar.gz", hash = "sha256:50d6fd431061630f783a90d957a674bbbabb74ff85c3b58857f42d52b79ae892"}, ] [package.dependencies] @@ -2223,8 +2209,8 @@ Flask = ">=2.0.2,<3.0.0" gql = "3.5.0" hexbytes = "*" jsonschema = ">=4.3.0,<4.4.0" -open-aea = {version = "1.57.0", extras = ["all"]} -open-aea-cli-ipfs = "1.57.0" +open-aea = {version = "1.60.0", extras = ["all"]} +open-aea-cli-ipfs = "1.60.0" protobuf = ">=4.21.6,<4.25.0" pytest = "7.2.1" python-dotenv = ">=0.14.5,<0.22.0" @@ -2237,8 +2223,8 @@ watchdog = ">=2.1.6" werkzeug = "2.0.3" [package.extras] -all = ["click (>=8.1.0,<9)", "coverage (>=6.4.4,<8.0.0)", "open-aea-cli-ipfs (==1.57.0)", "pytest (>=7.0.0,<7.3.0)", "python-dotenv (>=0.14.5,<0.22.0)", "texttable (==1.6.7)"] -cli = ["click (>=8.1.0,<9)", "coverage (>=6.4.4,<8.0.0)", "open-aea-cli-ipfs (==1.57.0)", "pytest (>=7.0.0,<7.3.0)", "python-dotenv (>=0.14.5,<0.22.0)", "texttable (==1.6.7)"] +all = ["click (>=8.1.0,<9)", "coverage (>=6.4.4,<8.0.0)", "open-aea-cli-ipfs (==1.60.0)", "pytest (>=7.0.0,<7.3.0)", "python-dotenv (>=0.14.5,<0.22.0)", "texttable (==1.6.7)"] +cli = ["click (>=8.1.0,<9)", "coverage (>=6.4.4,<8.0.0)", "open-aea-cli-ipfs (==1.60.0)", "pytest (>=7.0.0,<7.3.0)", "python-dotenv (>=0.14.5,<0.22.0)", "texttable (==1.6.7)"] [[package]] name = "openapi-core" @@ -2979,17 +2965,6 @@ files = [ {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, ] -[[package]] -name = "pywin32-ctypes" -version = "0.2.3" -description = "A (partial) reimplementation of pywin32 using ctypes/cffi" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, - {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, -] - [[package]] name = "pyyaml" version = "6.0.1" @@ -3052,105 +3027,105 @@ files = [ [[package]] name = "regex" -version = "2024.9.11" +version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, - {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, - {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, - {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, - {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, - {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, - {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, - {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, - {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, - {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, - {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, - {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, - {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, - {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, ] [[package]] @@ -3222,23 +3197,23 @@ files = [ [[package]] name = "setuptools" -version = "75.3.0" +version = "75.5.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd"}, - {file = "setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"}, + {file = "setuptools-75.5.0-py3-none-any.whl", hash = "sha256:87cb777c3b96d638ca02031192d40390e0ad97737e27b6b4fa831bea86f2f829"}, + {file = "setuptools-75.5.0.tar.gz", hash = "sha256:5c4ccb41111392671f02bb5f8436dfc5a9a7185e80500531b133f5775c4163ef"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] +core = ["importlib-metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.12.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] [[package]] name = "six" @@ -3297,13 +3272,13 @@ files = [ [[package]] name = "tomli" -version = "2.0.2" +version = "2.1.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, - {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, + {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, + {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, ] [[package]] @@ -3558,97 +3533,80 @@ six = "*" [[package]] name = "websockets" -version = "13.1" +version = "14.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "websockets-13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee"}, - {file = "websockets-13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7"}, - {file = "websockets-13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f779498eeec470295a2b1a5d97aa1bc9814ecd25e1eb637bd9d1c73a327387f6"}, - {file = "websockets-13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676df3fe46956fbb0437d8800cd5f2b6d41143b6e7e842e60554398432cf29b"}, - {file = "websockets-13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7affedeb43a70351bb811dadf49493c9cfd1ed94c9c70095fd177e9cc1541fa"}, - {file = "websockets-13.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1971e62d2caa443e57588e1d82d15f663b29ff9dfe7446d9964a4b6f12c1e700"}, - {file = "websockets-13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5f2e75431f8dc4a47f31565a6e1355fb4f2ecaa99d6b89737527ea917066e26c"}, - {file = "websockets-13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58cf7e75dbf7e566088b07e36ea2e3e2bd5676e22216e4cad108d4df4a7402a0"}, - {file = "websockets-13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90d6dec6be2c7d03378a574de87af9b1efea77d0c52a8301dd831ece938452f"}, - {file = "websockets-13.1-cp310-cp310-win32.whl", hash = "sha256:730f42125ccb14602f455155084f978bd9e8e57e89b569b4d7f0f0c17a448ffe"}, - {file = "websockets-13.1-cp310-cp310-win_amd64.whl", hash = "sha256:5993260f483d05a9737073be197371940c01b257cc45ae3f1d5d7adb371b266a"}, - {file = "websockets-13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19"}, - {file = "websockets-13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5"}, - {file = "websockets-13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd"}, - {file = "websockets-13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02"}, - {file = "websockets-13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7"}, - {file = "websockets-13.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096"}, - {file = "websockets-13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084"}, - {file = "websockets-13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3"}, - {file = "websockets-13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9"}, - {file = "websockets-13.1-cp311-cp311-win32.whl", hash = "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f"}, - {file = "websockets-13.1-cp311-cp311-win_amd64.whl", hash = "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557"}, - {file = "websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc"}, - {file = "websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49"}, - {file = "websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd"}, - {file = "websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0"}, - {file = "websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6"}, - {file = "websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9"}, - {file = "websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68"}, - {file = "websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14"}, - {file = "websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf"}, - {file = "websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c"}, - {file = "websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3"}, - {file = "websockets-13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6"}, - {file = "websockets-13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708"}, - {file = "websockets-13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418"}, - {file = "websockets-13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a"}, - {file = "websockets-13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f"}, - {file = "websockets-13.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5"}, - {file = "websockets-13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135"}, - {file = "websockets-13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2"}, - {file = "websockets-13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6"}, - {file = "websockets-13.1-cp313-cp313-win32.whl", hash = "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d"}, - {file = "websockets-13.1-cp313-cp313-win_amd64.whl", hash = "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2"}, - {file = "websockets-13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c7934fd0e920e70468e676fe7f1b7261c1efa0d6c037c6722278ca0228ad9d0d"}, - {file = "websockets-13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:149e622dc48c10ccc3d2760e5f36753db9cacf3ad7bc7bbbfd7d9c819e286f23"}, - {file = "websockets-13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a569eb1b05d72f9bce2ebd28a1ce2054311b66677fcd46cf36204ad23acead8c"}, - {file = "websockets-13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95df24ca1e1bd93bbca51d94dd049a984609687cb2fb08a7f2c56ac84e9816ea"}, - {file = "websockets-13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8dbb1bf0c0a4ae8b40bdc9be7f644e2f3fb4e8a9aca7145bfa510d4a374eeb7"}, - {file = "websockets-13.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:035233b7531fb92a76beefcbf479504db8c72eb3bff41da55aecce3a0f729e54"}, - {file = "websockets-13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e4450fc83a3df53dec45922b576e91e94f5578d06436871dce3a6be38e40f5db"}, - {file = "websockets-13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:463e1c6ec853202dd3657f156123d6b4dad0c546ea2e2e38be2b3f7c5b8e7295"}, - {file = "websockets-13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6d6855bbe70119872c05107e38fbc7f96b1d8cb047d95c2c50869a46c65a8e96"}, - {file = "websockets-13.1-cp38-cp38-win32.whl", hash = "sha256:204e5107f43095012b00f1451374693267adbb832d29966a01ecc4ce1db26faf"}, - {file = "websockets-13.1-cp38-cp38-win_amd64.whl", hash = "sha256:485307243237328c022bc908b90e4457d0daa8b5cf4b3723fd3c4a8012fce4c6"}, - {file = "websockets-13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9b37c184f8b976f0c0a231a5f3d6efe10807d41ccbe4488df8c74174805eea7d"}, - {file = "websockets-13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:163e7277e1a0bd9fb3c8842a71661ad19c6aa7bb3d6678dc7f89b17fbcc4aeb7"}, - {file = "websockets-13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b889dbd1342820cc210ba44307cf75ae5f2f96226c0038094455a96e64fb07a"}, - {file = "websockets-13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:586a356928692c1fed0eca68b4d1c2cbbd1ca2acf2ac7e7ebd3b9052582deefa"}, - {file = "websockets-13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bd6abf1e070a6b72bfeb71049d6ad286852e285f146682bf30d0296f5fbadfa"}, - {file = "websockets-13.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2aad13a200e5934f5a6767492fb07151e1de1d6079c003ab31e1823733ae79"}, - {file = "websockets-13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:df01aea34b6e9e33572c35cd16bae5a47785e7d5c8cb2b54b2acdb9678315a17"}, - {file = "websockets-13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e54affdeb21026329fb0744ad187cf812f7d3c2aa702a5edb562b325191fcab6"}, - {file = "websockets-13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ef8aa8bdbac47f4968a5d66462a2a0935d044bf35c0e5a8af152d58516dbeb5"}, - {file = "websockets-13.1-cp39-cp39-win32.whl", hash = "sha256:deeb929efe52bed518f6eb2ddc00cc496366a14c726005726ad62c2dd9017a3c"}, - {file = "websockets-13.1-cp39-cp39-win_amd64.whl", hash = "sha256:7c65ffa900e7cc958cd088b9a9157a8141c991f8c53d11087e6fb7277a03f81d"}, - {file = "websockets-13.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238"}, - {file = "websockets-13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5"}, - {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9"}, - {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6"}, - {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a"}, - {file = "websockets-13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23"}, - {file = "websockets-13.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9156c45750b37337f7b0b00e6248991a047be4aa44554c9886fe6bdd605aab3b"}, - {file = "websockets-13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80c421e07973a89fbdd93e6f2003c17d20b69010458d3a8e37fb47874bd67d51"}, - {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d0ba76371769d6a4e56f7e83bb8e81846d17a6190971e38b5de108bde9b0d7"}, - {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9875a0143f07d74dc5e1ded1c4581f0d9f7ab86c78994e2ed9e95050073c94d"}, - {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11e38ad8922c7961447f35c7b17bffa15de4d17c70abd07bfbe12d6faa3e027"}, - {file = "websockets-13.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4059f790b6ae8768471cddb65d3c4fe4792b0ab48e154c9f0a04cefaabcd5978"}, - {file = "websockets-13.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25c35bf84bf7c7369d247f0b8cfa157f989862c49104c5cf85cb5436a641d93e"}, - {file = "websockets-13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:83f91d8a9bb404b8c2c41a707ac7f7f75b9442a0a876df295de27251a856ad09"}, - {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a43cfdcddd07f4ca2b1afb459824dd3c6d53a51410636a2c7fc97b9a8cf4842"}, - {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a2ef1381632a2f0cb4efeff34efa97901c9fbc118e01951ad7cfc10601a9bb"}, - {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459bf774c754c35dbb487360b12c5727adab887f1622b8aed5755880a21c4a20"}, - {file = "websockets-13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678"}, - {file = "websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f"}, - {file = "websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"}, + {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"}, + {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"}, + {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, + {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, + {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, + {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"}, + {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"}, + {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"}, + {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"}, + {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"}, + {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"}, + {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"}, + {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"}, + {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"}, + {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"}, + {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"}, + {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"}, + {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, + {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, ] [[package]] @@ -3667,93 +3625,93 @@ watchdog = ["watchdog"] [[package]] name = "yarl" -version = "1.17.1" +version = "1.17.2" description = "Yet another URL library" optional = false python-versions = ">=3.9" files = [ - {file = "yarl-1.17.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1794853124e2f663f0ea54efb0340b457f08d40a1cef78edfa086576179c91"}, - {file = "yarl-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fbea1751729afe607d84acfd01efd95e3b31db148a181a441984ce9b3d3469da"}, - {file = "yarl-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ee427208c675f1b6e344a1f89376a9613fc30b52646a04ac0c1f6587c7e46ec"}, - {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b74ff4767d3ef47ffe0cd1d89379dc4d828d4873e5528976ced3b44fe5b0a21"}, - {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62a91aefff3d11bf60e5956d340eb507a983a7ec802b19072bb989ce120cd948"}, - {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:846dd2e1243407133d3195d2d7e4ceefcaa5f5bf7278f0a9bda00967e6326b04"}, - {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e844be8d536afa129366d9af76ed7cb8dfefec99f5f1c9e4f8ae542279a6dc3"}, - {file = "yarl-1.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc7c92c1baa629cb03ecb0c3d12564f172218fb1739f54bf5f3881844daadc6d"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae3476e934b9d714aa8000d2e4c01eb2590eee10b9d8cd03e7983ad65dfbfcba"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c7e177c619342e407415d4f35dec63d2d134d951e24b5166afcdfd1362828e17"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64cc6e97f14cf8a275d79c5002281f3040c12e2e4220623b5759ea7f9868d6a5"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:84c063af19ef5130084db70ada40ce63a84f6c1ef4d3dbc34e5e8c4febb20822"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:482c122b72e3c5ec98f11457aeb436ae4aecca75de19b3d1de7cf88bc40db82f"}, - {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:380e6c38ef692b8fd5a0f6d1fa8774d81ebc08cfbd624b1bca62a4d4af2f9931"}, - {file = "yarl-1.17.1-cp310-cp310-win32.whl", hash = "sha256:16bca6678a83657dd48df84b51bd56a6c6bd401853aef6d09dc2506a78484c7b"}, - {file = "yarl-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:561c87fea99545ef7d692403c110b2f99dced6dff93056d6e04384ad3bc46243"}, - {file = "yarl-1.17.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cbad927ea8ed814622305d842c93412cb47bd39a496ed0f96bfd42b922b4a217"}, - {file = "yarl-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fca4b4307ebe9c3ec77a084da3a9d1999d164693d16492ca2b64594340999988"}, - {file = "yarl-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff5c6771c7e3511a06555afa317879b7db8d640137ba55d6ab0d0c50425cab75"}, - {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b29beab10211a746f9846baa39275e80034e065460d99eb51e45c9a9495bcca"}, - {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a52a1ffdd824fb1835272e125385c32fd8b17fbdefeedcb4d543cc23b332d74"}, - {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58c8e9620eb82a189c6c40cb6b59b4e35b2ee68b1f2afa6597732a2b467d7e8f"}, - {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d216e5d9b8749563c7f2c6f7a0831057ec844c68b4c11cb10fc62d4fd373c26d"}, - {file = "yarl-1.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:881764d610e3269964fc4bb3c19bb6fce55422828e152b885609ec176b41cf11"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8c79e9d7e3d8a32d4824250a9c6401194fb4c2ad9a0cec8f6a96e09a582c2cc0"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:299f11b44d8d3a588234adbe01112126010bd96d9139c3ba7b3badd9829261c3"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cc7d768260f4ba4ea01741c1b5fe3d3a6c70eb91c87f4c8761bbcce5181beafe"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:de599af166970d6a61accde358ec9ded821234cbbc8c6413acfec06056b8e860"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2b24ec55fad43e476905eceaf14f41f6478780b870eda5d08b4d6de9a60b65b4"}, - {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9fb815155aac6bfa8d86184079652c9715c812d506b22cfa369196ef4e99d1b4"}, - {file = "yarl-1.17.1-cp311-cp311-win32.whl", hash = "sha256:7615058aabad54416ddac99ade09a5510cf77039a3b903e94e8922f25ed203d7"}, - {file = "yarl-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:14bc88baa44e1f84164a392827b5defb4fa8e56b93fecac3d15315e7c8e5d8b3"}, - {file = "yarl-1.17.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61"}, - {file = "yarl-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d"}, - {file = "yarl-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139"}, - {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5"}, - {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac"}, - {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463"}, - {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147"}, - {file = "yarl-1.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c"}, - {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199"}, - {file = "yarl-1.17.1-cp312-cp312-win32.whl", hash = "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96"}, - {file = "yarl-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df"}, - {file = "yarl-1.17.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d1d42556b063d579cae59e37a38c61f4402b47d70c29f0ef15cee1acaa64488"}, - {file = "yarl-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0167540094838ee9093ef6cc2c69d0074bbf84a432b4995835e8e5a0d984374"}, - {file = "yarl-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2f0a6423295a0d282d00e8701fe763eeefba8037e984ad5de44aa349002562ac"}, - {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b078134f48552c4d9527db2f7da0b5359abd49393cdf9794017baec7506170"}, - {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d401f07261dc5aa36c2e4efc308548f6ae943bfff20fcadb0a07517a26b196d8"}, - {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5f1ac7359e17efe0b6e5fec21de34145caef22b260e978336f325d5c84e6938"}, - {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f63d176a81555984e91f2c84c2a574a61cab7111cc907e176f0f01538e9ff6e"}, - {file = "yarl-1.17.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e275792097c9f7e80741c36de3b61917aebecc08a67ae62899b074566ff8556"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:81713b70bea5c1386dc2f32a8f0dab4148a2928c7495c808c541ee0aae614d67"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:aa46dce75078fceaf7cecac5817422febb4355fbdda440db55206e3bd288cfb8"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1ce36ded585f45b1e9bb36d0ae94765c6608b43bd2e7f5f88079f7a85c61a4d3"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2d374d70fdc36f5863b84e54775452f68639bc862918602d028f89310a034ab0"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2d9f0606baaec5dd54cb99667fcf85183a7477f3766fbddbe3f385e7fc253299"}, - {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b0341e6d9a0c0e3cdc65857ef518bb05b410dbd70d749a0d33ac0f39e81a4258"}, - {file = "yarl-1.17.1-cp313-cp313-win32.whl", hash = "sha256:2e7ba4c9377e48fb7b20dedbd473cbcbc13e72e1826917c185157a137dac9df2"}, - {file = "yarl-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:949681f68e0e3c25377462be4b658500e85ca24323d9619fdc41f68d46a1ffda"}, - {file = "yarl-1.17.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8994b29c462de9a8fce2d591028b986dbbe1b32f3ad600b2d3e1c482c93abad6"}, - {file = "yarl-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f9cbfbc5faca235fbdf531b93aa0f9f005ec7d267d9d738761a4d42b744ea159"}, - {file = "yarl-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b40d1bf6e6f74f7c0a567a9e5e778bbd4699d1d3d2c0fe46f4b717eef9e96b95"}, - {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5efe0661b9fcd6246f27957f6ae1c0eb29bc60552820f01e970b4996e016004"}, - {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5c4804e4039f487e942c13381e6c27b4b4e66066d94ef1fae3f6ba8b953f383"}, - {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5d6a6c9602fd4598fa07e0389e19fe199ae96449008d8304bf5d47cb745462e"}, - {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4c9156c4d1eb490fe374fb294deeb7bc7eaccda50e23775b2354b6a6739934"}, - {file = "yarl-1.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6324274b4e0e2fa1b3eccb25997b1c9ed134ff61d296448ab8269f5ac068c4c"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d8a8b74d843c2638f3864a17d97a4acda58e40d3e44b6303b8cc3d3c44ae2d29"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7fac95714b09da9278a0b52e492466f773cfe37651cf467a83a1b659be24bf71"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c180ac742a083e109c1a18151f4dd8675f32679985a1c750d2ff806796165b55"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:578d00c9b7fccfa1745a44f4eddfdc99d723d157dad26764538fbdda37209857"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1a3b91c44efa29e6c8ef8a9a2b583347998e2ba52c5d8280dbd5919c02dfc3b5"}, - {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a7ac5b4984c468ce4f4a553df281450df0a34aefae02e58d77a0847be8d1e11f"}, - {file = "yarl-1.17.1-cp39-cp39-win32.whl", hash = "sha256:7294e38f9aa2e9f05f765b28ffdc5d81378508ce6dadbe93f6d464a8c9594473"}, - {file = "yarl-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:eb6dce402734575e1a8cc0bb1509afca508a400a57ce13d306ea2c663bad1138"}, - {file = "yarl-1.17.1-py3-none-any.whl", hash = "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06"}, - {file = "yarl-1.17.1.tar.gz", hash = "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47"}, + {file = "yarl-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:93771146ef048b34201bfa382c2bf74c524980870bb278e6df515efaf93699ff"}, + {file = "yarl-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8281db240a1616af2f9c5f71d355057e73a1409c4648c8949901396dc0a3c151"}, + {file = "yarl-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:170ed4971bf9058582b01a8338605f4d8c849bd88834061e60e83b52d0c76870"}, + {file = "yarl-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc61b005f6521fcc00ca0d1243559a5850b9dd1e1fe07b891410ee8fe192d0c0"}, + {file = "yarl-1.17.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:871e1b47eec7b6df76b23c642a81db5dd6536cbef26b7e80e7c56c2fd371382e"}, + {file = "yarl-1.17.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a58a2f2ca7aaf22b265388d40232f453f67a6def7355a840b98c2d547bd037f"}, + {file = "yarl-1.17.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:736bb076f7299c5c55dfef3eb9e96071a795cb08052822c2bb349b06f4cb2e0a"}, + {file = "yarl-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8fd51299e21da709eabcd5b2dd60e39090804431292daacbee8d3dabe39a6bc0"}, + {file = "yarl-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:358dc7ddf25e79e1cc8ee16d970c23faee84d532b873519c5036dbb858965795"}, + {file = "yarl-1.17.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:50d866f7b1a3f16f98603e095f24c0eeba25eb508c85a2c5939c8b3870ba2df8"}, + {file = "yarl-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8b9c4643e7d843a0dca9cd9d610a0876e90a1b2cbc4c5ba7930a0d90baf6903f"}, + {file = "yarl-1.17.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d63123bfd0dce5f91101e77c8a5427c3872501acece8c90df457b486bc1acd47"}, + {file = "yarl-1.17.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:4e76381be3d8ff96a4e6c77815653063e87555981329cf8f85e5be5abf449021"}, + {file = "yarl-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:734144cd2bd633a1516948e477ff6c835041c0536cef1d5b9a823ae29899665b"}, + {file = "yarl-1.17.2-cp310-cp310-win32.whl", hash = "sha256:26bfb6226e0c157af5da16d2d62258f1ac578d2899130a50433ffee4a5dfa673"}, + {file = "yarl-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:76499469dcc24759399accd85ec27f237d52dec300daaca46a5352fcbebb1071"}, + {file = "yarl-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:792155279dc093839e43f85ff7b9b6493a8eaa0af1f94f1f9c6e8f4de8c63500"}, + {file = "yarl-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38bc4ed5cae853409cb193c87c86cd0bc8d3a70fd2268a9807217b9176093ac6"}, + {file = "yarl-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4a8c83f6fcdc327783bdc737e8e45b2e909b7bd108c4da1892d3bc59c04a6d84"}, + {file = "yarl-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c6d5fed96f0646bfdf698b0a1cebf32b8aae6892d1bec0c5d2d6e2df44e1e2d"}, + {file = "yarl-1.17.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:782ca9c58f5c491c7afa55518542b2b005caedaf4685ec814fadfcee51f02493"}, + {file = "yarl-1.17.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff6af03cac0d1a4c3c19e5dcc4c05252411bf44ccaa2485e20d0a7c77892ab6e"}, + {file = "yarl-1.17.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a3f47930fbbed0f6377639503848134c4aa25426b08778d641491131351c2c8"}, + {file = "yarl-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1fa68a3c921365c5745b4bd3af6221ae1f0ea1bf04b69e94eda60e57958907f"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:187df91395c11e9f9dc69b38d12406df85aa5865f1766a47907b1cc9855b6303"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:93d1c8cc5bf5df401015c5e2a3ce75a5254a9839e5039c881365d2a9dcfc6dc2"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:11d86c6145ac5c706c53d484784cf504d7d10fa407cb73b9d20f09ff986059ef"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c42774d1d1508ec48c3ed29e7b110e33f5e74a20957ea16197dbcce8be6b52ba"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8e589379ef0407b10bed16cc26e7392ef8f86961a706ade0a22309a45414d7"}, + {file = "yarl-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1056cadd5e850a1c026f28e0704ab0a94daaa8f887ece8dfed30f88befb87bb0"}, + {file = "yarl-1.17.2-cp311-cp311-win32.whl", hash = "sha256:be4c7b1c49d9917c6e95258d3d07f43cfba2c69a6929816e77daf322aaba6628"}, + {file = "yarl-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:ac8eda86cc75859093e9ce390d423aba968f50cf0e481e6c7d7d63f90bae5c9c"}, + {file = "yarl-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dd90238d3a77a0e07d4d6ffdebc0c21a9787c5953a508a2231b5f191455f31e9"}, + {file = "yarl-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c74f0b0472ac40b04e6d28532f55cac8090e34c3e81f118d12843e6df14d0909"}, + {file = "yarl-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d486ddcaca8c68455aa01cf53d28d413fb41a35afc9f6594a730c9779545876"}, + {file = "yarl-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25b7e93f5414b9a983e1a6c1820142c13e1782cc9ed354c25e933aebe97fcf2"}, + {file = "yarl-1.17.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a0baff7827a632204060f48dca9e63fbd6a5a0b8790c1a2adfb25dc2c9c0d50"}, + {file = "yarl-1.17.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:460024cacfc3246cc4d9f47a7fc860e4fcea7d1dc651e1256510d8c3c9c7cde0"}, + {file = "yarl-1.17.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5870d620b23b956f72bafed6a0ba9a62edb5f2ef78a8849b7615bd9433384171"}, + {file = "yarl-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2941756754a10e799e5b87e2319bbec481ed0957421fba0e7b9fb1c11e40509f"}, + {file = "yarl-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9611b83810a74a46be88847e0ea616794c406dbcb4e25405e52bff8f4bee2d0a"}, + {file = "yarl-1.17.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cd7e35818d2328b679a13268d9ea505c85cd773572ebb7a0da7ccbca77b6a52e"}, + {file = "yarl-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6b981316fcd940f085f646b822c2ff2b8b813cbd61281acad229ea3cbaabeb6b"}, + {file = "yarl-1.17.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:688058e89f512fb7541cb85c2f149c292d3fa22f981d5a5453b40c5da49eb9e8"}, + {file = "yarl-1.17.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:56afb44a12b0864d17b597210d63a5b88915d680f6484d8d202ed68ade38673d"}, + {file = "yarl-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:17931dfbb84ae18b287279c1f92b76a3abcd9a49cd69b92e946035cff06bcd20"}, + {file = "yarl-1.17.2-cp312-cp312-win32.whl", hash = "sha256:ff8d95e06546c3a8c188f68040e9d0360feb67ba8498baf018918f669f7bc39b"}, + {file = "yarl-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:4c840cc11163d3c01a9d8aad227683c48cd3e5be5a785921bcc2a8b4b758c4f3"}, + {file = "yarl-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3294f787a437cb5d81846de3a6697f0c35ecff37a932d73b1fe62490bef69211"}, + {file = "yarl-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f1e7fedb09c059efee2533119666ca7e1a2610072076926fa028c2ba5dfeb78c"}, + {file = "yarl-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:da9d3061e61e5ae3f753654813bc1cd1c70e02fb72cf871bd6daf78443e9e2b1"}, + {file = "yarl-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91c012dceadc695ccf69301bfdccd1fc4472ad714fe2dd3c5ab4d2046afddf29"}, + {file = "yarl-1.17.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f11fd61d72d93ac23718d393d2a64469af40be2116b24da0a4ca6922df26807e"}, + {file = "yarl-1.17.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46c465ad06971abcf46dd532f77560181387b4eea59084434bdff97524444032"}, + {file = "yarl-1.17.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef6eee1a61638d29cd7c85f7fd3ac7b22b4c0fabc8fd00a712b727a3e73b0685"}, + {file = "yarl-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4434b739a8a101a837caeaa0137e0e38cb4ea561f39cb8960f3b1e7f4967a3fc"}, + {file = "yarl-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:752485cbbb50c1e20908450ff4f94217acba9358ebdce0d8106510859d6eb19a"}, + {file = "yarl-1.17.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:17791acaa0c0f89323c57da7b9a79f2174e26d5debbc8c02d84ebd80c2b7bff8"}, + {file = "yarl-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5c6ea72fe619fee5e6b5d4040a451d45d8175f560b11b3d3e044cd24b2720526"}, + {file = "yarl-1.17.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db5ac3871ed76340210fe028f535392f097fb31b875354bcb69162bba2632ef4"}, + {file = "yarl-1.17.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7a1606ba68e311576bcb1672b2a1543417e7e0aa4c85e9e718ba6466952476c0"}, + {file = "yarl-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9bc27dd5cfdbe3dc7f381b05e6260ca6da41931a6e582267d5ca540270afeeb2"}, + {file = "yarl-1.17.2-cp313-cp313-win32.whl", hash = "sha256:52492b87d5877ec405542f43cd3da80bdcb2d0c2fbc73236526e5f2c28e6db28"}, + {file = "yarl-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:8e1bf59e035534ba4077f5361d8d5d9194149f9ed4f823d1ee29ef3e8964ace3"}, + {file = "yarl-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c556fbc6820b6e2cda1ca675c5fa5589cf188f8da6b33e9fc05b002e603e44fa"}, + {file = "yarl-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f2f44a4247461965fed18b2573f3a9eb5e2c3cad225201ee858726cde610daca"}, + {file = "yarl-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3a3ede8c248f36b60227eb777eac1dbc2f1022dc4d741b177c4379ca8e75571a"}, + {file = "yarl-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2654caaf5584449d49c94a6b382b3cb4a246c090e72453493ea168b931206a4d"}, + {file = "yarl-1.17.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d41c684f286ce41fa05ab6af70f32d6da1b6f0457459a56cf9e393c1c0b2217"}, + {file = "yarl-1.17.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2270d590997445a0dc29afa92e5534bfea76ba3aea026289e811bf9ed4b65a7f"}, + {file = "yarl-1.17.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18662443c6c3707e2fc7fad184b4dc32dd428710bbe72e1bce7fe1988d4aa654"}, + {file = "yarl-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75ac158560dec3ed72f6d604c81090ec44529cfb8169b05ae6fcb3e986b325d9"}, + {file = "yarl-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1fee66b32e79264f428dc8da18396ad59cc48eef3c9c13844adec890cd339db5"}, + {file = "yarl-1.17.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:585ce7cd97be8f538345de47b279b879e091c8b86d9dbc6d98a96a7ad78876a3"}, + {file = "yarl-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c019abc2eca67dfa4d8fb72ba924871d764ec3c92b86d5b53b405ad3d6aa56b0"}, + {file = "yarl-1.17.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c6e659b9a24d145e271c2faf3fa6dd1fcb3e5d3f4e17273d9e0350b6ab0fe6e2"}, + {file = "yarl-1.17.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:d17832ba39374134c10e82d137e372b5f7478c4cceeb19d02ae3e3d1daed8721"}, + {file = "yarl-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:bc3003710e335e3f842ae3fd78efa55f11a863a89a72e9a07da214db3bf7e1f8"}, + {file = "yarl-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f5ffc6b7ace5b22d9e73b2a4c7305740a339fbd55301d52735f73e21d9eb3130"}, + {file = "yarl-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:48e424347a45568413deec6f6ee2d720de2cc0385019bedf44cd93e8638aa0ed"}, + {file = "yarl-1.17.2-py3-none-any.whl", hash = "sha256:dd7abf4f717e33b7487121faf23560b3a50924f80e4bef62b22dab441ded8f3b"}, + {file = "yarl-1.17.2.tar.gz", hash = "sha256:753eaaa0c7195244c84b5cc159dc8204b7fd99f716f11198f999f2332a86b178"}, ] [package.dependencies] @@ -3763,5 +3721,5 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.0" -python-versions = "<3.13,>=3.10" -content-hash = "2c27e6b4619091d4d9318ee7dc983c9aa61d9b9ca01b5e28d2e4a6d754c89696" +python-versions = "<4.0,>=3.10" +content-hash = "074dd9e15da206b9fec58ae93b6d6da478dcced57381dbc25273a66a94aaf125" diff --git a/pyproject.toml b/pyproject.toml index ac81ba1..d99baa1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,11 +15,11 @@ classifiers = [ "Environment :: Console", "Environment :: Web Environment", "Dev include = "packages" [tool.poetry.dependencies] -python = "<3.13,>=3.10" -open-autonomy = "==0.16.1" -open-aea-test-autonomy = "==0.16.1" -open-aea = "==1.57.0" -open-aea-ledger-ethereum = "==1.57.0" +python = "<4.0,>=3.10" +open-autonomy = "==0.18.3" +open-aea-test-autonomy = "==0.18.3" +open-aea = "==1.60.0" +open-aea-ledger-ethereum = "==1.60.0" typing_extensions = ">=3.10.0.2" toml = "==0.10.2" tomte = {version = "==0.2.17", extras = ["cli", "tests"]} @@ -27,7 +27,7 @@ black = "==24.2.0" isort = "==5.13.2" grpcio = "==1.53.0" asn1crypto = "<1.5.0,>=1.4.0" -open-aea-ledger-cosmos = "==1.57.0" +open-aea-ledger-cosmos = "==1.60.0" py-ecc = "==6.0.0" pytz = "==2022.2.1" openapi-core = "==0.15.0" diff --git a/scripts/aea-config-replace.py b/scripts/aea-config-replace.py index c44538f..294ca61 100644 --- a/scripts/aea-config-replace.py +++ b/scripts/aea-config-replace.py @@ -50,6 +50,11 @@ def main() -> None: "address" ] = f"${{str:{os.getenv('OPTIMISM_LEDGER_RPC')}}}" + if os.getenv("MODE_LEDGER_RPC"): + config[2]["config"]["ledger_apis"]["mode"][ + "address" + ] = f"${{str:{os.getenv('MODE_LEDGER_RPC')}}}" + # Params config[5]["models"]["params"]["args"]["setup"][ "all_participants" @@ -80,8 +85,8 @@ def main() -> None: ] = f"${{str:{os.getenv('COINGECKO_API_KEY')}}}" config[5]["models"]["params"]["args"][ - "allowed_chains" - ] = f"${{list:{os.getenv('ALLOWED_CHAINS')}}}" + "staking_chain" + ] = f"${{str:{os.getenv('STAKING_CHAIN')}}}" with open(Path("optimus", "aea-config.yaml"), "w", encoding="utf-8") as file: yaml.dump_all(config, file, sort_keys=False) diff --git a/tox.ini b/tox.ini index 48d32a7..380d6f6 100644 --- a/tox.ini +++ b/tox.ini @@ -25,12 +25,12 @@ deps = grpcio==1.53.0 hypothesis==6.21.6 jsonschema<4.4.0,>=4.3.0 - open-autonomy==0.16.1 - open-aea==1.57.0 - open-aea-ledger-ethereum==1.57.0 - open-aea-ledger-cosmos==1.57.0 - open-aea-cli-ipfs==1.57.0 - open-aea-test-autonomy==0.16.1 + open-autonomy==0.18.3 + open-aea==1.60.0 + open-aea-ledger-ethereum==1.60.0 + open-aea-ledger-cosmos==1.60.0 + open-aea-cli-ipfs==1.60.0 + open-aea-test-autonomy==0.18.3 toml==0.10.2 typing_extensions>=3.10.0.2 py-ecc==6.0.0 @@ -38,6 +38,7 @@ deps = pytest==7.2.1 openapi-core==0.15.0 openapi-spec-validator<0.5.0,>=0.4.0 + requests<2.31.2,>=2.28.1 [extra-deps] deps = @@ -60,6 +61,7 @@ deps = requests<2.31.2,>=2.28.1 web3<7,>=6.0.0 werkzeug + pyyaml<=6.0.1,>=3.10 pyinstaller==6.8.0 ; end-extra