diff --git a/.eslintrc.base.json b/.eslintrc.base.json index fc0774380..71005364b 100644 --- a/.eslintrc.base.json +++ b/.eslintrc.base.json @@ -6,7 +6,7 @@ "plugin:prettier/recommended", "plugin:jsdoc/recommended" ], - "plugins": ["@typescript-eslint", "prettier"], + "plugins": ["@typescript-eslint", "prettier", "import"], "env": { "node": true, "es6": true @@ -16,6 +16,7 @@ "sourceType": "module" }, "rules": { + "import/first": "error", "multiline-comment-style": ["error", "starred-block"], "prettier/prettier": "error", "@typescript-eslint/member-ordering": "error", diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 840199399..b6ca6398a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./cdp-agentkit-core/python + working-directory: ./python/cdp-agentkit-core steps: - uses: actions/checkout@v3 @@ -26,8 +26,8 @@ jobs: id: cached-poetry-dependencies uses: actions/cache@v3 with: - path: ./cdp-agentkit-core/python/.venv - key: venv-agentkit-${{ runner.os }}-${{ hashFiles('cdp-agentkit-core/python/poetry.lock') }} + path: ./python/cdp-agentkit-core/.venv + key: venv-agentkit-${{ runner.os }}-${{ hashFiles('python/cdp-agentkit-core/poetry.lock') }} - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' @@ -40,7 +40,7 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./cdp-langchain/python + working-directory: ./python/cdp-langchain steps: - uses: actions/checkout@v3 @@ -60,8 +60,8 @@ jobs: id: cached-poetry-dependencies uses: actions/cache@v3 with: - path: ./cdp-langchain/python/.venv - key: venv-langchain-${{ runner.os }}-${{ hashFiles('cdp-langchain/python/poetry.lock') }} + path: ./python/cdp-langchain/.venv + key: venv-langchain-${{ runner.os }}-${{ hashFiles('python/cdp-langchain/poetry.lock') }} - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' @@ -74,7 +74,7 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./twitter-langchain/python + working-directory: ./python/twitter-langchain steps: - uses: actions/checkout@v3 @@ -94,8 +94,8 @@ jobs: id: cached-poetry-dependencies uses: actions/cache@v3 with: - path: ./twitter-langchain/python/.venv - key: venv-twitter-langchain-${{ runner.os }}-${{ hashFiles('twitter-langchain/python/poetry.lock') }} + path: ./python/twitter-langchain/.venv + key: venv-twitter-langchain-${{ runner.os }}-${{ hashFiles('python/twitter-langchain/poetry.lock') }} - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' @@ -104,7 +104,7 @@ jobs: - name: Run linters run: poetry run make lint - lint-cdp-agentkit-core-typescript: + lint-agentkit-typescript: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -115,40 +115,7 @@ jobs: # Install dependencies in parent directory first - run: npm install # Then install and lint in working directory - - name: Install and lint @coinbase/cdp-agentkit-core - working-directory: ./cdp-agentkit-core/typescript - run: | - npm install - npm run lint - npm run format - - lint-cdp-langchain-typescript: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: "18" - cache: "npm" - - run: npm install - - name: Install and lint @coinbase/cdp-langchain - working-directory: ./cdp-langchain/typescript - run: | - npm install - npm run lint - npm run format - - lint-twitter-langchain-typescript: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: "18" - cache: "npm" - - run: npm install - - name: Install and lint @coinbase/twitter-langchain - working-directory: ./twitter-langchain/typescript + - name: Install and lint AgentKit run: | npm install npm run lint diff --git a/.github/workflows/publish_docs.yml b/.github/workflows/publish_docs.yml index 95143e80c..0c19c619a 100644 --- a/.github/workflows/publish_docs.yml +++ b/.github/workflows/publish_docs.yml @@ -21,20 +21,15 @@ jobs: npm run build npm run docs - - name: Build CDP AgentKit Core JSDocs + - name: Build AgentKit JSDocs run: | - mkdir -p docs/cdp-agentkit-core/typescript - cp -r cdp-agentkit-core/typescript/docs/* docs/cdp-agentkit-core/typescript + mkdir -p docs/agentkit/typescript + cp -r typescript/agentkit/docs/* docs/agentkit/typescript - - name: Build CDP LangChain JSDocs + - name: Build AgentKit LangChain JSDocs run: | - mkdir -p docs/cdp-langchain/typescript - cp -r cdp-langchain/typescript/docs/* docs/cdp-langchain/typescript - - - name: Build Twitter LangChain JSDocs - run: | - mkdir -p docs/twitter-langchain/typescript - cp -r twitter-langchain/typescript/docs/* docs/twitter-langchain/typescript + mkdir -p docs/agentkit-langchain/typescript + cp -r typescript/framework-extensions/langchain/docs/* docs/agentkit-langchain/typescript - name: Set up Python 3.10 uses: actions/setup-python@v4 @@ -52,73 +47,73 @@ jobs: id: cached-poetry-dependencies-core uses: actions/cache@v3 with: - path: ./cdp-agentkit-core/python/.venv - key: venv-agentkit-${{ runner.os }}-3.10-${{ hashFiles('cdp-agentkit-core/python/poetry.lock') }} + path: ./python/cdp-agentkit-core/.venv + key: venv-agentkit-${{ runner.os }}-3.10-${{ hashFiles('python/cdp-agentkit-core/poetry.lock') }} - name: Install dependencies for CDP AgentKit Core Python if: steps.cached-poetry-dependencies-core.outputs.cache-hit != 'true' run: | - cd cdp-agentkit-core/python + cd python/cdp-agentkit-core poetry install --with dev cd .. - name: Build Sphinx Documentation for CDP AgentKit Core Python run: | - cd cdp-agentkit-core/python + cd python/cdp-agentkit-core poetry run make docs cd docs poetry run make html cd ../../.. mkdir -p docs/cdp-agentkit-core/python - cp -r cdp-agentkit-core/python/docs/_build/html/* docs/cdp-agentkit-core/python + cp -r python/cdp-agentkit-core/docs/_build/html/* docs/cdp-agentkit-core/python - name: Load cached venv for CDP LangChain Python id: cached-poetry-dependencies-langchain uses: actions/cache@v3 with: - path: ./cdp-langchain/python/.venv - key: venv-langchain-${{ runner.os }}-3.10-${{ hashFiles('cdp-langchain/python/poetry.lock') }} + path: ./python/cdp-langchain/.venv + key: venv-langchain-${{ runner.os }}-3.10-${{ hashFiles('python/cdp-langchain/poetry.lock') }} - name: Install dependencies for CDP LangChain Python if: steps.cached-poetry-dependencies-langchain.outputs.cache-hit != 'true' run: | - cd cdp-langchain/python + cd python/cdp-langchain poetry install --with dev cd .. - name: Build Sphinx Documentation for CDP LangChain Python run: | - cd cdp-langchain/python + cd python/cdp-langchain poetry run make docs cd docs poetry run make html cd ../../.. mkdir -p docs/cdp-langchain/python - cp -r cdp-langchain/python/docs/_build/html/* docs/cdp-langchain/python + cp -r python/cdp-langchain/docs/_build/html/* docs/cdp-langchain/python - name: Load cached venv for Twitter LangChain Python id: cached-poetry-dependencies-twitter-langchain uses: actions/cache@v3 with: - path: ./twitter-langchain/python/.venv - key: venv-twitter-langchain-${{ runner.os }}-3.10-${{ hashFiles('twitter-langchain/python/poetry.lock') }} + path: ./python/twitter-langchain/.venv + key: venv-twitter-langchain-${{ runner.os }}-3.10-${{ hashFiles('python/twitter-langchain/poetry.lock') }} - name: Install dependencies for Twitter LangChain Python if: steps.cached-poetry-dependencies-twitter-langchain.outputs.cache-hit != 'true' run: | - cd twitter-langchain/python + cd python/twitter-langchain poetry install --with dev cd .. - name: Build Sphinx Documentation for Twitter LangChain Python run: | - cd twitter-langchain/python + cd python/twitter-langchain poetry run make docs cd docs poetry run make html cd ../../.. mkdir -p docs/twitter-langchain/python - cp -r twitter-langchain/python/docs/_build/html/* docs/twitter-langchain/python + cp -r python/twitter-langchain/docs/_build/html/* docs/twitter-langchain/python - name: Deploy to Github Pages uses: peaceiris/actions-gh-pages@v4 diff --git a/.github/workflows/publish_npm_cdp_agentkit_core.yml b/.github/workflows/publish_npm_agentkit.yml similarity index 71% rename from .github/workflows/publish_npm_cdp_agentkit_core.yml rename to .github/workflows/publish_npm_agentkit.yml index d61fd7c51..022aa26fd 100644 --- a/.github/workflows/publish_npm_cdp_agentkit_core.yml +++ b/.github/workflows/publish_npm_agentkit.yml @@ -1,10 +1,10 @@ -name: Release CDP AgentKit Core to NPM +name: Release AgentKit to NPM on: workflow_dispatch: jobs: - deploy-npm-cdp-agentkit-core: + deploy-npm-agentkit: runs-on: ubuntu-latest permissions: contents: read @@ -16,8 +16,8 @@ jobs: node-version: "18" registry-url: "https://registry.npmjs.org" - run: npm ci - - name: Install, build and publish @coinbase/cdp-agentkit-core - working-directory: ./cdp-agentkit-core/typescript + - name: Install, build and publish @coinbase/agentkit + working-directory: ./typescript/agentkit run: | npm ci npm run build diff --git a/.github/workflows/publish_npm_farcaster_langchain.yml b/.github/workflows/publish_npm_agentkit_langchain.yml similarity index 70% rename from .github/workflows/publish_npm_farcaster_langchain.yml rename to .github/workflows/publish_npm_agentkit_langchain.yml index a531a789d..bddd6bde9 100644 --- a/.github/workflows/publish_npm_farcaster_langchain.yml +++ b/.github/workflows/publish_npm_agentkit_langchain.yml @@ -1,10 +1,10 @@ -name: Publish Farcaster LangChain to NPM +name: Publish AgentKit LangChain to NPM on: workflow_dispatch: jobs: - deploy-npm-farcaster-langchain: + deploy-npm-agentkit-langchain: runs-on: ubuntu-latest permissions: contents: read @@ -16,8 +16,8 @@ jobs: node-version: "18" registry-url: "https://registry.npmjs.org" - run: npm i && npm run build - - name: Install, build and publish @coinbase/farcaster-langchain - working-directory: ./farcaster-langchain/typescript + - name: Install, build and publish @coinbase/agentkit-langchain + working-directory: ./typescript/framework-extensions/langchain run: | npm publish --ignore-scripts --provenance --access public env: diff --git a/.github/workflows/publish_npm_cdp_langchain.yml b/.github/workflows/publish_npm_cdp_langchain.yml deleted file mode 100644 index d37cc98e5..000000000 --- a/.github/workflows/publish_npm_cdp_langchain.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Publish CDP LangChain to NPM - -on: - workflow_dispatch: - -jobs: - deploy-npm-cdp-langchain: - runs-on: ubuntu-latest - permissions: - contents: read - id-token: write - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: "18" - registry-url: "https://registry.npmjs.org" - - run: npm i && npm run build - - name: Install, build and publish @coinbase/cdp-langchain - working-directory: ./cdp-langchain/typescript - run: | - npm publish --ignore-scripts --provenance --access public - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/publish_npm_twitter_langchain.yml b/.github/workflows/publish_npm_twitter_langchain.yml deleted file mode 100644 index 1a3d91972..000000000 --- a/.github/workflows/publish_npm_twitter_langchain.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Publish Twitter LangChain to NPM - -on: - workflow_dispatch: - -jobs: - deploy-npm-twitter-langchain: - runs-on: ubuntu-latest - permissions: - contents: read - id-token: write - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: "18" - registry-url: "https://registry.npmjs.org" - - run: npm i && npm run build - - name: Install, build and publish @coinbase/twitter-langchain - working-directory: ./twitter-langchain/typescript - run: | - npm publish --ignore-scripts --provenance --access public - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/publish_pypi_cdp_agentkit_core.yml b/.github/workflows/publish_pypi_cdp_agentkit_core.yml index c8a6ac723..a402a032c 100644 --- a/.github/workflows/publish_pypi_cdp_agentkit_core.yml +++ b/.github/workflows/publish_pypi_cdp_agentkit_core.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./cdp-agentkit-core/python + working-directory: ./python/cdp-agentkit-core environment: name: pypi url: https://pypi.org/p/cdp-agentkit-core @@ -41,4 +41,4 @@ jobs: uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_API_TOKEN }} - packages-dir: cdp-agentkit-core/python/dist/ + packages-dir: python/cdp-agentkit-core/dist/ diff --git a/.github/workflows/publish_pypi_cdp_langchain.yml b/.github/workflows/publish_pypi_cdp_langchain.yml index 2ab26d471..215c3cedf 100644 --- a/.github/workflows/publish_pypi_cdp_langchain.yml +++ b/.github/workflows/publish_pypi_cdp_langchain.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./cdp-langchain/python + working-directory: ./python/cdp-langchain environment: name: pypi url: https://pypi.org/p/cdp-langchain @@ -41,4 +41,4 @@ jobs: uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_API_TOKEN }} - packages-dir: cdp-langchain/python/dist/ + packages-dir: python/cdp-langchain/dist/ diff --git a/.github/workflows/publish_pypi_twitter_langchain.yml b/.github/workflows/publish_pypi_twitter_langchain.yml index 92834c1b5..5a08d6eef 100644 --- a/.github/workflows/publish_pypi_twitter_langchain.yml +++ b/.github/workflows/publish_pypi_twitter_langchain.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./twitter-langchain/python + working-directory: ./python/twitter-langchain environment: name: pypi url: https://pypi.org/p/twitter-langchain @@ -41,4 +41,4 @@ jobs: uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_API_TOKEN }} - packages-dir: twitter-langchain/python/dist/ + packages-dir: python/twitter-langchain/dist/ diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index b2d124167..2e003ab2b 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./cdp-agentkit-core/python + working-directory: ./python/cdp-agentkit-core strategy: matrix: python: ['3.10', '3.11', '3.12'] @@ -30,8 +30,8 @@ jobs: id: cached-poetry-dependencies uses: actions/cache@v3 with: - path: ./cdp-agentkit-core/python/.venv - key: venv-agentkit-${{ runner.os }}-${{ matrix.python }}-${{ hashFiles('cdp-agentkit-core/python/poetry.lock') }} + path: ./python/cdp-agentkit-core/.venv + key: venv-agentkit-${{ runner.os }}-${{ matrix.python }}-${{ hashFiles('python/cdp-agentkit-core/poetry.lock') }} - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' @@ -44,7 +44,7 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./cdp-langchain/python + working-directory: ./python/cdp-langchain strategy: matrix: python: ['3.10', '3.11', '3.12'] @@ -68,8 +68,8 @@ jobs: id: cached-poetry-dependencies uses: actions/cache@v3 with: - path: ./cdp-langchain/python/.venv - key: venv-langchain-${{ runner.os }}-${{ matrix.python }}-${{ hashFiles('cdp-langchain/python/poetry.lock') }} + path: ./python/cdp-langchain/.venv + key: venv-langchain-${{ runner.os }}-${{ matrix.python }}-${{ hashFiles('python/cdp-langchain/poetry.lock') }} - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' @@ -82,7 +82,7 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: ./twitter-langchain/python + working-directory: ./python/twitter-langchain strategy: matrix: python: ['3.10', '3.11', '3.12'] @@ -106,8 +106,8 @@ jobs: id: cached-poetry-dependencies uses: actions/cache@v3 with: - path: ./twitter-langchain/python/.venv - key: venv-twitter-langchain-${{ runner.os }}-${{ matrix.python }}-${{ hashFiles('cdp-twitter-langchain/python/poetry.lock') }} + path: ./python/twitter-langchain/.venv + key: venv-twitter-langchain-${{ runner.os }}-${{ matrix.python }}-${{ hashFiles('python/twitter-langchain/poetry.lock') }} - name: Install dependencies if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' diff --git a/CONTRIBUTING-PYTHON.md b/CONTRIBUTING-PYTHON.md index 3b6aa15f7..82b9d6530 100644 --- a/CONTRIBUTING-PYTHON.md +++ b/CONTRIBUTING-PYTHON.md @@ -6,7 +6,7 @@ This guide covers Python-specific setup and development for AgentKit. - [Development Setup](#development-setup) - [Adding an Agentic Action](#adding-an-agentic-action) -- [Adding an Agentic Action to Langchain Toolkit](#adding-an-agentic-action-to-langchain-toolkit) +- [Adding an Agentic Action to LangChain Toolkit](#adding-an-agentic-action-to-langchain-toolkit) - [Adding an Agentic Action to the Twitter Toolkit](#adding-an-agentic-action-to-the-twitter-toolkit) - [Integrating into an AI Agent Framework](#integrating-into-an-ai-agent-framework) - [Testing](#testing) @@ -37,12 +37,12 @@ An Action is an interface for an AI Agent to interact with the real world: any P 2. **Input Schema**: Define the input parameters using [Pydantic](https://docs.pydantic.dev/latest/) schemas. Pydantic is used to validate the inputs to the action and to generate a JSON schema that can be used by the LLM to understand the inputs. 3. **Implementation Function**: The actual logic that executes the action. This function receives as input the wallet that the Agent has access to, and as you'll see in the walkthrough below, we can use this wallet to invoke an onchain contract! For more information on contract invocations using a CDP wallet, see [here](https://docs.cdp.coinbase.com/cdp-sdk/docs/onchain-interactions#smart-contract-interactions). -In practice, Actions are housed in `cdp-agentkit-core/python/cdp_agentkit_core/actions` and generally grouped by the type of action they are. For example, actions related to interacting with social platforms such as X (Twitter) are housed in `cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter`. When adding a new action, check if there is an existing folder for the type of action you are adding and add your new action to the appropriate folder. +In practice, Actions are housed in `python/cdp-agentkit-core/cdp_agentkit_core/actions` and generally grouped by the type of action they are. For example, actions related to interacting with social platforms such as X (Twitter) are housed in `python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter`. When adding a new action, check if there is an existing folder for the type of action you are adding and add your new action to the appropriate folder. Here's the structure of the actions directory: ``` -./cdp-agentkit-core/python +./python/cdp-agentkit-core └── cdp_agentkit_core └── actions ├── defi @@ -53,7 +53,7 @@ Here's the structure of the actions directory: └── wow ``` -Once you decide which folder to add your action to, go ahead and create a new file there to house your action, then read through the following sections to learn how to implement your action. For a complete example of an action, see [mint_nft.py](https://github.com/coinbase/agentkit/blob/master/cdp-agentkit-core/python/cdp_agentkit_core/actions/mint_nft.py). +Once you decide which folder to add your action to, go ahead and create a new file there to house your action, then read through the following sections to learn how to implement your action. For a complete example of an action, see [mint_nft.py](https://github.com/coinbase/agentkit/blob/master/python/cdp-agentkit-core/cdp_agentkit_core/actions/mint_nft.py). ### Crafting a good prompt @@ -136,30 +136,30 @@ class MintNftAction(CdpAction): func: Callable[..., str] = mint_nft ``` -This class is then exported out of [`cdp_agentkit_core/actions/__init__.py`](https://github.com/coinbase/agentkit/blob/master/cdp-agentkit-core/python/cdp_agentkit_core/actions/__init__.py) so that is is consumable by users of the `cdp-agentkit-core` package. +This class is then exported out of [`cdp_agentkit_core/actions/__init__.py`](https://github.com/coinbase/agentkit/blob/master/python/cdp-agentkit-core/cdp_agentkit_core/actions/__init__.py) so that is is consumable by users of the `cdp-agentkit-core` package. ### Testing the action There are two forms of testing you should do: unit testing and manual end-to-end testing. -To add a unit test for your action, add a file to the folder in `cdp-agentkit-core/python/tests/actions` that corresponds to the same folder that you are adding your action to. For an example, see [test_mint_nft.py](https://github.com/coinbase/agentkit/blob/master/cdp-agentkit-core/python/tests/actions/test_mint_nft.py). +To add a unit test for your action, add a file to the folder in `python/cdp-agentkit-core/tests/actions` that corresponds to the same folder that you are adding your action to. For an example, see [test_mint_nft.py](https://github.com/coinbase/agentkit/blob/master/python/cdp-agentkit-core/tests/actions/test_mint_nft.py). You can then run the unit tests with the following command: ```bash -cd cdp-agentkit-core/python +cd python/cdp-agentkit-core make test ``` For instructions on manual end-to-end testing, see the [Testing](#testing) section. -## Adding an Agentic Action to Langchain Toolkit +## Adding an Agentic Action to LangChain Toolkit -The action will be included automatically, all you need to do is add the action to the list of tools in the `CdpToolkit` class documentation in `cdp-langchain/python/cdp_langchain/agent_toolkits/cdp_toolkit.py`. +The action will be included automatically, all you need to do is add the action to the list of tools in the `CdpToolkit` class documentation in `python/cdp-langchain/cdp_langchain/agent_toolkits/cdp_toolkit.py`. ## Adding an Agentic Action to the Twitter Toolkit 1. Ensure the action is implemented in `cdp-agentkit-core/actions/social/twitter`. -2. Add a wrapper method to `TwitterApiWrapper` in `./twitter_langchain/twitter_api_wrapper.py` +2. Add a wrapper method to `TwitterApiWrapper` in `python/twitter-langchain/twitter_langchain/twitter_api_wrapper.py` - E.g. ```python def post_tweet_wrapper(self, tweet: str) -> str: @@ -176,14 +176,14 @@ The action will be included automatically, all you need to do is add the action return post_tweet(client=self.client, tweet=tweet) ``` -3. Add call to the wrapper in `TwitterApiWrapper.run` in `./twitter_langchain/twitter_api_wrapper.py` +3. Add call to the wrapper in `TwitterApiWrapper.run` in `python/twitter-langchain/twitter_langchain/twitter_api_wrapper.py` - E.g. ```python if mode == "post_tweet": return self.post_tweet_wrapper(**kwargs) ``` -4. Add the action to the list of available tools in the `TwitterToolkit` in `./twitter_langchain/twitter_toolkit.py` +4. Add the action to the list of available tools in the `TwitterToolkit` in `python/twitter-langchain/twitter_langchain/twitter_toolkit.py` - E.g. ```python actions: List[Dict] = [ @@ -205,21 +205,21 @@ Actions are necessary building blocks powering onchain AI applications, but they Integrations into AI Agent frameworks are specific to the framework itself, so we can't go into specific implementation details here, but we can offer up some examples and tips. - To automatically get access to new actions as they are released, make sure to import the `CDP_ACTIONS` constant from `cdp-agentkit-core`. This will make it so that all you / the framework authors have to do to get new actions is bump the version of AgentKit the framework is using. -- Check out how [AgentKit Actions are mapped into LangChain Tools](https://github.com/coinbase/agentkit/blob/master/cdp-langchain/python/cdp_langchain/agent_toolkits/cdp_toolkit.py#L132-L141) +- Check out how [AgentKit Actions are mapped into LangChain Tools](https://github.com/coinbase/agentkit/blob/master/python/cdp-langchain/cdp_langchain/agent_toolkits/cdp_toolkit.py#L132-L141) ## Testing ### Local Testing -A good way to test new actions locally is by using the chatbot example in `cdp-langchain`. See the [chatbot README](https://github.com/coinbase/agentkit/blob/master/cdp-langchain/examples/chatbot-python/README.md) for instructions on setting up and running the chatbot. +A good way to test new actions locally is by using the chatbot example in `cdp-langchain`. See the [chatbot README](https://github.com/coinbase/agentkit/blob/master/python/examples/cdp-langchain-chatbot/README.md) for instructions on setting up and running the chatbot. The flow is: 1. Make your change as described in the [Adding an Agentic Action](#adding-an-agentic-action) section -2. Update `cdp-langchain/examples/chatbot-python/pyproject.toml` to point to the local package +2. Update `python/examples/cdp-langchain-chatbot/pyproject.toml` to point to the local package ```diff [tool.poetry] -name = "chatbot-python" +name = "cdp-langchain-chatbot" version = "0.0.1" description = "CDP AgentKit Example Chatbot" authors = ["John Peterson "] @@ -229,13 +229,13 @@ package-mode = false [tool.poetry.dependencies] python = "^3.10" - cdp-langchain = "^0.0.11" -+ cdp-langchain = { path: "../../cdp-agentkit-core/python", develop: true } ++ cdp-langchain = { path: "../cdp-agentkit-core", develop: true } [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" ``` -3. In `cdp-langchain/examples/chatbot-python`, run `python chatbot.py` +3. In `python/examples/cdp-langchain-chatbot`, run `python chatbot.py` 4. You can now interact with your new action via the chatbot! ### Running Unit Tests @@ -246,9 +246,9 @@ From the package you are working in, you can run: make test ``` -For example, to run all tests in the `cdp_agentkit_core` package, you can run: +For example, to run all tests in the `cdp-agentkit-core` package, you can run: ```bash -cd cdp-agentkit-core/python +cd python/cdp-agentkit-core make test ``` diff --git a/CONTRIBUTING-TYPESCRIPT.md b/CONTRIBUTING-TYPESCRIPT.md index a543a622c..5b618f7a2 100644 --- a/CONTRIBUTING-TYPESCRIPT.md +++ b/CONTRIBUTING-TYPESCRIPT.md @@ -5,8 +5,8 @@ This guide covers TypeScript-specific setup and development for AgentKit. ## Contents - [Development Setup](#development-setup) -- [Adding an Agentic Action](#adding-an-agentic-action) -- [Adding an Agentic Action to Langchain Toolkit](#adding-an-agentic-action-to-langchain-toolkit) +- [Adding an Action Provider](#adding-an-action-provider) +- [Adding a Wallet Provider](#adding-a-wallet-provider) - [Integrating into an AI Agent Framework](#integrating-into-an-ai-agent-framework) - [Testing](#testing) - [Code Style](#code-style) @@ -26,36 +26,52 @@ If the versions are not correct or you don't have Node.js or npm installed, down Once you have these installed, make sure you install the project dependencies by running `npm install` from the root of the repository. -## Adding an Agentic Action +## Adding an Action Provider -An Action is an interface for an AI Agent to interact with the real world: any TypeScript function that you can think of can be used by an Agent via an Action! There are a few components to an Action: +An Action is an interface for an AI Agent to interact with the real world: any TypeScript function that you can think of can be used by an Agent via an Action! Actions are grouped by Action Providers, which are classes that contain a collection of actions along with configuration and helper functions. -1. **Prompt**: A description that helps the AI understand when and how to use the action. It's important to describe the inputs and outputs of the action and include examples. Additionally, think about what inputs can be removed entirely and fetched or inferred by the LLM, so that users don't have to manually provide them. -2. **Input Schema**: Define the input parameters using [Zod](https://zod.dev/) schemas. Zod is used to validate the inputs to the action and to generate a JSON schema that can be used by the LLM to understand the inputs. -3. **Implementation Function**: The actual logic that executes the action. This function receives as input the wallet that the Agent has access to, and as you'll see in the walkthrough below, we can use this wallet to invoke an onchain contract! For more information on contract invocations using a CDP wallet, see [here](https://docs.cdp.coinbase.com/cdp-sdk/docs/onchain-interactions#smart-contract-interactions). +Action Components: -In practice, Actions are housed in `cdp-agentkit-core/typescript/src/actions/cdp` and generally grouped by the type of action they are. For example, actions related to interacting with social platforms such as X (Twitter) are housed in `cdp-agentkit-core/typescript/src/actions/cdp/social/twitter`. When adding a new action, check if there is an existing folder for the type of action you are adding and add your new action to the appropriate folder. +1. **Name**: The name of the action. This is used to identify the action when it is added to an Agent. -Here's the structure of the actions directory: +2. **Description**: A description that helps the AI understand when and how to use the action. It's important to describe the inputs and outputs of the action and include examples. Additionally, think about what inputs can be removed entirely and fetched or inferred by the LLM, so that users don't have to manually provide them. + +3. **Input Schema**: Define the input parameters using [Zod](https://zod.dev/) schemas. Zod is used to validate the inputs to the action and to generate a JSON schema that can be used by the LLM to understand the inputs. + +4. **Invocation Function**: The actual logic that executes the action. This function receives as input the wallet that the Agent has access to, and as you'll see in the walkthrough below, we can use this wallet to invoke an onchain contract! For more information on contract invocations using a CDP wallet, see [here](https://docs.cdp.coinbase.com/cdp-sdk/docs/onchain-interactions#smart-contract-interactions). + +In practice, action providers are housed in `typescript/agentkit/src/action-providers` and generally grouped by the type of action they are and the configuration they require . For example, actions related to interacting with social platforms such as X (Twitter) are housed in `typescript/agentkit/src/action-providers/twitter`. When adding a new action, check if there is an existing action provider for the type of action you are adding and add your new action to the appropriate folder. + +Here's the structure of the action providers directory: ``` -./cdp-agentkit-core/typescript/src -└── actions - └── cdp - ├── data - ├── defi - └── social +./typescript/agentkit/src +└── action-providers + └── pyth + ├── pythActionProvider.ts + ├── schemas.ts + └── pythActionProvider.test.ts + └── ... ``` -Once you decide which folder to add your action to, go ahead and create a new file there to house your action, then read through the following sections to learn how to implement your action. For a complete example of an action, see [mint_nft.ts](https://github.com/coinbase/agentkit/blob/master/cdp-agentkit-core/typescript/src/actions/cdp/mint_nft.ts). +Once you decide which folder to add your action to, go ahead and create a new file there to house your action, then read through the following sections to learn how to implement your action. For a complete example of an action provider, see [erc721ActionProvider.ts](https://github.com/coinbase/agentkit/blob/master/typescript/agentkit/src/action-providers/erc721/erc721ActionProvider.ts). -### Crafting a good prompt +### Crafting a good description prompt -The prompt is used by the LLM to understand when and how to use the action. It's important to be as specific as possible in describing the inputs and outputs of the action and include examples. Take the Mint NFT prompt for example: +The description prompt is used by the LLM to understand when and how to use the action. It's important to be as specific as possible in describing the inputs and outputs of the action and include examples. Take the Mint NFT prompt for example: ```typescript -const MINT_NFT_PROMPT = ` -This tool will mint an NFT (ERC-721) to a specified destination address onchain via a contract invocation. It takes the contract address of the NFT onchain and the destination address onchain that will receive the NFT as inputs. Do not use the contract address as the destination address. If you are unsure of the destination address, please ask the user before proceeding.`; +// src/action-providers/erc721/erc721ActionProvider.ts + + @CreateAction({ + name: "mint", + description: ` +This tool will mint an NFT (ERC-721) to a specified destination address onchain via a contract invocation. +It takes the contract address of the NFT onchain and the destination address onchain that will receive the NFT as inputs. +Do not use the contract address as the destination address. If you are unsure of the destination address, please ask the user before proceeding. +`, + schema: MintSchema, + }) ``` * The prompt disambuguates the type of NFT by specifying "ERC-721" @@ -68,7 +84,9 @@ This tool will mint an NFT (ERC-721) to a specified destination address onchain The input schema is used to validate the inputs to the action and to generate a JSON schema that can be used by the LLM to understand the inputs. For TypeScript, we use [Zod](https://zod.dev/) to define the input schema. For example, the Mint NFT input schema is defined as follows: ```typescript -const MintNftInput = z +// src/action-providers/erc721/schemas.ts + +const MintSchema = z .object({ contractAddress: z.string().describe("The contract address of the NFT to mint"), destination: z.string().describe("The destination address that will receive the NFT"), @@ -79,88 +97,124 @@ const MintNftInput = z This says that the input schema has two fields: `contractAddress` and `destination`. The `contractAddress` field is required and must be a string. The `destination` field is required and must be a string. For more information on Zod, see the [Zod documentation](https://zod.dev/). -### Implementing the action - -Now we need to implement the actual function that the AI will call when using your action. The function receives as input the wallet that the Agent has access to, along with the inputs defined in the input schema, and it must return a string. This return value is used by the LLM to understand the result of the action, which in turn will generate a user-facing response. Here's an example of the Mint NFT implementation function: +### Implementing the action provider ```typescript -async function mintNft(wallet: Wallet, args: z.infer): Promise { - const mintArgs = { - to: args.destination, - quantity: "1", - }; - - try { - const mintInvocation = await wallet.invokeContract({ - contractAddress: args.contractAddress, - method: "mint", - args: mintArgs, - }); - - const result = await mintInvocation.wait(); - - return `Minted NFT from contract ${args.contractAddress} to address ${args.destination} on network ${wallet.getNetworkId()}.\nTransaction hash for the mint: ${result.getTransaction().getTransactionHash()}\nTransaction link for the mint: ${result.getTransaction().getTransactionLink()}`; - } catch (error) { - return `Error minting NFT: ${error}`; +// src/action-providers/erc721/erc721ActionProvider.ts + +export class Erc721ActionProvider extends ActionProvider { + constructor() { + super("erc721", []); } + + supportsNetwork = (network: Network) => network.protocolFamily === "evm"; } + +export const erc721ActionProvider = () => new Erc721ActionProvider(); ``` -Notice the return value contains useful information for the user, such as the transaction hash and link. It's important to include this information in the return value so that the user can easily see the result of the action. +### Implementing the action -Finally, we need to create a class that implements the `CdpAction` interface and export it. This class contains the name, description, input schema, and implementation function of the action. Here's an example of the Mint NFT action class: +Now we need to implement the actual function that the AI will call when using your action. Actions are defined as instance methods on the action provider class with the `@CreateAction` decorator. The function receives as input the wallet provider that the Agent has access to, along with the inputs defined in the input schema, and it must return a string. This return value is used by the LLM to understand the result of the action, which in turn will generate a user-facing response. Here's an example of the Mint NFT implementation instance method: ```typescript -export class MintNftAction implements CdpAction { - public name = "mint_nft"; - public description = MINT_NFT_PROMPT; - public argsSchema = MintNftInput; - public func = mintNft; +// src/action-providers/erc721/erc721ActionProvider.ts + +export class Erc721ActionProvider extends ActionProvider { + constructor() { + super("erc721", []); + } + + @CreateAction({ + name: "mint", + description: ` +This tool will mint an NFT (ERC-721) to a specified destination address onchain via a contract invocation. +It takes the contract address of the NFT onchain and the destination address onchain that will receive the NFT as inputs. +Do not use the contract address as the destination address. If you are unsure of the destination address, please ask the user before proceeding. +`, + schema: MintSchema, + }) + async mint(walletProvider: EvmWalletProvider, args: z.infer): Promise { + try { + const data = encodeFunctionData({ + abi: ERC721_ABI, + functionName: "mint", + args: [args.destination as Hex, 1n], + }); + + const hash = await walletProvider.sendTransaction({ + to: args.contractAddress as `0x${string}`, + data, + }); + + await walletProvider.waitForTransactionReceipt(hash); + + return `Successfully minted NFT ${args.contractAddress} to ${args.destination}`; + } catch (error) { + return `Error minting NFT ${args.contractAddress} to ${args.destination}: ${error}`; + } + } + + supportsNetwork = (network: Network) => network.protocolFamily === "evm"; } + ``` -This class is then exported out of [cdp-agentkit-core/typescript/src/actions/cdp/index.ts](https://github.com/coinbase/agentkit/blob/master/cdp-agentkit-core/typescript/src/actions/cdp/index.ts) so that is is consumable by users of the `@coinbase/cdp-agentkit-core` package. +Notice the return value contains useful information for the user, such as the transaction hash and link. It's important to include this information in the return value so that the user can easily see the result of the action. -### Testing the action +This class is then exported out of [typescript/agentkit/src/action-providers/erc721/index.ts](https://github.com/coinbase/agentkit/blob/master/typescript/agentkit/src/action-providers/erc721/index.ts) so that is is consumable by users of the `@coinbase/agentkit` package. + +### Testing the action provider There are two forms of testing you should do: unit testing and manual end-to-end testing. -To add a unit test for your action, add a file to the folder in `cdp-agentkit-core/typescript/src/tests/actions` that corresponds to the same folder that you are adding your action to, or to the top-level if there is no folder. For an example, see [test_mint_nft.ts](https://github.com/coinbase/agentkit/blob/master/cdp-agentkit-core/typescript/tests/actions/test_mint_nft.ts). +To add a unit test for your action provider, add a file to your action provider folder post-fixing it with `.test.ts`. For an example, see [pythActionProvider.test.ts](https://github.com/coinbase/agentkit/blob/master/typescript/agentkit/src/action-providers/pyth/pythActionProvider.test.ts). You can then run the unit tests with the following command: ```bash -cd cdp-agentkit-core/typescript +cd typescript/agentkit npm test ``` For instructions on manual end-to-end testing, see the [Testing](#testing) section. -Check out the [Testing](#testing) section to learn how to manually test your new action. +Check out the [Testing](#testing) section to learn how to manually test your new action provider. + +## Adding a Wallet Provider + +Wallet providers give an agent access to a wallet. AgentKit currently supports the following wallet providers: + +EVM: +- [CdpWalletProvider](https://github.com/coinbase/agentkit/blob/master/typescript/agentkit/src/wallet-providers/cdpWalletProvider.ts) +- [ViemWalletProvider](https://github.com/coinbase/agentkit/blob/master/typescript/agentkit/src/wallet-providers/viemWalletProvider.ts) + +### Adding a new EVM wallet provider + +The EVM Wallet Providers are housed in `typescript/agentkit/src/wallet-providers`. EVM Wallet Providers extend `EvmWalletProvider` which is an abstract class that conforms to [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193). To add a new EVM wallet provider, create a new file in the `wallet-providers` directory and implement a class that extends `EvmWalletProvider`. -## Adding an Agentic Action to Langchain Toolkit +### Adding a new non-EVM wallet provider -The action will be included automatically, all you need to do is add the action to the list of tools in the `CdpToolkit` class documentation in `cdp-langchain/typescript/src/toolkits/cdp_toolkit.ts`. +Non-EVM Wallet Providers are housed in `typescript/agentkit/src/wallet-providers`. Non-EVM Wallet Providers extend `WalletProvider` which is an abstract class that provides a core set of wallet functionality. To add a new non-EVM wallet provider, create a new file in the `wallet-providers` directory and implement a class that extends `WalletProvider`. ## Integrating into an AI Agent Framework Actions are necessary building blocks powering onchain AI applications, but they're just one piece of the puzzle. To make them truly useful, they must be integrated into an AI Agent framework such as [LangChain](https://www.langchain.com/) or [Eliza](https://elizaos.github.io/eliza/), among others. Integrations into AI Agent frameworks are specific to the framework itself, so we can't go into specific implementation details here, but we can offer up some examples and tips. -- To automatically get access to new actions as they are released, make sure to import the `CDP_ACTIONS` constant from `@coinbase/cdp-agentkit-core`. This will make it so that all you / the framework authors have to do to get new actions is bump the version of AgentKit the framework is using. -- Check out how [AgentKit actions are mapped into LangChain Tools](https://github.com/coinbase/agentkit/blob/master/cdp-langchain/typescript/src/toolkits/cdp_toolkit.ts#L59) +- Check out how [AgentKit actions are mapped into LangChain Tools](https://github.com/coinbase/agentkit/blob/master/typescript/agentkit-langchain/src/index.ts) - Check out how [AgentKit Actions are mapped into Eliza Actions](https://github.com/elizaOS/eliza/blob/develop/packages/plugin-agentkit/src/actions.ts#L31) ## Testing ### Local Testing -A good way to test new actions locally is by using the chatbot example in `cdp-langchain`. See the [chatbot README](https://github.com/coinbase/agentkit/blob/master/cdp-langchain/examples/chatbot-typescript/README.md) for instructions on setting up and running the chatbot. +A good way to test new actions locally is by using the chatbot example in `typescript/examples/langchain-cdp-chatbot`. See the [chatbot README](https://github.com/coinbase/agentkit/blob/master/typescript/examples/langchain-cdp-chatbot/README.md) for instructions on setting up and running the chatbot. The flow is: 1. Make your change as described in the [Adding an Agentic Action](#adding-an-agentic-action) section -2. From root, run `npm run build` -3. In `cdp-langchain/examples/chatbot-typescript`, run `npm run start` +2. From root, run `npm run build && npm i` +3. In `typescript/examples/langchain-cdp-chatbot`, run `npm run start` 4. You can now interact with your new action via the chatbot! ### Running Tests @@ -171,9 +225,9 @@ From the package you are working in, you can run: npm test ``` -For example, to run all tests in the `cdp-agentkit-core` package, you can run: +For example, to run all tests in the `@coinbase/agentkit` package, you can run: ```bash -cd cdp-agentkit-core/typescript +cd typescript/agentkit npm test ``` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c083e4989..01edb8121 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ Thank you for your interest in contributing to AgentKit! We welcome all contribu ## Repository Structure -The AgentKit repository is organized as a [multi-package workspace](https://vercel.com/docs/vercel-platform/glossary#multi-package-workspace) (otherwise known as a [monorepo](https://vercel.com/docs/vercel-platform/glossary#monorepo)) and managed with [Turborepo](https://turbo.build/repo/docs). The repo contains multiple packages for Python and TypeScript, where a [package](https://vercel.com/docs/vercel-platform/glossary#package) is a single subfolder with either a `package.json` (if it's a TypeScript package) or a `pyproject.toml` (if it's a Python package),and related code that is published to either NPM or PyPI. For example, the `cdp-agentkit-core/typescript` subfolder is one package, and the `cdp-agentkit-core/python` subfolder is another package. +The AgentKit repository is organized as a [multi-package workspace](https://vercel.com/docs/vercel-platform/glossary#multi-package-workspace) (otherwise known as a [monorepo](https://vercel.com/docs/vercel-platform/glossary#monorepo)) and managed with [Turborepo](https://turbo.build/repo/docs). The repo contains multiple packages for Python and TypeScript, where a [package](https://vercel.com/docs/vercel-platform/glossary#package) is a single subfolder with either a `package.json` (if it's a TypeScript package) or a `pyproject.toml` (if it's a Python package),and related code that is published to either NPM or PyPI. For example, the `typescript/agentkit` subfolder is one package, and the `python/cdp-agentkit-core` subfolder is another package. Note that not all AgentKit packages have both Python and TypeScript implementations. This is okay, and we expect some level of drift between the languages. If you'd like to add a TypeScript variant of a package that only has a Python variant (or vice versa), that would be a great and welcome contribution! @@ -12,18 +12,22 @@ See this section for tips on developing in our monorepo: [Monorepo Development T Here's a high-level overview of the repository structure: ``` -./agentkit -├── cdp-agentkit-core/ -│ ├── python/ -│ └── typescript/ -├── cdp-langchain/ -│ ├── python/ -│ └── typescript/ -├── farcaster-langchain/ -│ └── typescript/ -└── twitter-langchain/ - ├── python/ - └── typescript/ +./ +├── typescript/ +│ ├── agentkit/ +│ ├── framework-extensions/ +│ | └── langchain/ +│ └── examples/ +│ ├── langchain-cdp-chatbot/ +│ ├── langchain-farcaster-chatbot/ +│ └── langchain-twitter-chatbot/ +├── python/ +│ ├── cdp-agentkit-core/ +│ ├── cdp-langchain/ +│ ├── twitter-langchain/ +│ └── examples/ +│ ├── cdp-langchain-chatbot/ +│ └── twitter-langchain-chatbot/ ``` ## Language-Specific Guides @@ -85,4 +89,4 @@ Here are some common issues you might run into when developing in our monorepo a | Issue | Resolution | | ----- | ---------- | -| Python imports are not resolving in VSCode / Cursor | Try opening the package folder in a new window. For example, `cd cdp-agentkit-core/python` and then `code .` or `cursor .` | +| Python imports are not resolving in VSCode / Cursor | Try opening the package folder in a new window. For example, `cd python/cdp-agentkit-core` and then `code .` or `cursor .` | diff --git a/README.md b/README.md index 8879e0a91..471e8d9b5 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,9 @@

[![PyPI - Downloads](https://img.shields.io/pypi/dm/cdp-agentkit-core?style=flat-square)](https://pypistats.org/packages/cdp-agentkit-core) -[![npm downloads](https://img.shields.io/npm/dm/@coinbase/cdp-agentkit-core?style=flat-square)](https://www.npmjs.com/package/@coinbase/cdp-agentkit-core) -[![GitHub star chart](https://img.shields.io/github/stars/coinbase/cdp-agentkit?style=flat-square)](https://star-history.com/#coinbase/cdp-agentkit) -[![Open Issues](https://img.shields.io/github/issues-raw/coinbase/cdp-agentkit?style=flat-square)](https://github.com/coinbase/cdp-agentkit/issues) +[![npm downloads](https://img.shields.io/npm/dm/@coinbase/cdp-agentkit-core?style=flat-square)](https://www.npmjs.com/package/@coinbase/agentkit) +[![GitHub star chart](https://img.shields.io/github/stars/coinbase/cdp-agentkit?style=flat-square)](https://star-history.com/#coinbase/agentkit) +[![Open Issues](https://img.shields.io/github/issues-raw/coinbase/cdp-agentkit?style=flat-square)](https://github.com/coinbase/agentkit/issues) @@ -49,11 +49,10 @@ AgentKit is [Coinbase Developer Platform's](https://docs.cdp.coinbase.com) frame ## 🚀 Quickstart -### Python +### Node.js *Prerequisites*: -- [Python 3.10+](https://www.python.org/downloads/) -- [Poetry](https://python-poetry.org/docs/) +- [Node.js 18+](https://nodejs.org/en/download/) - [CDP Secret API Key](https://docs.cdp.coinbase.com/get-started/docs/cdp-api-keys#creating-secret-api-keys) - [OpenAI API Key](https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key) @@ -63,19 +62,19 @@ AgentKit is [Coinbase Developer Platform's](https://docs.cdp.coinbase.com) frame # Clone the repository git clone https://github.com/coinbase/agentkit.git -# Navigate to the chatbot-python example -cd agentkit/cdp-langchain/examples/chatbot-python +# Navigate to the langchain-cdp-chatbot example +cd agentkit/typescript/examples/langchain-cdp-chatbot -# At this point, fill in your CDP API key name, private key, and OpenAI API key in the -# .env.example file. +# At this point, fill in your CDP API key name, private key, and OpenAI API key in +# the .env.example file. # Then, rename the .env.example file to .env mv .env.example .env # Install dependencies -poetry install +npm install # Run the chatbot -make run +npm run start ``` 2. Select "1. chat mode" and start telling your Agent to do things onchain! @@ -92,10 +91,11 @@ Your wallet has been successfully funded with testnet ETH. You can view the tran ------------------- ``` -### Node.js +### Python *Prerequisites*: -- [Node.js 18+](https://nodejs.org/en/download/) +- [Python 3.10+](https://www.python.org/downloads/) +- [Poetry](https://python-poetry.org/docs/) - [CDP Secret API Key](https://docs.cdp.coinbase.com/get-started/docs/cdp-api-keys#creating-secret-api-keys) - [OpenAI API Key](https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key) @@ -105,19 +105,19 @@ Your wallet has been successfully funded with testnet ETH. You can view the tran # Clone the repository git clone https://github.com/coinbase/agentkit.git -# Navigate to the chatbot-typescript example -cd agentkit/cdp-langchain/examples/chatbot-typescript +# Navigate to the chatbot-python example +cd agentkit/python/cdp-langchain/examples/chatbot-python -# At this point, fill in your CDP API key name, private key, and OpenAI API key in -# the .env.example file. +# At this point, fill in your CDP API key name, private key, and OpenAI API key in the +# .env.example file. # Then, rename the .env.example file to .env mv .env.example .env # Install dependencies -npm install +poetry install # Run the chatbot -npm run start +make run ``` 2. Select "1. chat mode" and start telling your Agent to do things onchain! @@ -140,42 +140,23 @@ AgentKit is organized as a monorepo that contains multiple packages. ``` ./ -├── cdp-agentkit-core/ -│ ├── python/ -│ └── typescript/ -├── cdp-langchain/ -│ ├── python/ -│ ├── typescript/ +├── typescript/ +│ ├── agentkit/ +│ ├── framework-extensions/ +│ | └── langchain/ │ └── examples/ -└── farcaster-langchain/ - ├── typescript/ - └── examples/ -└── twitter-langchain/ - ├── python/ - ├── typescript/ - └── examples/ +│ ├── langchain-cdp-chatbot/ +│ ├── langchain-farcaster-chatbot/ +│ └── langchain-twitter-chatbot/ +├── python/ +│ ├── cdp-agentkit-core/ +│ ├── cdp-langchain/ +│ ├── twitter-langchain/ +│ └── examples/ +│ ├── cdp-langchain-chatbot/ +│ └── twitter-langchain-chatbot/ ``` -### cdp-agentkit-core - -Core primitives and framework-agnostic tools that are meant to be composable and used via AgentKit framework extensions (ie, `cdp-langchain`). -See [CDP Agentkit Core](./cdp-agentkit-core/README.md) to get started! - -### cdp-langchain - -Langchain Toolkit extension of AgentKit. Enables agentic workflows to interact with onchain actions. -See [CDP Langchain](./cdp-langchain/README.md) to get started! - -### farcaster-langchain - -Langchain Toolkit extension for Farcaster. Enables agentic workflows to interact with Farcaster, such as to post a tweet. -See [Farcaster Langchain](./farcaster-langchain/typescript/README.md) to get started! - -### twitter-langchain - -Langchain Toolkit extension for Twitter. Enables agentic workflows to interact with Twitter, such as to post a tweet. -See [Twitter Langchain](./twitter-langchain/README.md) to get started! - ## 🤝 Contributing **AgentKit is actively looking for community contributions!** @@ -190,8 +171,8 @@ See [Twitter Langchain](./twitter-langchain/README.md) to get started! - [AgentKit Core](https://coinbase.github.io/agentkit/cdp-agentkit-core/python/index.html) - [AgentKit Langchain Extension](https://coinbase.github.io/agentkit/cdp-langchain/python/index.html) - Node.js API References - - [AgentKit Core](https://coinbase.github.io/agentkit/cdp-agentkit-core/typescript/index.html) - - [AgentKit Langchain Extension](https://coinbase.github.io/agentkit/cdp-langchain/typescript/index.html) + - [AgentKit](https://coinbase.github.io/agentkit/agentkit/typescript/index.html) + - [AgentKit Langchain Extension](https://coinbase.github.io/agentkit-langchain/typescript/index.html) ## 🚨 Security and Bug Reports @@ -225,4 +206,4 @@ The AgentKit software is novel and experimental, and is therefore provided on an software may produce output that is inaccurate, incorrect, unpredictable or undesirable, and it is the user's exclusive responsibility to evaluate the output and the use-case and determine whether it is appropriate. The right to use the software is contingent on your - agreement to the [CDP Terms of Service](https://www.coinbase.com/legal/developer-platform/terms-of-service) (except to the extent it conflicts with the Apache-2.0 license). \ No newline at end of file + agreement to the [CDP Terms of Service](https://www.coinbase.com/legal/developer-platform/terms-of-service) (except to the extent it conflicts with the Apache-2.0 license). diff --git a/cdp-agentkit-core/README.md b/cdp-agentkit-core/README.md deleted file mode 100644 index 97bca4d9d..000000000 --- a/cdp-agentkit-core/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Agentkit Core - -Framework agnostic primitives that are meant to be composable and used via Agentkit framework extensions. - -For Python, see [cdp-agentkit-core/python](./python/README.md). -For TypeScript, see [cdp-agentkit-core/typescript](./typescript/README.md). diff --git a/cdp-agentkit-core/python/docs/README.md b/cdp-agentkit-core/python/docs/README.md deleted file mode 120000 index 32d46ee88..000000000 --- a/cdp-agentkit-core/python/docs/README.md +++ /dev/null @@ -1 +0,0 @@ -../README.md \ No newline at end of file diff --git a/cdp-agentkit-core/typescript/jest.config.cjs b/cdp-agentkit-core/typescript/jest.config.cjs deleted file mode 100644 index 57471c6d0..000000000 --- a/cdp-agentkit-core/typescript/jest.config.cjs +++ /dev/null @@ -1,20 +0,0 @@ -const baseConfig = require("../../jest.config.base.cjs"); - -module.exports = { - ...baseConfig, - coveragePathIgnorePatterns: ["node_modules", "dist", "docs", "index.ts"], - coverageThreshold: { - "./src/actions/cdp/*": { - branches: 50, - functions: 50, - statements: 50, - lines: 50, - }, - "./src/actions/cdp/defi/wow/actions/*": { - branches: 50, - functions: 50, - statements: 50, - lines: 50, - }, - }, -}; diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/address_reputation.ts b/cdp-agentkit-core/typescript/src/actions/cdp/address_reputation.ts deleted file mode 100644 index 6d25e303a..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/address_reputation.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Wallet, Address } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; - -import { CdpAction } from "./cdp_action"; - -const ADDRESS_REPUTATION_PROMPT = ` -This tool checks the reputation of an address on a given network. It takes: - -- network: The network to check the address on (e.g. "base-mainnet") -- address: The Ethereum address to check - -Important notes: -- This tool will not work on base-sepolia, you can default to using base-mainnet instead -- The wallet's default address and its network may be used if not provided -`; - -/** - * Input schema for address reputation check. - */ -export const AddressReputationInput = z - .object({ - address: z - .string() - .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") - .describe("The Ethereum address to check"), - network: z.string().describe("The network to check the address on"), - }) - .strip() - .describe("Input schema for address reputation check"); - -/** - * Check the reputation of an address. - * - * @param wallet - The wallet instance - * @param args - The input arguments for the action - * @returns A string containing reputation data or error message - */ -export async function checkAddressReputation( - args: z.infer, -): Promise { - try { - const address = new Address(args.network, args.address); - const reputation = await address.reputation(); - return reputation.toString(); - } catch (error) { - return `Error checking address reputation: ${error}`; - } -} - -/** - * Address reputation check action. - */ -export class AddressReputationAction implements CdpAction { - public name = "address_reputation"; - public description = ADDRESS_REPUTATION_PROMPT; - public argsSchema = AddressReputationInput; - public func = checkAddressReputation; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/cdp_action.ts b/cdp-agentkit-core/typescript/src/actions/cdp/cdp_action.ts deleted file mode 100644 index 2166ef930..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/cdp_action.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { z } from "zod"; -import { Wallet } from "@coinbase/coinbase-sdk"; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type CdpActionSchemaAny = z.ZodObject; - -/** - * Represents the base structure for CDP Actions. - */ -export interface CdpAction { - /** - * The name of the action - */ - name: string; - - /** - * A description of what the action does - */ - description: string; - - /** - * Schema for validating action arguments - */ - argsSchema: TActionSchema; - - /** - * The function to execute for this action - */ - func: - | ((wallet: Wallet, args: z.infer) => Promise) - | ((args: z.infer) => Promise); -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/constants.ts b/cdp-agentkit-core/typescript/src/actions/cdp/constants.ts deleted file mode 100644 index cd6c132cb..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/constants.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const ERC20_APPROVE_ABI = [ - { - constant: false, - inputs: [ - { internalType: "address", name: "spender", type: "address" }, - { internalType: "uint256", name: "value", type: "uint256" }, - ], - name: "approve", - outputs: [{ internalType: "bool", name: "", type: "bool" }], - payable: false, - stateMutability: "nonpayable", - type: "function", - }, -]; diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/data/pyth/fetch_price.ts b/cdp-agentkit-core/typescript/src/actions/cdp/data/pyth/fetch_price.ts deleted file mode 100644 index d929e91e4..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/data/pyth/fetch_price.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { CdpAction } from "../../cdp_action"; -import { z } from "zod"; - -const PYTH_FETCH_PRICE_PROMPT = ` -Fetch the price of a given price feed from Pyth. - -Inputs: -- Pyth price feed ID - -Important notes: -- Do not assume that a random ID is a Pyth price feed ID. If you are confused, ask a clarifying question. -- This action only fetches price inputs from Pyth price feeds. No other source. -- If you are asked to fetch the price from Pyth for a ticker symbol such as BTC, you must first use the pyth_fetch_price_feed_id -action to retrieve the price feed ID before invoking the pyth_Fetch_price action -`; - -/** - * Input schema for Pyth fetch price action. - */ -export const PythFetchPriceInput = z.object({ - priceFeedID: z.string().describe("The price feed ID to fetch the price for"), -}); - -/** - * Fetches the price from Pyth given a Pyth price feed ID. - * - * @param args - The input arguments for the action. - * @returns A message containing the price from the given price feed. - */ -export async function pythFetchPrice(args: z.infer): Promise { - const url = `https://hermes.pyth.network/v2/updates/price/latest?ids[]=${args.priceFeedID}`; - const response = await fetch(url); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); - const parsedData = data.parsed; - - if (parsedData.length === 0) { - throw new Error(`No price data found for ${args.priceFeedID}`); - } - - const priceInfo = parsedData[0].price; - const price = BigInt(priceInfo.price); - const exponent = priceInfo.expo; - - if (exponent < 0) { - const adjustedPrice = price * BigInt(100); - const divisor = BigInt(10) ** BigInt(-exponent); - const scaledPrice = adjustedPrice / BigInt(divisor); - const priceStr = scaledPrice.toString(); - const formattedPrice = `${priceStr.slice(0, -2)}.${priceStr.slice(-2)}`; - return formattedPrice.startsWith(".") ? `0${formattedPrice}` : formattedPrice; - } - - const scaledPrice = price / BigInt(10) ** BigInt(exponent); - return scaledPrice.toString(); -} - -/** - * Pyth fetch price action. - */ -export class PythFetchPriceAction implements CdpAction { - public name = "pyth_fetch_price"; - public description = PYTH_FETCH_PRICE_PROMPT; - public argsSchema = PythFetchPriceInput; - public func = pythFetchPrice; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/data/pyth/fetch_price_feed_id.ts b/cdp-agentkit-core/typescript/src/actions/cdp/data/pyth/fetch_price_feed_id.ts deleted file mode 100644 index b627abcad..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/data/pyth/fetch_price_feed_id.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { CdpAction } from "../../cdp_action"; -import { z } from "zod"; - -const PYTH_FETCH_PRICE_FEED_ID_PROMPT = ` -Fetch the price feed ID for a given token symbol from Pyth. -`; - -/** - * Input schema for Pyth fetch price feed ID action. - */ -export const PythFetchPriceFeedIDInput = z.object({ - tokenSymbol: z.string().describe("The token symbol to fetch the price feed ID for"), -}); - -/** - * Fetches the price feed ID from Pyth given a ticker symbol. - * - * @param args - The input arguments for the action. - * @returns A message containing the price feed ID corresponding to the given ticker symbol. - */ -export async function pythFetchPriceFeedID( - args: z.infer, -): Promise { - const url = `https://hermes.pyth.network/v2/price_feeds?query=${args.tokenSymbol}&asset_type=crypto`; - const response = await fetch(url); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const data = await response.json(); - - if (data.length === 0) { - throw new Error(`No price feed found for ${args.tokenSymbol}`); - } - - const filteredData = data.filter( - (item: any) => item.attributes.base.toLowerCase() === args.tokenSymbol.toLowerCase(), - ); - - if (filteredData.length === 0) { - throw new Error(`No price feed found for ${args.tokenSymbol}`); - } - - return filteredData[0].id; -} - -/** - * Pyth fetch price feed ID action. - */ -export class PythFetchPriceFeedIDAction implements CdpAction { - public name = "pyth_fetch_price_feed_id"; - public description = PYTH_FETCH_PRICE_FEED_ID_PROMPT; - public argsSchema = PythFetchPriceFeedIDInput; - public func = pythFetchPriceFeedID; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/data/pyth/index.ts b/cdp-agentkit-core/typescript/src/actions/cdp/data/pyth/index.ts deleted file mode 100644 index 1abca9c52..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/data/pyth/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { CdpAction, CdpActionSchemaAny } from "../../cdp_action"; -import { PythFetchPriceAction } from "./fetch_price"; -import { PythFetchPriceFeedIDAction } from "./fetch_price_feed_id"; -export * from "./fetch_price_feed_id"; -export * from "./fetch_price"; - -/** - * Retrieves all Pyth Network action instances. - * WARNING: All new Pyth action classes must be instantiated here to be discovered. - * - * @returns Array of Pyth Network action instances - */ -export function getAllPythActions(): CdpAction[] { - // eslint-disable-next-line prettier/prettier - return [new PythFetchPriceFeedIDAction(), new PythFetchPriceAction()]; -} - -export const PYTH_ACTIONS = getAllPythActions(); - -// Export individual actions for direct imports -// eslint-disable-next-line prettier/prettier -export { PythFetchPriceFeedIDAction, PythFetchPriceAction }; diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/morpho/deposit.ts b/cdp-agentkit-core/typescript/src/actions/cdp/defi/morpho/deposit.ts deleted file mode 100644 index 3c4973e98..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/defi/morpho/deposit.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { Asset, Wallet } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; -import { Decimal } from "decimal.js"; - -import { CdpAction } from "../../cdp_action"; -import { approve } from "../../utils"; - -import { METAMORPHO_ABI } from "./constants"; - -const DEPOSIT_PROMPT = ` -This tool allows depositing assets into a Morpho Vault. - -It takes: -- vaultAddress: The address of the Morpho Vault to deposit to -- assets: The amount of assets to deposit in whole units - Examples for WETH: - - 1 WETH - - 0.1 WETH - - 0.01 WETH -- receiver: The address to receive the shares -- tokenAddress: The address of the token to approve - -Important notes: -- Make sure to use the exact amount provided. Do not convert units for assets for this action. -- Please use a token address (example 0x4200000000000000000000000000000000000006) for the tokenAddress field. If you are unsure of the token address, please clarify what the requested token address is before continuing. -`; - -/** - * Input schema for Morpho Vault deposit action. - */ -export const MorphoDepositInput = z - .object({ - assets: z - .string() - .regex(/^\d+(\.\d+)?$/, "Must be a valid integer or decimal value") - .describe("The quantity of assets to deposit, in whole units"), - receiver: z - .string() - .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") - .describe( - "The address that will own the position on the vault which will receive the shares", - ), - tokenAddress: z - .string() - .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") - .describe("The address of the assets token to approve for deposit"), - vaultAddress: z - .string() - .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") - .describe("The address of the Morpho Vault to deposit to"), - }) - .describe("Input schema for Morpho Vault deposit action"); - -/** - * Deposits assets into a Morpho Vault - * @param Wallet - The wallet instance to execute the transaction - * @param args - The input arguments for the action - * @returns A success message with transaction details or an error message - */ -export async function depositToMorpho( - wallet: Wallet, - args: z.infer, -): Promise { - const assets = new Decimal(args.assets); - - if (assets.comparedTo(new Decimal(0.0)) != 1) { - return "Error: Assets amount must be greater than 0"; - } - - try { - const tokenAsset = await Asset.fetch(wallet.getNetworkId(), args.tokenAddress); - const atomicAssets = tokenAsset.toAtomicAmount(assets); - - const approvalResult = await approve( - wallet, - args.tokenAddress, - args.vaultAddress, - atomicAssets, - ); - if (approvalResult.startsWith("Error")) { - return `Error approving Morpho Vault as spender: ${approvalResult}`; - } - - const contractArgs = { - assets: atomicAssets.toString(), - receiver: args.receiver, - }; - - const invocation = await wallet.invokeContract({ - contractAddress: args.vaultAddress, - method: "deposit", - abi: METAMORPHO_ABI, - args: contractArgs, - }); - - const result = await invocation.wait(); - - return `Deposited ${args.assets} to Morpho Vault ${args.vaultAddress} with transaction hash: ${result.getTransactionHash()} and transaction link: ${result.getTransactionLink()}`; - } catch (error) { - return `Error depositing to Morpho Vault: ${error}`; - } -} - -/** - * Morpho Vault deposit action. - */ -export class MorphoDepositAction implements CdpAction { - public name = "morpho_deposit"; - public description = DEPOSIT_PROMPT; - public argsSchema = MorphoDepositInput; - public func = depositToMorpho; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/morpho/index.ts b/cdp-agentkit-core/typescript/src/actions/cdp/defi/morpho/index.ts deleted file mode 100644 index 70204461d..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/defi/morpho/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { CdpAction, CdpActionSchemaAny } from "../../cdp_action"; - -import { MorphoDepositAction } from "./deposit"; -import { MorphoWithdrawAction } from "./withdraw"; - -/** - * Retrieves all Morpho action instances. - * WARNING: All new Morpho action classes must be instantiated here to be discovered. - * - * @returns - Array of Morpho action instances - */ -export function getAllMorphoActions(): CdpAction[] { - return [new MorphoDepositAction(), new MorphoWithdrawAction()]; -} - -export const MORPHO_ACTIONS = getAllMorphoActions(); - -export { MorphoDepositAction, MorphoWithdrawAction }; diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/morpho/withdraw.ts b/cdp-agentkit-core/typescript/src/actions/cdp/defi/morpho/withdraw.ts deleted file mode 100644 index 9c5b51e55..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/defi/morpho/withdraw.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Asset, Wallet } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; - -import { CdpAction } from "../../cdp_action"; -import { METAMORPHO_ABI } from "./constants"; - -const WITHDRAW_PROMPT = ` -This tool allows withdrawing assets from a Morpho Vault. It takes: - -- vaultAddress: The address of the Morpho Vault to withdraw from -- assets: The amount of assets to withdraw in atomic units -- receiver: The address to receive the shares -`; - -/** - * Input schema for Morpho Vault withdraw action. - */ -export const MorphoWithdrawInput = z - .object({ - vaultAddress: z - .string() - .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") - .describe("The address of the Morpho Vault to withdraw from"), - assets: z - .string() - .regex(/^\d+$/, "Must be a valid whole number") - .describe("The amount of assets to withdraw in atomic units e.g. 1"), - receiver: z - .string() - .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") - .describe("The address to receive the shares"), - }) - .strip() - .describe("Input schema for Morpho Vault withdraw action"); - -/** - * Withdraw assets from a Morpho Vault. - * - * @param wallet - The wallet to execute the withdrawal from - * @param args - The input arguments for the action - * @returns A success message with transaction details or error message - */ -export async function withdrawFromMorpho( - wallet: Wallet, - args: z.infer, -): Promise { - if (BigInt(args.assets) <= 0) { - return "Error: Assets amount must be greater than 0"; - } - - try { - const invocation = await wallet.invokeContract({ - contractAddress: args.vaultAddress, - method: "withdraw", - abi: METAMORPHO_ABI, - args: { - assets: args.assets, - receiver: args.receiver, - owner: args.receiver, - }, - }); - - const result = await invocation.wait(); - - return `Withdrawn ${args.assets} from Morpho Vault ${args.vaultAddress} with transaction hash: ${result.getTransaction().getTransactionHash()} and transaction link: ${result.getTransaction().getTransactionLink()}`; - } catch (error) { - return `Error withdrawing from Morpho Vault: ${error}`; - } -} - -/** - * Morpho Vault withdraw action. - */ -export class MorphoWithdrawAction implements CdpAction { - public name = "morpho_withdraw"; - public description = WITHDRAW_PROMPT; - public argsSchema = MorphoWithdrawInput; - public func = withdrawFromMorpho; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/actions/buy_token.ts b/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/actions/buy_token.ts deleted file mode 100644 index 9ccd1a084..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/actions/buy_token.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { CdpAction } from "../../../cdp_action"; -import { Wallet } from "@coinbase/coinbase-sdk"; -import { WOW_ABI } from "../constants"; -import { getHasGraduated } from "../uniswap/utils"; -import { getBuyQuote } from "../utils"; -import { z } from "zod"; - -const WOW_BUY_TOKEN_PROMPT = ` -This tool can only be used to buy a Zora Wow ERC20 memecoin (also can be referred to as a bonding curve token) with ETH. -Do not use this tool for any other purpose, or trading other assets. - -Inputs: -- WOW token contract address -- Address to receive the tokens -- Amount of ETH to spend (in wei) - -Important notes: -- The amount is a string and cannot have any decimal points, since the unit of measurement is wei. -- Make sure to use the exact amount provided, and if there's any doubt, check by getting more information before continuing with the action. -- 1 wei = 0.000000000000000001 ETH -- Minimum purchase amount is 100000000000000 wei (0.0000001 ETH) -- Only supported on the following networks: - - Base Sepolia (ie, 'base-sepolia') - - Base Mainnet (ie, 'base', 'base-mainnet') -`; - -/** - * Input schema for buy token action. - */ -export const WowBuyTokenInput = z - .object({ - contractAddress: z.string().describe("The WOW token contract address"), - amountEthInWei: z.string().describe("Amount of ETH to spend (in wei)"), - }) - .strip() - .describe("Instructions for buying WOW tokens"); - -/** - * Buys a Zora Wow ERC20 memecoin with ETH. - * - * @param wallet - The wallet to create the token from. - * @param args - The input arguments for the action. - * @returns A message containing the token purchase details. - */ -export async function wowBuyToken( - wallet: Wallet, - args: z.infer, -): Promise { - try { - const tokenQuote = await getBuyQuote( - wallet.getNetworkId(), - args.contractAddress, - args.amountEthInWei, - ); - - // Multiply by 99/100 and floor to get 99% of quote as minimum - const minTokens = (BigInt(Math.floor(Number(tokenQuote) * 99)) / BigInt(100)).toString(); - - const hasGraduated = await getHasGraduated(wallet.getNetworkId(), args.contractAddress); - - const invocation = await wallet.invokeContract({ - contractAddress: args.contractAddress, - method: "buy", - abi: WOW_ABI, - args: { - recipient: (await wallet.getDefaultAddress()).getId(), - refundRecipient: (await wallet.getDefaultAddress()).getId(), - orderReferrer: "0x0000000000000000000000000000000000000000", - expectedMarketType: hasGraduated ? "1" : "0", - minOrderSize: minTokens, - sqrtPriceLimitX96: "0", - comment: "", - }, - amount: BigInt(args.amountEthInWei), - assetId: "wei", - }); - - const result = await invocation.wait(); - return `Purchased WoW ERC20 memecoin with transaction hash: ${result - .getTransaction() - .getTransactionHash()}`; - } catch (error) { - return `Error buying Zora Wow ERC20 memecoin: ${error}`; - } -} - -/** - * Zora Wow buy token action. - */ -export class WowBuyTokenAction implements CdpAction { - public name = "wow_buy_token"; - public description = WOW_BUY_TOKEN_PROMPT; - public argsSchema = WowBuyTokenInput; - public func = wowBuyToken; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/actions/create_token.ts b/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/actions/create_token.ts deleted file mode 100644 index ff0c9f76c..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/actions/create_token.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { CdpAction } from "../../../cdp_action"; -import { Wallet } from "@coinbase/coinbase-sdk"; -import { WOW_FACTORY_ABI, GENERIC_TOKEN_METADATA_URI, getFactoryAddress } from "../constants"; -import { z } from "zod"; - -const WOW_CREATE_TOKEN_PROMPT = ` -This tool can only be used to create a Zora Wow ERC20 memecoin (also can be referred to as a bonding curve token) using the WoW factory. -Do not use this tool for any other purpose, or for creating other types of tokens. - -Inputs: -- Token name (e.g. WowCoin) -- Token symbol (e.g. WOW) -- Token URI (optional) - Contains metadata about the token - -Important notes: -- Uses a bonding curve - no upfront liquidity needed -- Only supported on the following networks: - - Base Sepolia (ie, 'base-sepolia') - - Base Mainnet (ie, 'base', 'base-mainnet') -`; - -/** - * Input schema for create token action. - */ -export const WowCreateTokenInput = z - .object({ - name: z.string().describe("The name of the token to create, e.g. WowCoin"), - symbol: z.string().describe("The symbol of the token to create, e.g. WOW"), - tokenUri: z - .string() - .optional() - .describe( - "The URI of the token metadata to store on IPFS, e.g. ipfs://QmY1GqprFYvojCcUEKgqHeDj9uhZD9jmYGrQTfA9vAE78J", - ), - }) - .strip() - .describe("Instructions for creating a WOW token"); - -/** - * Creates a Zora Wow ERC20 memecoin. - * - * @param wallet - The wallet to create the token from. - * @param args - The input arguments for the action. - * @returns A message containing the token creation details. - */ -export async function wowCreateToken( - wallet: Wallet, - args: z.infer, -): Promise { - const factoryAddress = getFactoryAddress(wallet.getNetworkId()); - - try { - const invocation = await wallet.invokeContract({ - contractAddress: factoryAddress, - method: "deploy", - abi: WOW_FACTORY_ABI, - args: { - _tokenCreator: (await wallet.getDefaultAddress()).getId(), - _platformReferrer: "0x0000000000000000000000000000000000000000", - _tokenURI: args.tokenUri || GENERIC_TOKEN_METADATA_URI, - _name: args.name, - _symbol: args.symbol, - }, - }); - - const result = await invocation.wait(); - return `Created WoW ERC20 memecoin ${args.name} with symbol ${ - args.symbol - } on network ${wallet.getNetworkId()}.\nTransaction hash for the token creation: ${result - .getTransaction() - .getTransactionHash()}`; - } catch (error) { - return `Error creating Zora Wow ERC20 memecoin: ${error}`; - } -} - -/** - * Zora Wow create token action. - */ -export class WowCreateTokenAction implements CdpAction { - public name = "wow_create_token"; - public description = WOW_CREATE_TOKEN_PROMPT; - public argsSchema = WowCreateTokenInput; - public func = wowCreateToken; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/actions/sell_token.ts b/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/actions/sell_token.ts deleted file mode 100644 index 4676de71c..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/actions/sell_token.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { CdpAction } from "../../../cdp_action"; -import { Wallet } from "@coinbase/coinbase-sdk"; -import { WOW_ABI } from "../constants"; -import { getHasGraduated } from "../uniswap/utils"; -import { getSellQuote } from "../utils"; -import { z } from "zod"; - -const WOW_SELL_TOKEN_PROMPT = ` -This tool can only be used to sell a Zora Wow ERC20 memecoin (also can be referred to as a bonding curve token) for ETH. -Do not use this tool for any other purpose, or trading other assets. - -Inputs: -- WOW token contract address -- Amount of tokens to sell (in wei) - -Important notes: -- The amount is a string and cannot have any decimal points, since the unit of measurement is wei. -- Make sure to use the exact amount provided, and if there's any doubt, check by getting more information before continuing with the action. -- 1 wei = 0.000000000000000001 ETH -- Minimum purchase amount is 100000000000000 wei (0.0000001 ETH) -- Only supported on the following networks: - - Base Sepolia (ie, 'base-sepolia') - - Base Mainnet (ie, 'base', 'base-mainnet') -`; - -/** - * Input schema for sell token action. - */ -export const WowSellTokenInput = z - .object({ - contractAddress: z - .string() - .describe( - "The WOW token contract address, such as `0x036CbD53842c5426634e7929541eC2318f3dCF7e`", - ), - amountTokensInWei: z - .string() - .describe( - "Amount of tokens to sell (in wei), meaning 1 is 1 wei or 0.000000000000000001 of the token", - ), - }) - .strip() - .describe("Instructions for selling WOW tokens"); - -/** - * Sells WOW tokens for ETH. - * - * @param wallet - The wallet to sell the tokens from. - * @param args - The input arguments for the action. - * @returns A message confirming the sale with the transaction hash. - */ -export async function wowSellToken( - wallet: Wallet, - args: z.infer, -): Promise { - try { - const ethQuote = await getSellQuote( - wallet.getNetworkId(), - args.contractAddress, - args.amountTokensInWei, - ); - const hasGraduated = await getHasGraduated(wallet.getNetworkId(), args.contractAddress); - - // Multiply by 98/100 and floor to get 98% of quote as minimum - const minEth = (BigInt(Math.floor(Number(ethQuote) * 98)) / BigInt(100)).toString(); - - const invocation = await wallet.invokeContract({ - contractAddress: args.contractAddress, - method: "sell", - abi: WOW_ABI, - args: { - tokensToSell: args.amountTokensInWei, - recipient: (await wallet.getDefaultAddress()).getId(), - orderReferrer: "0x0000000000000000000000000000000000000000", - comment: "", - expectedMarketType: hasGraduated ? "1" : "0", - minPayoutSize: minEth, - sqrtPriceLimitX96: "0", - }, - }); - - const result = await invocation.wait(); - return `Sold WoW ERC20 memecoin with transaction hash: ${result - .getTransaction() - .getTransactionHash()}`; - } catch (error) { - return `Error selling Zora Wow ERC20 memecoin: ${error}`; - } -} - -/** - * Zora Wow sell token action. - */ -export class WowSellTokenAction implements CdpAction { - public name = "wow_sell_token"; - public description = WOW_SELL_TOKEN_PROMPT; - public argsSchema = WowSellTokenInput; - public func = wowSellToken; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/index.ts b/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/index.ts deleted file mode 100644 index 9837e23f8..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { CdpAction, CdpActionSchemaAny } from "../../cdp_action"; -import { WowBuyTokenAction } from "./actions/buy_token"; -import { WowSellTokenAction } from "./actions/sell_token"; -import { WowCreateTokenAction } from "./actions/create_token"; - -/** - * Retrieves all WOW protocol action instances. - * WARNING: All new WowAction classes must be instantiated here to be discovered. - * - * @returns Array of WOW protocol action instances - */ -export function getAllWowActions(): CdpAction[] { - // eslint-disable-next-line prettier/prettier - return [new WowBuyTokenAction(), new WowSellTokenAction(), new WowCreateTokenAction()]; -} - -export const WOW_ACTIONS = getAllWowActions(); - -// Export individual actions for direct imports -// eslint-disable-next-line prettier/prettier -export { WowBuyTokenAction, WowSellTokenAction, WowCreateTokenAction }; diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/utils.ts b/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/utils.ts deleted file mode 100644 index 7d0e66fdc..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/utils.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { readContract } from "@coinbase/coinbase-sdk"; -import { WOW_ABI } from "./constants"; -import { getHasGraduated, getUniswapQuote } from "./uniswap/utils"; - -/** - * Gets the current supply of a token. - * - * @param tokenAddress - Address of the token contract - * @returns The current token supply - */ -export async function getCurrentSupply(tokenAddress: string): Promise { - const supply = await readContract({ - networkId: "base-sepolia", - contractAddress: tokenAddress as `0x${string}`, - method: "totalSupply", - args: {}, - abi: WOW_ABI, - }); - - return supply as string; -} - -/** - * Gets quote for buying tokens. - * - * @param networkId - Network ID, either base-sepolia or base-mainnet - * @param tokenAddress - Address of the token contract - * @param amountEthInWei - Amount of ETH to buy (in wei) - * @returns The buy quote amount - */ -export async function getBuyQuote( - networkId: string, - tokenAddress: string, - amountEthInWei: string, -): Promise { - const hasGraduated = await getHasGraduated(networkId, tokenAddress); - - const tokenQuote = ( - hasGraduated - ? (await getUniswapQuote(networkId, tokenAddress, Number(amountEthInWei), "buy")).amountOut - : await readContract({ - networkId: networkId, - contractAddress: tokenAddress as `0x${string}`, - method: "getEthBuyQuote", - args: { - ethOrderSize: amountEthInWei, - }, - abi: WOW_ABI, - }) - ) as string | number; - - return tokenQuote.toString(); -} - -/** - * Gets quote for selling tokens. - * - * @param networkId - Network ID, either base-sepolia or base-mainnet - * @param tokenAddress - Address of the token contract - * @param amountTokensInWei - Amount of tokens to sell (in wei) - * @returns The sell quote amount - */ -export async function getSellQuote( - networkId: string, - tokenAddress: string, - amountTokensInWei: string, -): Promise { - const hasGraduated = await getHasGraduated(networkId, tokenAddress); - - const tokenQuote = ( - hasGraduated - ? (await getUniswapQuote(networkId, tokenAddress, Number(amountTokensInWei), "sell")) - .amountOut - : await readContract({ - networkId: networkId, - contractAddress: tokenAddress as `0x${string}`, - method: "getTokenSellQuote", - args: { - tokenOrderSize: amountTokensInWei, - }, - abi: WOW_ABI, - }) - ) as string | number; - - return tokenQuote.toString(); -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/deploy_contract.ts b/cdp-agentkit-core/typescript/src/actions/cdp/deploy_contract.ts deleted file mode 100644 index e3a09cfbe..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/deploy_contract.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { Wallet } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; - -const DEPLOY_CONTRACT_PROMPT = ` -Deploys smart contract with required args: solidity version (string), solidity input json (string), contract name (string), and optional constructor args (Dict[str, Any]) - -Input json structure: -{"language":"Solidity","settings":{"remappings":[],"outputSelection":{"*":{"*":["abi","evm.bytecode"]}}},"sources":{}} - -You must set the outputSelection to {"*":{"*":["abi","evm.bytecode"]}} in the settings. The solidity version must be >= 0.8.0 and <= 0.8.28. - -Sources should contain one or more contracts with the following structure: -{"contract_name.sol":{"content":"contract code"}} - -The contract code should be escaped. Contracts cannot import from external contracts but can import from one another. - -Constructor args are required if the contract has a constructor. They are a key-value -map where the key is the arg name and the value is the arg value. Encode uint/int/bytes/string/address values as strings, boolean values as true/false. For arrays/tuples, encode based on contained type. -`; - -const SolidityVersions = { - "0.8.28": "0.8.28+commit.7893614a", - "0.8.27": "0.8.27+commit.40a35a09", - "0.8.26": "0.8.26+commit.8a97fa7a", - "0.8.25": "0.8.25+commit.b61c2a91", - "0.8.24": "0.8.24+commit.e11b9ed9", - "0.8.23": "0.8.23+commit.f704f362", - "0.8.22": "0.8.22+commit.4fc1097e", - "0.8.21": "0.8.21+commit.d9974bed", - "0.8.20": "0.8.20+commit.a1b79de6", - "0.8.19": "0.8.19+commit.7dd6d404", - "0.8.18": "0.8.18+commit.87f61d96", - "0.8.17": "0.8.17+commit.8df45f5f", - "0.8.16": "0.8.16+commit.07a7930e", - "0.8.15": "0.8.15+commit.e14f2714", - "0.8.14": "0.8.14+commit.80d49f37", - "0.8.13": "0.8.13+commit.abaa5c0e", - "0.8.12": "0.8.12+commit.f00d7308", - "0.8.11": "0.8.11+commit.d7f03943", - "0.8.10": "0.8.10+commit.fc410830", - "0.8.9": "0.8.9+commit.e5eed63a", - "0.8.8": "0.8.8+commit.dddeac2f", - "0.8.7": "0.8.7+commit.e28d00a7", - "0.8.6": "0.8.6+commit.11564f7e", - "0.8.5": "0.8.5+commit.a4f2e591", - "0.8.4": "0.8.4+commit.c7e474f2", - "0.8.3": "0.8.3+commit.8d00100c", - "0.8.2": "0.8.2+commit.661d1103", - "0.8.1": "0.8.1+commit.df193b15", - "0.8.0": "0.8.0+commit.c7dfd78e", -} as const; - -/** - * Input schema for deploy contract action. - */ -export const DeployContractInput = z - .object({ - solidityVersion: z - .enum(Object.keys(SolidityVersions) as [string, ...string[]]) - .describe("The solidity compiler version"), - solidityInputJson: z.string().describe("The input json for the solidity compiler"), - contractName: z.string().describe("The name of the contract class to be deployed"), - constructorArgs: z - .record(z.string(), z.any()) - .describe("The constructor arguments for the contract") - .optional(), - }) - .strip() - .describe("Instructions for deploying an arbitrary contract"); - -/** - * Deploys an arbitrary contract. - * - * @param wallet - The wallet to deploy the contract from. - * @param args - The input arguments for the action. The three required fields are solidityVersion, solidityInputJson, and contractName. The constructorArgs field is only required if the contract has a constructor. - * @returns A message containing the deployed contract address and details. - */ -export async function deployContract( - wallet: Wallet, - args: z.infer, -): Promise { - try { - const solidityVersion = SolidityVersions[args.solidityVersion]; - - const contract = await wallet.deployContract({ - solidityVersion: solidityVersion, - solidityInputJson: args.solidityInputJson, - contractName: args.contractName, - constructorArgs: args.constructorArgs ?? {}, - }); - - const result = await contract.wait(); - - return `Deployed contract ${args.contractName} at address ${result.getContractAddress()}. Transaction link: ${result - .getTransaction()! - .getTransactionLink()}`; - } catch (error) { - return `Error deploying contract: ${error}`; - } -} - -/** - * Deploy contract action. - */ -export class DeployContractAction implements CdpAction { - public name = "deploy_contract"; - public description = DEPLOY_CONTRACT_PROMPT; - public argsSchema = DeployContractInput; - public func = deployContract; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/deploy_nft.ts b/cdp-agentkit-core/typescript/src/actions/cdp/deploy_nft.ts deleted file mode 100644 index a4ed60423..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/deploy_nft.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { Wallet } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; - -const DEPLOY_NFT_PROMPT = ` -This tool will deploy an NFT (ERC-721) contract onchain from the wallet. -It takes the name of the NFT collection, the symbol of the NFT collection, and the base URI for the token metadata as inputs. -`; - -/** - * Input schema for deploy NFT action. - */ -export const DeployNftInput = z - .object({ - name: z.string().describe("The name of the NFT collection"), - symbol: z.string().describe("The symbol of the NFT collection"), - baseURI: z.string().describe("The base URI for the token metadata"), - }) - .strip() - .describe("Instructions for deploying an NFT collection"); - -/** - * Deploys an NFT (ERC-721) token collection onchain from the wallet. - * - * @param wallet - The wallet to deploy the NFT from. - * @param args - The input arguments for the action. - * @returns A message containing the NFT token deployment details. - */ -export async function deployNft( - wallet: Wallet, - args: z.infer, -): Promise { - try { - const nftContract = await wallet.deployNFT({ - name: args.name, - symbol: args.symbol, - baseURI: args.baseURI, - }); - - const result = await nftContract.wait(); - - return `Deployed NFT Collection ${ - args.name - } to address ${result.getContractAddress()} on network ${wallet.getNetworkId()}.\nTransaction hash for the deployment: ${result - .getTransaction()! - .getTransactionHash()}\nTransaction link for the deployment: ${result - .getTransaction()! - .getTransactionLink()}`; - } catch (error) { - return `Error deploying NFT: ${error}`; - } -} - -/** - * Deploy NFT action. - */ -export class DeployNftAction implements CdpAction { - public name = "deploy_nft"; - public description = DEPLOY_NFT_PROMPT; - public argsSchema = DeployNftInput; - public func = deployNft; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/deploy_token.ts b/cdp-agentkit-core/typescript/src/actions/cdp/deploy_token.ts deleted file mode 100644 index 6856870a3..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/deploy_token.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { Wallet, Amount } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; - -const DEPLOY_TOKEN_PROMPT = ` -This tool will deploy an ERC20 token smart contract. It takes the token name, symbol, and total supply as input. -The token will be deployed using the wallet's default address as the owner and initial token holder. -`; - -/** - * Input schema for deploy token action. - */ -export const DeployTokenInput = z - .object({ - name: z.string().describe("The name of the token"), - symbol: z.string().describe("The token symbol"), - totalSupply: z.custom().describe("The total supply of tokens to mint"), - }) - .strip() - .describe("Instructions for deploying a token"); - -/** - * Deploys an ERC20 token smart contract. - * - * @param wallet - The wallet to deploy the Token from. - * @param args - The input arguments for the action. - * @returns A message containing the deployed token contract address and details. - */ -export async function deployToken( - wallet: Wallet, - args: z.infer, -): Promise { - try { - const tokenContract = await wallet.deployToken({ - name: args.name, - symbol: args.symbol, - totalSupply: args.totalSupply, - }); - - const result = await tokenContract.wait(); - - return `Deployed ERC20 token contract ${args.name} (${args.symbol}) with total supply of ${ - args.totalSupply - } tokens at address ${result.getContractAddress()}. Transaction link: ${result - .getTransaction()! - .getTransactionLink()}`; - } catch (error) { - return `Error deploying token: ${error}`; - } -} - -/** - * Deploy token action. - */ -export class DeployTokenAction implements CdpAction { - public name = "deploy_token"; - public description = DEPLOY_TOKEN_PROMPT; - public argsSchema = DeployTokenInput; - public func = deployToken; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/get_balance.ts b/cdp-agentkit-core/typescript/src/actions/cdp/get_balance.ts deleted file mode 100644 index 9463bb073..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/get_balance.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { Wallet } from "@coinbase/coinbase-sdk"; -import Decimal from "decimal.js"; -import { z } from "zod"; - -const GET_BALANCE_PROMPT = ` -This tool will get the balance of all the addresses in the wallet for a given asset. -It takes the asset ID as input. Always use 'eth' for the native asset ETH and 'usdc' for USDC. -`; - -/** - * Input schema for get balance action. - */ -export const GetBalanceInput = z - .object({ - assetId: z.string().describe("The asset ID to get the balance for"), - }) - .strip() - .describe("Instructions for getting wallet balance"); - -/** - * Gets balance for all addresses in the wallet for a given asset. - * - * @param wallet - The wallet to get the balance for. - * @param args - The input arguments for the action. - * @returns A message containing the balance information. - */ -export async function getBalance( - wallet: Wallet, - args: z.infer, -): Promise { - const balances: Record = {}; - - try { - const addresses = await wallet.listAddresses(); - for (const address of addresses) { - const balance = await address.getBalance(args.assetId); - balances[address.getId()] = balance; - } - - const balanceLines = Object.entries(balances).map(([addr, balance]) => `${addr}: ${balance}`); - const formattedBalances = balanceLines.join("\n"); - return `Balances for wallet ${wallet.getId()}:\n${formattedBalances}`; - } catch (error) { - return `Error getting balance for all addresses in the wallet: ${error}`; - } -} - -/** - * Get wallet balance action. - */ -export class GetBalanceAction implements CdpAction { - public name = "get_balance"; - public description = GET_BALANCE_PROMPT; - public argsSchema = GetBalanceInput; - public func = getBalance; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/get_balance_nft.ts b/cdp-agentkit-core/typescript/src/actions/cdp/get_balance_nft.ts deleted file mode 100644 index 3c81743af..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/get_balance_nft.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { readContract, Wallet } from "@coinbase/coinbase-sdk"; -import { Hex } from "viem"; -import { z } from "zod"; - -const GET_BALANCE_NFT_PROMPT = ` -This tool will get the NFTs (ERC721 tokens) owned by the wallet for a specific NFT contract. - -It takes the following inputs: -- contractAddress: The NFT contract address to check -- address: (Optional) The address to check NFT balance for. If not provided, uses the wallet's default address -`; - -/** - * Input schema for get NFT balance action. - */ -export const GetBalanceNftInput = z - .object({ - contractAddress: z.string().describe("The NFT contract address to check balance for"), - address: z - .string() - .optional() - .describe( - "The address to check NFT balance for. If not provided, uses the wallet's default address", - ), - }) - .strip() - .describe("Instructions for getting NFT balance"); - -/** - * Gets NFT balance for a specific contract. - * - * @param wallet - The wallet to check balance from. - * @param args - The input arguments for the action. - * @returns A message containing the NFT balance details. - */ -export async function getBalanceNft( - wallet: Wallet, - args: z.infer, -): Promise { - try { - const checkAddress = args.address || (await wallet.getDefaultAddress()).getId(); - - const ownedTokens = await readContract({ - contractAddress: args.contractAddress as Hex, - networkId: wallet.getNetworkId(), - method: "tokensOfOwner", - args: { owner: checkAddress }, - }); - - if (!ownedTokens || ownedTokens.length === 0) { - return `Address ${checkAddress} owns no NFTs in contract ${args.contractAddress}`; - } - - const tokenList = ownedTokens.map(String).join(", "); - return `Address ${checkAddress} owns ${ownedTokens.length} NFTs in contract ${args.contractAddress}.\nToken IDs: ${tokenList}`; - } catch (error) { - return `Error getting NFT balance for address ${args.address} in contract ${args.contractAddress}: ${error}`; - } -} - -/** - * Get NFT balance action. - */ -export class GetBalanceNftAction implements CdpAction { - name = "get_balance_nft"; - description = GET_BALANCE_NFT_PROMPT; - argsSchema = GetBalanceNftInput; - func = getBalanceNft; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/get_wallet_details.ts b/cdp-agentkit-core/typescript/src/actions/cdp/get_wallet_details.ts deleted file mode 100644 index 94b14fdc0..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/get_wallet_details.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { z } from "zod"; -import { CdpAction } from "./cdp_action"; -import { Wallet } from "@coinbase/coinbase-sdk"; - -/** - * Input schema for get wallet details action. - * This schema intentionally accepts no parameters as the wallet is injected separately. - */ -export const GetWalletDetailsInput = z.object({}); - -/** - * Gets a wallet's details. - * - * @param wallet - The wallet to get details from. - * @param _ - The input arguments for the action. - * @returns A message containing the wallet details. - */ -export async function getWalletDetails( - wallet: Wallet, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _: z.infer, -): Promise { - try { - const defaultAddress = await wallet.getDefaultAddress(); - return `Wallet: ${wallet.getId()} on network: ${wallet.getNetworkId()} with default address: ${defaultAddress.getId()}`; - } catch (error) { - return `Error getting wallet details: ${error}`; - } -} - -/** - * Get wallet details action. - */ -export class GetWalletDetailsAction implements CdpAction { - /** - * The name of the action - */ - public name = "get_wallet_details"; - - /** - * A description of what the action does - */ - public description = "This tool will get details about the MPC Wallet."; - - /** - * Schema for validating action arguments - */ - public argsSchema = GetWalletDetailsInput; - - /** - * The function to execute for this action - */ - public func = getWalletDetails; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/index.ts b/cdp-agentkit-core/typescript/src/actions/cdp/index.ts deleted file mode 100644 index 368928b04..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/index.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { CdpAction, CdpActionSchemaAny } from "./cdp_action"; -import { AddressReputationAction } from "./address_reputation"; -import { DeployNftAction } from "./deploy_nft"; -import { DeployTokenAction } from "./deploy_token"; -import { DeployContractAction } from "./deploy_contract"; -import { GetBalanceAction } from "./get_balance"; -import { GetBalanceNftAction } from "./get_balance_nft"; -import { GetWalletDetailsAction } from "./get_wallet_details"; -import { MintNftAction } from "./mint_nft"; -import { RegisterBasenameAction } from "./register_basename"; -import { RequestFaucetFundsAction } from "./request_faucet_funds"; -import { TradeAction } from "./trade"; -import { TransferAction } from "./transfer"; -import { TransferNftAction } from "./transfer_nft"; -import { WrapEthAction } from "./wrap_eth"; - -import { MORPHO_ACTIONS } from "./defi/morpho"; -import { PYTH_ACTIONS } from "./data/pyth"; -import { WOW_ACTIONS } from "./defi/wow"; - -/** - * Retrieves all CDP action instances. - * WARNING: All new CdpAction classes must be instantiated here to be discovered. - * - * @returns - Array of CDP action instances - */ -export function getAllCdpActions(): CdpAction[] { - return [ - new AddressReputationAction(), - new GetWalletDetailsAction(), - new DeployNftAction(), - new DeployTokenAction(), - new DeployContractAction(), - new GetBalanceAction(), - new GetBalanceNftAction(), - new MintNftAction(), - new RegisterBasenameAction(), - new RequestFaucetFundsAction(), - new TradeAction(), - new TransferAction(), - new TransferNftAction(), - new WrapEthAction(), - ]; -} - -export const CDP_ACTIONS = getAllCdpActions() - .concat(MORPHO_ACTIONS) - .concat(PYTH_ACTIONS) - .concat(WOW_ACTIONS); - -export { - CdpAction, - CdpActionSchemaAny, - AddressReputationAction, - GetWalletDetailsAction, - DeployNftAction, - DeployTokenAction, - DeployContractAction, - GetBalanceAction, - GetBalanceNftAction, - MintNftAction, - RegisterBasenameAction, - RequestFaucetFundsAction, - TradeAction, - TransferAction, - TransferNftAction, - WrapEthAction, -}; diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/mint_nft.ts b/cdp-agentkit-core/typescript/src/actions/cdp/mint_nft.ts deleted file mode 100644 index a3268d58c..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/mint_nft.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { Wallet } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; - -const MINT_NFT_PROMPT = ` -This tool will mint an NFT (ERC-721) to a specified destination address onchain via a contract invocation. -It takes the contract address of the NFT onchain and the destination address onchain that will receive the NFT as inputs. -Do not use the contract address as the destination address. If you are unsure of the destination address, please ask the user before proceeding. -`; - -/** - * Input schema for mint NFT action. - */ -export const MintNftInput = z - .object({ - contractAddress: z.string().describe("The contract address of the NFT to mint"), - destination: z.string().describe("The destination address that will receive the NFT"), - }) - .strip() - .describe("Instructions for minting an NFT"); - -/** - * Mints an NFT (ERC-721) to a specified destination address onchain. - * - * @param wallet - The wallet to mint the NFT from. - * @param args - The input arguments for the action. - * @returns A message containing the NFT mint details. - */ -export async function mintNft(wallet: Wallet, args: z.infer): Promise { - const mintArgs = { - to: args.destination, - quantity: "1", - }; - - try { - const mintInvocation = await wallet.invokeContract({ - contractAddress: args.contractAddress, - method: "mint", - args: mintArgs, - }); - - const result = await mintInvocation.wait(); - - return `Minted NFT from contract ${args.contractAddress} to address ${ - args.destination - } on network ${wallet.getNetworkId()}.\nTransaction hash for the mint: ${result - .getTransaction() - .getTransactionHash()}\nTransaction link for the mint: ${result - .getTransaction() - .getTransactionLink()}`; - } catch (error) { - return `Error minting NFT: ${error}`; - } -} - -/** - * Mint NFT action. - */ -export class MintNftAction implements CdpAction { - public name = "mint_nft"; - public description = MINT_NFT_PROMPT; - public argsSchema = MintNftInput; - public func = mintNft; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/register_basename.ts b/cdp-agentkit-core/typescript/src/actions/cdp/register_basename.ts deleted file mode 100644 index 46fff2fa8..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/register_basename.ts +++ /dev/null @@ -1,202 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { Coinbase, Wallet } from "@coinbase/coinbase-sdk"; -import { encodeFunctionData, namehash } from "viem"; -import { z } from "zod"; -import { Decimal } from "decimal.js"; - -const REGISTER_BASENAME_PROMPT = ` -This tool will register a Basename for the agent. The agent should have a wallet associated to register a Basename. -When your network ID is 'base-mainnet' (also sometimes known simply as 'base'), the name must end with .base.eth, and when your network ID is 'base-sepolia', it must ends with .basetest.eth. -Do not suggest any alternatives and never try to register a Basename with another postfix. The prefix of the name must be unique so if the registration of the -Basename fails, you should prompt to try again with a more unique name. -`; - -// Contract addresses -export const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET = - "0x4cCb0BB02FCABA27e82a56646E81d8c5bC4119a5"; -export const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET = - "0x49aE3cC2e3AA768B1e5654f5D3C6002144A59581"; - -export const L2_RESOLVER_ADDRESS_MAINNET = "0xC6d566A56A1aFf6508b41f6c90ff131615583BCD"; -export const L2_RESOLVER_ADDRESS_TESTNET = "0x6533C94869D28fAA8dF77cc63f9e2b2D6Cf77eBA"; - -// Default registration duration (1 year in seconds) -export const REGISTRATION_DURATION = "31557600"; - -// Relevant ABI for L2 Resolver Contract. -export const L2_RESOLVER_ABI = [ - { - inputs: [ - { internalType: "bytes32", name: "node", type: "bytes32" }, - { internalType: "address", name: "a", type: "address" }, - ], - name: "setAddr", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { internalType: "bytes32", name: "node", type: "bytes32" }, - { internalType: "string", name: "newName", type: "string" }, - ], - name: "setName", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, -]; - -// Relevant ABI for Basenames Registrar Controller Contract. -export const REGISTRAR_ABI = [ - { - inputs: [ - { - components: [ - { - internalType: "string", - name: "name", - type: "string", - }, - { - internalType: "address", - name: "owner", - type: "address", - }, - { - internalType: "uint256", - name: "duration", - type: "uint256", - }, - { - internalType: "address", - name: "resolver", - type: "address", - }, - { - internalType: "bytes[]", - name: "data", - type: "bytes[]", - }, - { - internalType: "bool", - name: "reverseRecord", - type: "bool", - }, - ], - internalType: "struct RegistrarController.RegisterRequest", - name: "request", - type: "tuple", - }, - ], - name: "register", - outputs: [], - stateMutability: "payable", - type: "function", - }, -]; - -/** - * Input schema for registering a Basename. - */ -export const RegisterBasenameInput = z - .object({ - basename: z.string().describe("The Basename to assign to the agent"), - amount: z.string().default("0.002").describe("The amount of ETH to pay for registration"), - }) - .strip() - .describe("Instructions for registering a Basename"); - -/** - * Creates registration arguments for Basenames. - * - * @param baseName - The Basename (e.g., "example.base.eth" or "example.basetest.eth"). - * @param addressId - The Ethereum address. - * @param isMainnet - True if on mainnet, False if on testnet. - * @returns Formatted arguments for the register contract method. - */ -function createRegisterContractMethodArgs( - baseName: string, - addressId: string, - isMainnet: boolean, -): object { - const l2ResolverAddress = isMainnet ? L2_RESOLVER_ADDRESS_MAINNET : L2_RESOLVER_ADDRESS_TESTNET; - const suffix = isMainnet ? ".base.eth" : ".basetest.eth"; - - const addressData = encodeFunctionData({ - abi: L2_RESOLVER_ABI, - functionName: "setAddr", - args: [namehash(baseName), addressId], - }); - const nameData = encodeFunctionData({ - abi: L2_RESOLVER_ABI, - functionName: "setName", - args: [namehash(baseName), baseName], - }); - - const registerArgs = { - request: [ - baseName.replace(suffix, ""), - addressId, - REGISTRATION_DURATION, - l2ResolverAddress, - [addressData, nameData], - true, - ], - }; - - return registerArgs; -} - -/** - * Registers a Basename for the agent. - * - * @param wallet - The wallet to register the Basename with. - * @param args - The input arguments for the action. - * @returns Confirmation message with the basename. - */ -export async function registerBasename( - wallet: Wallet, - args: z.infer, -): Promise { - const addressId = (await wallet.getDefaultAddress()).getId(); - const isMainnet = wallet.getNetworkId() === Coinbase.networks.BaseMainnet; - - const suffix = isMainnet ? ".base.eth" : ".basetest.eth"; - if (!args.basename.endsWith(suffix)) { - args.basename += suffix; - } - - const registerArgs = createRegisterContractMethodArgs(args.basename, addressId, isMainnet); - - try { - const contractAddress = isMainnet - ? BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET - : BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET; - - const invocation = await wallet.invokeContract({ - contractAddress, - method: "register", - args: registerArgs, - abi: REGISTRAR_ABI, - amount: new Decimal(args.amount), - assetId: "eth", - }); - - await invocation.wait(); - return `Successfully registered basename ${args.basename} for address ${addressId}`; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error) { - return `Error registering basename: Error: ${error}`; - } -} - -/** - * Register Basename action. - */ -export class RegisterBasenameAction implements CdpAction { - public name = "register_basename"; - public description = REGISTER_BASENAME_PROMPT; - public argsSchema = RegisterBasenameInput; - public func = registerBasename; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/request_faucet_funds.ts b/cdp-agentkit-core/typescript/src/actions/cdp/request_faucet_funds.ts deleted file mode 100644 index d56eb694b..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/request_faucet_funds.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { Wallet } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; - -const REQUEST_FAUCET_FUNDS_PROMPT = ` -This tool will request test tokens from the faucet for the default address in the wallet. It takes the wallet and asset ID as input. -If no asset ID is provided the faucet defaults to ETH. Faucet is only allowed on 'base-sepolia' and can only provide asset ID 'eth' or 'usdc'. -You are not allowed to faucet with any other network or asset ID. If you are on another network, suggest that the user sends you some ETH -from another wallet and provide the user with your wallet details. -`; - -/** - * Input schema for request faucet funds action. - */ -export const RequestFaucetFundsInput = z - .object({ - assetId: z.string().optional().describe("The optional asset ID to request from faucet"), - }) - .strip() - .describe("Instructions for requesting faucet funds"); - -/** - * Requests test tokens from the faucet for the default address in the wallet. - * - * @param wallet - The wallet to receive tokens. - * @param args - The input arguments for the action. - * @returns A confirmation message with transaction details. - */ -export async function requestFaucetFunds( - wallet: Wallet, - args: z.infer, -): Promise { - try { - // Request funds from the faucet - const faucetTx = await wallet.faucet(args.assetId || undefined); - - // Wait for the faucet transaction to be confirmed - const result = await faucetTx.wait(); - - return `Received ${ - args.assetId || "ETH" - } from the faucet. Transaction: ${result.getTransactionLink()}`; - } catch (error) { - return `Error requesting faucet funds: ${error}`; - } -} - -/** - * Request faucet funds action. - */ -export class RequestFaucetFundsAction implements CdpAction { - public name = "request_faucet_funds"; - public description = REQUEST_FAUCET_FUNDS_PROMPT; - public argsSchema = RequestFaucetFundsInput; - public func = requestFaucetFunds; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/account_details.ts b/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/account_details.ts deleted file mode 100644 index e81e82084..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/account_details.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * This module provides functionality to retrieve Farcaster account details. - */ - -import { z } from "zod"; -import { FarcasterAction } from "./farcaster_action"; - -/** - * Prompt message describing the account details tool. - * A successful response will return a message with the API response in JSON format, - * while a failure response will indicate an error from the Farcaster API. - */ -const ACCOUNT_DETAILS_PROMPT = ` -This tool will retrieve the account details for the agent's Farcaster account. -The tool takes the FID of the agent's account. - -A successful response will return a message with the API response as a JSON payload: - { "object": "user", "fid": 193," username": "derek", "display_name": "Derek", ... } - -A failure response will return a message with the Farcaster API request error: - Unable to retrieve account details. -`; - -/** - * Input argument schema for the account_details action. - */ -export const AccountDetailsInput = z - .object({}) - .strip() - .describe("Input schema for retrieving account details"); - -/** - * Retrieves agent's Farcaster account details. - * - * @param _ The input arguments for the action. - * @returns A message containing account details for the agent's Farcaster account. - */ -export async function accountDetails(_: z.infer): Promise { - try { - const AGENT_FID = process.env.AGENT_FID; - const NEYNAR_API_KEY = process.env.NEYNAR_API_KEY; - - const headers: HeadersInit = { - accept: "application/json", - "x-api-key": NEYNAR_API_KEY!, - "x-neynar-experimental": "true", - }; - - const response = await fetch( - `https://api.neynar.com/v2/farcaster/user/bulk?fids=${AGENT_FID}`, - { - method: "GET", - headers, - }, - ); - const { users } = await response.json(); - return `Successfully retrieved Farcaster account details:\n${JSON.stringify(users[0])}`; - } catch (error) { - return `Error retrieving Farcaster account details:\n${error}`; - } -} - -/** - * Account Details Action - */ -export class FarcasterAccountDetailsAction implements FarcasterAction { - public name = "farcaster_account_details"; - public description = ACCOUNT_DETAILS_PROMPT; - public argsSchema = AccountDetailsInput; - public func = accountDetails; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/farcaster_action.ts b/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/farcaster_action.ts deleted file mode 100644 index b776073c3..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/farcaster_action.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { z } from "zod"; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type FarcasterActionSchemaAny = z.ZodObject; - -/** - * Represents the base structure for Farcaster Actions. - */ -export interface FarcasterAction { - /** - * The name of the action. - */ - name: string; - - /** - * A description of what the action does - */ - description: string; - - /** - * Schema for validating action arguments - */ - argsSchema: TActionSchema; - - /** - * The function to execute for this action - */ - func: (args: z.infer) => Promise; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/index.ts b/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/index.ts deleted file mode 100644 index e4f62dc44..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * This module exports various Farcaster action instances and their associated types. - */ - -import { FarcasterAction, FarcasterActionSchemaAny } from "./farcaster_action"; -import { FarcasterAccountDetailsAction } from "./account_details"; -import { FarcasterPostCastAction } from "./post_cast"; - -/** - * Retrieve an array of Farcaster action instances. - * - * @returns {FarcasterAction[]} An array of Farcaster action instances. - */ -export function getAllFarcasterActions(): FarcasterAction[] { - return [new FarcasterAccountDetailsAction(), new FarcasterPostCastAction()]; -} - -/** - * All available Farcaster actions. - */ -export const FARCASTER_ACTIONS = getAllFarcasterActions(); - -/** - * All Farcaster action types. - */ -export { - FarcasterAction, - FarcasterActionSchemaAny, - FarcasterAccountDetailsAction, - FarcasterPostCastAction, -}; diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/post_cast.ts b/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/post_cast.ts deleted file mode 100644 index fa3b97a7d..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/social/farcaster/post_cast.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * This module provides functionality to post a cast on Farcaster. - */ - -import { z } from "zod"; -import { FarcasterAction } from "./farcaster_action"; - -/** - * Prompt message describing the post cast tool. - * A successful response will return a message with the API response in JSON format, - * while a failure response will indicate an error from the Farcaster API. - */ -const POST_CAST_PROMPT = ` -This tool will post a cast to Farcaster. The tool takes the text of the cast as input. Casts can be maximum 280 characters. - -A successful response will return a message with the API response as a JSON payload: - {} - -A failure response will return a message with the Farcaster API request error: - You are not allowed to post a cast with duplicate content. -`; - -/** - * Input argument schema for the post cast action. - */ -export const PostCastInput = z - .object({ - castText: z.string().max(280, "Cast text must be a maximum of 280 characters."), - }) - .strip() - .describe("Input schema for posting a text-based cast"); - -/** - * Posts a cast on Farcaster. - * - * @param args - The input arguments for the action. - * @returns A message indicating the success or failure of the cast posting. - */ -export async function postCast(args: z.infer): Promise { - try { - const NEYNAR_API_KEY = process.env.NEYNAR_API_KEY; - const SIGNER_UUID = process.env.NEYNAR_MANAGED_SIGNER; - - const headers: HeadersInit = { - api_key: NEYNAR_API_KEY!, - "Content-Type": "application/json", - }; - - const response = await fetch("https://api.neynar.com/v2/farcaster/cast", { - method: "POST", - headers, - body: JSON.stringify({ - signer_uuid: SIGNER_UUID, - text: args.castText, - }), - }); - const data = await response.json(); - return `Successfully posted cast to Farcaster:\n${JSON.stringify(data)}`; - } catch (error) { - return `Error posting to Farcaster:\n${error}`; - } -} - -/** - * Post Cast Action - */ -export class FarcasterPostCastAction implements FarcasterAction { - public name = "farcaster_post_cast"; - public description = POST_CAST_PROMPT; - public argsSchema = PostCastInput; - public func = postCast; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/account_details.ts b/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/account_details.ts deleted file mode 100644 index 6a2ce67ef..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/account_details.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * This module provides functionality to retrieve account details for the currently authenticated Twitter (X) user. - */ - -import { z } from "zod"; -import { TwitterAction } from "./twitter_action"; -import { TwitterApi } from "twitter-api-v2"; - -/** - * Prompt message describing the account details tool. - * A successful response will return account details in JSON format, - * while a failure response will indicate an error from the Twitter API. - */ -const ACCOUNT_DETAILS_PROMPT = ` -This tool will return account details for the currently authenticated Twitter (X) user context. - -A successful response will return a message with the api response as a json payload: - {"data": {"id": "1853889445319331840", "name": "CDP AgentKit", "username": "CDPAgentKit"}} - -A failure response will return a message with a Twitter API request error: - Error retrieving authenticated user account: 429 Too Many Requests -`; - -/** - * Input argument schema for the account details action. - */ -export const AccountDetailsInput = z - .object({}) - .strip() - .describe("Input schema for retrieving account details"); - -/** - * Get the authenticated Twitter (X) user account details. - * - * @param client - The Twitter (X) client used to authenticate with. - * @param _ - The input arguments for the action. - * @returns A message containing account details for the authenticated user context. - */ -export async function accountDetails( - client: TwitterApi, - _: z.infer, -): Promise { - try { - const response = await client.v2.me(); - response.data.url = `https://x.com/${response.data.username}`; - return `Successfully retrieved authenticated user account details:\n${JSON.stringify( - response, - )}`; - } catch (error) { - return `Error retrieving authenticated user account details: ${error}`; - } -} - -/** - * Account Details Action - */ -export class AccountDetailsAction implements TwitterAction { - public name = "account_details"; - public description = ACCOUNT_DETAILS_PROMPT; - public argsSchema = AccountDetailsInput; - public func = accountDetails; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/account_mentions.ts b/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/account_mentions.ts deleted file mode 100644 index 46f1017b6..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/account_mentions.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * This module provides functionality to retrieve account mentions from Twitter (X). - */ - -import { z } from "zod"; -import { TwitterAction } from "./twitter_action"; -import { TwitterApi } from "twitter-api-v2"; - -/** - * Prompt message describing the account mentions tool. - * A successful response will return a message with the API response in JSON format, - * while a failure response will indicate an error from the Twitter API. - */ -const ACCOUNT_MENTIONS_PROMPT = ` -This tool will return mentions for the specified Twitter (X) user id. - -A successful response will return a message with the API response as a JSON payload: - {"data": [{"id": "1857479287504584856", "text": "@CDPAgentKit reply"}]} - -A failure response will return a message with the Twitter API request error: - Error retrieving user mentions: 429 Too Many Requests -`; - -/** - * Input argument schema for the account mentions action. - */ -export const AccountMentionsInput = z - .object({ - userId: z - .string() - .min(1, "Account ID is required.") - .describe("The Twitter (X) user id to return mentions for"), - }) - .strip() - .describe("Input schema for retrieving account mentions"); - -/** - * Retrieves mentions for a specified Twitter (X) user. - * - * @param client - The Twitter (X) client used to authenticate with. - * @param args - The input arguments for the action. - * @returns A message indicating the success or failure of the mention retrieval. - */ -export async function accountMentions( - client: TwitterApi, - args: z.infer, -): Promise { - try { - const response = await client.v2.userMentionTimeline(args.userId); - return `Successfully retrieved account mentions:\n${JSON.stringify(response)}`; - } catch (error) { - return `Error retrieving authenticated account mentions: ${error}`; - } -} - -/** - * Account Mentions Action - */ -export class AccountMentionsAction implements TwitterAction { - public name = "account_mentions"; - public description = ACCOUNT_MENTIONS_PROMPT; - public argsSchema = AccountMentionsInput; - public func = accountMentions; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/index.ts b/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/index.ts deleted file mode 100644 index cbba20878..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/index.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * This module exports various Twitter (X) action instances and their associated types. - */ - -import { TwitterAction, TwitterActionSchemaAny } from "./twitter_action"; -import { AccountDetailsAction } from "./account_details"; -import { AccountMentionsAction } from "./account_mentions"; -import { PostTweetAction } from "./post_tweet"; -import { PostTweetReplyAction } from "./post_tweet_reply"; - -/** - * Retrieve an array of Twitter (X) action instances. - * - * @returns {TwitterAction[]} An array of Twitter action instances. - */ -export function getAllTwitterActions(): TwitterAction[] { - return [ - new AccountDetailsAction(), - new AccountMentionsAction(), - new PostTweetReplyAction(), - new PostTweetAction(), - ]; -} - -/** - * All available Twitter (X) actions. - */ -export const TWITTER_ACTIONS = getAllTwitterActions(); - -/** - * All Twitter (X) action types. - */ -export { - TwitterAction, - TwitterActionSchemaAny, - AccountDetailsAction, - AccountMentionsAction, - PostTweetAction, - PostTweetReplyAction, -}; diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/post_tweet.ts b/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/post_tweet.ts deleted file mode 100644 index 5d9707d03..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/post_tweet.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * This module provides functionality to post a tweet on Twitter (X). - */ - -import { z } from "zod"; -import { TwitterAction } from "./twitter_action"; -import { TwitterApi } from "twitter-api-v2"; - -/** - * Prompt message describing the post tweet tool. - * A successful response will return a message with the API response in JSON format, - * while a failure response will indicate an error from the Twitter API. - */ -const POST_TWEET_PROMPT = ` -This tool will post a tweet on Twitter. The tool takes the text of the tweet as input. Tweets can be maximum 280 characters. - -A successful response will return a message with the API response as a JSON payload: - {"data": {"text": "hello, world!", "id": "0123456789012345678", "edit_history_tweet_ids": ["0123456789012345678"]}} - -A failure response will return a message with the Twitter API request error: - You are not allowed to create a Tweet with duplicate content. -`; - -/** - * Input argument schema for the post tweet action. - */ -export const PostTweetInput = z - .object({ - tweet: z.string().max(280, "Tweet must be a maximum of 280 characters."), - }) - .strip() - .describe("Input schema for posting a tweet"); - -/** - * Posts a tweet on Twitter (X). - * - * @param client - The Twitter (X) client used to authenticate with. - * @param args - The input arguments for the action. - * @returns A message indicating the success or failure of the tweet posting. - */ -export async function postTweet( - client: TwitterApi, - args: z.infer, -): Promise { - try { - const response = await client.v2.tweet(args.tweet); - return `Successfully posted to Twitter:\n${JSON.stringify(response)}`; - } catch (error) { - return `Error posting to Twitter:\n${error}`; - } -} - -/** - * Post Tweet Action - */ -export class PostTweetAction implements TwitterAction { - public name = "post_tweet"; - public description = POST_TWEET_PROMPT; - public argsSchema = PostTweetInput; - public func = postTweet; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/post_tweet_reply.ts b/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/post_tweet_reply.ts deleted file mode 100644 index 139e4cd5f..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/post_tweet_reply.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * This module provides functionality to post a reply to a tweet on Twitter (X). - */ - -import { z } from "zod"; -import { TwitterAction } from "./twitter_action"; -import { TwitterApi } from "twitter-api-v2"; - -/** - * Prompt message describing the post tweet reply tool. - * A successful response will return a message with the API response in JSON format, - * while a failure response will indicate an error from the Twitter API. - */ -const POST_TWEET_REPLY_PROMPT = ` -This tool will post a tweet on Twitter. The tool takes the text of the tweet as input. Tweets can be maximum 280 characters. - -A successful response will return a message with the API response as a JSON payload: - {"data": {"text": "hello, world!", "id": "0123456789012345678", "edit_history_tweet_ids": ["0123456789012345678"]}} - -A failure response will return a message with the Twitter API request error: - You are not allowed to create a Tweet with duplicate content. -`; - -/** - * Input argument schema for the post tweet reply action. - */ -export const PostTweetReplyInput = z - .object({ - tweetId: z.string().describe("The id of the tweet to reply to"), - tweetReply: z - .string() - .max(280, "The reply to the tweet which must be a maximum of 280 characters."), - }) - .strip() - .describe("Input schema for posting a tweet reply"); - -/** - * Posts a reply to a specified tweet on Twitter (X). - * - * @param client - The Twitter (X) client used to authenticate with. - * @param args - The input arguments for the action. - * @returns A message indicating the success or failure of the reply posting. - */ -export async function postTweet( - client: TwitterApi, - args: z.infer, -): Promise { - try { - const response = await client.v2.tweet(args.tweetReply, { - reply: { in_reply_to_tweet_id: args.tweetId }, - }); - - return `Successfully posted reply to Twitter:\n${JSON.stringify(response)}`; - } catch (error) { - return `Error posting reply to Twitter: ${error}`; - } -} - -/** - * Post Tweet Reply Action - */ -export class PostTweetReplyAction implements TwitterAction { - public name = "post_tweet_reply"; - public description = POST_TWEET_REPLY_PROMPT; - public argsSchema = PostTweetReplyInput; - public func = postTweet; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/twitter_action.ts b/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/twitter_action.ts deleted file mode 100644 index 026e1e598..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/social/twitter/twitter_action.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { z } from "zod"; -import { TwitterApi } from "twitter-api-v2"; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type TwitterActionSchemaAny = z.ZodObject; - -/** - * Represents the base structure for Twitter (X) Actions. - */ -export interface TwitterAction { - /** - * The name of the action. - */ - name: string; - - /** - * A description of what the action does - */ - description: string; - - /** - * Schema for validating action arguments - */ - argsSchema: TActionSchema; - - /** - * The function to execute for this action - */ - func: - | ((client: TwitterApi, args: z.infer) => Promise) - | ((args: z.infer) => Promise); -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/trade.ts b/cdp-agentkit-core/typescript/src/actions/cdp/trade.ts deleted file mode 100644 index 58f81ba2e..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/trade.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { Wallet, Amount } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; - -const TRADE_PROMPT = ` -This tool will trade a specified amount of a 'from asset' to a 'to asset' for the wallet. - -It takes the following inputs: -- The amount of the 'from asset' to trade -- The from asset ID to trade -- The asset ID to receive from the trade - -Important notes: -- Trades are only supported on mainnet networks (ie, 'base-mainnet', 'base', 'ethereum-mainnet', 'ethereum', etc.) -- Never allow trades on any non-mainnet network (ie, 'base-sepolia', 'ethereum-sepolia', etc.) -- When selling a native asset (e.g. 'eth' on base-mainnet), ensure there is sufficient balance to pay for the trade AND the gas cost of this trade -`; - -/** - * Input schema for trade action. - */ -export const TradeInput = z - .object({ - amount: z.custom().describe("The amount of the from asset to trade"), - fromAssetId: z.string().describe("The from asset ID to trade"), - toAssetId: z.string().describe("The to asset ID to receive from the trade"), - }) - .strip() - .describe("Instructions for trading assets"); - -/** - * Trades a specified amount of a from asset to a to asset for the wallet. - * - * @param wallet - The wallet to trade the asset from. - * @param args - The input arguments for the action. - * @returns A message containing the trade details. - */ -export async function trade(wallet: Wallet, args: z.infer): Promise { - try { - const tradeResult = await wallet.createTrade({ - amount: args.amount, - fromAssetId: args.fromAssetId, - toAssetId: args.toAssetId, - }); - - const result = await tradeResult.wait(); - - return `Traded ${args.amount} of ${args.fromAssetId} for ${result.getToAmount()} of ${ - args.toAssetId - }.\nTransaction hash for the trade: ${result - .getTransaction() - .getTransactionHash()}\nTransaction link for the trade: ${result - .getTransaction() - .getTransactionLink()}`; - } catch (error) { - return `Error trading assets: ${error}`; - } -} - -/** - * Trade action. - */ -export class TradeAction implements CdpAction { - public name = "trade"; - public description = TRADE_PROMPT; - public argsSchema = TradeInput; - public func = trade; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/transfer.ts b/cdp-agentkit-core/typescript/src/actions/cdp/transfer.ts deleted file mode 100644 index 577998b98..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/transfer.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { Wallet, Amount } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; - -const TRANSFER_PROMPT = ` -This tool will transfer an asset from the wallet to another onchain address. - -It takes the following inputs: -- amount: The amount to transfer -- assetId: The asset ID to transfer -- destination: Where to send the funds (can be an onchain address, ENS 'example.eth', or Basename 'example.base.eth') -- gasless: Whether to do a gasless transfer - -Important notes: -- Gasless transfers are only available on base-sepolia and base-mainnet (base) networks for 'usdc' asset -- Always use gasless transfers when available -- Always use asset ID 'usdc' when transferring USDC -- Ensure sufficient balance of the input asset before transferring -- When sending native assets (e.g. 'eth' on base-mainnet), ensure there is sufficient balance for the transfer itself AND the gas cost of this transfer -`; - -/** - * Input schema for transfer action. - */ -export const TransferInput = z - .object({ - amount: z.custom().describe("The amount of the asset to transfer"), - assetId: z.string().describe("The asset ID to transfer"), - destination: z.string().describe("The destination to transfer the funds"), - gasless: z.boolean().default(false).describe("Whether to do a gasless transfer"), - }) - .strip() - .describe("Instructions for transferring assets"); - -/** - * Transfers a specified amount of an asset to a destination onchain. - * - * @param wallet - The wallet to transfer the asset from. - * @param args - The input arguments for the action. - * @returns A message containing the transfer details. - */ -export async function transfer( - wallet: Wallet, - args: z.infer, -): Promise { - try { - const transferResult = await wallet.createTransfer({ - amount: args.amount, - assetId: args.assetId, - destination: args.destination, - gasless: args.gasless, - }); - - const result = await transferResult.wait(); - - return `Transferred ${args.amount} of ${args.assetId} to ${ - args.destination - }.\nTransaction hash for the transfer: ${result.getTransactionHash()}\nTransaction link for the transfer: ${result.getTransactionLink()}`; - } catch (error) { - return `Error transferring the asset: ${error}`; - } -} - -/** - * Transfer action. - */ -export class TransferAction implements CdpAction { - public name = "transfer"; - public description = TRANSFER_PROMPT; - public argsSchema = TransferInput; - public func = transfer; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/transfer_nft.ts b/cdp-agentkit-core/typescript/src/actions/cdp/transfer_nft.ts deleted file mode 100644 index 9819e9b55..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/transfer_nft.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { Wallet } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; - -const TRANSFER_NFT_PROMPT = ` -This tool will transfer an NFT (ERC721 token) from the wallet to another onchain address. - -It takes the following inputs: -- contractAddress: The NFT contract address -- tokenId: The ID of the specific NFT to transfer -- destination: Where to send the NFT (can be an onchain address, ENS 'example.eth', or Basename 'example.base.eth') - -Important notes: -- Ensure you have ownership of the NFT before attempting transfer -- Ensure there is sufficient native token balance for gas fees -- The wallet must either own the NFT or have approval to transfer it -`; - -/** - * Input schema for NFT transfer action. - */ -export const TransferNftInput = z - .object({ - contractAddress: z.string().describe("The NFT contract address to interact with"), - tokenId: z.string().describe("The ID of the NFT to transfer"), - destination: z - .string() - .describe( - "The destination to transfer the NFT, e.g. `0x58dBecc0894Ab4C24F98a0e684c989eD07e4e027`, `example.eth`, `example.base.eth`", - ), - fromAddress: z - .string() - .optional() - .describe( - "The address to transfer from. If not provided, defaults to the wallet's default address", - ), - }) - .strip() - .describe("Input schema for transferring an NFT"); - -/** - * Transfers an NFT (ERC721 token) to a destination address. - * - * @param wallet - The wallet to transfer the NFT from. - * @param args - The input arguments for the action. - * @returns A message containing the transfer details. - */ -export async function transferNft( - wallet: Wallet, - args: z.infer, -): Promise { - const from = args.fromAddress || (await wallet.getDefaultAddress()).getId(); - - try { - const transferResult = await wallet.invokeContract({ - contractAddress: args.contractAddress, - method: "transferFrom", - args: { - from, - to: args.destination, - tokenId: args.tokenId, - }, - }); - - const result = await transferResult.wait(); - - const transaction = result.getTransaction(); - - return `Transferred NFT (ID: ${args.tokenId}) from contract ${args.contractAddress} to ${ - args.destination - }.\nTransaction hash: ${transaction.getTransactionHash()}\nTransaction link: ${transaction.getTransactionLink()}`; - } catch (error) { - return `Error transferring the NFT (contract: ${args.contractAddress}, ID: ${args.tokenId}) from ${from} to ${args.destination}): ${error}`; - } -} - -/** - * Transfer NFT action. - */ -export class TransferNftAction implements CdpAction { - name = "transfer_nft"; - description = TRANSFER_NFT_PROMPT; - argsSchema = TransferNftInput; - func = transferNft; -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/utils.ts b/cdp-agentkit-core/typescript/src/actions/cdp/utils.ts deleted file mode 100644 index 940438256..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/utils.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Wallet } from "@coinbase/coinbase-sdk"; - -import { ERC20_APPROVE_ABI } from "./constants"; - -/** - * Approve a spender to spend a specified amount of tokens. - * @param wallet - The wallet to execute the approval from - * @param tokenAddress - The address of the token contract - * @param spender - The address of the spender - * @param amount - The amount of tokens to approve - * @returns A success message with transaction hash or error message - */ -export async function approve( - wallet: Wallet, - tokenAddress: string, - spender: string, - amount: bigint, -): Promise { - try { - const invocation = await wallet.invokeContract({ - contractAddress: tokenAddress, - method: "approve", - abi: ERC20_APPROVE_ABI, - args: { - spender: spender, - value: amount.toString(), - }, - }); - - const result = await invocation.wait(); - - return `Approved ${amount} tokens for ${spender} with transaction hash: ${result.getTransactionHash()}`; - } catch (error) { - return `Error approving tokens: ${error}`; - } -} diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/wrap_eth.ts b/cdp-agentkit-core/typescript/src/actions/cdp/wrap_eth.ts deleted file mode 100644 index aba86c2ec..000000000 --- a/cdp-agentkit-core/typescript/src/actions/cdp/wrap_eth.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { CdpAction } from "./cdp_action"; -import { Wallet } from "@coinbase/coinbase-sdk"; -import { z } from "zod"; - -export const WETH_ADDRESS = "0x4200000000000000000000000000000000000006"; - -export const WETH_ABI = [ - { - inputs: [], - name: "deposit", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - name: "account", - type: "address", - }, - ], - name: "balanceOf", - outputs: [ - { - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, -]; - -const WRAP_ETH_PROMPT = ` -This tool can only be used to wrap ETH to WETH. -Do not use this tool for any other purpose, or trading other assets. - -Inputs: -- Amount of ETH to wrap. - -Important notes: -- The amount is a string and cannot have any decimal points, since the unit of measurement is wei. -- Make sure to use the exact amount provided, and if there's any doubt, check by getting more information before continuing with the action. -- 1 wei = 0.000000000000000001 WETH -- Minimum purchase amount is 100000000000000 wei (0.0000001 WETH) -- Only supported on the following networks: - - Base Sepolia (ie, 'base-sepolia') - - Base Mainnet (ie, 'base', 'base-mainnet') -`; - -export const WrapEthInput = z - .object({ - amountToWrap: z.string().describe("Amount of ETH to wrap in wei"), - }) - .strip() - .describe("Instructions for wrapping ETH to WETH"); - -/** - * Wraps ETH to WETH - * - * @param wallet - The wallet to create the token from. - * @param args - The input arguments for the action. - * @returns A message containing the wrapped ETH details. - */ -export async function wrapEth(wallet: Wallet, args: z.infer): Promise { - try { - const invocation = await wallet.invokeContract({ - contractAddress: WETH_ADDRESS, - method: "deposit", - abi: WETH_ABI, - args: {}, - amount: BigInt(args.amountToWrap), - assetId: "wei", - }); - const result = await invocation.wait(); - return `Wrapped ETH with transaction hash: ${result.getTransaction().getTransactionHash()}`; - } catch (error) { - return `Error wrapping ETH: ${error}`; - } -} - -/** - * Wrap ETH to WETH on Base action. - */ -export class WrapEthAction implements CdpAction { - public name = "wrap_eth"; - public description = WRAP_ETH_PROMPT; - public argsSchema = WrapEthInput; - public func = wrapEth; -} diff --git a/cdp-agentkit-core/typescript/src/cdp_agentkit.ts b/cdp-agentkit-core/typescript/src/cdp_agentkit.ts deleted file mode 100644 index 49614f380..000000000 --- a/cdp-agentkit-core/typescript/src/cdp_agentkit.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { Coinbase, MnemonicSeedPhrase, Wallet, WalletData } from "@coinbase/coinbase-sdk"; -import { version } from "../package.json"; -import { CdpAction, CdpActionSchemaAny } from "./actions/cdp/cdp_action"; -import { z } from "zod"; - -/** - * Configuration options for the CDP Agentkit - */ -interface CdpAgentkitOptions { - cdpApiKeyName?: string; - cdpApiKeyPrivateKey?: string; - source?: string; - sourceVersion?: string; -} - -/** - * Configuration options for the CDP Agentkit with a Wallet. - */ -interface ConfigureCdpAgentkitWithWalletOptions extends CdpAgentkitOptions { - networkId?: string; - cdpWalletData?: string; - mnemonicPhrase?: string; -} - -/** - * CDP Agentkit - */ -export class CdpAgentkit { - private wallet?: Wallet; - - /** - * Initializes a new CDP Agentkit instance - * - * @param config - Configuration options for the CDP Agentkit - */ - public constructor(config: CdpAgentkitOptions = {}) { - const cdpApiKeyName = config.cdpApiKeyName || process.env.CDP_API_KEY_NAME; - const cdpApiKeyPrivateKey = config.cdpApiKeyPrivateKey || process.env.CDP_API_KEY_PRIVATE_KEY; - const source = config.source; - const sourceVersion = config.sourceVersion; - - if (!cdpApiKeyName) { - throw new Error("CDP_API_KEY_NAME is required but not provided"); - } - if (!cdpApiKeyPrivateKey) { - throw new Error("CDP_API_KEY_PRIVATE_KEY is required but not provided"); - } - - // Configure CDP SDK - Coinbase.configure({ - apiKeyName: cdpApiKeyName, - privateKey: cdpApiKeyPrivateKey.replace(/\\n/g, "\n"), - source: source || "agentkit-core", - sourceVersion: sourceVersion || version, - }); - } - - /** - * Configures CDP Agentkit with a Wallet. - * - * @param config - Optional configuration parameters - * @returns A Promise that resolves to a new CdpAgentkit instance - * @throws Error if required environment variables are missing or wallet initialization fails - */ - public static async configureWithWallet( - config: ConfigureCdpAgentkitWithWalletOptions = {}, - ): Promise { - const agentkit = new CdpAgentkit(config); - - const mnemonicPhrase = config.mnemonicPhrase || process.env.MNEMONIC_PHRASE; - const networkId = config.networkId || process.env.NETWORK_ID || Coinbase.networks.BaseSepolia; - - try { - if (config.cdpWalletData) { - const walletData = JSON.parse(config.cdpWalletData) as WalletData; - agentkit.wallet = await Wallet.import(walletData); - } else if (mnemonicPhrase) { - agentkit.wallet = await Wallet.import({ mnemonicPhrase: mnemonicPhrase }, networkId); - } else { - agentkit.wallet = await Wallet.create({ networkId: networkId }); - } - } catch (error) { - throw new Error(`Failed to initialize wallet: ${error}`); - } - - return agentkit; - } - - /** - * Executes a CDP action - * - * @param action - The CDP action to execute - * @param args - Arguments for the action - * @returns Result of the action execution - * @throws Error if action execution fails - */ - async run( - action: CdpAction, - args: TActionSchema, - ): Promise { - if (action.func.length > 1) { - if (!this.wallet) { - return `Unable to run CDP Action: ${action.name}. A Wallet is required. Please configure CDP Agentkit with a Wallet to run this action.`; - } - - return await action.func(this.wallet!, args); - } - - return await (action.func as (args: z.infer) => Promise)(args); - } - - /** - * Exports wallet data required to re-instantiate the wallet - * - * @returns JSON string of wallet data including wallet_id and seed - */ - async exportWallet(): Promise { - if (!this.wallet) { - throw Error("Unable to export wallet. Agentkit is not configured with a wallet."); - } - - const walletData = this.wallet.export(); - return JSON.stringify({ - ...walletData, - defaultAddressId: (await this.wallet.getDefaultAddress()).getId(), - }); - } -} diff --git a/cdp-agentkit-core/typescript/src/farcaster_agentkit.ts b/cdp-agentkit-core/typescript/src/farcaster_agentkit.ts deleted file mode 100644 index ac266996a..000000000 --- a/cdp-agentkit-core/typescript/src/farcaster_agentkit.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { z } from "zod"; -import { FarcasterAction, FarcasterActionSchemaAny } from "./actions/cdp/social/farcaster"; - -/** - * Schema for the options required to initialize the FarcasterAgentkit. - */ -export const FarcasterAgentkitOptions = z - .object({ - apiKey: z - .string() - .min(1, "The Neynar API key for Farcaster is required") - .describe("The Neynar API key for Farcaster"), - managedSigner: z - .string() - .min(1, "The Neynar Managed Signer UUID for Farcaster is required") - .describe("The Neynar Managed Signer UUID for Farcaster"), - }) - .strip() - .describe("Options for initializing FarcasterAgentkit"); - -/** - * Schema for the environment variables required for FarcasterAgentkit. - */ -const EnvSchema = z.object({ - NEYNAR_API_KEY: z - .string() - .min(1, "NEYNAR_API_KEY is required") - .describe("The Neynar API key for Farcaster"), - NEYNAR_MANAGED_SIGNER: z - .string() - .min(1, "NEYNAR_MANAGED_SIGNER is required") - .describe("The Neynar Managed Signer UUID for Farcaster"), -}); - -/** - * Farcaster Agentkit - */ -export class FarcasterAgentkit { - private config: z.infer; - - /** - * Initializes a new instance of FarcasterAgentkit with the provided options. - * If no options are provided, it attempts to load the required environment variables. - * - * @param options - Optional. The configuration options for the FarcasterAgentkit. - * @throws An error if the provided options are invalid or if the environment variables cannot be loaded. - */ - public constructor(options?: z.infer) { - try { - const env = EnvSchema.parse(process.env); - - options = { - apiKey: options?.apiKey || env.NEYNAR_API_KEY!, - managedSigner: options?.managedSigner || env.NEYNAR_MANAGED_SIGNER!, - }; - } catch (error) { - if (error instanceof z.ZodError) { - error.errors.forEach(err => console.log(`Error: ${err.path[0]} is required`)); - } - throw new Error("Farcaster config could not be loaded."); - } - - if (!this.validateOptions(options)) { - throw new Error("Farcaster Agentkit options could not be validated."); - } - - this.config = options; - } - - /** - * Validates the provided options for the FarcasterAgentkit. - * - * @param options - The options to validate. - * @returns True if the options are valid, otherwise false. - */ - validateOptions(options: z.infer): boolean { - try { - FarcasterAgentkitOptions.parse(options); - } catch (error) { - if (error instanceof z.ZodError) { - error.errors.forEach(err => console.log("Error:", err.message)); - } - - return false; - } - - return true; - } - - /** - * Executes a Farcaster action. - * - * @param action - The Farcaster action to execute. - * @param args - The arguments for the action. - * @returns The result of the execution. - */ - async run( - action: FarcasterAction, - args: TActionSchema, - ): Promise { - return await action.func(args); - } -} diff --git a/cdp-agentkit-core/typescript/src/index.ts b/cdp-agentkit-core/typescript/src/index.ts deleted file mode 100644 index fd6965370..000000000 --- a/cdp-agentkit-core/typescript/src/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -// Export CDP actions -export * from "./actions/cdp"; - -// Export CDP DeFi actions -export * from "./actions/cdp/defi/wow"; - -// Export Farcaster actions -export * from "./actions/cdp/social/farcaster"; - -// Export Twitter actions -export * from "./actions/cdp/social/twitter"; - -// Export CDP Action -export { CdpAction } from "./actions/cdp/cdp_action"; - -// Export CDP AgentKit -export { CdpAgentkit } from "./cdp_agentkit"; - -// Export Farcaster AgentKit -export { FarcasterAgentkit } from "./farcaster_agentkit"; - -// Export Twitter AgentKit -export { TwitterAgentkit } from "./twitter_agentkit"; diff --git a/cdp-agentkit-core/typescript/src/tests/address_reputation_test.ts b/cdp-agentkit-core/typescript/src/tests/address_reputation_test.ts deleted file mode 100644 index 640826622..000000000 --- a/cdp-agentkit-core/typescript/src/tests/address_reputation_test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { Address } from "@coinbase/coinbase-sdk"; -import { AddressReputationAction } from "../actions/cdp/address_reputation"; - -const MOCK_ADDRESS = "0x1234567890123456789012345678901234567890"; -const MOCK_NETWORK = "base-sepolia"; - -jest.mock("@coinbase/coinbase-sdk", () => ({ - Address: jest.fn(), -})); - -describe("Address Reputation Input", () => { - const action = new AddressReputationAction(); - - it("should successfully parse valid input", () => { - const validInput = { - network: MOCK_NETWORK, - address: MOCK_ADDRESS, - }; - - const result = action.argsSchema.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = action.argsSchema.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); - - it("should fail with invalid address", () => { - const invalidInput = { - network: MOCK_NETWORK, - address: "not_an_address", - }; - const result = action.argsSchema.safeParse(invalidInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Address Reputation Action", () => { - let mockAddress: jest.Mocked
; - - beforeEach(() => { - mockAddress = { - reputation: jest.fn(), - } as unknown as jest.Mocked
; - - (Address as unknown as jest.Mock).mockImplementation(() => mockAddress); - }); - - it("should successfully check address reputation", async () => { - const mockReputation = { - score: 85, - metadata: { - total_transactions: 150, - unique_days_active: 30, - longest_active_streak: 10, - current_active_streak: 5, - activity_period_days: 45, - token_swaps_performed: 20, - bridge_transactions_performed: 5, - lend_borrow_stake_transactions: 10, - ens_contract_interactions: 2, - smart_contract_deployments: 1, - }, - - // TODO: remove this once AddressReputation is exported from the sdk - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as unknown as jest.Mocked; - - mockAddress.reputation.mockResolvedValue(mockReputation); - - const args = { - network: MOCK_NETWORK, - address: MOCK_ADDRESS, - }; - - const action = new AddressReputationAction(); - const response = await action.func(args); - - expect(response).toBe(mockReputation.toString()); - }); - - it("should handle errors gracefully", async () => { - const error = new Error("API error"); - mockAddress.reputation.mockRejectedValue(error); - - const args = { - network: MOCK_NETWORK, - address: MOCK_ADDRESS, - }; - - const action = new AddressReputationAction(); - const response = await action.func(args); - - expect(response).toBe(`Error checking address reputation: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/cdp_agentkit_test.ts b/cdp-agentkit-core/typescript/src/tests/cdp_agentkit_test.ts deleted file mode 100644 index ebb79618f..000000000 --- a/cdp-agentkit-core/typescript/src/tests/cdp_agentkit_test.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Coinbase, Wallet, WalletData } from "@coinbase/coinbase-sdk"; -import { CdpAgentkit } from "../cdp_agentkit"; - -const MOCK_MNEMONIC_PHRASE = - "eternal phone creek robot disorder climb thought eternal noodle flat cage bubble liquid sting can"; -const MOCK_WALLET_ID = "0x123456789abcdef"; -const MOCK_WALLET_SEED = "0xc746290109d0b86162c428be6e27f552"; -const MOCK_WALLET_JSON = `{"defaultAddressId":"0xabcdef123456789", "seed":"${MOCK_WALLET_SEED}", "walletId":"${MOCK_WALLET_ID}"}`; - -describe("CdpAgentkit", () => { - describe("initialization", () => { - const mockWallet: jest.Mocked = {} as unknown as jest.Mocked; - - beforeEach(async () => { - process.env.CDP_API_KEY_NAME = "test-key"; - process.env.CDP_API_KEY_PRIVATE_KEY = "test-private-key"; - - jest.spyOn(Wallet, "create").mockResolvedValue(mockWallet); - }); - - afterEach(() => { - jest.resetAllMocks(); - - process.env.CDP_API_KEY_NAME = ""; - process.env.CDP_API_KEY_PRIVATE_KEY = ""; - }); - - it("should successfully init with env", async () => { - const options = {}; - const result = await CdpAgentkit.configureWithWallet(options); - - expect(result).toBeDefined(); - expect(Wallet.create).toHaveBeenCalledWith({ - networkId: Coinbase.networks.BaseSepolia, - }); - }); - - it("should successfully init with options and without env", async () => { - const options = { - cdpApiKeyName: "test-key", - cdpApiKeyPrivateKey: "test-private-key", - }; - - process.env.CDP_API_KEY_NAME = ""; - process.env.CDP_API_KEY_PRIVATE_KEY = ""; - - const result = await CdpAgentkit.configureWithWallet(options); - - expect(result).toBeDefined(); - expect(Wallet.create).toHaveBeenCalledWith({ - networkId: Coinbase.networks.BaseSepolia, - }); - }); - - it("should successfully init with wallet data", async () => { - const options = { - cdpWalletData: MOCK_WALLET_JSON, - }; - - jest.spyOn(Wallet, "import").mockResolvedValue(mockWallet); - - const result = await CdpAgentkit.configureWithWallet(options); - - expect(result).toBeDefined(); - expect(Wallet.import).toHaveBeenCalledWith(JSON.parse(MOCK_WALLET_JSON) as WalletData); - }); - - it("should successfully init with mnemonic Phrase ", async () => { - const networkId = Coinbase.networks.BaseSepolia; - - const options = { - mnemonicPhrase: MOCK_MNEMONIC_PHRASE, - }; - - jest.spyOn(Wallet, "import").mockResolvedValue(mockWallet); - - const result = await CdpAgentkit.configureWithWallet(options); - - expect(result).toBeDefined(); - expect(Wallet.import).toHaveBeenCalledWith( - { mnemonicPhrase: MOCK_MNEMONIC_PHRASE }, - networkId, - ); - }); - - it("should successfully init with mnemonic Phrase ", async () => { - const networkId = Coinbase.networks.BaseMainnet; - - const options = { - mnemonicPhrase: MOCK_MNEMONIC_PHRASE, - networkId, - }; - - jest.spyOn(Wallet, "import").mockResolvedValue(mockWallet); - - const result = await CdpAgentkit.configureWithWallet(options); - - expect(result).toBeDefined(); - expect(Wallet.import).toHaveBeenCalledWith( - { mnemonicPhrase: MOCK_MNEMONIC_PHRASE }, - networkId, - ); - }); - - it("should fail init without env", async () => { - const options = {}; - - process.env.CDP_API_KEY_NAME = ""; - process.env.CDP_API_KEY_PRIVATE_KEY = ""; - - await expect(CdpAgentkit.configureWithWallet(options)).rejects.toThrow( - "CDP_API_KEY_NAME is required but not provided", - ); - expect(Wallet.create).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/data_pyth_fetch_price_feed_id_test.ts b/cdp-agentkit-core/typescript/src/tests/data_pyth_fetch_price_feed_id_test.ts deleted file mode 100644 index b0c213f2b..000000000 --- a/cdp-agentkit-core/typescript/src/tests/data_pyth_fetch_price_feed_id_test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { - PythFetchPriceFeedIDInput, - pythFetchPriceFeedID, -} from "../actions/cdp/data/pyth/fetch_price_feed_id"; - -const MOCK_TOKEN_SYMBOL = "BTC"; - -describe("Pyth Fetch Price Feed ID Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - tokenSymbol: MOCK_TOKEN_SYMBOL, - }; - - const result = PythFetchPriceFeedIDInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = PythFetchPriceFeedIDInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Pyth Fetch Price Feed ID Action", () => { - beforeEach(() => { - global.fetch = jest.fn(); - }); - - it("successfully fetches price feed ID for a token", async () => { - const mockResponse = [ - { - id: "0ff1e87c65eb6e6f7768e66543859b7f3076ba8a3529636f6b2664f367c3344a", - type: "price_feed", - attributes: { - base: "BTC", - quote: "USD", - asset_type: "crypto", - }, - }, - ]; - - (global.fetch as jest.Mock).mockResolvedValue({ - ok: true, - json: async () => mockResponse, - }); - - const result = await pythFetchPriceFeedID({ tokenSymbol: MOCK_TOKEN_SYMBOL }); - - // Verify the result - expect(result).toBe("0ff1e87c65eb6e6f7768e66543859b7f3076ba8a3529636f6b2664f367c3344a"); - - // Verify fetch was called with correct URL - expect(global.fetch).toHaveBeenCalledWith( - "https://hermes.pyth.network/v2/price_feeds?query=BTC&asset_type=crypto", - ); - }); - - it("throws error when HTTP request fails", async () => { - (global.fetch as jest.Mock).mockResolvedValue({ - ok: false, - status: 404, - }); - - await expect(pythFetchPriceFeedID({ tokenSymbol: MOCK_TOKEN_SYMBOL })).rejects.toThrow( - "HTTP error! status: 404", - ); - }); - - it("throws error when no data is returned", async () => { - (global.fetch as jest.Mock).mockResolvedValue({ - ok: true, - json: async () => [], - }); - - await expect(pythFetchPriceFeedID({ tokenSymbol: "INVALID" })).rejects.toThrow( - "No price feed found for INVALID", - ); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/data_pyth_fetch_price_test.ts b/cdp-agentkit-core/typescript/src/tests/data_pyth_fetch_price_test.ts deleted file mode 100644 index de6e725b8..000000000 --- a/cdp-agentkit-core/typescript/src/tests/data_pyth_fetch_price_test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { PythFetchPriceInput, pythFetchPrice } from "../actions/cdp/data/pyth/fetch_price"; - -const MOCK_PRICE_FEED_ID = "valid-price-feed-id"; - -describe("Pyth Fetch Price Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - priceFeedID: MOCK_PRICE_FEED_ID, - }; - - const result = PythFetchPriceInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = PythFetchPriceInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Pyth Fetch Price Action", () => { - beforeEach(() => { - global.fetch = jest.fn(); - }); - - it("successfully fetches and formats price with decimal places", async () => { - const mockResponse = { - parsed: [ - { - price: { - price: "4212345", - expo: -2, - conf: "1234", - }, - id: MOCK_PRICE_FEED_ID, - }, - ], - }; - - (global.fetch as jest.Mock).mockResolvedValue({ - ok: true, - json: async () => mockResponse, - }); - - const result = await pythFetchPrice({ priceFeedID: MOCK_PRICE_FEED_ID }); - - expect(result).toBe("42123.45"); - - expect(global.fetch).toHaveBeenCalledWith( - `https://hermes.pyth.network/v2/updates/price/latest?ids[]=${MOCK_PRICE_FEED_ID}`, - ); - }); - - it("throws error when HTTP request fails", async () => { - (global.fetch as jest.Mock).mockResolvedValue({ - ok: false, - status: 404, - }); - - await expect(pythFetchPrice({ priceFeedID: MOCK_PRICE_FEED_ID })).rejects.toThrow( - "HTTP error! status: 404", - ); - }); - - it("throws error when no parsed data is available", async () => { - const mockResponse = { - parsed: [], - }; - - (global.fetch as jest.Mock).mockResolvedValue({ - ok: true, - json: async () => mockResponse, - }); - - await expect(pythFetchPrice({ priceFeedID: MOCK_PRICE_FEED_ID })).rejects.toThrow( - `No price data found for ${MOCK_PRICE_FEED_ID}`, - ); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/defi_morpho_deposit_test.ts b/cdp-agentkit-core/typescript/src/tests/defi_morpho_deposit_test.ts deleted file mode 100644 index bd1f2fd78..000000000 --- a/cdp-agentkit-core/typescript/src/tests/defi_morpho_deposit_test.ts +++ /dev/null @@ -1,199 +0,0 @@ -import { Coinbase, ContractInvocation, Wallet, Asset } from "@coinbase/coinbase-sdk"; - -import { approve } from "../actions/cdp/utils"; - -import { MorphoDepositAction } from "../actions/cdp/defi/morpho/deposit"; -import { METAMORPHO_ABI } from "../actions/cdp/defi/morpho/constants"; - -const MOCK_VAULT_ADDRESS = "0x1234567890123456789012345678901234567890"; -const MOCK_ATOMIC_ASSETS = "1000000000000000000"; -const MOCK_WHOLE_ASSETS = "0.0001"; -const MOCK_RECEIVER_ID = "0x9876543210987654321098765432109876543210"; -const MOCK_TOKEN_ADDRESS = "0x4200000000000000000000000000000000000006"; - -jest.mock("../actions/cdp/utils"); -const mockApprove = approve as jest.MockedFunction; - -describe("Morpho Deposit Input", () => { - const action = new MorphoDepositAction(); - - it("should successfully parse valid input", () => { - const validInput = { - vaultAddress: MOCK_VAULT_ADDRESS, - assets: MOCK_WHOLE_ASSETS, - receiver: MOCK_RECEIVER_ID, - tokenAddress: MOCK_TOKEN_ADDRESS, - }; - - const result = action.argsSchema.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = action.argsSchema.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); - - it("should fail with invalid vault address", () => { - const invalidInput = { - vaultAddress: "not_an_address", - assets: MOCK_WHOLE_ASSETS, - receiver: MOCK_RECEIVER_ID, - tokenAddress: MOCK_TOKEN_ADDRESS, - }; - const result = action.argsSchema.safeParse(invalidInput); - - expect(result.success).toBe(false); - }); - - it("should handle valid asset string formats", () => { - const validInput = { - vaultAddress: MOCK_VAULT_ADDRESS, - assets: MOCK_WHOLE_ASSETS, - receiver: MOCK_RECEIVER_ID, - tokenAddress: MOCK_TOKEN_ADDRESS, - }; - - const validInputs = [ - { ...validInput, assets: "1000000000000000000" }, - { ...validInput, assets: "1.5" }, - { ...validInput, assets: "0.00001" }, - ]; - - validInputs.forEach(input => { - const result = action.argsSchema.safeParse(input); - expect(result.success).toBe(true); - }); - }); - - it("should reject invalid asset strings", () => { - const validInput = { - vaultAddress: MOCK_VAULT_ADDRESS, - assets: MOCK_WHOLE_ASSETS, - receiver: MOCK_RECEIVER_ID, - tokenAddress: MOCK_TOKEN_ADDRESS, - }; - - const invalidInputs = [ - { ...validInput, assets: "" }, - { ...validInput, assets: "1,000" }, - { ...validInput, assets: "1.2.3" }, - { ...validInput, assets: "abc" }, - ]; - - invalidInputs.forEach(input => { - const result = action.argsSchema.safeParse(input); - expect(result.success).toBe(false); - }); - }); -}); - -describe("Morpho Deposit Action", () => { - const NETWORK_ID = Coinbase.networks.BaseSepolia; - const TRANSACTION_HASH = "0xabcdef1234567890"; - const TRANSACTION_LINK = `https://etherscan.io/tx/${TRANSACTION_HASH}`; - - const action = new MorphoDepositAction(); - - let mockContractInvocation: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockContractInvocation = { - wait: jest.fn().mockResolvedValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), - }), - } as unknown as jest.Mocked; - - mockWallet = { - invokeContract: jest.fn(), - getDefaultAddress: jest.fn().mockResolvedValue({ - getId: jest.fn().mockReturnValue(MOCK_RECEIVER_ID), - }), - getNetworkId: jest.fn().mockReturnValue(NETWORK_ID), - } as unknown as jest.Mocked; - - mockWallet.invokeContract.mockResolvedValue(mockContractInvocation); - - jest.spyOn(Asset, "fetch").mockResolvedValue({ - toAtomicAmount: jest.fn().mockReturnValue(BigInt(MOCK_ATOMIC_ASSETS)), - } as unknown as Asset); - - mockApprove.mockResolvedValue("Approval successful"); - }); - - it("should successfully deposit to Morpho vault", async () => { - const args = { - vaultAddress: MOCK_VAULT_ADDRESS, - assets: MOCK_WHOLE_ASSETS, - receiver: MOCK_RECEIVER_ID, - tokenAddress: MOCK_TOKEN_ADDRESS, - }; - - const atomicAssets = BigInt(MOCK_ATOMIC_ASSETS); - const response = await action.func(mockWallet, args); - - expect(mockApprove).toHaveBeenCalledWith( - mockWallet, - MOCK_TOKEN_ADDRESS, - MOCK_VAULT_ADDRESS, - atomicAssets, - ); - - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: MOCK_VAULT_ADDRESS, - method: "deposit", - abi: METAMORPHO_ABI, - args: { - assets: MOCK_ATOMIC_ASSETS, - receiver: MOCK_RECEIVER_ID, - }, - }); - - expect(mockContractInvocation.wait).toHaveBeenCalled(); - expect(response).toContain(`Deposited ${MOCK_WHOLE_ASSETS}`); - expect(response).toContain(`to Morpho Vault ${MOCK_VAULT_ADDRESS}`); - expect(response).toContain(`with transaction hash: ${TRANSACTION_HASH}`); - expect(response).toContain(`and transaction link: ${TRANSACTION_LINK}`); - }); - - it("should handle approval failure", async () => { - const args = { - vaultAddress: MOCK_VAULT_ADDRESS, - assets: MOCK_WHOLE_ASSETS, - receiver: MOCK_RECEIVER_ID, - tokenAddress: MOCK_TOKEN_ADDRESS, - }; - - mockApprove.mockResolvedValue("Error: Approval failed"); - - const response = await action.func(mockWallet, args); - - expect(mockApprove).toHaveBeenCalled(); - expect(response).toContain("Error approving Morpho Vault as spender: Error: Approval failed"); - expect(mockWallet.invokeContract).not.toHaveBeenCalled(); - }); - - it("should handle deposit errors", async () => { - const args = { - vaultAddress: MOCK_VAULT_ADDRESS, - assets: MOCK_WHOLE_ASSETS, - receiver: MOCK_RECEIVER_ID, - tokenAddress: MOCK_TOKEN_ADDRESS, - }; - - const error = new Error("Failed to deposit to Morpho vault"); - mockWallet.invokeContract.mockRejectedValue(error); - - const response = await action.func(mockWallet, args); - - expect(mockApprove).toHaveBeenCalled(); - expect(mockWallet.invokeContract).toHaveBeenCalled(); - expect(response).toContain(`Error depositing to Morpho Vault: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/defi_morpho_withdraw_test.ts b/cdp-agentkit-core/typescript/src/tests/defi_morpho_withdraw_test.ts deleted file mode 100644 index a9ad7d7ab..000000000 --- a/cdp-agentkit-core/typescript/src/tests/defi_morpho_withdraw_test.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { Coinbase, ContractInvocation, Wallet } from "@coinbase/coinbase-sdk"; -import { MorphoWithdrawAction } from "../actions/cdp/defi/morpho/withdraw"; -import { METAMORPHO_ABI } from "../actions/cdp/defi/morpho/constants"; - -const MOCK_VAULT_ADDRESS = "0x1234567890123456789012345678901234567890"; -const MOCK_ASSETS = "1000000000000000000"; // 1 token in wei -const MOCK_RECEIVER_ID = "0x9876543210987654321098765432109876543210"; - -describe("Morpho Withdraw Input", () => { - const action = new MorphoWithdrawAction(); - - it("should successfully parse valid input", () => { - const validInput = { - vaultAddress: MOCK_VAULT_ADDRESS, - assets: MOCK_ASSETS, - receiver: MOCK_RECEIVER_ID, - }; - - const result = action.argsSchema.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = action.argsSchema.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); - - it("should fail with invalid Vault address", () => { - const invalidInput = { - vaultAddress: "not_an_address", - assets: MOCK_ASSETS, - receiver: MOCK_RECEIVER_ID, - }; - const result = action.argsSchema.safeParse(invalidInput); - - expect(result.success).toBe(false); - if (!result.success) { - expect(result.error.issues[0].path[0]).toBe("vaultAddress"); - } - }); - - it("should handle valid asset string formats", () => { - const validInput = { - vaultAddress: MOCK_VAULT_ADDRESS, - assets: MOCK_ASSETS, - receiver: MOCK_RECEIVER_ID, - }; - - const validInputs = [{ ...validInput, assets: "1000000000000000000" }]; - - validInputs.forEach(input => { - const result = action.argsSchema.safeParse(input); - expect(result.success).toBe(true); - }); - }); - - it("should reject invalid asset strings", () => { - const validInput = { - vaultAddress: MOCK_VAULT_ADDRESS, - assets: MOCK_ASSETS, - receiver: MOCK_RECEIVER_ID, - }; - - const invalidInputs = [ - { ...validInput, assets: "" }, - { ...validInput, assets: "1,000" }, - { ...validInput, assets: "1.2.3" }, - { ...validInput, assets: "abc" }, - ]; - - invalidInputs.forEach(input => { - const result = action.argsSchema.safeParse(input); - expect(result.success).toBe(false); - }); - }); -}); - -describe("Morpho Withdraw Action", () => { - const NETWORK_ID = Coinbase.networks.BaseSepolia; - const TRANSACTION_HASH = "0xabcdef1234567890"; - const TRANSACTION_LINK = `https://etherscan.io/tx/${TRANSACTION_HASH}`; - - const action = new MorphoWithdrawAction(); - - let mockContractInvocation: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockContractInvocation = { - wait: jest.fn().mockResolvedValue({ - getTransaction: jest.fn().mockReturnValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), - }), - }), - } as unknown as jest.Mocked; - - mockWallet = { - invokeContract: jest.fn(), - getDefaultAddress: jest.fn().mockResolvedValue({ - getId: jest.fn().mockReturnValue(MOCK_RECEIVER_ID), - }), - getNetworkId: jest.fn().mockReturnValue(NETWORK_ID), - } as unknown as jest.Mocked; - - mockWallet.invokeContract.mockResolvedValue(mockContractInvocation); - }); - - it("should successfully withdraw from Morpho Vault", async () => { - const args = { - vaultAddress: MOCK_VAULT_ADDRESS, - assets: MOCK_ASSETS, - receiver: MOCK_RECEIVER_ID, - }; - - const response = await action.func(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: MOCK_VAULT_ADDRESS, - method: "withdraw", - abi: METAMORPHO_ABI, - args: { - assets: MOCK_ASSETS, - receiver: MOCK_RECEIVER_ID, - owner: MOCK_RECEIVER_ID, - }, - }); - expect(mockContractInvocation.wait).toHaveBeenCalled(); - expect(response).toContain(`Withdrawn ${MOCK_ASSETS}`); - expect(response).toContain(`from Morpho Vault ${MOCK_VAULT_ADDRESS}`); - expect(response).toContain(`with transaction hash: ${TRANSACTION_HASH}`); - expect(response).toContain(`and transaction link: ${TRANSACTION_LINK}`); - }); - - it("should handle errors when withdrawing", async () => { - const args = { - vaultAddress: MOCK_VAULT_ADDRESS, - assets: MOCK_ASSETS, - receiver: MOCK_RECEIVER_ID, - }; - - const error = new Error("API Error"); - mockWallet.invokeContract.mockRejectedValue(error); - - const response = await action.func(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalled(); - expect(response).toContain(`Error withdrawing from Morpho Vault: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/defi_wow_buy_token_test.ts b/cdp-agentkit-core/typescript/src/tests/defi_wow_buy_token_test.ts deleted file mode 100644 index 9b6b198dc..000000000 --- a/cdp-agentkit-core/typescript/src/tests/defi_wow_buy_token_test.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { Coinbase, ContractInvocation, Wallet } from "@coinbase/coinbase-sdk"; - -import { WOW_ABI } from "../actions/cdp/defi/wow/constants"; -import { wowBuyToken, WowBuyTokenInput } from "../actions/cdp/defi/wow/actions/buy_token"; -import { getBuyQuote } from "../actions/cdp/defi/wow/utils"; -import { getHasGraduated } from "../actions/cdp/defi/wow/uniswap/utils"; - -jest.mock("../actions/cdp/defi/wow/utils", () => ({ - getBuyQuote: jest.fn(), -})); - -jest.mock("../actions/cdp/defi/wow/uniswap/utils", () => ({ - getHasGraduated: jest.fn(), -})); - -const MOCK_CONTRACT_ADDRESS = "0xabcdef123456789"; -const MOCK_AMOUNT_ETH_IN_WEI = "100000000000000000"; - -describe("Wow Buy Token Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - contractAddress: MOCK_CONTRACT_ADDRESS, - amountEthInWei: MOCK_AMOUNT_ETH_IN_WEI, - }; - - const result = WowBuyTokenInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = WowBuyTokenInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Wow Buy Token Action", () => { - const NETWORK_ID = Coinbase.networks.BaseSepolia; - const TRANSACTION_HASH = "0xghijkl987654321"; - - let mockContractInvocation: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockWallet = { - invokeContract: jest.fn(), - getDefaultAddress: jest.fn().mockResolvedValue({ - getId: jest.fn().mockReturnValue(TRANSACTION_HASH), - }), - getNetworkId: jest.fn().mockReturnValue(NETWORK_ID), - } as unknown as jest.Mocked; - - mockContractInvocation = { - wait: jest.fn().mockResolvedValue({ - getTransaction: jest.fn().mockReturnValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - }), - }), - } as unknown as jest.Mocked; - - mockWallet.invokeContract.mockResolvedValue(mockContractInvocation); - }); - - it("should successfully buy a token", async () => { - const args = { - contractAddress: MOCK_CONTRACT_ADDRESS, - amountEthInWei: MOCK_AMOUNT_ETH_IN_WEI, - }; - - (getHasGraduated as jest.Mock).mockResolvedValue(true); - (getBuyQuote as jest.Mock).mockResolvedValue(1.0); - - const response = await wowBuyToken(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: MOCK_CONTRACT_ADDRESS, - method: "buy", - abi: WOW_ABI, - args: { - recipient: expect.any(String), - refundRecipient: expect.any(String), - orderReferrer: "0x0000000000000000000000000000000000000000", - expectedMarketType: "1", - minOrderSize: expect.any(String), - sqrtPriceLimitX96: "0", - comment: "", - }, - amount: BigInt(args.amountEthInWei), - assetId: "wei", - }); - expect(getBuyQuote).toHaveBeenCalled(); - expect(getHasGraduated).toHaveBeenCalled(); - expect(response).toContain( - `Purchased WoW ERC20 memecoin with transaction hash: ${TRANSACTION_HASH}`, - ); - }); - - it("should handle errors when buying a token", async () => { - const args = { - contractAddress: MOCK_CONTRACT_ADDRESS, - amountEthInWei: MOCK_AMOUNT_ETH_IN_WEI, - }; - - const error = new Error("An error has occurred"); - mockWallet.invokeContract.mockRejectedValue(error); - (getHasGraduated as jest.Mock).mockResolvedValue(true); - - const response = await wowBuyToken(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalled(); - expect(response).toContain(`Error buying Zora Wow ERC20 memecoin: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/defi_wow_create_token_test.ts b/cdp-agentkit-core/typescript/src/tests/defi_wow_create_token_test.ts deleted file mode 100644 index 3b2a82b52..000000000 --- a/cdp-agentkit-core/typescript/src/tests/defi_wow_create_token_test.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { Coinbase, ContractInvocation, Wallet } from "@coinbase/coinbase-sdk"; - -import { - getFactoryAddress, - GENERIC_TOKEN_METADATA_URI, - WOW_FACTORY_ABI, -} from "../actions/cdp/defi/wow/constants"; -import { wowCreateToken, WowCreateTokenInput } from "../actions/cdp/defi/wow/actions/create_token"; - -jest.mock("../actions/cdp/defi/wow/constants", () => ({ - getFactoryAddress: jest.fn(), -})); - -const MOCK_NAME = "Test Token"; -const MOCK_SYMBOL = "TEST"; -const MOCK_URI = "ipfs://QmY1GqprFYvojCcUEKgqHeDj9uhZD9jmYGrQTfA9vAE78J"; - -describe("Wow Create Token Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - name: MOCK_NAME, - symbol: MOCK_SYMBOL, - tokenUri: MOCK_URI, - }; - - const result = WowCreateTokenInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should successfully parse input without tokenUri", () => { - const validInput = { - name: MOCK_NAME, - symbol: MOCK_SYMBOL, - }; - - const result = WowCreateTokenInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail with missing required fields", () => { - const invalidInput = { - symbol: MOCK_SYMBOL, - }; - const result = WowCreateTokenInput.safeParse(invalidInput); - - expect(result.success).toBe(false); - }); - - it("should fail with invalid tokenUri", () => { - const invalidInput = { - name: MOCK_NAME, - symbol: MOCK_SYMBOL, - tokenUri: 12345, - }; - const result = WowCreateTokenInput.safeParse(invalidInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Wow Create Token Action", () => { - const CONTRACT_ADDRESS = "0xabcdef123456789"; - const NETWORK_ID = Coinbase.networks.BaseSepolia; - const TRANSACTION_HASH = "0xghijkl987654321"; - const WALLET_ID = "0x123456789abcdef"; - - let mockContractInvocation: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockWallet = { - invokeContract: jest.fn(), - getDefaultAddress: jest.fn().mockResolvedValue({ - getId: jest.fn().mockReturnValue(WALLET_ID), - }), - getNetworkId: jest.fn().mockReturnValue(NETWORK_ID), - } as unknown as jest.Mocked; - - mockContractInvocation = { - wait: jest.fn().mockResolvedValue({ - getTransaction: jest.fn().mockReturnValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - }), - }), - } as unknown as jest.Mocked; - - mockWallet.invokeContract.mockResolvedValue(mockContractInvocation); - }); - - it("should successfully create a token", async () => { - const args = { - name: MOCK_NAME, - symbol: MOCK_SYMBOL, - tokenUri: MOCK_URI, - }; - - (getFactoryAddress as jest.Mock).mockReturnValue(CONTRACT_ADDRESS); - - const response = await wowCreateToken(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: CONTRACT_ADDRESS, - method: "deploy", - abi: WOW_FACTORY_ABI, - args: { - _tokenCreator: WALLET_ID, - _platformReferrer: "0x0000000000000000000000000000000000000000", - _tokenURI: args.tokenUri || GENERIC_TOKEN_METADATA_URI, - _name: args.name, - _symbol: args.symbol, - }, - }); - expect(mockContractInvocation.wait).toHaveBeenCalled(); - expect(response).toContain(`Created WoW ERC20 memecoin ${MOCK_NAME}`); - expect(response).toContain(`with symbol ${MOCK_SYMBOL}`); - expect(response).toContain(`on network ${NETWORK_ID}`); - expect(response).toContain(`Transaction hash for the token creation: ${TRANSACTION_HASH}`); - }); - - it("should handle errors when creating a token", async () => { - const args = { - name: MOCK_NAME, - symbol: MOCK_SYMBOL, - tokenUri: MOCK_URI, - }; - - const error = new Error("An error has occurred"); - mockWallet.invokeContract.mockRejectedValue(error); - - const response = await wowCreateToken(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalled(); - expect(response).toContain(`Error creating Zora Wow ERC20 memecoin: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/defi_wow_sell_token_test.ts b/cdp-agentkit-core/typescript/src/tests/defi_wow_sell_token_test.ts deleted file mode 100644 index e918ec7e6..000000000 --- a/cdp-agentkit-core/typescript/src/tests/defi_wow_sell_token_test.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { Coinbase, ContractInvocation, Wallet } from "@coinbase/coinbase-sdk"; - -import { WOW_ABI } from "../actions/cdp/defi/wow/constants"; -import { wowSellToken, WowSellTokenInput } from "../actions/cdp/defi/wow/actions/sell_token"; -import { getSellQuote } from "../actions/cdp/defi/wow/utils"; -import { getHasGraduated } from "../actions/cdp/defi/wow/uniswap/utils"; - -jest.mock("../actions/cdp/defi/wow/utils", () => ({ - getSellQuote: jest.fn(), -})); - -jest.mock("../actions/cdp/defi/wow/uniswap/utils", () => ({ - getHasGraduated: jest.fn(), -})); - -const MOCK_CONTRACT_ADDRESS = "0x036cbd53842c5426634e7929541ec2318f3dcf7e"; -const MOCK_AMOUNT_TOKENS_IN_WEI = "1000000000000000000"; - -describe("Wow Sell Token Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - contractAddress: MOCK_CONTRACT_ADDRESS, - amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI, - }; - - const result = WowSellTokenInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail with missing amountTokensInWei", () => { - const invalidInput = { - contractAddress: MOCK_CONTRACT_ADDRESS, - }; - const result = WowSellTokenInput.safeParse(invalidInput); - - expect(result.success).toBe(false); - }); - - it("does not fail with invalid contract address", () => { - const invalidInput = { - contractAddress: MOCK_CONTRACT_ADDRESS, - amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI, - }; - const result = WowSellTokenInput.safeParse(invalidInput); - - expect(result.success).toBe(true); - }); - - it("does not fail with non-numeric amountTokensInWei", () => { - const invalidInput = { - contractAddress: MOCK_CONTRACT_ADDRESS, - amountTokensInWei: "not_a_number", - }; - const result = WowSellTokenInput.safeParse(invalidInput); - - expect(result.success).toBe(true); - }); -}); - -describe("Wow Sell Token Action", () => { - const ADDRESS_ID = "0xabcdef123456789"; - const NETWORK_ID = Coinbase.networks.BaseSepolia; - const TRANSACTION_HASH = "0xghijkl987654321"; - - let mockContractInvocation: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockWallet = { - invokeContract: jest.fn(), - getNetworkId: jest.fn().mockReturnValue(NETWORK_ID), - getDefaultAddress: jest.fn().mockResolvedValue({ - getId: jest.fn().mockReturnValue(ADDRESS_ID), - }), - } as unknown as jest.Mocked; - - mockContractInvocation = { - wait: jest.fn().mockResolvedValue({ - getTransaction: jest.fn().mockReturnValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - }), - }), - } as unknown as jest.Mocked; - - mockWallet.invokeContract.mockResolvedValue(mockContractInvocation); - }); - - it("should successfully sell tokens", async () => { - const args = { - contractAddress: MOCK_CONTRACT_ADDRESS, - amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI, - }; - - (getHasGraduated as jest.Mock).mockResolvedValue(true); - (getSellQuote as jest.Mock).mockResolvedValue(1.0); - - const response = await wowSellToken(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: MOCK_CONTRACT_ADDRESS, - method: "sell", - abi: WOW_ABI, - args: { - tokensToSell: MOCK_AMOUNT_TOKENS_IN_WEI, - recipient: expect.any(String), - orderReferrer: "0x0000000000000000000000000000000000000000", - comment: "", - expectedMarketType: "1", - minPayoutSize: expect.any(String), - sqrtPriceLimitX96: "0", - }, - }); - expect(getSellQuote).toHaveBeenCalled(); - expect(getHasGraduated).toHaveBeenCalled(); - expect(response).toContain( - `Sold WoW ERC20 memecoin with transaction hash: ${TRANSACTION_HASH}`, - ); - }); - - it("should handle errors when selling tokens", async () => { - const args = { - contractAddress: MOCK_CONTRACT_ADDRESS, - amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI, - }; - - const error = new Error("An error has occurred"); - mockWallet.invokeContract.mockRejectedValue(error); - (getHasGraduated as jest.Mock).mockResolvedValue(true); - - const response = await wowSellToken(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalled(); - expect(response).toContain(`Error selling Zora Wow ERC20 memecoin: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/deploy_contract_test.ts b/cdp-agentkit-core/typescript/src/tests/deploy_contract_test.ts deleted file mode 100644 index 901970c01..000000000 --- a/cdp-agentkit-core/typescript/src/tests/deploy_contract_test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { SmartContract, Wallet } from "@coinbase/coinbase-sdk"; - -import { deployContract, DeployContractInput } from "../actions/cdp/deploy_contract"; - -const MOCK_CONTRACT_NAME = "Test Contract"; -const MOCK_SOLIDITY_VERSION = "0.8.0"; -const MOCK_SOLIDITY_INPUT_JSON = "{}"; -const MOCK_CONSTRUCTOR_ARGS = { arg1: "value1", arg2: "value2" }; - -describe("Deploy Contract Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - solidityVersion: MOCK_SOLIDITY_VERSION, - solidityInputJson: MOCK_SOLIDITY_INPUT_JSON, - contractName: MOCK_CONTRACT_NAME, - constructorArgs: MOCK_CONSTRUCTOR_ARGS, - }; - - const result = DeployContractInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = DeployContractInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Deploy Contract Action", () => { - const CONTRACT_ADDRESS = "0x123456789abcdef"; - const TRANSACTION_HASH = "0xghijkl987654321"; - const TRANSACTION_LINK = `https://etherscan.io/tx/${TRANSACTION_HASH}`; - - let mockSmartContract: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockSmartContract = { - wait: jest.fn().mockResolvedValue({ - getContractAddress: jest.fn().mockReturnValue(CONTRACT_ADDRESS), - getTransaction: jest.fn().mockReturnValue({ - getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), - }), - }), - } as unknown as jest.Mocked; - - mockWallet = { - deployContract: jest.fn(), - } as unknown as jest.Mocked; - - mockWallet.deployContract.mockResolvedValue(mockSmartContract); - }); - - it("should successfully respond", async () => { - const args = { - solidityVersion: MOCK_SOLIDITY_VERSION, - solidityInputJson: MOCK_SOLIDITY_INPUT_JSON, - contractName: MOCK_CONTRACT_NAME, - constructorArgs: MOCK_CONSTRUCTOR_ARGS, - }; - - const response = await deployContract(mockWallet, args); - - expect(mockWallet.deployContract).toHaveBeenCalledWith({ - solidityVersion: "0.8.0+commit.c7dfd78e", - solidityInputJson: MOCK_SOLIDITY_INPUT_JSON, - contractName: MOCK_CONTRACT_NAME, - constructorArgs: MOCK_CONSTRUCTOR_ARGS, - }); - expect(mockSmartContract.wait).toHaveBeenCalled(); - expect(response).toContain( - `Deployed contract ${MOCK_CONTRACT_NAME} at address ${CONTRACT_ADDRESS}`, - ); - expect(response).toContain(`Transaction link: ${TRANSACTION_LINK}`); - }); - - it("should fail with an error", async () => { - const args = { - solidityVersion: MOCK_SOLIDITY_VERSION, - solidityInputJson: MOCK_SOLIDITY_INPUT_JSON, - contractName: MOCK_CONTRACT_NAME, - constructorArgs: MOCK_CONSTRUCTOR_ARGS, - }; - - const error = new Error("An error has occurred"); - mockWallet.deployContract.mockRejectedValue(error); - - const response = await deployContract(mockWallet, args); - - expect(mockWallet.deployContract).toHaveBeenCalledWith({ - solidityVersion: "0.8.0+commit.c7dfd78e", - solidityInputJson: MOCK_SOLIDITY_INPUT_JSON, - contractName: MOCK_CONTRACT_NAME, - constructorArgs: MOCK_CONSTRUCTOR_ARGS, - }); - expect(response).toContain(`Error deploying contract: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/deploy_nft_test.ts b/cdp-agentkit-core/typescript/src/tests/deploy_nft_test.ts deleted file mode 100644 index 480d36f89..000000000 --- a/cdp-agentkit-core/typescript/src/tests/deploy_nft_test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Coinbase, SmartContract, Wallet } from "@coinbase/coinbase-sdk"; - -import { deployNft, DeployNftInput } from "../actions/cdp/deploy_nft"; - -const MOCK_NFT_BASE_URI = "https://www.test.xyz/metadata/"; -const MOCK_NFT_NAME = "Test Token"; -const MOCK_NFT_SYMBOL = "TEST"; - -describe("Deploy NFT Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - baseURI: MOCK_NFT_BASE_URI, - name: MOCK_NFT_NAME, - symbol: MOCK_NFT_SYMBOL, - }; - - const result = DeployNftInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("sould fail parsing empty input", () => { - const emptyInput = {}; - const result = DeployNftInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Deploy NFT Action", () => { - const CONTRACT_ADDRESS = "0x123456789abcdef"; - const NETWORK_ID = Coinbase.networks.BaseSepolia; - const TRANSACTION_HASH = "0xghijkl987654321"; - const TRANSACTION_LINK = `https://etherscan.io/tx/${TRANSACTION_HASH}`; - - let mockSmartContract: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockSmartContract = { - wait: jest.fn().mockResolvedValue({ - getContractAddress: jest.fn().mockReturnValue(CONTRACT_ADDRESS), - getTransaction: jest.fn().mockReturnValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), - }), - }), - } as unknown as jest.Mocked; - - mockWallet = { - deployNFT: jest.fn(), - getNetworkId: jest.fn().mockReturnValue(NETWORK_ID), - } as unknown as jest.Mocked; - - mockWallet.deployNFT.mockResolvedValue(mockSmartContract); - }); - - it("should successfully respond", async () => { - const args = { - name: MOCK_NFT_NAME, - symbol: MOCK_NFT_SYMBOL, - baseURI: MOCK_NFT_BASE_URI, - }; - - const response = await deployNft(mockWallet, args); - - expect(mockWallet.deployNFT).toHaveBeenCalledWith(args); - expect(mockSmartContract.wait).toHaveBeenCalled(); - expect(response).toContain(`Deployed NFT Collection ${MOCK_NFT_NAME}`); - expect(response).toContain(`to address ${CONTRACT_ADDRESS}`); - expect(response).toContain(`on network ${NETWORK_ID}`); - expect(response).toContain(`Transaction hash for the deployment: ${TRANSACTION_HASH}`); - expect(response).toContain(`Transaction link for the deployment: ${TRANSACTION_LINK}`); - }); - - it("should fail with an error", async () => { - const args = { - baseURI: MOCK_NFT_BASE_URI, - name: MOCK_NFT_NAME, - symbol: MOCK_NFT_SYMBOL, - }; - - const error = new Error("An error has occurred"); - mockWallet.deployNFT.mockRejectedValue(error); - - const response = await deployNft(mockWallet, args); - - expect(mockWallet.deployNFT).toHaveBeenCalledWith(args); - expect(response).toContain(`Error deploying NFT: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/deploy_token_test.ts b/cdp-agentkit-core/typescript/src/tests/deploy_token_test.ts deleted file mode 100644 index e0dc150e8..000000000 --- a/cdp-agentkit-core/typescript/src/tests/deploy_token_test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { SmartContract, Wallet } from "@coinbase/coinbase-sdk"; - -import { deployToken, DeployTokenInput } from "../actions/cdp/deploy_token"; - -const MOCK_TOKEN_NAME = "Test Token"; -const MOCK_TOKEN_SYMBOL = "TEST"; -const MOCK_TOKEN_SUPPLY = 100; - -describe("Deploy Token Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - name: MOCK_TOKEN_NAME, - symbol: MOCK_TOKEN_SYMBOL, - totalSupply: MOCK_TOKEN_SUPPLY, - }; - - const result = DeployTokenInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = DeployTokenInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Deploy Token Action", () => { - const CONTRACT_ADDRESS = "0x123456789abcdef"; - const TRANSACTION_HASH = "0xghijkl987654321"; - const TRANSACTION_LINK = `https://etherscan.io/tx/${TRANSACTION_HASH}`; - - let mockSmartContract: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockSmartContract = { - wait: jest.fn().mockResolvedValue({ - getContractAddress: jest.fn().mockReturnValue(CONTRACT_ADDRESS), - getTransaction: jest.fn().mockReturnValue({ - getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), - }), - }), - } as unknown as jest.Mocked; - - mockWallet = { - deployToken: jest.fn(), - } as unknown as jest.Mocked; - - mockWallet.deployToken.mockResolvedValue(mockSmartContract); - }); - - it("should successfully respond", async () => { - const args = { - name: MOCK_TOKEN_NAME, - symbol: MOCK_TOKEN_SYMBOL, - totalSupply: MOCK_TOKEN_SUPPLY, - }; - - const response = await deployToken(mockWallet, args); - - expect(mockWallet.deployToken).toHaveBeenCalledWith(args); - expect(mockSmartContract.wait).toHaveBeenCalled(); - expect(response).toContain( - `Deployed ERC20 token contract ${MOCK_TOKEN_NAME} (${MOCK_TOKEN_SYMBOL})`, - ); - expect(response).toContain(`with total supply of ${MOCK_TOKEN_SUPPLY}`); - expect(response).toContain(`tokens at address ${CONTRACT_ADDRESS}`); - expect(response).toContain(`Transaction link: ${TRANSACTION_LINK}`); - }); - - it("should fail with an error", async () => { - const args = { - name: MOCK_TOKEN_NAME, - symbol: MOCK_TOKEN_SYMBOL, - totalSupply: MOCK_TOKEN_SUPPLY, - }; - - const error = new Error("An error has occurred"); - mockWallet.deployToken.mockRejectedValue(error); - - const response = await deployToken(mockWallet, args); - - expect(mockWallet.deployToken).toHaveBeenCalledWith(args); - expect(response).toContain(`Error deploying token: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/get_balance_nft_test.ts b/cdp-agentkit-core/typescript/src/tests/get_balance_nft_test.ts deleted file mode 100644 index 29412050f..000000000 --- a/cdp-agentkit-core/typescript/src/tests/get_balance_nft_test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { GetBalanceNftInput, getBalanceNft } from "../actions/cdp/get_balance_nft"; -import { Wallet } from "@coinbase/coinbase-sdk"; -import { readContract } from "@coinbase/coinbase-sdk"; - -const MOCK_CONTRACT_ADDRESS = "0xvalidContractAddress"; -const MOCK_ADDRESS = "0xvalidAddress"; -const MOCK_TOKEN_IDS = ["1", "2", "3"]; - -jest.mock("@coinbase/coinbase-sdk", () => ({ - ...jest.requireActual("@coinbase/coinbase-sdk"), - readContract: jest.fn(), -})); - -describe("GetBalanceNft", () => { - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockWallet = { - getDefaultAddress: jest.fn().mockResolvedValue({ getId: () => MOCK_ADDRESS }), - getNetworkId: jest.fn().mockReturnValue("base-sepolia"), - } as unknown as jest.Mocked; - - (readContract as jest.Mock).mockClear(); - }); - - it("should validate input schema with all parameters", () => { - const input = { - contractAddress: MOCK_CONTRACT_ADDRESS, - address: MOCK_ADDRESS, - }; - - const result = GetBalanceNftInput.safeParse(input); - expect(result.success).toBe(true); - }); - - it("should validate input schema with required parameters only", () => { - const input = { - contractAddress: MOCK_CONTRACT_ADDRESS, - }; - - const result = GetBalanceNftInput.safeParse(input); - expect(result.success).toBe(true); - }); - - it("should fail validation with missing required parameters", () => { - const input = {}; - - const result = GetBalanceNftInput.safeParse(input); - expect(result.success).toBe(false); - }); - - it("should successfully get NFT balance using default address", async () => { - (readContract as jest.Mock).mockResolvedValueOnce(MOCK_TOKEN_IDS); - - const input = { - contractAddress: MOCK_CONTRACT_ADDRESS, - }; - - const response = await getBalanceNft(mockWallet, input); - - expect(mockWallet.getDefaultAddress).toHaveBeenCalled(); - expect(readContract).toHaveBeenCalledWith({ - contractAddress: MOCK_CONTRACT_ADDRESS, - networkId: "base-sepolia", - method: "tokensOfOwner", - args: { owner: MOCK_ADDRESS }, - }); - - expect(response).toBe( - `Address ${MOCK_ADDRESS} owns ${MOCK_TOKEN_IDS.length} NFTs in contract ${MOCK_CONTRACT_ADDRESS}.\n` + - `Token IDs: ${MOCK_TOKEN_IDS.join(", ")}`, - ); - }); - - it("should handle case when no tokens are owned", async () => { - (readContract as jest.Mock).mockResolvedValueOnce([]); - - const input = { - contractAddress: MOCK_CONTRACT_ADDRESS, - address: MOCK_ADDRESS, - }; - - const response = await getBalanceNft(mockWallet, input); - - expect(response).toBe( - `Address ${MOCK_ADDRESS} owns no NFTs in contract ${MOCK_CONTRACT_ADDRESS}`, - ); - }); - - it("should get NFT balance with specific address", async () => { - const customAddress = "0xcustomAddress"; - (readContract as jest.Mock).mockResolvedValueOnce(MOCK_TOKEN_IDS); - - const input = { - contractAddress: MOCK_CONTRACT_ADDRESS, - address: customAddress, - }; - - const response = await getBalanceNft(mockWallet, input); - - expect(readContract).toHaveBeenCalledWith({ - contractAddress: MOCK_CONTRACT_ADDRESS, - networkId: "base-sepolia", - method: "tokensOfOwner", - args: { owner: customAddress }, - }); - - expect(response).toBe( - `Address ${customAddress} owns ${MOCK_TOKEN_IDS.length} NFTs in contract ${MOCK_CONTRACT_ADDRESS}.\n` + - `Token IDs: ${MOCK_TOKEN_IDS.join(", ")}`, - ); - }); - - it("should handle API errors gracefully", async () => { - const errorMessage = "API error"; - (readContract as jest.Mock).mockRejectedValueOnce(new Error(errorMessage)); - - const input = { - contractAddress: MOCK_CONTRACT_ADDRESS, - address: MOCK_ADDRESS, - }; - - const response = await getBalanceNft(mockWallet, input); - - expect(response).toBe( - `Error getting NFT balance for address ${MOCK_ADDRESS} in contract ${MOCK_CONTRACT_ADDRESS}: Error: ${errorMessage}`, - ); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/get_balance_test.ts b/cdp-agentkit-core/typescript/src/tests/get_balance_test.ts deleted file mode 100644 index 2ff39553b..000000000 --- a/cdp-agentkit-core/typescript/src/tests/get_balance_test.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Wallet, WalletAddress } from "@coinbase/coinbase-sdk"; -import { getBalance, GetBalanceInput } from "../actions/cdp/get_balance"; - -const MOCK_ASSET_ID = "test-asset-id"; -const MOCK_BALANCE = 1000000000000000000; - -describe("Get Balance Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - assetId: MOCK_ASSET_ID, - }; - - const result = GetBalanceInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = GetBalanceInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Get Balance Action", () => { - const WALLET_ID = "0x123456789abcdef"; - - let mockAddresses: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockAddresses = [ - { - getId: jest.fn().mockReturnValue("test-address-id-1"), - getBalance: jest.fn().mockReturnValue(MOCK_BALANCE), - } as unknown as jest.Mocked, - { - getId: jest.fn().mockReturnValue("test-address-id-2"), - getBalance: jest.fn().mockReturnValue(0.0), - } as unknown as jest.Mocked, - { - getId: jest.fn().mockReturnValue("test-address-id-3"), - getBalance: jest.fn().mockReturnValue(MOCK_BALANCE), - } as unknown as jest.Mocked, - ] as unknown as jest.Mocked[]; - - mockWallet = { - getId: jest.fn().mockReturnValue(WALLET_ID), - listAddresses: jest.fn(), - } as unknown as jest.Mocked; - - mockWallet.listAddresses.mockResolvedValue(mockAddresses); - }); - - it("should successfully respond", async () => { - const args = { - assetId: MOCK_ASSET_ID, - }; - - const response = await getBalance(mockWallet, args); - - expect(mockWallet.listAddresses).toHaveBeenCalledWith(); - mockAddresses.forEach(address => { - expect(address.getBalance).toHaveBeenCalledWith(MOCK_ASSET_ID); - expect(response).toContain(`${address.getId()}: ${address.getBalance(MOCK_ASSET_ID)}`); - }); - expect(response).toContain(`Balances for wallet ${WALLET_ID}`); - }); - - it("should fail with an error", async () => { - const args = { - assetId: MOCK_ASSET_ID, - }; - - const error = new Error("An error has occurred"); - mockWallet.listAddresses.mockRejectedValue(error); - - const response = await getBalance(mockWallet, args); - - expect(mockWallet.listAddresses).toHaveBeenCalled(); - expect(response).toContain(`Error getting balance for all addresses in the wallet: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/get_wallet_details_test.ts b/cdp-agentkit-core/typescript/src/tests/get_wallet_details_test.ts deleted file mode 100644 index d6b096612..000000000 --- a/cdp-agentkit-core/typescript/src/tests/get_wallet_details_test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Coinbase, Wallet, WalletAddress } from "@coinbase/coinbase-sdk"; - -import { getWalletDetails, GetWalletDetailsInput } from "../actions/cdp/get_wallet_details"; - -describe("Wallet Details Input", () => { - it("should successfully parse empty input", () => { - const emptyInput = {}; - const result = GetWalletDetailsInput.safeParse(emptyInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(emptyInput); - }); -}); - -describe("Wallet Details Action", () => { - const ADDRESS_ID = "0xabcdef123456789"; - const NETWORK_ID = Coinbase.networks.BaseSepolia; - const WALLET_ID = "0x123456789abcdef"; - - let mockAddress: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockAddress = { - getId: jest.fn().mockReturnValue(ADDRESS_ID), - } as unknown as jest.Mocked; - - mockWallet = { - getDefaultAddress: jest.fn(), - getId: jest.fn().mockReturnValue(WALLET_ID), - getNetworkId: jest.fn().mockReturnValue(NETWORK_ID), - } as unknown as jest.Mocked; - - mockWallet.getDefaultAddress.mockResolvedValue(mockAddress); - }); - - it("should successfully respond", async () => { - const args = {}; - const response = await getWalletDetails(mockWallet, args); - - expect(mockWallet.getDefaultAddress).toHaveBeenCalled(); - expect(response).toContain(`Wallet: ${WALLET_ID}`); - expect(response).toContain(`on network: ${NETWORK_ID}`); - expect(response).toContain(`with default address: ${ADDRESS_ID}`); - }); - - it("should fail with an error", async () => { - const args = {}; - - const error = new Error("An error has occurred"); - mockWallet.getDefaultAddress.mockRejectedValue(error); - - const response = await getWalletDetails(mockWallet, args); - - expect(mockWallet.getDefaultAddress).toHaveBeenCalled(); - expect(response).toContain(`Error getting wallet details: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/mint_nft_test.ts b/cdp-agentkit-core/typescript/src/tests/mint_nft_test.ts deleted file mode 100644 index f151ad609..000000000 --- a/cdp-agentkit-core/typescript/src/tests/mint_nft_test.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Coinbase, ContractInvocation, Wallet } from "@coinbase/coinbase-sdk"; - -import { mintNft, MintNftInput } from "../actions/cdp/mint_nft"; - -const MOCK_CONTRACT_ADDRESS = "0x123456789abcdef"; -const MOCK_CONTRACT_DESTINATION = "0xabcdef123456789"; - -describe("Mint NFT Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - contractAddress: MOCK_CONTRACT_ADDRESS, - destination: MOCK_CONTRACT_DESTINATION, - }; - - const result = MintNftInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = MintNftInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Mint NFT Action", () => { - const NETWORK_ID = Coinbase.networks.BaseSepolia; - const TRANSACTION_HASH = "0xghijkl987654321"; - const TRANSACTION_LINK = `https://etherscan.io/tx/${TRANSACTION_HASH}`; - - let mockContractInvocation: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockContractInvocation = { - wait: jest.fn().mockResolvedValue({ - getTransaction: jest.fn().mockReturnValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), - }), - }), - } as unknown as jest.Mocked; - - mockWallet = { - invokeContract: jest.fn(), - getNetworkId: jest.fn().mockReturnValue(NETWORK_ID), - } as unknown as jest.Mocked; - - mockWallet.invokeContract.mockResolvedValue(mockContractInvocation); - }); - - it("should successfully respond", async () => { - const args = { - contractAddress: MOCK_CONTRACT_ADDRESS, - destination: MOCK_CONTRACT_DESTINATION, - }; - - const response = await mintNft(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: MOCK_CONTRACT_ADDRESS, - method: "mint", - args: { - to: MOCK_CONTRACT_DESTINATION, - quantity: "1", - }, - }); - expect(mockContractInvocation.wait).toHaveBeenCalled(); - expect(response).toContain(`Minted NFT from contract ${MOCK_CONTRACT_ADDRESS}`); - expect(response).toContain(`to address ${MOCK_CONTRACT_DESTINATION}`); - expect(response).toContain(`on network ${NETWORK_ID}`); - expect(response).toContain(`Transaction hash for the mint: ${TRANSACTION_HASH}`); - expect(response).toContain(`Transaction link for the mint: ${TRANSACTION_LINK}`); - }); - - it("should fail with an error", async () => { - const args = { - contractAddress: MOCK_CONTRACT_ADDRESS, - destination: MOCK_CONTRACT_DESTINATION, - }; - - const error = new Error("An error has occurred"); - mockWallet.invokeContract.mockRejectedValue(error); - - const response = await mintNft(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalled(); - expect(response).toContain(`Error minting NFT: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/register_basename_test.ts b/cdp-agentkit-core/typescript/src/tests/register_basename_test.ts deleted file mode 100644 index 138d33334..000000000 --- a/cdp-agentkit-core/typescript/src/tests/register_basename_test.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { Coinbase, ContractInvocation, Wallet } from "@coinbase/coinbase-sdk"; - -import { Decimal } from "decimal.js"; -import { encodeFunctionData, namehash } from "viem"; - -import { - registerBasename, - RegisterBasenameInput, - BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET, - BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET, - L2_RESOLVER_ABI, - L2_RESOLVER_ADDRESS_MAINNET, - L2_RESOLVER_ADDRESS_TESTNET, - REGISTRATION_DURATION, - REGISTRAR_ABI, -} from "../actions/cdp/register_basename"; - -const MOCK_AMOUNT = "0.123"; -const MOCK_BASENAME = "test-basename"; - -describe("Register Basename Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - amount: MOCK_AMOUNT, - basename: MOCK_BASENAME, - }; - - const result = RegisterBasenameInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = RegisterBasenameInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Register Basename Action", () => { - /** - * This is the default network. - */ - const NETWORK_ID = Coinbase.networks.BaseMainnet; - - /** - * This is a 40 character hexadecimal string that requires lowercase alpha characters. - */ - const ADDRESS_ID = "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83"; - - let mockContractInvocation: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockContractInvocation = { - wait: jest.fn().mockResolvedValue({}), - } as unknown as jest.Mocked; - - mockWallet = { - getDefaultAddress: jest.fn().mockResolvedValue({ - getId: jest.fn().mockReturnValue(ADDRESS_ID), - }), - getNetworkId: jest.fn().mockReturnValue(NETWORK_ID), - invokeContract: jest.fn(), - } as unknown as jest.Mocked; - - mockWallet.invokeContract.mockResolvedValue(mockContractInvocation); - }); - - it(`should Successfully respond with ${MOCK_BASENAME}.base.eth for network: ${Coinbase.networks.BaseMainnet}`, async () => { - const args = { - amount: MOCK_AMOUNT, - basename: MOCK_BASENAME, - }; - - const name = `${MOCK_BASENAME}.base.eth`; - - mockWallet.getNetworkId.mockReturnValue(Coinbase.networks.BaseMainnet); - - const response = await registerBasename(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET, - method: "register", - args: { - request: [ - MOCK_BASENAME, - ADDRESS_ID, - REGISTRATION_DURATION, - L2_RESOLVER_ADDRESS_MAINNET, - [ - encodeFunctionData({ - abi: L2_RESOLVER_ABI, - functionName: "setAddr", - args: [namehash(name), ADDRESS_ID], - }), - encodeFunctionData({ - abi: L2_RESOLVER_ABI, - functionName: "setName", - args: [namehash(name), name], - }), - ], - true, - ], - }, - abi: REGISTRAR_ABI, - amount: new Decimal(MOCK_AMOUNT), - assetId: "eth", - }); - expect(mockContractInvocation.wait).toHaveBeenCalled(); - expect(response).toContain(`Successfully registered basename ${MOCK_BASENAME}.base.eth`); - expect(response).toContain(`for address ${ADDRESS_ID}`); - }); - - it(`should Successfully respond with ${MOCK_BASENAME}.basetest.eth for any other network`, async () => { - const args = { - amount: MOCK_AMOUNT, - basename: MOCK_BASENAME, - }; - - const name = `${MOCK_BASENAME}.basetest.eth`; - - mockWallet.getNetworkId.mockReturnValue("anything-else"); - - const response = await registerBasename(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET, - method: "register", - args: { - request: [ - MOCK_BASENAME, - ADDRESS_ID, - REGISTRATION_DURATION, - L2_RESOLVER_ADDRESS_TESTNET, - [ - encodeFunctionData({ - abi: L2_RESOLVER_ABI, - functionName: "setAddr", - args: [namehash(name), ADDRESS_ID], - }), - encodeFunctionData({ - abi: L2_RESOLVER_ABI, - functionName: "setName", - args: [namehash(name), name], - }), - ], - true, - ], - }, - abi: REGISTRAR_ABI, - amount: new Decimal(MOCK_AMOUNT), - assetId: "eth", - }); - expect(mockContractInvocation.wait).toHaveBeenCalled(); - expect(response).toContain(`Successfully registered basename ${MOCK_BASENAME}.basetest.eth`); - expect(response).toContain(`for address ${ADDRESS_ID}`); - }); - - it("should fail with an error", async () => { - const args = { - amount: MOCK_AMOUNT, - basename: MOCK_BASENAME, - }; - - const error = new Error("Failed to register basename"); - mockWallet.invokeContract.mockRejectedValue(error); - - await registerBasename(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalled(); - expect(`Error registering basename: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/request_faucet_funds_test.ts b/cdp-agentkit-core/typescript/src/tests/request_faucet_funds_test.ts deleted file mode 100644 index 605f01e05..000000000 --- a/cdp-agentkit-core/typescript/src/tests/request_faucet_funds_test.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Coinbase, FaucetTransaction, Wallet } from "@coinbase/coinbase-sdk"; - -import { requestFaucetFunds, RequestFaucetFundsInput } from "../actions/cdp/request_faucet_funds"; - -const MOCK_ASSET_ID = Coinbase.assets.Usdc; - -describe("Request Faucet Funds Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - assetId: MOCK_ASSET_ID, - }; - - const result = RequestFaucetFundsInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should successfully parsing empty input", () => { - const emptyInput = {}; - const result = RequestFaucetFundsInput.safeParse(emptyInput); - - expect(result.success).toBe(true); - }); -}); - -describe("Request Faucet Funds Action", () => { - const TRANSACTION_HASH = "0xghijkl987654321"; - const TRANSACTION_LINK = `https://etherscan.io/tx/${TRANSACTION_HASH}`; - - let mockFaucetTransaction: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockFaucetTransaction = { - wait: jest.fn().mockResolvedValue({ - getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), - }), - } as unknown as jest.Mocked; - - mockWallet = { - faucet: jest.fn(), - } as unknown as jest.Mocked; - - mockWallet.faucet.mockResolvedValue(mockFaucetTransaction); - }); - - it("should successfully request faucet funds", async () => { - const args = {}; - const response = await requestFaucetFunds(mockWallet, args); - - expect(mockWallet.faucet).toHaveBeenCalled(); - expect(mockFaucetTransaction.wait).toHaveBeenCalled(); - expect(response).toContain(`Received ETH from the faucet. Transaction: ${TRANSACTION_LINK}`); - }); - - it("should successfully request faucet funds with an asset id", async () => { - const args = { assetId: MOCK_ASSET_ID }; - const response = await requestFaucetFunds(mockWallet, args); - - expect(mockWallet.faucet).toHaveBeenCalledWith(MOCK_ASSET_ID); - expect(mockFaucetTransaction.wait).toHaveBeenCalled(); - expect(response).toContain(`Received ${MOCK_ASSET_ID} from the faucet`); - expect(response).toContain(`Transaction: ${TRANSACTION_LINK}`); - }); - - it("should fail with an error", async () => { - const args = { assetId: MOCK_ASSET_ID }; - - const error = new Error("Failed to request funds"); - mockWallet.faucet.mockRejectedValue(error); - - const response = await requestFaucetFunds(mockWallet, args); - - expect(mockWallet.faucet).toHaveBeenCalled(); - expect(response).toContain(`Error requesting faucet funds: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/social_farcaster_account_details_test.ts b/cdp-agentkit-core/typescript/src/tests/social_farcaster_account_details_test.ts deleted file mode 100644 index 07dfb35f6..000000000 --- a/cdp-agentkit-core/typescript/src/tests/social_farcaster_account_details_test.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { - accountDetails, - AccountDetailsInput, -} from "../actions/cdp/social/farcaster/account_details"; - -describe("Farcaster Account Details Input", () => { - it("should successfully parse empty input", () => { - const emptyInput = {}; - const result = AccountDetailsInput.safeParse(emptyInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(emptyInput); - }); -}); - -describe("Farcaster Account Details Action", () => { - beforeEach(async () => { - process.env.NEYNAR_API_KEY = "test-key"; - process.env.NEYNAR_MANAGED_SIGNER = "test-managed-signer"; - }); - - afterEach(() => { - jest.resetAllMocks(); - process.env.NEYNAR_API_KEY = ""; - process.env.NEYNAR_MANAGED_SIGNER = ""; - }); - - it("should successfully retrieve Farcaster account details", async () => { - global.fetch = jest.fn(() => - Promise.resolve({ - json: () => - Promise.resolve({ - users: [ - { - object: "user", - fid: 193, - username: "derek", - display_name: "derek", - }, - ], - }), - }), - ) as jest.Mock; - - const args = {}; - const response = await accountDetails(args); - expect(response).toContain("Successfully retrieved Farcaster account details:"); - }); - - it("should handle errors when retrieving Farcaster account details", async () => { - global.fetch = jest.fn(() => Promise.reject(new Error("An error has occurred"))) as jest.Mock; - - const args = {}; - const response = await accountDetails(args); - expect(response).toContain("Error retrieving Farcaster account details:"); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/social_farcaster_post_cast_test.ts b/cdp-agentkit-core/typescript/src/tests/social_farcaster_post_cast_test.ts deleted file mode 100644 index 6c204d80e..000000000 --- a/cdp-agentkit-core/typescript/src/tests/social_farcaster_post_cast_test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { postCast, PostCastInput } from "../actions/cdp/social/farcaster/post_cast"; - -const MOCK_CAST = "Hello from AgentKit, @CoinbaseDev!"; - -describe("Post Cast Input", () => { - it("should successfully parse valid input", () => { - const validInput = { castText: MOCK_CAST }; - const result = PostCastInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail to parse empty input", () => { - const emptyInput = {}; - const result = PostCastInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - expect(result.error!.issues[0].message).toBe("Required"); - }); - - it("should fail to parse invalid input: cast is too long", () => { - const invalidInput = { castText: "A".repeat(281) }; - const result = PostCastInput.safeParse(invalidInput); - - expect(result.success).toBe(false); - expect(result.error!.issues[0].message).toBe("Cast text must be a maximum of 280 characters."); - }); -}); - -describe("Post Cast Action", () => { - beforeEach(async () => { - process.env.NEYNAR_API_KEY = "test-key"; - process.env.NEYNAR_MANAGED_SIGNER = "test-managed-signer"; - }); - - afterEach(() => { - jest.resetAllMocks(); - process.env.NEYNAR_API_KEY = ""; - process.env.NEYNAR_MANAGED_SIGNER = ""; - }); - - it("should successfully post a cast", async () => { - global.fetch = jest.fn(() => - Promise.resolve({ json: () => Promise.resolve({ hash: "0x123" }) }), - ) as jest.Mock; - - const args = { - castText: "Hello, world!", - }; - const response = await postCast(args); - expect(response).toContain("Successfully posted cast to Farcaster:"); - }); - - it("should handle errors when posting a cast", async () => { - global.fetch = jest.fn(() => Promise.reject(new Error("An error has occurred"))) as jest.Mock; - - const args = { - castText: "Hello, world!", - }; - const response = await postCast(args); - - expect(response).toContain("Error posting to Farcaster:"); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/social_twitter_account_details_test.ts b/cdp-agentkit-core/typescript/src/tests/social_twitter_account_details_test.ts deleted file mode 100644 index ca8ae9c49..000000000 --- a/cdp-agentkit-core/typescript/src/tests/social_twitter_account_details_test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { accountDetails, AccountDetailsInput } from "../actions/cdp/social/twitter/account_details"; -import { TwitterApi, TwitterApiv2 } from "twitter-api-v2"; - -const MOCK_ID = "1853889445319331840"; -const MOCK_NAME = "CDP Agentkit"; -const MOCK_USERNAME = "CDPAgentkit"; - -describe("Twitter (X) Account Details Input", () => { - it("should successfully parse empty input", () => { - const emptyInput = {}; - const result = AccountDetailsInput.safeParse(emptyInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(emptyInput); - }); -}); - -describe("Account Details Action", () => { - const mockResponse = { - data: { - id: MOCK_ID, - name: MOCK_NAME, - username: MOCK_USERNAME, - }, - }; - - let mockApi: jest.Mocked; - let mockClient: jest.Mocked; - - beforeEach(() => { - mockClient = { - me: jest.fn().mockResolvedValue(mockResponse), - } as unknown as jest.Mocked; - - mockApi = { - get v2() { - return mockClient; - }, - } as unknown as jest.Mocked; - }); - - it("should successfully retrieve account details", async () => { - const args = {}; - const response = await accountDetails(mockApi, args); - - expect(mockApi.v2.me).toHaveBeenCalled(); - expect(response).toContain("Successfully retrieved authenticated user account details"); - expect(response).toContain(JSON.stringify(mockResponse)); - }); - - it("should handle errors when retrieving account details", async () => { - const args = {}; - - const error = new Error("An error has occurred"); - mockApi.v2.me = jest.fn().mockRejectedValue(error); - - const response = await accountDetails(mockApi, args); - - expect(mockApi.v2.me).toHaveBeenCalled(); - expect(response).toContain("Error retrieving authenticated user account details"); - expect(response).toContain(error.message); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/social_twitter_account_mentions_test.ts b/cdp-agentkit-core/typescript/src/tests/social_twitter_account_mentions_test.ts deleted file mode 100644 index 6f48c2943..000000000 --- a/cdp-agentkit-core/typescript/src/tests/social_twitter_account_mentions_test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { - accountMentions, - AccountMentionsInput, -} from "../actions/cdp/social/twitter/account_mentions"; -import { TwitterApi, TwitterApiv2 } from "twitter-api-v2"; - -const MOCK_ACCOUNT_ID = "1857479287504584856"; - -describe("Account Mentions Input", () => { - it("should successfully parse valid input", () => { - const validInput = { userId: MOCK_ACCOUNT_ID }; - const result = AccountMentionsInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail to parse empty input", () => { - const emptyInput = {}; - const result = AccountMentionsInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - expect(result.error!.issues[0].message).toBe("Required"); - }); - - it("should fail to parse invalid input", () => { - const invalidInput = { userId: "" }; - const result = AccountMentionsInput.safeParse(invalidInput); - - expect(result.success).toBe(false); - expect(result.error!.issues[0].message).toBe("Account ID is required."); - }); -}); - -describe("Account Mentions Action", () => { - const mockApiResponse = { - data: [ - { - id: "0123456789012345678", - text: "@CDPAgentkit please reply!", - }, - ], - }; - - let mockApi: jest.Mocked; - let mockClient: jest.Mocked; - - beforeEach(() => { - mockClient = { - userMentionTimeline: jest.fn().mockResolvedValue(mockApiResponse), - } as unknown as jest.Mocked; - - mockApi = { - get v2() { - return mockClient; - }, - } as unknown as jest.Mocked; - }); - - it("should successfully retrieve account mentions", async () => { - const args = { userId: MOCK_ACCOUNT_ID }; - const response = await accountMentions(mockApi, args); - - expect(mockApi.v2.userMentionTimeline).toHaveBeenCalledWith(MOCK_ACCOUNT_ID); - expect(response).toContain("Successfully retrieved account mentions:"); - expect(response).toContain(JSON.stringify(mockApiResponse)); - }); - - it("should handle errors when retrieving account mentions", async () => { - const args = { - userId: MOCK_ACCOUNT_ID, - }; - - const error = new Error("Twitter API error"); - mockClient.userMentionTimeline.mockRejectedValue(error); - - const response = await accountMentions(mockApi, args); - - expect(mockApi.v2.userMentionTimeline).toHaveBeenCalledWith(MOCK_ACCOUNT_ID); - expect(response).toContain("Error retrieving authenticated account mentions:"); - expect(response).toContain(error.message); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/social_twitter_post_tweet_reply_test.ts b/cdp-agentkit-core/typescript/src/tests/social_twitter_post_tweet_reply_test.ts deleted file mode 100644 index 8e6e25176..000000000 --- a/cdp-agentkit-core/typescript/src/tests/social_twitter_post_tweet_reply_test.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { postTweet, PostTweetReplyInput } from "../actions/cdp/social/twitter/post_tweet_reply"; -import { TwitterApi, TwitterApiv2 } from "twitter-api-v2"; - -const MOCK_TWEET_ID = "0123456789012345678"; -const MOCK_TWEET_REPLY = "hello, world, again!"; - -describe("Post Tweet Reply Input", () => { - it("should successfully parse valid input", () => { - const validInput = { tweetId: MOCK_TWEET_ID, tweetReply: MOCK_TWEET_REPLY }; - const result = PostTweetReplyInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail to parse empty input", () => { - const emptyInput = {}; - const result = PostTweetReplyInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - expect(result.error!.issues[0].message).toBe("Required"); - }); - - it("should fail to parse invalid input: tweet is too long", () => { - const invalidInput = { tweetId: MOCK_TWEET_ID, tweetReply: "A".repeat(281) }; - const result = PostTweetReplyInput.safeParse(invalidInput); - - expect(result.success).toBe(false); - expect(result.error!.issues[0].message).toBe( - "The reply to the tweet which must be a maximum of 280 characters.", - ); - }); -}); - -describe("Post Tweet Reply Action", () => { - const mockApiResponse = { - data: { - id: "9123456789012345678", - edit_history_tweet_ids: ["9123456789012345678"], - text: MOCK_TWEET_REPLY, - }, - }; - - let mockApi: jest.Mocked; - let mockClient: jest.Mocked; - - beforeEach(() => { - mockClient = { - tweet: jest.fn().mockResolvedValue(mockApiResponse), - } as unknown as jest.Mocked; - - mockApi = { - get v2() { - return mockClient; - }, - } as unknown as jest.Mocked; - }); - - it("should successfully post a reply", async () => { - const args = { - tweetId: MOCK_TWEET_ID, - tweetReply: MOCK_TWEET_REPLY, - }; - - const response = await postTweet(mockApi, args); - - expect(mockApi.v2.tweet).toHaveBeenCalledWith(MOCK_TWEET_REPLY, { - reply: { in_reply_to_tweet_id: MOCK_TWEET_ID }, - }); - expect(response).toContain("Successfully posted reply to Twitter:"); - expect(response).toContain(JSON.stringify(mockApiResponse)); - }); - - it("should handle errors when posting a reply", async () => { - const args = { - tweetId: MOCK_TWEET_ID, - tweetReply: MOCK_TWEET_REPLY, - }; - - const error = new Error("An error has occurred"); - mockClient.tweet.mockRejectedValue(error); - - const response = await postTweet(mockApi, args); - - expect(mockApi.v2.tweet).toHaveBeenCalledWith(MOCK_TWEET_REPLY, { - reply: { in_reply_to_tweet_id: MOCK_TWEET_ID }, - }); - expect(response).toContain("Error posting reply to Twitter:"); - expect(response).toContain(error.message); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/social_twitter_post_tweet_test.ts b/cdp-agentkit-core/typescript/src/tests/social_twitter_post_tweet_test.ts deleted file mode 100644 index 09e461724..000000000 --- a/cdp-agentkit-core/typescript/src/tests/social_twitter_post_tweet_test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { postTweet, PostTweetInput } from "../actions/cdp/social/twitter/post_tweet"; -import { TwitterApi, TwitterApiv2 } from "twitter-api-v2"; - -const MOCK_TWEET = "@CDPAgentkit please reply!"; - -describe("Post Tweet Input", () => { - it("should successfully parse valid input", () => { - const validInput = { tweet: MOCK_TWEET }; - const result = PostTweetInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail to parse empty input", () => { - const emptyInput = {}; - const result = PostTweetInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - expect(result.error!.issues[0].message).toBe("Required"); - }); - - it("should fail to parse invalid input: tweet is too long", () => { - const invalidInput = { tweet: "A".repeat(281) }; - const result = PostTweetInput.safeParse(invalidInput); - - expect(result.success).toBe(false); - expect(result.error!.issues[0].message).toBe("Tweet must be a maximum of 280 characters."); - }); -}); - -describe("Post Tweet Action", () => { - const mockApiResponse = { - data: { - id: "0123456789012345678", - edit_history_tweet_ids: ["0123456789012345678"], - text: MOCK_TWEET, - }, - }; - - let mockApi: jest.Mocked; - let mockClient: jest.Mocked; - - beforeEach(() => { - mockClient = { - tweet: jest.fn().mockResolvedValue(mockApiResponse), - } as unknown as jest.Mocked; - - mockApi = { - get v2() { - return mockClient; - }, - } as unknown as jest.Mocked; - }); - - it("should successfully post a tweet", async () => { - const args = { - tweet: "Hello, world!", - }; - - const response = await postTweet(mockApi, args); - - expect(mockApi.v2.tweet).toHaveBeenCalledWith(args.tweet); - expect(response).toContain("Successfully posted to Twitter:"); - expect(response).toContain(JSON.stringify(mockApiResponse)); - }); - - it("should handle errors when posting a tweet", async () => { - const args = { - tweet: "Hello, world!", - }; - - const error = new Error("An error has occurred"); - mockClient.tweet.mockRejectedValue(error); - - const response = await postTweet(mockApi, { tweet: "Hello, world!" }); - - expect(mockApi.v2.tweet).toHaveBeenCalledWith(args.tweet); - expect(response).toContain("Error posting to Twitter:"); - expect(response).toContain(error.message); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/trade_test.ts b/cdp-agentkit-core/typescript/src/tests/trade_test.ts deleted file mode 100644 index 89804a2c0..000000000 --- a/cdp-agentkit-core/typescript/src/tests/trade_test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Coinbase, Trade, Wallet } from "@coinbase/coinbase-sdk"; - -import { trade as createTrade, TradeInput } from "../actions/cdp/trade"; - -const MOCK_TRADE_AMOUNT = 0.123; -const MOCK_TRADE_ASSET_ID_FROM = Coinbase.assets.Eth; -const MOCK_TRADE_ASSET_ID_TO = Coinbase.assets.Usdc; - -describe("Trade Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - amount: MOCK_TRADE_AMOUNT, - fromAssetId: MOCK_TRADE_ASSET_ID_FROM, - toAssetId: MOCK_TRADE_ASSET_ID_TO, - }; - - const result = TradeInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = TradeInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Trade Action", () => { - const TO_AMOUNT = 3661.08; - const TRANSACTION_HASH = "0xghijkl987654321"; - const TRANSACTION_LINK = `https://etherscan.io/tx/${TRANSACTION_HASH}`; - - let mockTrade: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(async () => { - mockTrade = { - wait: jest.fn().mockResolvedValue({ - getToAmount: jest.fn().mockReturnValue(TO_AMOUNT), - getTransaction: jest.fn().mockReturnValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), - }), - }), - } as unknown as jest.Mocked; - - mockWallet = { - createTrade: jest.fn(), - } as unknown as jest.Mocked; - - mockWallet.createTrade.mockResolvedValue(mockTrade); - }); - - it("should successfully execute the trade", async () => { - const args = { - amount: MOCK_TRADE_AMOUNT, - fromAssetId: MOCK_TRADE_ASSET_ID_FROM, - toAssetId: MOCK_TRADE_ASSET_ID_TO, - }; - - const response = await createTrade(mockWallet, args); - - expect(mockWallet.createTrade).toHaveBeenCalledWith(args); - expect(mockTrade.wait).toHaveBeenCalled(); - expect(response).toContain( - `Traded ${MOCK_TRADE_AMOUNT} of ${MOCK_TRADE_ASSET_ID_FROM} for ${TO_AMOUNT} of ${MOCK_TRADE_ASSET_ID_TO}`, - ); - expect(response).toContain(`Transaction hash for the trade: ${TRANSACTION_HASH}`); - expect(response).toContain(`Transaction link for the trade: ${TRANSACTION_LINK}`); - }); - - it("should fail with an error", async () => { - const args = { - amount: MOCK_TRADE_AMOUNT, - fromAssetId: MOCK_TRADE_ASSET_ID_FROM, - toAssetId: MOCK_TRADE_ASSET_ID_TO, - }; - - const error = new Error("Failed to execute trade"); - mockWallet.createTrade.mockRejectedValue(error); - - const response = await createTrade(mockWallet, args); - - expect(mockWallet.createTrade).toHaveBeenCalled(); - expect(response).toContain(`Error trading assets: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/transfer_nft_test.ts b/cdp-agentkit-core/typescript/src/tests/transfer_nft_test.ts deleted file mode 100644 index 2c1a0dc16..000000000 --- a/cdp-agentkit-core/typescript/src/tests/transfer_nft_test.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { ContractInvocation, Wallet } from "@coinbase/coinbase-sdk"; - -import { transferNft, TransferNftInput } from "../actions/cdp/transfer_nft"; - -const MOCK_CONTRACT_ADDRESS = "0x123456789abcdef"; -const MOCK_TOKEN_ID = "1000"; -const MOCK_DESTINATION = "0xabcdef123456789"; -const MOCK_FROM_ADDRESS = "0xdefault123456789"; - -describe("Transfer NFT Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - contractAddress: MOCK_CONTRACT_ADDRESS, - tokenId: MOCK_TOKEN_ID, - destination: MOCK_DESTINATION, - fromAddress: MOCK_FROM_ADDRESS, - }; - - const result = TransferNftInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should successfully parse input without optional fromAddress", () => { - const validInput = { - contractAddress: MOCK_CONTRACT_ADDRESS, - tokenId: MOCK_TOKEN_ID, - destination: MOCK_DESTINATION, - }; - - const result = TransferNftInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = TransferNftInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Transfer NFT Action", () => { - const TRANSACTION_HASH = "0xghijkl987654321"; - const TRANSACTION_LINK = `https://etherscan.io/tx/${TRANSACTION_HASH}`; - - let mockContractInvocation: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockContractInvocation = { - wait: jest.fn().mockResolvedValue({ - getTransaction: jest.fn().mockReturnValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), - }), - }), - } as unknown as jest.Mocked; - - mockWallet = { - invokeContract: jest.fn(), - getDefaultAddress: jest.fn().mockResolvedValue({ - getId: jest.fn().mockReturnValue(MOCK_FROM_ADDRESS), - }), - } as unknown as jest.Mocked; - - mockWallet.invokeContract.mockResolvedValue(mockContractInvocation); - }); - - it("should successfully transfer NFT with provided fromAddress", async () => { - const args = { - contractAddress: MOCK_CONTRACT_ADDRESS, - tokenId: MOCK_TOKEN_ID, - destination: MOCK_DESTINATION, - fromAddress: MOCK_FROM_ADDRESS, - }; - - const response = await transferNft(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: MOCK_CONTRACT_ADDRESS, - method: "transferFrom", - args: { - from: MOCK_FROM_ADDRESS, - to: MOCK_DESTINATION, - tokenId: MOCK_TOKEN_ID, - }, - }); - expect(mockContractInvocation.wait).toHaveBeenCalled(); - expect(response).toContain( - `Transferred NFT (ID: ${MOCK_TOKEN_ID}) from contract ${MOCK_CONTRACT_ADDRESS} to ${MOCK_DESTINATION}`, - ); - expect(response).toContain(`Transaction hash: ${TRANSACTION_HASH}`); - expect(response).toContain(`Transaction link: ${TRANSACTION_LINK}`); - }); - - it("should successfully transfer NFT with default address", async () => { - const args = { - contractAddress: MOCK_CONTRACT_ADDRESS, - tokenId: MOCK_TOKEN_ID, - destination: MOCK_DESTINATION, - }; - - const response = await transferNft(mockWallet, args); - - expect(mockWallet.getDefaultAddress).toHaveBeenCalled(); - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: MOCK_CONTRACT_ADDRESS, - method: "transferFrom", - args: { - from: MOCK_FROM_ADDRESS, - to: MOCK_DESTINATION, - tokenId: MOCK_TOKEN_ID, - }, - }); - expect(mockContractInvocation.wait).toHaveBeenCalled(); - expect(response).toContain( - `Transferred NFT (ID: ${MOCK_TOKEN_ID}) from contract ${MOCK_CONTRACT_ADDRESS} to ${MOCK_DESTINATION}`, - ); - }); - - it("should fail with an error", async () => { - const args = { - contractAddress: MOCK_CONTRACT_ADDRESS, - tokenId: MOCK_TOKEN_ID, - destination: MOCK_DESTINATION, - }; - - const error = new Error("Failed to transfer NFT"); - mockWallet.invokeContract.mockRejectedValue(error); - - const response = await transferNft(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalled(); - expect(response).toContain( - `Error transferring the NFT (contract: ${MOCK_CONTRACT_ADDRESS}, ID: ${MOCK_TOKEN_ID}) from ${MOCK_FROM_ADDRESS} to ${MOCK_DESTINATION}): ${error}`, - ); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/transfer_test.ts b/cdp-agentkit-core/typescript/src/tests/transfer_test.ts deleted file mode 100644 index bf3caf7e8..000000000 --- a/cdp-agentkit-core/typescript/src/tests/transfer_test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Coinbase, Transfer, Wallet } from "@coinbase/coinbase-sdk"; - -import { transfer as createTransfer, TransferInput } from "../actions/cdp/transfer"; - -const MOCK_AMOUNT = 15; -const MOCK_ASSET_ID = Coinbase.assets.Eth; -const MOCK_DESTINATION = "0x321"; -const MOCK_GASLESS = true; - -describe("Transfer Input", () => { - it("should successfully parse valid input", () => { - const validInput = { - amount: MOCK_AMOUNT, - assetId: MOCK_ASSET_ID, - destination: MOCK_DESTINATION, - gasless: MOCK_GASLESS, - }; - - const result = TransferInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = TransferInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Transfer Action", () => { - const TRANSACTION_HASH = "0xghijkl987654321"; - const TRANSACTION_LINK = `https://etherscan.io/tx/${TRANSACTION_HASH}`; - - let mockTransfer: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(async () => { - mockTransfer = { - wait: jest.fn().mockResolvedValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), - }), - } as unknown as jest.Mocked; - - mockWallet = { - createTransfer: jest.fn(), - } as unknown as jest.Mocked; - - mockWallet.createTransfer.mockResolvedValue(mockTransfer); - }); - - it("should successfully respond", async () => { - const args = { - amount: MOCK_AMOUNT, - assetId: MOCK_ASSET_ID, - destination: MOCK_DESTINATION, - gasless: MOCK_GASLESS, - }; - - const response = await createTransfer(mockWallet, args); - - expect(mockWallet.createTransfer).toHaveBeenCalledWith(args); - expect(mockTransfer.wait).toHaveBeenCalled(); - expect(response).toContain( - `Transferred ${MOCK_AMOUNT} of ${MOCK_ASSET_ID} to ${MOCK_DESTINATION}`, - ); - expect(response).toContain(`Transaction hash for the transfer: ${TRANSACTION_HASH}`); - expect(response).toContain(`Transaction link for the transfer: ${TRANSACTION_LINK}`); - }); - - it("should fail with an error", async () => { - const args = { - amount: MOCK_AMOUNT, - assetId: MOCK_ASSET_ID, - destination: MOCK_DESTINATION, - gasless: MOCK_GASLESS, - }; - - const error = new Error("Failed to execute transfer"); - mockWallet.createTransfer.mockRejectedValue(error); - - const response = await createTransfer(mockWallet, args); - - expect(mockWallet.createTransfer).toHaveBeenCalledWith(args); - expect(response).toContain(`Error transferring the asset: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/utils_test.ts b/cdp-agentkit-core/typescript/src/tests/utils_test.ts deleted file mode 100644 index 105dcfd6e..000000000 --- a/cdp-agentkit-core/typescript/src/tests/utils_test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { ContractInvocation, Wallet } from "@coinbase/coinbase-sdk"; -import { approve } from "../actions/cdp/utils"; - -const MOCK_TOKEN_ADDRESS = "0x123456789abcdef"; -const MOCK_SPENDER_ADDRESS = "0xabcdef123456789"; -const MOCK_AMOUNT = BigInt(1000000); -const TRANSACTION_HASH = "0xghijkl987654321"; - -describe("Utils - Approve", () => { - let mockContractInvocation: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockContractInvocation = { - wait: jest.fn().mockResolvedValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - }), - } as unknown as jest.Mocked; - - mockWallet = { - invokeContract: jest.fn(), - } as unknown as jest.Mocked; - - mockWallet.invokeContract.mockResolvedValue(mockContractInvocation); - }); - - it("should successfully approve tokens", async () => { - const response = await approve( - mockWallet, - MOCK_TOKEN_ADDRESS, - MOCK_SPENDER_ADDRESS, - MOCK_AMOUNT, - ); - - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: MOCK_TOKEN_ADDRESS, - method: "approve", - abi: expect.any(Array), - args: { - spender: MOCK_SPENDER_ADDRESS, - value: MOCK_AMOUNT.toString(), - }, - }); - expect(mockContractInvocation.wait).toHaveBeenCalled(); - expect(response).toBe( - `Approved ${MOCK_AMOUNT} tokens for ${MOCK_SPENDER_ADDRESS} with transaction hash: ${TRANSACTION_HASH}`, - ); - }); - - it("should handle approval errors", async () => { - const error = new Error("Approval failed"); - mockWallet.invokeContract.mockRejectedValue(error); - - const response = await approve( - mockWallet, - MOCK_TOKEN_ADDRESS, - MOCK_SPENDER_ADDRESS, - MOCK_AMOUNT, - ); - - expect(mockWallet.invokeContract).toHaveBeenCalled(); - expect(response).toBe(`Error approving tokens: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/tests/wrap_eth_test.ts b/cdp-agentkit-core/typescript/src/tests/wrap_eth_test.ts deleted file mode 100644 index 0d13eebc3..000000000 --- a/cdp-agentkit-core/typescript/src/tests/wrap_eth_test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { ContractInvocation, Wallet } from "@coinbase/coinbase-sdk"; - -import { WETH_ABI, WETH_ADDRESS, wrapEth, WrapEthInput } from "../actions/cdp/wrap_eth"; - -const MOCK_AMOUNT_TO_WRAP = "100000000000000000"; - -describe("Wrap Eth", () => { - it("should successfully parse valid input", () => { - const validInput = { - amountToWrap: MOCK_AMOUNT_TO_WRAP, - }; - - const result = WrapEthInput.safeParse(validInput); - - expect(result.success).toBe(true); - expect(result.data).toEqual(validInput); - }); - - it("should fail parsing empty input", () => { - const emptyInput = {}; - const result = WrapEthInput.safeParse(emptyInput); - - expect(result.success).toBe(false); - }); -}); - -describe("Wrap Eth Action", () => { - const TRANSACTION_HASH = "0xghijkl987654321"; - - let mockContractInvocation: jest.Mocked; - let mockWallet: jest.Mocked; - - beforeEach(() => { - mockWallet = { - invokeContract: jest.fn(), - } as unknown as jest.Mocked; - - mockContractInvocation = { - wait: jest.fn().mockResolvedValue({ - getTransaction: jest.fn().mockReturnValue({ - getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), - }), - }), - } as unknown as jest.Mocked; - - mockWallet.invokeContract.mockResolvedValue(mockContractInvocation); - }); - - it("should successfully wrap ETH", async () => { - const args = { - amountToWrap: MOCK_AMOUNT_TO_WRAP, - }; - - const response = await wrapEth(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalledWith({ - contractAddress: WETH_ADDRESS, - method: "deposit", - abi: WETH_ABI, - args: {}, - amount: BigInt(args.amountToWrap), - assetId: "wei", - }); - expect(response).toContain(`Wrapped ETH with transaction hash: ${TRANSACTION_HASH}`); - }); - - it("should fail with an error", async () => { - const args = { - amountToWrap: MOCK_AMOUNT_TO_WRAP, - }; - - const error = new Error("Failed to execute transfer"); - mockWallet.invokeContract.mockRejectedValue(error); - - const response = await wrapEth(mockWallet, args); - - expect(mockWallet.invokeContract).toHaveBeenCalled(); - expect(response).toContain(`Error wrapping ETH: ${error}`); - }); -}); diff --git a/cdp-agentkit-core/typescript/src/twitter_agentkit.ts b/cdp-agentkit-core/typescript/src/twitter_agentkit.ts deleted file mode 100644 index f416f119c..000000000 --- a/cdp-agentkit-core/typescript/src/twitter_agentkit.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { TwitterApi, TwitterApiTokens } from "twitter-api-v2"; -import { z } from "zod"; -import { TwitterAction, TwitterActionSchemaAny } from "./actions/cdp/social/twitter"; - -/** - * Schema for the options required to initialize the TwitterAgentkit. - */ -export const TwitterAgentkitOptions = z - .object({ - apiKey: z - .string() - .min(1, "The Twitter (X) API key is required") - .describe("The Twitter (X) API key"), - apiSecret: z - .string() - .min(1, "The Twitter (X) API secret is required") - .describe("The Twitter (X) API secret"), - accessToken: z - .string() - .min(1, "The Twitter (X) access token is required") - .describe("The Twitter (X) access token"), - accessTokenSecret: z - .string() - .min(1, "The Twitter (X) access token secret is required") - .describe("The Twitter (X) access token secret"), - }) - .strip() - .describe("Options for initializing TwitterAgentkit"); - -/** - * Schema for the environment variables required for TwitterAgentkit. - */ -const EnvSchema = z.object({ - TWITTER_API_KEY: z - .string() - .min(1, "TWITTER_API_KEY is required") - .describe("The Twitter (X) API key"), - TWITTER_API_SECRET: z - .string() - .min(1, "TWITTER_API_SECRET is required") - .describe("The Twitter (X) API secret"), - TWITTER_ACCESS_TOKEN: z - .string() - .min(1, "TWITTER_ACCESS_TOKEN is required") - .describe("The Twitter (X) access token"), - TWITTER_ACCESS_TOKEN_SECRET: z - .string() - .min(1, "TWITTER_ACCESS_TOKEN_SECRET is required") - .describe("The Twitter (X) access token secret"), -}); - -/** - * Twitter Agentkit - */ -export class TwitterAgentkit { - private client: TwitterApi; - - /** - * Initializes a new instance of TwitterAgentkit with the provided options. - * If no options are provided, it attempts to load the required environment variables. - * - * @param options - Optional. The configuration options for the TwitterAgentkit. - * @throws An error if the provided options are invalid or if the environment variables cannot be loaded. - */ - public constructor(options?: z.infer) { - if (!options) { - try { - const env = EnvSchema.parse(process.env); - - options = { - apiKey: env.TWITTER_API_KEY!, - apiSecret: env.TWITTER_API_SECRET!, - accessToken: env.TWITTER_ACCESS_TOKEN!, - accessTokenSecret: env.TWITTER_ACCESS_TOKEN_SECRET!, - }; - } catch (error) { - if (error instanceof z.ZodError) { - error.errors.forEach(err => console.log(`Error: ${err.path[0]} is required`)); - } - throw new Error("Twitter (X) ENV could not be loaded."); - } - } - - if (!this.validateOptions(options)) { - throw new Error("Twitter (X) Agentkit options could not be validated."); - } - - this.client = new TwitterApi({ - appKey: options.apiKey, - appSecret: options.apiSecret, - accessToken: options.accessToken, - accessSecret: options.accessTokenSecret, - } as TwitterApiTokens); - } - - /** - * Validates the provided options for the TwitterAgentkit. - * - * @param options - The options to validate. - * @returns True if the options are valid, otherwise false. - */ - validateOptions(options: z.infer): boolean { - try { - TwitterAgentkitOptions.parse(options); - } catch (error) { - if (error instanceof z.ZodError) { - error.errors.forEach(err => console.log("Error:", err.message)); - } - - return false; - } - - return true; - } - - /** - * Executes a Twitter (X) action. - * - * @param action - The Twitter (X) action to execute. - * @param args - The arguments for the action. - * @returns The result of the execution. - */ - async run( - action: TwitterAction, - args: TActionSchema, - ): Promise { - return await action.func(this.client, args); - } -} diff --git a/cdp-langchain/README.md b/cdp-langchain/README.md deleted file mode 100644 index a8ae116cd..000000000 --- a/cdp-langchain/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# CDP Agentkit Extension - Langchain Toolkit - -CDP integration with Langchain to enable agentic workflows using the core primitives defined in `cdp-agentkit-core`. - -This toolkit contains tools that enable an LLM agent to interact with the [Coinbase Developer Platform](https://docs.cdp.coinbase.com/). The toolkit provides a wrapper around the CDP SDK, allowing agents to perform onchain operations like transfers, trades, and smart contract interactions. - -For Python, see [cdp-langchain/python](./python/README.md). -For TypeScript, see [cdp-langchain/typescript](./typescript/README.md). \ No newline at end of file diff --git a/cdp-langchain/examples/chatbot-typescript/.env.example b/cdp-langchain/examples/chatbot-typescript/.env.example deleted file mode 100644 index 38e3bbfd8..000000000 --- a/cdp-langchain/examples/chatbot-typescript/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -CDP_API_KEY_NAME="" # Place your CDP API key name in between the quotes -CDP_API_KEY_PRIVATE_KEY="" # Place your CDP API key private key in between the quotes -OPENAI_API_KEY="" # Place your OpenAI API key in between the quotes diff --git a/cdp-langchain/python/docs/README.md b/cdp-langchain/python/docs/README.md deleted file mode 120000 index 32d46ee88..000000000 --- a/cdp-langchain/python/docs/README.md +++ /dev/null @@ -1 +0,0 @@ -../README.md \ No newline at end of file diff --git a/cdp-langchain/typescript/.eslintrc.json b/cdp-langchain/typescript/.eslintrc.json deleted file mode 100644 index 91571ba7a..000000000 --- a/cdp-langchain/typescript/.eslintrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "extends": ["../../.eslintrc.base.json"] -} diff --git a/cdp-langchain/typescript/jest.config.cjs b/cdp-langchain/typescript/jest.config.cjs deleted file mode 100644 index 2dceab682..000000000 --- a/cdp-langchain/typescript/jest.config.cjs +++ /dev/null @@ -1,14 +0,0 @@ -const baseConfig = require("../../jest.config.base.cjs"); - -module.exports = { - ...baseConfig, - coveragePathIgnorePatterns: ["node_modules", "dist", "docs", "index.ts"], - coverageThreshold: { - "./src/**": { - branches: 30, - functions: 50, - statements: 50, - lines: 50, - }, - }, -}; diff --git a/cdp-langchain/typescript/src/index.ts b/cdp-langchain/typescript/src/index.ts deleted file mode 100644 index 72d1dcfff..000000000 --- a/cdp-langchain/typescript/src/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Main exports for the CDP Langchain package - */ - -// Export core toolkit components -export { CdpToolkit } from "./toolkits/cdp_toolkit"; -export { CdpTool } from "./tools/cdp_tool"; - -// Export types -export type { Tool } from "@langchain/core/tools"; diff --git a/cdp-langchain/typescript/src/tests/cdp_tool_test.ts b/cdp-langchain/typescript/src/tests/cdp_tool_test.ts deleted file mode 100644 index 2ecf6bcac..000000000 --- a/cdp-langchain/typescript/src/tests/cdp_tool_test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { CdpAction, CdpActionSchemaAny, CdpAgentkit } from "@coinbase/cdp-agentkit-core"; -import { CdpTool } from "../tools/cdp_tool"; -import { z } from "zod"; - -const MOCK_DESCRIPTION = "CDP Test Action"; -const MOCK_NAME = "get_wallet_details"; - -describe("CdpTool", () => { - let mockAgentkit: jest.Mocked; - let mockAction: jest.Mocked>; - let cdpTool: CdpTool; - - beforeEach(() => { - mockAgentkit = { - run: jest.fn((action, args) => action.func(args)), - wallet: { - getDefaultAddress: jest.fn().mockResolvedValue({ getId: () => "mock-address" }), - }, - } as unknown as jest.Mocked; - - mockAction = { - name: MOCK_NAME, - description: MOCK_DESCRIPTION, - argsSchema: z.object({ wallet_id: z.string() }), - func: jest.fn().mockResolvedValue("Wallet details retrieved successfully"), - } as unknown as jest.Mocked>; - - cdpTool = new CdpTool(mockAction, mockAgentkit); - }); - - it("should initialize with correct properties", () => { - expect(cdpTool.name).toBe(MOCK_NAME); - expect(cdpTool.description).toBe(MOCK_DESCRIPTION); - expect(cdpTool.schema).toEqual(mockAction.argsSchema); - }); - - it("should execute action with valid args", async () => { - const args = { wallet_id: "0x123" }; - const response = await cdpTool.call(args); - - expect(mockAction.func).toHaveBeenCalledWith(args); - expect(response).toBe("Wallet details retrieved successfully"); - }); - - it("should handle schema validation errors", async () => { - const invalidArgs = { invalid_param: "test" }; - await expect(cdpTool.call(invalidArgs)).rejects.toThrow(); - expect(mockAction.func).not.toHaveBeenCalled(); - }); - - it("should return error message on action execution failure", async () => { - mockAction.func.mockRejectedValue(new Error("Failed to retrieve wallet details")); - const args = { wallet_id: "0x123" }; - const response = await cdpTool.call(args); - expect(response).toContain( - "Error executing get_wallet_details: Failed to retrieve wallet details", - ); - }); -}); diff --git a/cdp-langchain/typescript/src/tests/cdp_toolkit_test.ts b/cdp-langchain/typescript/src/tests/cdp_toolkit_test.ts deleted file mode 100644 index 7733e218f..000000000 --- a/cdp-langchain/typescript/src/tests/cdp_toolkit_test.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { CdpToolkit } from "../toolkits/cdp_toolkit"; -import { CdpTool } from "../tools/cdp_tool"; -import { CdpAction, CdpActionSchemaAny, CdpAgentkit } from "@coinbase/cdp-agentkit-core"; -import { z } from "zod"; - -describe("CdpToolkit", () => { - let mockAgentkit: jest.Mocked; - let mockActions: jest.Mocked>[]; - let cdpToolkit: CdpToolkit; - - beforeEach(() => { - mockAgentkit = { - run: jest.fn((action, args) => action.func(args)), - wallet: { - getDefaultAddress: jest.fn().mockResolvedValue({ getId: () => "mock-address" }), - }, - } as unknown as jest.Mocked; - - mockActions = [ - { - name: "get_wallet_details", - description: "Get wallet details", - argsSchema: z.object({ param1: z.string() }), - func: jest.fn().mockResolvedValue("success_1"), - }, - { - name: "get_balance", - description: "Get wallet balance", - argsSchema: z.object({ param2: z.string() }), - func: jest.fn().mockResolvedValue("success_2"), - }, - ]; - - cdpToolkit = new CdpToolkit(mockAgentkit); - cdpToolkit.tools = mockActions.map(action => new CdpTool(action, mockAgentkit)); - }); - - it("should initialize with correct tools", () => { - expect(cdpToolkit.tools).toHaveLength(mockActions.length); - expect(cdpToolkit.tools[0].name).toBe("get_wallet_details"); - expect(cdpToolkit.tools[1].name).toBe("get_balance"); - }); - - it("should execute action from toolkit", async () => { - const tool = cdpToolkit.tools[0]; - const args = { param1: "test" }; - const response = await tool.call(args); - - expect(mockActions[0].func).toHaveBeenCalledWith(args); - expect(response).toBe("success_1"); - }); - - it("should handle action execution failure", async () => { - const error = new Error("Execution failed"); - mockActions[0].func.mockRejectedValue(error); - - const tool = cdpToolkit.tools[0]; - const args = { param1: "test" }; - const response = await tool.call(args); - - expect(response).toContain(`Error executing get_wallet_details: ${error.message}`); - }); - - it("should return all available tools", () => { - const tools = cdpToolkit.getTools(); - - expect(tools).toHaveLength(mockActions.length); - expect(tools[0].name).toBe("get_wallet_details"); - expect(tools[1].name).toBe("get_balance"); - }); -}); diff --git a/cdp-langchain/typescript/src/toolkits/cdp_toolkit.ts b/cdp-langchain/typescript/src/toolkits/cdp_toolkit.ts deleted file mode 100644 index 10a7015b7..000000000 --- a/cdp-langchain/typescript/src/toolkits/cdp_toolkit.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { StructuredToolInterface, BaseToolkit as Toolkit } from "@langchain/core/tools"; -import { CDP_ACTIONS, CdpAgentkit } from "@coinbase/cdp-agentkit-core"; -import { CdpTool } from "../tools/cdp_tool"; - -/** - * Coinbase Developer Platform (CDP) Toolkit. - * - * Security Note: This toolkit contains tools that can read and modify - * the state of a service; e.g., by creating, deleting, or updating, - * reading underlying data. - * - * For example, this toolkit can be used to create wallets, transactions, - * and smart contract invocations on CDP supported blockchains. - * - * Setup: - * You will need to set the following environment variables: - * ```bash - * export CDP_API_KEY_NAME="cdp-api-key-name" - * export CDP_API_KEY_PRIVATE_KEY="cdp-api-key-private-key" - * export NETWORK_ID="network-id" - * ``` - * - * Example usage: - * ```typescript - * const agentkit = await CdpAgentkit.configureWithWallet(); - * const toolkit = new CdpToolkit(agentkit); - * const tools = toolkit.getTools(); - * - * // Available tools include: - * // - get_wallet_details - * // - get_balance - * // - get_balance_nft - * // - request_faucet_funds - * // - transfer - * // - transfer_nft - * // - trade - * // - deploy_token - * // - deploy_contract - * // - mint_nft - * // - deploy_nft - * // - register_basename - * // - wow_create_token - * // - wow_buy_token - * // - wow_sell_token - * // - wrap_eth - * ``` - */ -export class CdpToolkit extends Toolkit { - tools: StructuredToolInterface[]; - - /** - * Creates a new CDP Toolkit instance - * - * @param agentkit - CDP agentkit instance - */ - constructor(agentkit: CdpAgentkit) { - super(); - const actions = CDP_ACTIONS; - const tools = actions.map(action => new CdpTool(action, agentkit)); - this.tools = tools; - } -} diff --git a/cdp-langchain/typescript/src/tools/cdp_tool.ts b/cdp-langchain/typescript/src/tools/cdp_tool.ts deleted file mode 100644 index 5223b24a2..000000000 --- a/cdp-langchain/typescript/src/tools/cdp_tool.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { StructuredTool } from "@langchain/core/tools"; -import { CdpAgentkit, CdpAction, CdpActionSchemaAny } from "@coinbase/cdp-agentkit-core"; -import { z } from "zod"; - -/** - * This tool allows agents to interact with the cdp-sdk library and control an MPC Wallet onchain. - * - * To use this tool, you must first set as environment variables: - * CDP_API_KEY_NAME - * CDP_API_KEY_PRIVATE_KEY - * NETWORK_ID - */ -export class CdpTool extends StructuredTool { - /** - * Schema definition for the tool's input - */ - public schema: TActionSchema; - - /** - * The name of the tool - */ - public name: string; - - /** - * The description of the tool - */ - public description: string; - - /** - * The CDP Agentkit instance - */ - private agentkit: CdpAgentkit; - - /** - * The CDP Action - */ - private action: CdpAction; - - /** - * Constructor for the CDP Tool class - * - * @param action - The CDP action to execute - * @param agentkit - The CDP wrapper to use - */ - constructor(action: CdpAction, agentkit: CdpAgentkit) { - super(); - this.action = action; - this.agentkit = agentkit; - this.name = action.name; - this.description = action.description; - this.schema = action.argsSchema; - } - - /** - * Executes the CDP action with the provided input - * - * @param input - An object containing either instructions or schema-validated arguments - * @returns A promise that resolves to the result of the CDP action - * @throws {Error} If the CDP action fails - */ - protected async _call( - input: z.infer & Record, - ): Promise { - try { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let args: any; - - // If we have a schema, try to validate against it - if (this.schema) { - try { - const validatedInput = this.schema.parse(input); - args = validatedInput; - } catch (validationError) { - // If schema validation fails, fall back to instructions-only mode - args = input; - } - } - // No schema, use instructions mode - else { - args = input; - } - - return await this.agentkit.run(this.action, args); - } catch (error: unknown) { - if (error instanceof Error) { - return `Error executing ${this.name}: ${error.message}`; - } - return `Error executing ${this.name}: Unknown error occurred`; - } - } -} diff --git a/cdp-langchain/typescript/tsconfig.json b/cdp-langchain/typescript/tsconfig.json deleted file mode 100644 index 2e2cc2c33..000000000 --- a/cdp-langchain/typescript/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*.ts"], - "exclude": ["src/tests"] -} diff --git a/farcaster-langchain/README.md b/farcaster-langchain/README.md deleted file mode 100644 index 873a475a3..000000000 --- a/farcaster-langchain/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# CDP Agentkit Extension - Farcaster Langchain Toolkit - -This toolkit contains tools that enable an LLM agent to interact with Farcaster using Neynar's API. The toolkit provides a wrapper around the Neynar API, allowing agents to interact with Farcaster and perform actions like posting casts. - -For TypeScript, see [farcaster-langchain/typescript](./typescript/README.md). diff --git a/farcaster-langchain/examples/chatbot-typescript/.prettierignore b/farcaster-langchain/examples/chatbot-typescript/.prettierignore deleted file mode 100644 index a6949181a..000000000 --- a/farcaster-langchain/examples/chatbot-typescript/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -docs/ -dist/ -coverage/ -.github/ -src/client -**/**/*.json -*.md \ No newline at end of file diff --git a/farcaster-langchain/examples/chatbot-typescript/.prettierrc b/farcaster-langchain/examples/chatbot-typescript/.prettierrc deleted file mode 100644 index ffb416b74..000000000 --- a/farcaster-langchain/examples/chatbot-typescript/.prettierrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "tabWidth": 2, - "useTabs": false, - "semi": true, - "singleQuote": false, - "trailingComma": "all", - "bracketSpacing": true, - "arrowParens": "avoid", - "printWidth": 100, - "proseWrap": "never" -} diff --git a/farcaster-langchain/typescript/.eslintrc.json b/farcaster-langchain/typescript/.eslintrc.json deleted file mode 100644 index 91571ba7a..000000000 --- a/farcaster-langchain/typescript/.eslintrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "extends": ["../../.eslintrc.base.json"] -} diff --git a/farcaster-langchain/typescript/.prettierignore b/farcaster-langchain/typescript/.prettierignore deleted file mode 100644 index 20de531f4..000000000 --- a/farcaster-langchain/typescript/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -docs/ -dist/ -coverage/ -.github/ -src/client -**/**/*.json -*.md diff --git a/farcaster-langchain/typescript/.prettierrc b/farcaster-langchain/typescript/.prettierrc deleted file mode 100644 index ffb416b74..000000000 --- a/farcaster-langchain/typescript/.prettierrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "tabWidth": 2, - "useTabs": false, - "semi": true, - "singleQuote": false, - "trailingComma": "all", - "bracketSpacing": true, - "arrowParens": "avoid", - "printWidth": 100, - "proseWrap": "never" -} diff --git a/farcaster-langchain/typescript/CHANGELOG.md b/farcaster-langchain/typescript/CHANGELOG.md deleted file mode 100644 index 5d7781330..000000000 --- a/farcaster-langchain/typescript/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -# AgentKit.js Farcaster Langchain Extension Changelog - -## [0.0.1] - 2025-01-27 - -### Added - -- Initial release of `@coinbase/farcaster-langchain`. diff --git a/farcaster-langchain/typescript/README.md b/farcaster-langchain/typescript/README.md deleted file mode 100644 index 4452f40d6..000000000 --- a/farcaster-langchain/typescript/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# CDP Agentkit Extension - Farcaster Langchain Toolkit - -This toolkit contains tools that enable an LLM agent to interact with Farcaster using Neynar's API. The toolkit provides a wrapper around the Neynar API, allowing agents to interact with Farcaster and perform actions like posting casts. - -## Setup - -### Prerequisites - -- [Farcaster Account](https://docs.farcaster.xyz/developers/guides/accounts/create-account) -- [Neynar API Key](https://neynar.com) -- [Neynar Managed Signer ID](https://docs.neynar.com/docs/integrate-managed-signers) -- [OpenAI API Key](https://platform.openai.com/docs/quickstart#create-and-export-an-api-key) -- Node.js 18 or higher - -### Installation - -```bash -npm install @coinbase/farcaster-langchain -``` - -### Environment Setup - -Set the following environment variables: - -```bash -export CDP_API_KEY_NAME= -export CDP_API_KEY_PRIVATE_KEY=$'' -export AGENT_FID= -export NEYNAR_API_KEY= -export NEYNAR_MANAGED_SIGNER= -export OPENAI_API_KEY= -export NETWORK_ID=base-sepolia # Optional: Defaults to base-sepolia -``` - -## Usage - -### Basic Setup - -```typescript -import { FarcasterToolkit } from "@coinbase/farcaster-langchain"; -import { FarcasterAgentkit } from "@coinbase/cdp-agentkit-core"; - -// Initialize LLM - const llm = new ChatOpenAI({ model: "gpt-4o-mini" }); - -// Farcaster Agentkit -const farcasterAgentkit = new FarcasterAgentkit(); - -// Farcaster Toolkit -const farcasterToolkit = new FarcasterToolkit(farcasterAgentkit); - -// Get available Farcaster tools -const tools = farcasterToolkit.getTools(); -``` - -The toolkit provides the following tools: - -1. **farcaster_account_details** - Retrieve account details for the agent's Farcaster account -2. **farcaster_post_cast** - Post a cast to Farcaster - - -## Examples - -Check out [farcaster-langchain/examples](./examples) for sample implementations! -- [Chatbot Typescript](./examples/chatbot-typescript/README.md): Simple example of a Node.js Chatbot that can post casts to Farcaster. diff --git a/farcaster-langchain/typescript/package.json b/farcaster-langchain/typescript/package.json deleted file mode 100644 index 9e7d84366..000000000 --- a/farcaster-langchain/typescript/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "@coinbase/farcaster-langchain", - "version": "0.0.1", - "description": "Farcaster langchain Toolkit extension of CDP Agentkit", - "repository": "https://github.com/coinbase/agentkit", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "files": ["dist"], - "scripts": { - "build": "tsc", - "lint": "npx --yes eslint -c .eslintrc.json src/**/*.ts", - "lint:fix": "npx --yes eslint -c .eslintrc.json src/**/*.ts --fix", - "format": "npx --yes prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"", - "format-check": "npx --yes prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"", - "check": "tsc --noEmit", - "test": "npx jest --no-cache --testMatch='**/*_test.ts'", - "test:dry-run": "npm install && npm ci && npm publish --dry-run", - "test:e2e": "npx jest --no-cache --testMatch=**/e2e.ts --coverageThreshold '{}'", - "test:types": "tsd --files src/tests/types.test-d.ts", - "clean": "rm -rf dist/*", - "prepack": "tsc", - "docs": "npx --yes typedoc --entryPoints ./src --entryPointStrategy expand --exclude ./src/tests/**/*.ts", - "docs:serve": "http-server ./docs", - "dev": "tsc --watch" - }, - "keywords": [ - "cdp", - "sdk", - "agentkit", - "ai", - "agent", - "farcaster", - "nodejs", - "typescript", - "langchain" - ], - "dependencies": { - "@coinbase/cdp-agentkit-core": "^0.0.14", - "@langchain/core": "0.3.30", - "zod": "^3.22.4" - }, - "peerDependencies": { - "@coinbase/coinbase-sdk": "^0.15.0" - } -} diff --git a/farcaster-langchain/typescript/src/farcaster_tool.ts b/farcaster-langchain/typescript/src/farcaster_tool.ts deleted file mode 100644 index 7999a8464..000000000 --- a/farcaster-langchain/typescript/src/farcaster_tool.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { StructuredTool } from "@langchain/core/tools"; -import { z } from "zod"; -import { - FarcasterAction, - FarcasterActionSchemaAny, - FarcasterAgentkit, -} from "@coinbase/cdp-agentkit-core"; - -/** - * This tool allows agents to interact with the Farcaster API and control an authenticated Farcaster account. - * - * To use this tool, you must first configure with proper options or - * set the following environment variables: - * - AGENT_FID - * - NEYNAR_API_KEY - * - NEYNAR_MANAGED_SIGNER - */ -export class FarcasterTool extends StructuredTool { - /** - * Schema definition for the tool's input. - */ - public schema: TActionSchema; - - /** - * The name of the tool. - */ - public name: string; - - /** - * The description of the tool. - */ - public description: string; - - /** - * The Farcaster Agentkit instance. - */ - private agentkit: FarcasterAgentkit; - - /** - * The Farcaster Action. - */ - private action: FarcasterAction; - - /** - * Constructor for the Farcaster Tool class. - * - * @param action - The Farcaster action to execute. - * @param agentkit - The Farcaster wrapper to use. - */ - constructor(action: FarcasterAction, agentkit: FarcasterAgentkit) { - super(); - - this.action = action; - this.agentkit = agentkit; - this.name = action.name; - this.description = action.description; - this.schema = action.argsSchema; - } - - /** - * Executes the Farcaster action with the provided input. - * - * @param input - An object containing either instructions or schema-validated arguments. - * @returns A promise that resolves to the result of the Farcaster action. - */ - protected async _call( - input: z.infer & Record, - ): Promise { - try { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let args: any; - - // If we have a schema, try to validate against it - if (this.schema) { - try { - const validatedInput = this.schema.parse(input); - args = validatedInput; - } catch (validationError) { - // If schema validation fails, fall back to instructions-only mode - args = input; - } - } - // No schema, use instructions mode - else { - args = input; - } - - return await this.agentkit.run(this.action, args); - } catch (error: unknown) { - if (error instanceof Error) { - return `Error executing ${this.name}: ${error.message}`; - } - return `Error executing ${this.name}: Unknown error occurred`; - } - } -} diff --git a/farcaster-langchain/typescript/src/farcaster_toolkit.ts b/farcaster-langchain/typescript/src/farcaster_toolkit.ts deleted file mode 100644 index e2e429f6a..000000000 --- a/farcaster-langchain/typescript/src/farcaster_toolkit.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { StructuredToolInterface, BaseToolkit as Toolkit } from "@langchain/core/tools"; -import { FARCASTER_ACTIONS, FarcasterAgentkit } from "@coinbase/cdp-agentkit-core"; -import { FarcasterTool } from "./farcaster_tool"; - -/** - * Farcaster Toolkit. - * - * Security Note: This toolkit contains tools that can read and modify - * the state of a service; e.g., by creating, deleting, or updating, - * reading underlying data. - * - * For example, this toolkit can be used to retrieve account details, post casts, - * and anything else you can implement with the Farcaster API! - * - * Setup: - * You will need to set the following environment variables: - * ```bash - * export OPENAI_API_KEY= - * export AGENT_FID= - * export NEYNAR_API_KEY= - * export NEYNAR_MANAGED_SIGNER= - * ``` - * - * Example usage: - * ```typescript - * // optional if not available via the ENV - * const options = { - * agentFid: "", - * neynarApiKey: "", - * neynarManagedSigner: "" - * }; - * - * const agentkit = await FarcasterAgentkit.configureWithOptions(options); - * const toolkit = new FarcasterToolkit(agentkit); - * const tools = toolkit.getTools(); - * - * // Available tools include: - * // - farcaster_account_details - * // - farcaster_post_cast - * ``` - */ -export class FarcasterToolkit extends Toolkit { - tools: StructuredToolInterface[]; - - /** - * Creates a new Farcaster Toolkit instance - * - * @param agentkit - Farcaster agentkit instance - */ - constructor(agentkit: FarcasterAgentkit) { - super(); - const actions = FARCASTER_ACTIONS; - const tools = actions.map(action => new FarcasterTool(action, agentkit)); - this.tools = tools; - } -} diff --git a/farcaster-langchain/typescript/src/index.ts b/farcaster-langchain/typescript/src/index.ts deleted file mode 100644 index 788eca284..000000000 --- a/farcaster-langchain/typescript/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Export Farcaster tool -export { FarcasterTool } from "./farcaster_tool"; - -// Export Farcaster toolkit -export { FarcasterToolkit } from "./farcaster_toolkit"; diff --git a/farcaster-langchain/typescript/src/tests/farcaster_tool_test.ts b/farcaster-langchain/typescript/src/tests/farcaster_tool_test.ts deleted file mode 100644 index 854122548..000000000 --- a/farcaster-langchain/typescript/src/tests/farcaster_tool_test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - FarcasterAction, - FarcasterActionSchemaAny, - FarcasterAgentkit, -} from "@coinbase/cdp-agentkit-core"; -import { FarcasterTool } from "../farcaster_tool"; -import { z } from "zod"; - -const MOCK_DESCRIPTION = "Farcaster Test Action"; -const MOCK_NAME = "test_action"; - -describe("FarcasterTool", () => { - let mockAgentkit: jest.Mocked; - let mockAction: jest.Mocked>; - let farcasterTool: FarcasterTool; - - beforeEach(() => { - mockAgentkit = { - run: jest.fn((action, args) => action.func(mockAgentkit, args)), - } as unknown as jest.Mocked; - - mockAction = { - name: MOCK_NAME, - description: MOCK_DESCRIPTION, - argsSchema: z.object({ test_param: z.string() }), - func: jest.fn().mockResolvedValue("success"), - } as unknown as jest.Mocked>; - - farcasterTool = new FarcasterTool(mockAction, mockAgentkit); - }); - - it("should initialize with correct properties", () => { - expect(farcasterTool.name).toBe(MOCK_NAME); - expect(farcasterTool.description).toBe(MOCK_DESCRIPTION); - expect(farcasterTool.schema).toEqual(mockAction.argsSchema); - }); - - it("should execute action with valid args", async () => { - const args = { test_param: "test" }; - const response = await farcasterTool.call(args); - - expect(mockAction.func).toHaveBeenCalledWith(mockAgentkit, args); - expect(response).toBe("success"); - }); - - it("should handle schema validation errors", async () => { - const invalidargs = { invalid_param: "test" }; - await expect(farcasterTool.call(invalidargs)).rejects.toThrow(); - expect(mockAction.func).not.toHaveBeenCalled(); - }); - - it("should return error message on action execution failure", async () => { - mockAction.func.mockRejectedValue(new Error("Execution failed")); - const args = { test_param: "test" }; - const response = await farcasterTool.call(args); - expect(response).toContain("Error executing test_action: Execution failed"); - }); -}); diff --git a/farcaster-langchain/typescript/src/tests/farcaster_toolkit_test.ts b/farcaster-langchain/typescript/src/tests/farcaster_toolkit_test.ts deleted file mode 100644 index 1954bebb8..000000000 --- a/farcaster-langchain/typescript/src/tests/farcaster_toolkit_test.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { FarcasterToolkit } from "../farcaster_toolkit"; -import { FarcasterTool } from "../farcaster_tool"; -import { - FarcasterAction, - FarcasterActionSchemaAny, - FarcasterAgentkit, -} from "@coinbase/cdp-agentkit-core"; -import { z } from "zod"; - -describe("FarcasterToolkit", () => { - let mockAgentkit: jest.Mocked; - let mockActions: jest.Mocked>[]; - let farcasterToolkit: FarcasterToolkit; - - beforeEach(() => { - mockAgentkit = { - run: jest.fn((action, args) => action.func(mockAgentkit, args)), - } as unknown as jest.Mocked; - - mockActions = [ - { - name: "farcaster_account_details", - description: "Retrieve Farcaster account details", - argsSchema: z.object({}), - func: jest.fn().mockResolvedValue("Successfully retrieved Farcaster account details"), - }, - { - name: "farcaster_post_cast", - description: "Post a new cast", - argsSchema: z.object({ castText: z.string() }), - func: jest.fn().mockResolvedValue("Cast posted successfully"), - }, - ]; - - farcasterToolkit = new FarcasterToolkit(mockAgentkit); - farcasterToolkit.tools = mockActions.map(action => new FarcasterTool(action, mockAgentkit)); - }); - - it("should initialize with correct tools", () => { - expect(farcasterToolkit.tools).toHaveLength(mockActions.length); - expect(farcasterToolkit.tools[0].name).toBe("farcaster_account_details"); - expect(farcasterToolkit.tools[1].name).toBe("farcaster_post_cast"); - }); - - it("should execute action from toolkit", async () => { - const tool = farcasterToolkit.tools[1]; - const args = { castText: "Hello world" }; - const response = await tool.call(args); - - expect(mockActions[1].func).toHaveBeenCalledWith(mockAgentkit, args); - expect(response).toBe("Cast posted successfully"); - }); - - it("should handle action execution failure", async () => { - const error = new Error("Failed to post cast"); - mockActions[1].func.mockRejectedValue(error); - - const tool = farcasterToolkit.tools[1]; - const args = { castText: "Hello world" }; - const response = await tool.call(args); - - expect(response).toContain(`Error executing farcaster_post_cast: ${error.message}`); - }); - - it("should return all available tools", () => { - const tools = farcasterToolkit.getTools(); - - expect(tools).toHaveLength(mockActions.length); - expect(tools[0].name).toBe("farcaster_account_details"); - expect(tools[1].name).toBe("farcaster_post_cast"); - }); -}); diff --git a/jest.config.base.cjs b/jest.config.base.cjs index c614ded84..241384783 100644 --- a/jest.config.base.cjs +++ b/jest.config.base.cjs @@ -8,6 +8,7 @@ module.exports = { coverageReporters: ["html"], verbose: true, maxWorkers: 1, + passWithNoTests: true, coverageThreshold: { "./src/**": { branches: 77, diff --git a/package-lock.json b/package-lock.json index 9913a9689..4b9478293 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,21 +7,20 @@ "name": "cdp-agentkit-monorepo", "license": "Apache-2.0", "workspaces": [ - "cdp-agentkit-core/typescript", - "cdp-langchain/examples/chatbot-typescript", - "cdp-langchain/typescript", - "twitter-langchain/typescript", - "twitter-langchain/examples/chatbot-typescript", - "farcaster-langchain/typescript", - "farcaster-langchain/examples/chatbot-typescript" + "typescript/agentkit", + "typescript/framework-extensions/langchain", + "typescript/examples/langchain-cdp-chatbot", + "typescript/examples/langchain-twitter-chatbot", + "typescript/examples/langchain-farcaster-chatbot" ], "devDependencies": { "@types/jest": "^29.5.14", "@types/node": "^20.12.11", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", + "@typescript-eslint/eslint-plugin": "^8.22.0", + "@typescript-eslint/parser": "^8.22.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsdoc": "^48.2.5", "eslint-plugin-prettier": "^5.1.3", "jest": "^29.7.0", @@ -35,11 +34,14 @@ "cdp-agentkit-core/typescript": { "name": "@coinbase/cdp-agentkit-core", "version": "0.0.14", + "extraneous": true, "license": "Apache-2.0", "dependencies": { - "@coinbase/coinbase-sdk": "^0.15.0", + "@coinbase/coinbase-sdk": "^0.17.0", + "md5": "^2.3.0", + "reflect-metadata": "^0.2.2", "twitter-api-v2": "^1.18.2", - "viem": "^2.21.51", + "viem": "^2.22.16", "zod": "^3.23.8" }, "devDependencies": { @@ -56,6 +58,7 @@ "cdp-langchain/examples/chatbot-typescript": { "name": "@coinbase/cdp-langchain-chatbot-example", "version": "1.0.0", + "extraneous": true, "license": "Apache-2.0", "dependencies": { "@coinbase/cdp-agentkit-core": "^0.0.14", @@ -71,52 +74,36 @@ "ts-node": "^10.9.2" } }, - "cdp-langchain/typescript": { - "name": "@coinbase/cdp-langchain", - "version": "0.0.15", + "cdp-langchain/examples/farcaster-typescript": { + "name": "@coinbase/cdp-langchain-farcaster-chatbot-example", + "version": "1.0.0", + "extraneous": true, "license": "Apache-2.0", "dependencies": { "@coinbase/cdp-agentkit-core": "^0.0.14", - "@coinbase/coinbase-sdk": "^0.15.0", + "@coinbase/cdp-langchain": "^0.0.15", "@langchain/core": "^0.3.19", + "@langchain/langgraph": "^0.2.21", + "@langchain/openai": "^0.3.14", + "dotenv": "^16.4.5", "zod": "^3.22.4" }, - "peerDependencies": { - "@coinbase/coinbase-sdk": "^0.15.0" - } - }, - "cdp-langchain/typescript/node_modules/@coinbase/cdp-agentkit-core/node_modules/@coinbase/coinbase-sdk": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@coinbase/coinbase-sdk/-/coinbase-sdk-0.14.1.tgz", - "integrity": "sha512-3goViecQEPvUBndle4nTF8Sv4lIEOe6lad05yG3ZRIhj0tgfn2hI9i6V+eZ3np+sAQQO1J+6uL2j9PH/AMWtiw==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "@scure/bip32": "^1.4.0", - "abitype": "^1.0.6", - "axios": "^1.6.8", - "axios-mock-adapter": "^1.22.0", - "axios-retry": "^4.4.1", - "bip32": "^4.0.0", - "bip39": "^3.1.0", - "decimal.js": "^10.4.3", - "dotenv": "^16.4.5", - "ethers": "^6.12.1", - "node-jose": "^2.2.0", - "secp256k1": "^5.0.0", - "viem": "^2.21.26" + "devDependencies": { + "nodemon": "^3.1.0", + "ts-node": "^10.9.2" } }, - "farcaster-langchain/examples/chatbot-typescript": { - "name": "@coinbase/farcaster-langchain-chatbot-example", + "cdp-langchain/examples/twitter-typescript": { + "name": "@coinbase/cdp-langchain-twitter-chatbot-example", "version": "1.0.0", + "extraneous": true, "license": "Apache-2.0", "dependencies": { - "@coinbase/cdp-agentkit-core": "^0.0.13", - "@coinbase/farcaster-langchain": "^0.0.1", - "@langchain/core": "0.3.30", - "@langchain/langgraph": "^0.2.39", - "@langchain/openai": "^0.3.16", + "@coinbase/cdp-agentkit-core": "^0.0.14", + "@coinbase/cdp-langchain": "^0.0.15", + "@langchain/core": "^0.3.19", + "@langchain/langgraph": "^0.2.21", + "@langchain/openai": "^0.3.14", "dotenv": "^16.4.5", "zod": "^3.22.4" }, @@ -125,83 +112,29 @@ "ts-node": "^10.9.2" } }, - "farcaster-langchain/examples/chatbot-typescript/node_modules/@coinbase/cdp-agentkit-core": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@coinbase/cdp-agentkit-core/-/cdp-agentkit-core-0.0.13.tgz", - "integrity": "sha512-4hRRnRMvX0lB6a2r8Nllhlxrhcy2lC6mMfg5jnLKGfMmJXvZ3hqjMH7eziy4Vm+msihu0OBqEVIA24qtGOxJtQ==", + "cdp-langchain/typescript": { + "name": "@coinbase/cdp-langchain", + "version": "0.0.15", + "extraneous": true, "license": "Apache-2.0", - "dependencies": { - "@coinbase/coinbase-sdk": "^0.14.1", - "twitter-api-v2": "^1.18.2", - "viem": "^2.21.51", - "zod": "^3.23.8" - } - }, - "farcaster-langchain/examples/chatbot-typescript/node_modules/@coinbase/coinbase-sdk": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@coinbase/coinbase-sdk/-/coinbase-sdk-0.14.1.tgz", - "integrity": "sha512-3goViecQEPvUBndle4nTF8Sv4lIEOe6lad05yG3ZRIhj0tgfn2hI9i6V+eZ3np+sAQQO1J+6uL2j9PH/AMWtiw==", - "license": "ISC", - "dependencies": { - "@scure/bip32": "^1.4.0", - "abitype": "^1.0.6", - "axios": "^1.6.8", - "axios-mock-adapter": "^1.22.0", - "axios-retry": "^4.4.1", - "bip32": "^4.0.0", - "bip39": "^3.1.0", - "decimal.js": "^10.4.3", - "dotenv": "^16.4.5", - "ethers": "^6.12.1", - "node-jose": "^2.2.0", - "secp256k1": "^5.0.0", - "viem": "^2.21.26" - } - }, - "farcaster-langchain/typescript": { - "name": "@coinbase/farcaster-langchain", - "version": "0.0.1", "dependencies": { "@coinbase/cdp-agentkit-core": "^0.0.14", - "@langchain/core": "0.3.30", + "@coinbase/coinbase-sdk": "^0.15.0", + "@langchain/core": "^0.3.19", "zod": "^3.22.4" }, "peerDependencies": { "@coinbase/coinbase-sdk": "^0.15.0" } }, - "farcaster-langchain/typescript/node_modules/@coinbase/cdp-agentkit-core/node_modules/@coinbase/coinbase-sdk": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@coinbase/coinbase-sdk/-/coinbase-sdk-0.14.1.tgz", - "integrity": "sha512-3goViecQEPvUBndle4nTF8Sv4lIEOe6lad05yG3ZRIhj0tgfn2hI9i6V+eZ3np+sAQQO1J+6uL2j9PH/AMWtiw==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "@scure/bip32": "^1.4.0", - "abitype": "^1.0.6", - "axios": "^1.6.8", - "axios-mock-adapter": "^1.22.0", - "axios-retry": "^4.4.1", - "bip32": "^4.0.0", - "bip39": "^3.1.0", - "decimal.js": "^10.4.3", - "dotenv": "^16.4.5", - "ethers": "^6.12.1", - "node-jose": "^2.2.0", - "secp256k1": "^5.0.0", - "viem": "^2.21.26" - } - }, "node_modules/@adraffy/ens-normalize": { "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" + "license": "MIT" }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -212,9 +145,8 @@ }, "node_modules/@babel/code-frame": { "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", @@ -226,18 +158,16 @@ }, "node_modules/@babel/compat-data": { "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", - "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.0", @@ -265,18 +195,16 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.26.5", "@babel/types": "^7.26.5", @@ -290,9 +218,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", @@ -306,18 +233,16 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -328,9 +253,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", @@ -345,45 +269,40 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", "@babel/types": "^7.26.0" @@ -394,9 +313,8 @@ }, "node_modules/@babel/parser": { "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.26.5" }, @@ -409,9 +327,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -421,9 +338,8 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -433,9 +349,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -445,9 +360,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -460,9 +374,8 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -475,9 +388,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -487,9 +399,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -499,9 +410,8 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -514,9 +424,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -526,9 +435,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -538,9 +446,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -550,9 +457,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -562,9 +468,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -574,9 +479,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -586,9 +490,8 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -601,9 +504,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -616,9 +518,8 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -631,9 +532,8 @@ }, "node_modules/@babel/template": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.25.9", "@babel/parser": "^7.25.9", @@ -645,9 +545,8 @@ }, "node_modules/@babel/traverse": { "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", - "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", @@ -663,18 +562,16 @@ }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/types": { "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -685,31 +582,28 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@cfworker/json-schema": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.0.tgz", - "integrity": "sha512-/vYKi/qMxwNsuIJ9WGWwM2rflY40ZenK3Kh4uR5vB9/Nz12Y7IUN/Xf4wDA7vzPfw0VNh3b/jz4+MjcVgARKJg==" + "license": "MIT" }, - "node_modules/@coinbase/cdp-agentkit-core": { - "resolved": "cdp-agentkit-core/typescript", + "node_modules/@coinbase/agentkit": { + "resolved": "typescript/agentkit", "link": true }, - "node_modules/@coinbase/cdp-langchain": { - "resolved": "cdp-langchain/typescript", + "node_modules/@coinbase/agentkit-langchain": { + "resolved": "typescript/framework-extensions/langchain", "link": true }, "node_modules/@coinbase/cdp-langchain-chatbot-example": { - "resolved": "cdp-langchain/examples/chatbot-typescript", + "resolved": "typescript/examples/langchain-cdp-chatbot", "link": true }, "node_modules/@coinbase/coinbase-sdk": { "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@coinbase/coinbase-sdk/-/coinbase-sdk-0.15.0.tgz", - "integrity": "sha512-i2YH/E/HcvUM+VgT+245CzcAyJ6kQg8PJDHBHsFwFdk2vAn+iQn0bjt+C9kgTWvzxUuJA4koHgkcGpdRQa2F/A==", + "license": "ISC", "dependencies": { "@scure/bip32": "^1.4.0", "abitype": "^1.0.6", @@ -726,26 +620,16 @@ "viem": "^2.21.26" } }, - "node_modules/@coinbase/farcaster-langchain": { - "resolved": "farcaster-langchain/typescript", - "link": true - }, "node_modules/@coinbase/farcaster-langchain-chatbot-example": { - "resolved": "farcaster-langchain/examples/chatbot-typescript", - "link": true - }, - "node_modules/@coinbase/twitter-langchain": { - "resolved": "twitter-langchain/typescript", + "resolved": "typescript/examples/langchain-farcaster-chatbot", "link": true }, "node_modules/@coinbase/twitter-langchain-chatbot-example": { - "resolved": "twitter-langchain/examples/chatbot-typescript", + "resolved": "typescript/examples/langchain-twitter-chatbot", "link": true }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "license": "MIT", "dependencies": { @@ -757,8 +641,6 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -768,9 +650,8 @@ }, "node_modules/@es-joy/jsdoccomment": { "version": "0.46.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.46.0.tgz", - "integrity": "sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==", "dev": true, + "license": "MIT", "dependencies": { "comment-parser": "1.4.1", "esquery": "^1.6.0", @@ -782,9 +663,8 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -800,18 +680,16 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -832,9 +710,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -842,9 +719,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -854,18 +730,16 @@ }, "node_modules/@eslint/js": { "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@gerrit0/mini-shiki": { "version": "1.27.2", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz", - "integrity": "sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==", "dev": true, + "license": "MIT", "dependencies": { "@shikijs/engine-oniguruma": "^1.27.2", "@shikijs/types": "^1.27.2", @@ -874,10 +748,8 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -889,9 +761,8 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -899,9 +770,8 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -911,9 +781,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -924,16 +793,13 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -947,18 +813,16 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -969,9 +833,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -982,9 +845,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -994,9 +856,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -1009,9 +870,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -1021,27 +881,24 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/console": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -1056,9 +913,8 @@ }, "node_modules/@jest/core": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -1103,9 +959,8 @@ }, "node_modules/@jest/environment": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -1118,9 +973,8 @@ }, "node_modules/@jest/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -1131,9 +985,8 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1143,9 +996,8 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -1160,9 +1012,8 @@ }, "node_modules/@jest/globals": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -1175,9 +1026,8 @@ }, "node_modules/@jest/reporters": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, + "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -1218,9 +1068,8 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1230,9 +1079,8 @@ }, "node_modules/@jest/source-map": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -1244,9 +1092,8 @@ }, "node_modules/@jest/test-result": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -1259,9 +1106,8 @@ }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -1274,9 +1120,8 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -1300,9 +1145,8 @@ }, "node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1317,9 +1161,8 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1331,49 +1174,44 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@langchain/core": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.30.tgz", - "integrity": "sha512-HFUpjJ6FkPSSeLKzCLKxba4VN1DKnrXRmjaWHDb5KUyE9DZrqak3Sh6k2dkzXDJIcdd/uNeeQGFyQnubVEMkPw==", + "version": "0.3.37", + "license": "MIT", "dependencies": { "@cfworker/json-schema": "^4.0.2", "ansi-styles": "^5.0.0", "camelcase": "6", "decamelize": "1.2.0", "js-tiktoken": "^1.0.12", - "langsmith": "^0.2.8", + "langsmith": ">=0.2.8 <0.4.0", "mustache": "^4.2.0", "p-queue": "^6.6.2", "p-retry": "4", @@ -1387,8 +1225,7 @@ }, "node_modules/@langchain/core/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -1398,8 +1235,7 @@ }, "node_modules/@langchain/core/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -1407,13 +1243,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@langchain/langgraph": { - "version": "0.2.41", - "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.2.41.tgz", - "integrity": "sha512-NeNizWP4k9voEwJxuFtfopF02Lx1isuEsdZKYCN3ueJpOnkVg0iGx8woPBsQpYcrWcySkIt3zOkgtUsrNHqo3g==", + "node_modules/@langchain/core/node_modules/langsmith": { + "version": "0.3.4", "license": "MIT", "dependencies": { - "@langchain/langgraph-checkpoint": "~0.0.13", + "@types/uuid": "^10.0.0", + "chalk": "^4.1.2", + "console-table-printer": "^2.12.1", + "p-queue": "^6.6.2", + "p-retry": "4", + "semver": "^7.6.3", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "openai": "*" + }, + "peerDependenciesMeta": { + "openai": { + "optional": true + } + } + }, + "node_modules/@langchain/langgraph": { + "version": "0.2.44", + "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-0.2.44.tgz", + "integrity": "sha512-CR9LB7sytdx0Ink56qVUPorDo5gW5m7iOU2ypu1OYA4l5aIrT4xGvHCwrGH9RE80pb/d0FglVUkEgEfuvSDbmw==", + "dependencies": { + "@langchain/langgraph-checkpoint": "~0.0.15", "@langchain/langgraph-sdk": "~0.0.32", "uuid": "^10.0.0", "zod": "^3.23.8" @@ -1426,10 +1282,9 @@ } }, "node_modules/@langchain/langgraph-checkpoint": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-0.0.13.tgz", - "integrity": "sha512-amdmBcNT8a9xP2VwcEWxqArng4gtRDcnVyVI4DsQIo1Aaz8e8+hH17zSwrUF3pt1pIYztngIfYnBOim31mtKMg==", - "license": "MIT", + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-0.0.15.tgz", + "integrity": "sha512-AiJkvsYHqNbCh1Tx823qs2lf2qRqeB4EAMejirOk8gkpPszAGYua5c3niKYkcKR2tU8Snhrmj7Gm9HKZSFOXyw==", "dependencies": { "uuid": "^10.0.0" }, @@ -1444,7 +1299,6 @@ "version": "0.0.36", "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.36.tgz", "integrity": "sha512-KkAZM0uXBaMcD/dpGTBppOhbvNX6gz+Y1zFAC898OblegFkSvICrkd0oRQ5Ro/GWK/NAoDymnMUDXeZDdUkSuw==", - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.15", "p-queue": "^6.6.2", @@ -1460,7 +1314,6 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -1469,7 +1322,6 @@ "version": "0.3.17", "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.3.17.tgz", "integrity": "sha512-uw4po32OKptVjq+CYHrumgbfh4NuD7LqyE+ZgqY9I/LrLc6bHLMc+sisHmI17vgek0K/yqtarI0alPJbzrwyag==", - "license": "MIT", "dependencies": { "js-tiktoken": "^1.0.12", "openai": "^4.77.0", @@ -1484,19 +1336,17 @@ } }, "node_modules/@langchain/openai/node_modules/@types/node": { - "version": "18.19.71", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.71.tgz", - "integrity": "sha512-evXpcgtZm8FY4jqBSN8+DmOTcVkkvTmAayeo4Wf3m1xAruyVGzGuDh/Fb/WWX2yLItUiho42ozyJjB0dw//Tkw==", - "license": "MIT", + "version": "18.19.74", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.74.tgz", + "integrity": "sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@langchain/openai/node_modules/openai": { - "version": "4.79.4", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.79.4.tgz", - "integrity": "sha512-c3rCDLDK4N6TpE4yQ1sl8eIkYET3tRjFcvm4lGga0qlBxaNL9RqUXg9DuhU+/UpzS3XA9dnRlc1H0vyQTRy65Q==", - "license": "Apache-2.0", + "version": "4.82.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.82.0.tgz", + "integrity": "sha512-1bTxOVGZuVGsKKUWbh3BEwX1QxIXUftJv+9COhhGGVDTFwiaOd4gWsMynF2ewj1mg6by3/O+U8+EEHpWRdPaJg==", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", @@ -1525,14 +1375,12 @@ "node_modules/@langchain/openai/node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/@langchain/openai/node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "license": "MIT", "optional": true, "peer": true, "engines": { @@ -1552,11 +1400,10 @@ } }, "node_modules/@noble/curves": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.0.tgz", - "integrity": "sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==", + "version": "1.8.1", + "license": "MIT", "dependencies": { - "@noble/hashes": "1.7.0" + "@noble/hashes": "1.7.1" }, "engines": { "node": "^14.21.3 || >=16" @@ -1566,9 +1413,8 @@ } }, "node_modules/@noble/hashes": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.0.tgz", - "integrity": "sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==", + "version": "1.7.1", + "license": "MIT", "engines": { "node": "^14.21.3 || >=16" }, @@ -1578,9 +1424,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1591,18 +1436,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1613,9 +1456,8 @@ }, "node_modules/@pkgr/core": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -1623,45 +1465,36 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, "node_modules/@scure/base": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.1.tgz", - "integrity": "sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==", + "version": "1.2.4", + "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.1.tgz", - "integrity": "sha512-jSO+5Ud1E588Y+LFo8TaB8JVPNAZw/lGGao+1SepHDeTs2dFLurdNIAgUuDlwezqEjRjElkCJajVrtrZaBxvaQ==", + "version": "1.6.2", + "license": "MIT", "dependencies": { - "@noble/curves": "~1.8.0", - "@noble/hashes": "~1.7.0", - "@scure/base": "~1.2.1" + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.0.tgz", - "integrity": "sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==", + "version": "1.5.4", + "license": "MIT", "dependencies": { - "@noble/hashes": "~1.6.0", - "@scure/base": "~1.2.1" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", - "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", - "engines": { - "node": "^14.21.3 || >=16" + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -1669,9 +1502,8 @@ }, "node_modules/@shikijs/engine-oniguruma": { "version": "1.27.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.27.2.tgz", - "integrity": "sha512-FZYKD1KN7srvpkz4lbGLOYWlyDU4Rd+2RtuKfABTkafAPOFr+J6umfIwY/TzOQqfNtWjL7SAwPAO0dcOraRLaQ==", "dev": true, + "license": "MIT", "dependencies": { "@shikijs/types": "1.27.2", "@shikijs/vscode-textmate": "^10.0.1" @@ -1679,9 +1511,8 @@ }, "node_modules/@shikijs/types": { "version": "1.27.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.27.2.tgz", - "integrity": "sha512-DM9OWUyjmdYdnKDpaGB/GEn9XkToyK1tqxuqbmc5PV+5K8WjjwfygL3+cIvbkSw2v1ySwHDgqATq/+98pJ4Kyg==", "dev": true, + "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" @@ -1689,76 +1520,62 @@ }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", - "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@tsconfig/node10": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true, "license": "MIT" }, "node_modules/@tsd/typescript": { "version": "5.4.5", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-saiCxzHRhUrRxQV2JhH580aQUZiKQUXI38FcAcikcfOomAil4G4lxT0RfrrKywoAYP/rqAdYXYmNRLppcd+hQQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.17" } }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -1769,18 +1586,16 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -1788,18 +1603,16 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/eslint": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "optional": true, "peer": true, "dependencies": { @@ -1809,57 +1622,50 @@ }, "node_modules/@types/estree": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/graceful-fs": { "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/hast": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -1867,19 +1673,21 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "20.17.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.12.tgz", - "integrity": "sha512-vo/wmBgMIiEA23A/knMfn/cf37VnuF52nZh5ZoW0GWt4e4sxNquibrMRJ7UQsA06+MBx9r/H1jsI9grYjQCQlw==", + "license": "MIT", "dependencies": { "undici-types": "~6.19.2" } @@ -1888,7 +1696,6 @@ "version": "2.6.12", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", - "license": "MIT", "dependencies": { "@types/node": "*", "form-data": "^4.0.0" @@ -1896,128 +1703,109 @@ }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + "license": "MIT" }, "node_modules/@types/secp256k1": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", - "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/stack-utils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/uuid": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==" + "license": "MIT" }, "node_modules/@types/yargs": { "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "version": "8.22.0", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/type-utils": "8.22.0", + "@typescript-eslint/utils": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "version": "8.22.0", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/typescript-estree": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "version": "8.22.0", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2025,39 +1813,33 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "version": "8.22.0", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/typescript-estree": "8.22.0", + "@typescript-eslint/utils": "8.22.0", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "version": "8.22.0", "dev": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2065,82 +1847,87 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "version": "8.22.0", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/visitor-keys": "8.22.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "version": "8.22.0", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@typescript-eslint/scope-manager": "8.22.0", + "@typescript-eslint/types": "8.22.0", + "@typescript-eslint/typescript-estree": "8.22.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "version": "8.22.0", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.22.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/abitype": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", - "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/wevm" }, @@ -2161,7 +1948,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -2171,9 +1957,8 @@ }, "node_modules/acorn": { "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2183,17 +1968,14 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", "dependencies": { @@ -2205,14 +1987,12 @@ }, "node_modules/aes-js": { "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + "license": "MIT" }, "node_modules/agentkeepalive": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "license": "MIT", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -2222,9 +2002,8 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2238,9 +2017,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -2253,9 +2031,8 @@ }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2265,18 +2042,15 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2289,9 +2063,8 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2302,59 +2075,179 @@ }, "node_modules/are-docs-informative": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arrify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/axios": { "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -2363,8 +2256,7 @@ }, "node_modules/axios-mock-adapter": { "version": "1.22.0", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", - "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" @@ -2375,8 +2267,7 @@ }, "node_modules/axios-retry": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.5.0.tgz", - "integrity": "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==", + "license": "Apache-2.0", "dependencies": { "is-retry-allowed": "^2.2.0" }, @@ -2386,9 +2277,8 @@ }, "node_modules/babel-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -2407,9 +2297,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -2423,9 +2312,8 @@ }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -2439,18 +2327,16 @@ }, "node_modules/babel-plugin-istanbul/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -2463,9 +2349,8 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -2489,9 +2374,8 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, + "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -2505,22 +2389,18 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base-x": { "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -2534,21 +2414,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/base64url": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/basic-auth": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.1.2" }, @@ -2561,7 +2440,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -2571,8 +2449,7 @@ }, "node_modules/bip32": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-4.0.0.tgz", - "integrity": "sha512-aOGy88DDlVUhspIXJN+dVEtclhIsfAUppD43V0j40cPTld3pv/0X/MlrZSZ6jowIaQQzFwP8M6rFU2z2mVYjDQ==", + "license": "MIT", "dependencies": { "@noble/hashes": "^1.2.0", "@scure/base": "^1.1.1", @@ -2585,31 +2462,27 @@ }, "node_modules/bip39": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", - "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "license": "ISC", "dependencies": { "@noble/hashes": "^1.2.0" } }, "node_modules/bn.js": { "version": "4.12.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -2619,13 +2492,10 @@ }, "node_modules/brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "license": "MIT" }, "node_modules/browserslist": { "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -2641,6 +2511,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -2656,9 +2527,8 @@ }, "node_modules/bs-logger": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, + "license": "MIT", "dependencies": { "fast-json-stable-stringify": "2.x" }, @@ -2668,16 +2538,14 @@ }, "node_modules/bs58": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", "dependencies": { "base-x": "^3.0.2" } }, "node_modules/bs58check": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "license": "MIT", "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -2686,17 +2554,14 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -2711,6 +2576,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -2718,18 +2584,33 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "node_modules/call-bind": { + "version": "1.0.8", "dev": true, + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" @@ -2737,9 +2618,8 @@ }, "node_modules/call-bound": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" @@ -2753,27 +2633,24 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase-keys": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -2788,8 +2665,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001692", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", - "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", "dev": true, "funding": [ { @@ -2804,13 +2679,12 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2824,19 +2698,24 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, + "node_modules/charenc": { + "version": "0.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2861,7 +2740,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2871,8 +2749,6 @@ }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -2880,14 +2756,14 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cipher-base": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", - "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1" @@ -2898,8 +2774,6 @@ }, "node_modules/cipher-base/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -2913,19 +2787,18 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/cjs-module-lexer": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -2937,9 +2810,8 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -2947,15 +2819,12 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2965,14 +2834,11 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -2990,38 +2856,40 @@ }, "node_modules/comment-parser": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.0.0" } }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/console-table-printer": { + "version": "2.12.1", + "license": "MIT", + "dependencies": { + "simple-wcswidth": "^1.0.1" + } }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/corser": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -3032,9 +2900,8 @@ }, "node_modules/create-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -3053,16 +2920,13 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3072,11 +2936,65 @@ "node": ">= 8" } }, + "node_modules/crypt": { + "version": "0.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -3091,17 +3009,15 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decamelize-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -3115,23 +3031,20 @@ }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decimal.js": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + "license": "MIT" }, "node_modules/dedent": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, + "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -3143,40 +3056,66 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -3185,18 +3124,16 @@ }, "node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -3206,9 +3143,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3218,8 +3154,7 @@ }, "node_modules/dotenv": { "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -3229,9 +3164,8 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -3243,9 +3177,8 @@ }, "node_modules/ejs": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -3258,14 +3191,12 @@ }, "node_modules/electron-to-chromium": { "version": "1.5.83", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz", - "integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/elliptic": { "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -3278,9 +3209,8 @@ }, "node_modules/emittery": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3290,15 +3220,13 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -3308,42 +3236,101 @@ }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -3351,25 +3338,60 @@ "node": ">= 0.4" } }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es6-promise": { "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + "license": "MIT" }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3379,10 +3401,8 @@ }, "node_modules/eslint": { "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3435,9 +3455,8 @@ }, "node_modules/eslint-config-prettier": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -3447,9 +3466,8 @@ }, "node_modules/eslint-formatter-pretty": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", - "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "^7.2.13", "ansi-escapes": "^4.2.1", @@ -3469,56 +3487,173 @@ }, "node_modules/eslint-formatter-pretty/node_modules/@types/eslint": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, - "node_modules/eslint-plugin-jsdoc": { - "version": "48.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.11.0.tgz", - "integrity": "sha512-d12JHJDPNo7IFwTOAItCeJY1hcqoIxE0lHA8infQByLilQ9xkqrRa6laWCnsuCrf+8rUnvxXY1XuTbibRBNylA==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", "dev": true, + "license": "MIT", "dependencies": { - "@es-joy/jsdoccomment": "~0.46.0", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", - "debug": "^4.3.5", - "escape-string-regexp": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.6.0", - "parse-imports": "^2.1.1", - "semver": "^7.6.3", - "spdx-expression-parse": "^4.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "48.11.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.46.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.5", + "escape-string-regexp": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", @@ -3533,9 +3668,8 @@ }, "node_modules/eslint-plugin-prettier": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.2.tgz", - "integrity": "sha512-1yI3/hf35wmlq66C8yOyrujQnel+v5l1Vop5Cl2I6ylyNTT1JbuUUnV3/41PzwTzcyDp/oF0jWE3HXvcH5AQOQ==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.9.1" @@ -3563,15 +3697,13 @@ }, "node_modules/eslint-rule-docs": { "version": "1.1.235", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", - "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -3585,9 +3717,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3597,9 +3728,8 @@ }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3607,9 +3737,8 @@ }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3619,9 +3748,8 @@ }, "node_modules/espree": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -3636,9 +3764,8 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -3649,9 +3776,8 @@ }, "node_modules/esquery": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -3661,9 +3787,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -3673,26 +3798,22 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/ethers": { "version": "6.13.5", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.5.tgz", - "integrity": "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==", "funding": [ { "type": "individual", @@ -3703,6 +3824,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", @@ -3718,8 +3840,7 @@ }, "node_modules/ethers/node_modules/@noble/curves": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", "dependencies": { "@noble/hashes": "1.3.2" }, @@ -3729,8 +3850,7 @@ }, "node_modules/ethers/node_modules/@noble/hashes": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", "engines": { "node": ">= 16" }, @@ -3740,36 +3860,31 @@ }, "node_modules/ethers/node_modules/@types/node": { "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", "dependencies": { "undici-types": "~6.19.2" } }, "node_modules/ethers/node_modules/tslib": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "license": "0BSD" }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "license": "MIT" }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -3790,8 +3905,6 @@ }, "node_modules/exit": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -3799,9 +3912,8 @@ }, "node_modules/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -3815,20 +3927,17 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3842,9 +3951,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3854,39 +3962,34 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -3896,18 +3999,16 @@ }, "node_modules/filelist": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3917,9 +4018,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3929,9 +4029,8 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3945,9 +4044,8 @@ }, "node_modules/flat-cache": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -3959,20 +4057,18 @@ }, "node_modules/flatted": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -3982,10 +4078,23 @@ } } }, + "node_modules/for-each": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/form-data": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -3998,14 +4107,12 @@ "node_modules/form-data-encoder": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", - "license": "MIT" + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" }, "node_modules/formdata-node": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "license": "MIT", "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" @@ -4016,16 +4123,13 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4036,36 +4140,59 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", @@ -4087,18 +4214,16 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -4109,9 +4234,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4119,12 +4243,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4142,9 +4280,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -4154,9 +4291,8 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4164,9 +4300,8 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4176,9 +4311,8 @@ }, "node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -4189,11 +4323,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -4211,9 +4359,8 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4223,39 +4370,26 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/hard-rejection": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { + "node_modules/has-bigints": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4263,10 +4397,66 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -4278,8 +4468,6 @@ }, "node_modules/hash-base/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -4293,12 +4481,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/hash.js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -4306,9 +4494,8 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4318,17 +4505,15 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -4337,9 +4522,8 @@ }, "node_modules/hosted-git-info": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4349,9 +4533,8 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -4361,15 +4544,13 @@ }, "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-encoding": "^2.0.0" }, @@ -4379,15 +4560,13 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -4399,9 +4578,8 @@ }, "node_modules/http-server": { "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, + "license": "MIT", "dependencies": { "basic-auth": "^2.0.1", "chalk": "^4.1.2", @@ -4426,9 +4604,8 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -4437,16 +4614,14 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", "dependencies": { "ms": "^2.0.0" } }, "node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -4456,8 +4631,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -4471,13 +4644,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -4486,14 +4659,12 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4507,9 +4678,8 @@ }, "node_modules/import-local": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -4526,28 +4696,24 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4555,30 +4721,87 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/irregular-plurals": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", - "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -4586,10 +4809,23 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-buffer": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "funding": [ { "type": "github", @@ -4604,15 +4840,26 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -4623,38 +4870,96 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4662,49 +4967,112 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-retry-allowed": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", - "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "node_modules/is-regex": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-retry-allowed": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4712,11 +5080,55 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4724,40 +5136,81 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isows": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", - "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "peerDependencies": { "ws": "*" } }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -4771,9 +5224,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -4785,9 +5237,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -4799,9 +5250,8 @@ }, "node_modules/istanbul-reports": { "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -4812,9 +5262,8 @@ }, "node_modules/jake": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -4830,9 +5279,8 @@ }, "node_modules/jake/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4840,9 +5288,8 @@ }, "node_modules/jake/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4852,9 +5299,8 @@ }, "node_modules/jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -4878,9 +5324,8 @@ }, "node_modules/jest-changed-files": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -4892,9 +5337,8 @@ }, "node_modules/jest-circus": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -4923,9 +5367,8 @@ }, "node_modules/jest-cli": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -4956,9 +5399,8 @@ }, "node_modules/jest-config": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -5001,9 +5443,8 @@ }, "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -5016,9 +5457,8 @@ }, "node_modules/jest-docblock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, + "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -5028,9 +5468,8 @@ }, "node_modules/jest-each": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -5044,9 +5483,8 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -5061,18 +5499,16 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -5095,9 +5531,8 @@ }, "node_modules/jest-leak-detector": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -5108,9 +5543,8 @@ }, "node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -5123,9 +5557,8 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -5143,9 +5576,8 @@ }, "node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -5157,9 +5589,8 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -5174,18 +5605,16 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -5203,9 +5632,8 @@ }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, + "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -5216,9 +5644,8 @@ }, "node_modules/jest-runner": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -5248,9 +5675,8 @@ }, "node_modules/jest-runtime": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -5281,9 +5707,8 @@ }, "node_modules/jest-snapshot": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -5312,9 +5737,8 @@ }, "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -5329,9 +5753,8 @@ }, "node_modules/jest-validate": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -5346,9 +5769,8 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -5358,9 +5780,8 @@ }, "node_modules/jest-watcher": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -5377,9 +5798,8 @@ }, "node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -5392,9 +5812,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -5407,23 +5826,20 @@ }, "node_modules/js-tiktoken": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.16.tgz", - "integrity": "sha512-nUVdO5k/M9llWpiaZlBBDdtmr6qWXwSD6fgaDu2zM8UP+OXxx9V37lFkI6w0/1IuaDx7WffZ37oYd9KvcWKElg==", + "license": "MIT", "dependencies": { "base64-js": "^1.5.1" } }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -5433,18 +5849,16 @@ }, "node_modules/jsdoc-type-pratt-parser": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0.0" } }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -5454,33 +5868,28 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -5490,66 +5899,40 @@ }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/langsmith": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.2.15.tgz", - "integrity": "sha512-homtJU41iitqIZVuuLW7iarCzD4f39KcfP9RTBWav9jifhrsDa1Ez89Ejr+4qi72iuBu8Y5xykchsGVgiEZ93w==", - "dependencies": { - "@types/uuid": "^10.0.0", - "commander": "^10.0.1", - "p-queue": "^6.6.2", - "p-retry": "4", - "semver": "^7.6.3", - "uuid": "^10.0.0" - }, - "peerDependencies": { - "openai": "*" - }, - "peerDependenciesMeta": { - "openai": { - "optional": true - } - } - }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5560,24 +5943,21 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/linkify-it": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, + "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -5590,26 +5970,22 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -5623,29 +5999,25 @@ }, "node_modules/long": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", - "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==" + "license": "Apache-2.0" }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/lunr": { "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -5658,24 +6030,21 @@ }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, "node_modules/map-obj": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -5685,9 +6054,8 @@ }, "node_modules/markdown-it": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", @@ -5702,34 +6070,43 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, + "node_modules/md5": { + "version": "2.3.0", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "node_modules/md5.js": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, + "node_modules/md5/node_modules/is-buffer": { + "version": "1.1.6", + "license": "MIT" + }, "node_modules/mdurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/meow": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -5753,9 +6130,8 @@ }, "node_modules/meow/node_modules/type-fest": { "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -5765,33 +6141,29 @@ }, "node_modules/meow/node_modules/yargs-parser": { "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -5802,9 +6174,8 @@ }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -5814,16 +6185,14 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -5833,37 +6202,32 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/min-indent": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "license": "MIT" }, "node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5876,18 +6240,16 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minimist-options": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -5899,9 +6261,8 @@ }, "node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -5911,36 +6272,31 @@ }, "node_modules/mock-fs": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-5.4.1.tgz", - "integrity": "sha512-sz/Q8K1gXXXHR+qr0GZg2ysxCRr323kuN10O7CtQjraJsFDJ4SJ+0I5MzALz7aRp9lHk8Cc/YdsT95h9Ka1aFw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0.0" } }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/mustache": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", "bin": { "mustache": "bin/mustache" } }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-addon-api": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + "license": "MIT" }, "node_modules/node-domexception": { "version": "1.0.0", @@ -5956,7 +6312,6 @@ "url": "https://paypal.me/jimmywarting" } ], - "license": "MIT", "engines": { "node": ">=10.5.0" } @@ -5965,7 +6320,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -5983,16 +6337,14 @@ }, "node_modules/node-forge": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/node-gyp-build": { "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -6001,14 +6353,12 @@ }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-jose": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz", - "integrity": "sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==", + "license": "Apache-2.0", "dependencies": { "base64url": "^3.0.1", "buffer": "^6.0.3", @@ -6023,28 +6373,25 @@ }, "node_modules/node-jose/node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/node-releases": { "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nodemon": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", "dev": true, - "license": "MIT", "dependencies": { "chokidar": "^3.5.2", "debug": "^4", @@ -6073,7 +6420,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6084,7 +6430,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -6094,7 +6439,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6107,7 +6451,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -6117,9 +6460,8 @@ }, "node_modules/normalize-package-data": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -6132,18 +6474,16 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -6153,9 +6493,82 @@ }, "node_modules/object-inspect": { "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -6165,18 +6578,16 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -6189,18 +6600,16 @@ }, "node_modules/opener": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, + "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -6213,16 +6622,31 @@ "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ox": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.5.tgz", - "integrity": "sha512-vmnH8KvMDwFZDbNY1mq2CBRBWIgSliZB/dFV0xKp+DfF/dJkTENt6nmA+DzHSSAgL/GO2ydjkXWvlndJgSY4KQ==", + "version": "0.6.7", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", @@ -6243,22 +6667,19 @@ }, "node_modules/ox/node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + "license": "MIT" }, "node_modules/p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -6271,9 +6692,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -6286,8 +6706,7 @@ }, "node_modules/p-queue": { "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" @@ -6301,8 +6720,7 @@ }, "node_modules/p-retry": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -6313,8 +6731,7 @@ }, "node_modules/p-timeout": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", "dependencies": { "p-finally": "^1.0.0" }, @@ -6324,23 +6741,20 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pako": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -6350,9 +6764,8 @@ }, "node_modules/parse-imports": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", - "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", "dev": true, + "license": "Apache-2.0 AND MIT", "dependencies": { "es-module-lexer": "^1.5.3", "slashes": "^3.0.12" @@ -6363,9 +6776,8 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -6381,57 +6793,50 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -6441,18 +6846,16 @@ }, "node_modules/pirates": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -6462,9 +6865,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -6475,9 +6877,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -6487,9 +6888,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -6502,9 +6902,8 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -6514,9 +6913,8 @@ }, "node_modules/plur": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", "dev": true, + "license": "MIT", "dependencies": { "irregular-plurals": "^3.2.0" }, @@ -6529,9 +6927,8 @@ }, "node_modules/portfinder": { "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, + "license": "MIT", "dependencies": { "async": "^2.6.4", "debug": "^3.2.7", @@ -6543,36 +6940,40 @@ }, "node_modules/portfinder/node_modules/async": { "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.14" } }, "node_modules/portfinder/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -6585,9 +6986,8 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -6597,9 +6997,8 @@ }, "node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -6611,9 +7010,8 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6623,17 +7021,15 @@ }, "node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -6644,38 +7040,32 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "license": "MIT" }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/punycode.js": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -6686,13 +7076,13 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, "node_modules/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" }, @@ -6705,8 +7095,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -6721,28 +7109,26 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/read-pkg": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -6755,9 +7141,8 @@ }, "node_modules/read-pkg-up": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -6772,9 +7157,8 @@ }, "node_modules/read-pkg-up/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -6785,9 +7169,8 @@ }, "node_modules/read-pkg-up/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -6797,9 +7180,8 @@ }, "node_modules/read-pkg-up/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -6812,9 +7194,8 @@ }, "node_modules/read-pkg-up/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -6824,24 +7205,21 @@ }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -6851,26 +7229,23 @@ }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6885,7 +7260,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -6895,9 +7269,8 @@ }, "node_modules/redent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -6906,26 +7279,67 @@ "node": ">=8" } }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "license": "Apache-2.0" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -6943,9 +7357,8 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -6955,44 +7368,39 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve.exports": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -7000,10 +7408,8 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -7016,8 +7422,7 @@ }, "node_modules/ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -7025,8 +7430,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -7042,56 +7445,143 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/secp256k1": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.1.tgz", - "integrity": "sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==", - "hasInstallScript": true, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "dev": true, + "license": "MIT", "dependencies": { - "elliptic": "^6.5.7", - "node-addon-api": "^5.0.0", - "node-gyp-build": "^4.2.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">=18.0.0" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", - "dev": true + "node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" + "node_modules/safe-push-apply": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">=10" - } - }, - "node_modules/sha.js": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/secp256k1": { + "version": "5.0.1", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -7102,9 +7592,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -7114,18 +7603,16 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -7142,9 +7629,8 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -7158,9 +7644,8 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -7176,9 +7661,8 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -7195,16 +7679,14 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -7212,41 +7694,40 @@ "node": ">=10" } }, + "node_modules/simple-wcswidth": { + "version": "1.0.1", + "license": "MIT" + }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/slashes": { "version": "3.0.12", - "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", - "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -7254,9 +7735,8 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -7264,9 +7744,8 @@ }, "node_modules/spdx-correct/node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -7274,15 +7753,13 @@ }, "node_modules/spdx-exceptions": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -7290,21 +7767,18 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -7314,25 +7788,21 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -7346,13 +7816,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -7363,9 +7833,8 @@ }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7375,11 +7844,63 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7389,27 +7910,24 @@ }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/strip-indent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -7419,9 +7937,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -7431,9 +7948,7 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -7443,9 +7958,8 @@ }, "node_modules/supports-hyperlinks": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -7456,9 +7970,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7468,9 +7981,8 @@ }, "node_modules/synckit": { "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, + "license": "MIT", "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" @@ -7484,9 +7996,8 @@ }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -7498,9 +8009,8 @@ }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7508,9 +8018,8 @@ }, "node_modules/test-exclude/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7520,21 +8029,18 @@ }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tmpl": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -7547,7 +8053,6 @@ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", "dev": true, - "license": "ISC", "bin": { "nodetouch": "bin/nodetouch.js" } @@ -7555,35 +8060,31 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trim-newlines": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "version": "2.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-jest": { "version": "29.2.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", - "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", "dev": true, + "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "ejs": "^3.1.10", @@ -7629,8 +8130,6 @@ }, "node_modules/ts-node": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7671,11 +8170,40 @@ } } }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/tsd": { "version": "0.31.2", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.31.2.tgz", - "integrity": "sha512-VplBAQwvYrHzVihtzXiUVXu5bGcr7uH1juQZ1lmKgkuGNGT+FechUCqmx9/zk7wibcqR2xaNEwCkDyKh+VVZnQ==", "dev": true, + "license": "MIT", "dependencies": { "@tsd/typescript": "~5.4.3", "eslint-formatter-pretty": "^4.1.0", @@ -7694,15 +8222,13 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/turbo": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.3.3.tgz", - "integrity": "sha512-DUHWQAcC8BTiUZDRzAYGvpSpGLiaOQPfYXlCieQbwUvmml/LRGIe3raKdrOPOoiX0DYlzxs2nH6BoWJoZrj8hA==", "dev": true, + "license": "MIT", "bin": { "turbo": "bin/turbo" }, @@ -7715,127 +8241,126 @@ "turbo-windows-arm64": "2.3.3" } }, - "node_modules/turbo-darwin-64": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.3.3.tgz", - "integrity": "sha512-bxX82xe6du/3rPmm4aCC5RdEilIN99VUld4HkFQuw+mvFg6darNBuQxyWSHZTtc25XgYjQrjsV05888w1grpaA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, "node_modules/turbo-darwin-arm64": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.3.3.tgz", - "integrity": "sha512-DYbQwa3NsAuWkCUYVzfOUBbSUBVQzH5HWUFy2Kgi3fGjIWVZOFk86ss+xsWu//rlEAfYwEmopigsPYSmW4X15A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, - "node_modules/turbo-linux-64": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.3.3.tgz", - "integrity": "sha512-eHj9OIB0dFaP6BxB88jSuaCLsOQSYWBgmhy2ErCu6D2GG6xW3b6e2UWHl/1Ho9FsTg4uVgo4DB9wGsKa5erjUA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "node_modules/twitter-api-v2": { + "version": "1.19.0", + "license": "Apache-2.0" }, - "node_modules/turbo-linux-arm64": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.3.3.tgz", - "integrity": "sha512-NmDE/NjZoDj1UWBhMtOPmqFLEBKhzGS61KObfrDEbXvU3lekwHeoPvAMfcovzswzch+kN2DrtbNIlz+/rp8OCg==", - "cpu": [ - "arm64" - ], + "node_modules/type-check": { + "version": "0.4.0", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "node_modules/turbo-windows-64": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.3.3.tgz", - "integrity": "sha512-O2+BS4QqjK3dOERscXqv7N2GXNcqHr9hXumkMxDj/oGx9oCatIwnnwx34UmzodloSnJpgSqjl8iRWiY65SmYoQ==", - "cpu": [ - "x64" - ], + "node_modules/type-detect": { + "version": "4.0.8", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "node_modules/turbo-windows-arm64": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.3.3.tgz", - "integrity": "sha512-dW4ZK1r6XLPNYLIKjC4o87HxYidtRRcBeo/hZ9Wng2XM/MqqYkAyzJXJGgRMsc0MMEN9z4+ZIfnSNBrA0b08ag==", - "cpu": [ - "arm64" - ], + "node_modules/type-fest": { + "version": "0.20.2", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/twitter-api-v2": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/twitter-api-v2/-/twitter-api-v2-1.19.0.tgz", - "integrity": "sha512-jfG4aapNPM9+4VxNxn0TXvD8Qj8NmVx6cY0hp5K626uZ41qXPaJz33Djd3y6gfHF/+W29+iZz0Y5qB869d/akA==" + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/typed-array-byte-length": { + "version": "1.0.3", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/typed-array-length": { + "version": "1.0.7", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typedoc": { "version": "0.27.6", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.6.tgz", - "integrity": "sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@gerrit0/mini-shiki": "^1.24.0", "lunr": "^2.3.9", @@ -7855,14 +8380,12 @@ }, "node_modules/typeforce": { "version": "1.18.0", - "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", - "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" + "license": "MIT" }, "node_modules/typescript": { "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "devOptional": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7873,26 +8396,38 @@ }, "node_modules/uc.micro": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/undici-types": { "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "license": "MIT" }, "node_modules/union": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", "dev": true, "dependencies": { "qs": "^6.4.0" @@ -7903,8 +8438,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { @@ -7920,6 +8453,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -7933,48 +8467,41 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-join": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "license": "MIT" }, "node_modules/uuid": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, + "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -7986,9 +8513,8 @@ }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -7996,32 +8522,30 @@ }, "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/viem": { - "version": "2.22.9", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.22.9.tgz", - "integrity": "sha512-2yy46qYhcdo8GZggQ3Zoq9QCahI0goddzpVI/vSnTpcClQBSDxYRCuAqRzzLqjvJ7hS0UYgplC7eRkM2sYgflw==", + "version": "2.22.16", "funding": [ { "type": "github", "url": "https://github.com/sponsors/wevm" } ], + "license": "MIT", "dependencies": { - "@noble/curves": "1.7.0", - "@noble/hashes": "1.6.1", - "@scure/bip32": "1.6.0", - "@scure/bip39": "1.5.0", - "abitype": "1.0.7", + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", "isows": "1.0.6", - "ox": "0.6.5", + "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { @@ -8033,79 +8557,9 @@ } } }, - "node_modules/viem/node_modules/@noble/curves": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", - "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", - "dependencies": { - "@noble/hashes": "1.6.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", - "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@noble/hashes": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", - "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@scure/bip32": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.0.tgz", - "integrity": "sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==", - "dependencies": { - "@noble/curves": "~1.7.0", - "@noble/hashes": "~1.6.0", - "@scure/base": "~1.2.1" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/abitype": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.7.tgz", - "integrity": "sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw==", - "funding": { - "url": "https://github.com/sponsors/wevm" - }, - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, "node_modules/viem/node_modules/ws": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -8124,9 +8578,8 @@ }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } @@ -8135,7 +8588,6 @@ "version": "4.0.0-beta.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "license": "MIT", "engines": { "node": ">= 14" } @@ -8143,14 +8595,12 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-encoding": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, @@ -8162,7 +8612,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -8170,9 +8619,8 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8183,28 +8631,105 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wif": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", + "license": "MIT", "dependencies": { "bs58check": "<3.0.0" } }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8219,15 +8744,13 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -8238,8 +8761,7 @@ }, "node_modules/ws": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -8258,24 +8780,21 @@ }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "dev": true, + "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -8285,9 +8804,8 @@ }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -8303,17 +8821,14 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "license": "MIT", "engines": { @@ -8322,9 +8837,8 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8334,27 +8848,68 @@ }, "node_modules/zod": { "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", - "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.1.tgz", - "integrity": "sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==", + "license": "ISC", "peerDependencies": { "zod": "^3.24.1" } }, - "twitter-langchain/examples/chatbot-typescript": { - "name": "@coinbase/twitter-langchain-chatbot-example", + "typescript/agentkit": { + "name": "@coinbase/agentkit", + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "@coinbase/coinbase-sdk": "^0.17.0", + "md5": "^2.3.0", + "reflect-metadata": "^0.2.2", + "twitter-api-v2": "^1.18.2", + "viem": "^2.22.16", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/jest": "^29.5.14", + "@types/secp256k1": "^4.0.6", + "http-server": "^14.1.1", + "jest": "^29.7.0", + "mock-fs": "^5.2.0", + "ts-jest": "^29.2.5", + "tsd": "^0.31.2", + "typescript": "^5.7.2" + } + }, + "typescript/agentkit/node_modules/@coinbase/coinbase-sdk": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@coinbase/coinbase-sdk/-/coinbase-sdk-0.17.0.tgz", + "integrity": "sha512-YdEO6kbi0EDTzmPBqKtvDR/78P2Zw72rLmM6LS6yGZuTnfrXRhYR7/xAY0Fesoc1BcCL4eodwc+txUxrpdYCcg==", + "dependencies": { + "@scure/bip32": "^1.4.0", + "abitype": "^1.0.6", + "axios": "^1.6.8", + "axios-mock-adapter": "^1.22.0", + "axios-retry": "^4.4.1", + "bip32": "^4.0.0", + "bip39": "^3.1.0", + "decimal.js": "^10.4.3", + "dotenv": "^16.4.5", + "ethers": "^6.12.1", + "node-jose": "^2.2.0", + "secp256k1": "^5.0.0", + "viem": "^2.21.26" + } + }, + "typescript/examples/langchain-cdp-chatbot": { + "name": "@coinbase/cdp-langchain-chatbot-example", "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@coinbase/cdp-agentkit-core": "^0.0.14", - "@coinbase/twitter-langchain": "^0.0.12", + "@coinbase/agentkit": "^0.1.0", + "@coinbase/agentkit-langchain": "^0.1.0", "@langchain/core": "^0.3.19", "@langchain/langgraph": "^0.2.21", "@langchain/openai": "^0.3.14", @@ -8366,39 +8921,119 @@ "ts-node": "^10.9.2" } }, - "twitter-langchain/typescript": { - "name": "@coinbase/twitter-langchain", - "version": "0.0.12", + "typescript/examples/langchain-farcaster-chatbot": { + "name": "@coinbase/farcaster-langchain-chatbot-example", + "version": "1.0.0", + "license": "Apache-2.0", "dependencies": { - "@coinbase/cdp-agentkit-core": "^0.0.14", - "@langchain/core": "^0.3.19", - "twitter-api-v2": "^1.18.2", + "@coinbase/agentkit": "^0.1.0", + "@coinbase/agentkit-langchain": "^0.1.0", + "@langchain/core": "0.3.30", + "@langchain/langgraph": "^0.2.39", + "@langchain/openai": "^0.3.16", + "dotenv": "^16.4.5", "zod": "^3.22.4" }, + "devDependencies": { + "nodemon": "^3.1.0", + "ts-node": "^10.9.2" + } + }, + "typescript/examples/langchain-farcaster-chatbot/node_modules/@langchain/core": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.30.tgz", + "integrity": "sha512-HFUpjJ6FkPSSeLKzCLKxba4VN1DKnrXRmjaWHDb5KUyE9DZrqak3Sh6k2dkzXDJIcdd/uNeeQGFyQnubVEMkPw==", + "dependencies": { + "@cfworker/json-schema": "^4.0.2", + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": "^0.2.8", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^10.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "typescript/examples/langchain-farcaster-chatbot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "typescript/examples/langchain-farcaster-chatbot/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "typescript/examples/langchain-farcaster-chatbot/node_modules/langsmith": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.2.15.tgz", + "integrity": "sha512-homtJU41iitqIZVuuLW7iarCzD4f39KcfP9RTBWav9jifhrsDa1Ez89Ejr+4qi72iuBu8Y5xykchsGVgiEZ93w==", + "dependencies": { + "@types/uuid": "^10.0.0", + "commander": "^10.0.1", + "p-queue": "^6.6.2", + "p-retry": "4", + "semver": "^7.6.3", + "uuid": "^10.0.0" + }, "peerDependencies": { - "@coinbase/coinbase-sdk": "^0.15.0" + "openai": "*" + }, + "peerDependenciesMeta": { + "openai": { + "optional": true + } } }, - "twitter-langchain/typescript/node_modules/@coinbase/cdp-agentkit-core/node_modules/@coinbase/coinbase-sdk": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@coinbase/coinbase-sdk/-/coinbase-sdk-0.14.1.tgz", - "integrity": "sha512-3goViecQEPvUBndle4nTF8Sv4lIEOe6lad05yG3ZRIhj0tgfn2hI9i6V+eZ3np+sAQQO1J+6uL2j9PH/AMWtiw==", - "extraneous": true, - "license": "ISC", + "typescript/examples/langchain-twitter-chatbot": { + "name": "@coinbase/twitter-langchain-chatbot-example", + "version": "1.0.0", + "license": "Apache-2.0", "dependencies": { - "@scure/bip32": "^1.4.0", - "abitype": "^1.0.6", - "axios": "^1.6.8", - "axios-mock-adapter": "^1.22.0", - "axios-retry": "^4.4.1", - "bip32": "^4.0.0", - "bip39": "^3.1.0", - "decimal.js": "^10.4.3", + "@coinbase/agentkit": "^0.1.0", + "@coinbase/agentkit-langchain": "^0.1.0", + "@langchain/core": "^0.3.19", + "@langchain/langgraph": "^0.2.21", + "@langchain/openai": "^0.3.14", "dotenv": "^16.4.5", - "ethers": "^6.12.1", - "node-jose": "^2.2.0", - "secp256k1": "^5.0.0", - "viem": "^2.21.26" + "zod": "^3.22.4" + }, + "devDependencies": { + "nodemon": "^3.1.0", + "ts-node": "^10.9.2" + } + }, + "typescript/framework-extensions/langchain": { + "name": "@coinbase/agentkit-langchain", + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "@coinbase/agentkit": "^0.1.0", + "@coinbase/coinbase-sdk": "^0.15.0", + "@langchain/core": "^0.3.19", + "zod": "^3.22.4" + }, + "peerDependencies": { + "@coinbase/coinbase-sdk": "^0.15.0" } } } diff --git a/package.json b/package.json index c6d0c6f8d..bdab8b048 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,11 @@ "name": "cdp-agentkit-monorepo", "private": true, "workspaces": [ - "cdp-agentkit-core/typescript", - "cdp-langchain/examples/chatbot-typescript", - "cdp-langchain/typescript", - "twitter-langchain/typescript", - "twitter-langchain/examples/chatbot-typescript", - "farcaster-langchain/typescript", - "farcaster-langchain/examples/chatbot-typescript" + "typescript/agentkit", + "typescript/framework-extensions/langchain", + "typescript/examples/langchain-cdp-chatbot", + "typescript/examples/langchain-twitter-chatbot", + "typescript/examples/langchain-farcaster-chatbot" ], "packageManager": "npm@8.9.0", "scripts": { @@ -42,10 +40,11 @@ "devDependencies": { "@types/jest": "^29.5.14", "@types/node": "^20.12.11", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", + "@typescript-eslint/eslint-plugin": "^8.22.0", + "@typescript-eslint/parser": "^8.22.0", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsdoc": "^48.2.5", "eslint-plugin-prettier": "^5.1.3", "jest": "^29.7.0", diff --git a/python/README.md b/python/README.md new file mode 100644 index 000000000..5f3fb84d3 --- /dev/null +++ b/python/README.md @@ -0,0 +1,25 @@ +# AgentKit Python + +## 📦 Packages + +### cdp-agentkit-core + +Core primitives and framework-agnostic actions that are meant to be composable and used via AgentKit framework extensions (ie, `cdp-langchain`). +See [CDP Agentkit Core](./cdp-agentkit-core/README.md) to get started! + +### cdp-langchain + +LangChain extension of AgentKit. Enables agentic workflows to interact with onchain actions. +See [CDP LangChain](./cdp-langchain/README.md) to get started! + +### twitter-langchain + +LangChain extension for Twitter. Enables agentic workflows to interact with Twitter, such as to post a tweet. +See [Twitter LangChain](./twitter-langchain/README.md) to get started! + +## 🤝 Contributing + +**AgentKit is actively looking for community contributions!** + +- To see a list of actions and frameworks we'd love to see open-source contributions for, see [WISHLIST.md](../WISHLIST.md). +- To understand the process for contributing to AgentKit, see [CONTRIBUTING.md](../CONTRIBUTING.md). \ No newline at end of file diff --git a/cdp-agentkit-core/python/CHANGELOG.md b/python/cdp-agentkit-core/CHANGELOG.md similarity index 100% rename from cdp-agentkit-core/python/CHANGELOG.md rename to python/cdp-agentkit-core/CHANGELOG.md diff --git a/cdp-agentkit-core/python/Makefile b/python/cdp-agentkit-core/Makefile similarity index 100% rename from cdp-agentkit-core/python/Makefile rename to python/cdp-agentkit-core/Makefile diff --git a/cdp-agentkit-core/python/README.md b/python/cdp-agentkit-core/README.md similarity index 100% rename from cdp-agentkit-core/python/README.md rename to python/cdp-agentkit-core/README.md diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/__init__.py b/python/cdp-agentkit-core/cdp_agentkit_core/__init__.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/__init__.py rename to python/cdp-agentkit-core/cdp_agentkit_core/__init__.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/__init__.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/__init__.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/__init__.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/__init__.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/address_reputation.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/address_reputation.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/address_reputation.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/address_reputation.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/cdp_action.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/cdp_action.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/cdp_action.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/cdp_action.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/constants.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/constants.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/constants.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/constants.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/defi/__init__.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/defi/__init__.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/defi/__init__.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/defi/__init__.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/deploy_contract.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/deploy_contract.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/deploy_contract.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/deploy_contract.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/deploy_nft.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/deploy_nft.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/deploy_nft.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/deploy_nft.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/deploy_token.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/deploy_token.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/deploy_token.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/deploy_token.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/get_balance.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/get_balance.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/get_balance.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/get_balance.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/get_balance_nft.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/get_balance_nft.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/get_balance_nft.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/get_balance_nft.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/get_wallet_details.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/get_wallet_details.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/get_wallet_details.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/get_wallet_details.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/mint_nft.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/mint_nft.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/mint_nft.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/mint_nft.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/morpho/__init__.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/morpho/__init__.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/morpho/__init__.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/morpho/__init__.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/morpho/constants.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/morpho/constants.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/morpho/constants.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/morpho/constants.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/morpho/deposit.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/morpho/deposit.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/morpho/deposit.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/morpho/deposit.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/morpho/withdraw.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/morpho/withdraw.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/morpho/withdraw.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/morpho/withdraw.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/pyth/__init__.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/pyth/__init__.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/pyth/__init__.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/pyth/__init__.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/pyth/fetch_price.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/pyth/fetch_price.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/pyth/fetch_price.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/pyth/fetch_price.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/pyth/fetch_price_feed_id.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/pyth/fetch_price_feed_id.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/pyth/fetch_price_feed_id.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/pyth/fetch_price_feed_id.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/register_basename.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/register_basename.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/register_basename.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/register_basename.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/request_faucet_funds.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/request_faucet_funds.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/request_faucet_funds.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/request_faucet_funds.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/social/__init__.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/social/__init__.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/social/__init__.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/social/__init__.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/__init__.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/__init__.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/__init__.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/__init__.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/account_details.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/account_details.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/account_details.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/account_details.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/account_mentions.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/account_mentions.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/account_mentions.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/account_mentions.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/action.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/action.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/action.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/action.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/post_tweet.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/post_tweet.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/post_tweet.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/post_tweet.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/post_tweet_reply.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/post_tweet_reply.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/social/twitter/post_tweet_reply.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/social/twitter/post_tweet_reply.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/superfluid/__init__.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/superfluid/__init__.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/superfluid/__init__.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/superfluid/__init__.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/superfluid/constants.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/superfluid/constants.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/superfluid/constants.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/superfluid/constants.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/superfluid/create_flow.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/superfluid/create_flow.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/superfluid/create_flow.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/superfluid/create_flow.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/superfluid/delete_flow.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/superfluid/delete_flow.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/superfluid/delete_flow.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/superfluid/delete_flow.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/superfluid/update_flow.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/superfluid/update_flow.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/superfluid/update_flow.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/superfluid/update_flow.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/trade.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/trade.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/trade.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/trade.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/transfer.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/transfer.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/transfer.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/transfer.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/transfer_nft.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/transfer_nft.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/transfer_nft.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/transfer_nft.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/utils.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/utils.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/utils.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/utils.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/__init__.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/__init__.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/__init__.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/__init__.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/buy_token.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/buy_token.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/buy_token.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/buy_token.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/constants.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/constants.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/constants.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/constants.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/create_token.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/create_token.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/create_token.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/create_token.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/sell_token.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/sell_token.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/sell_token.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/sell_token.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/uniswap/__init__.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/uniswap/__init__.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/uniswap/__init__.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/uniswap/__init__.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/uniswap/constants.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/uniswap/constants.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/uniswap/constants.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/uniswap/constants.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/uniswap/index.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/uniswap/index.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/uniswap/index.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/uniswap/index.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/utils.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/utils.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/wow/utils.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/wow/utils.py diff --git a/cdp-agentkit-core/python/cdp_agentkit_core/actions/wrap_eth.py b/python/cdp-agentkit-core/cdp_agentkit_core/actions/wrap_eth.py similarity index 100% rename from cdp-agentkit-core/python/cdp_agentkit_core/actions/wrap_eth.py rename to python/cdp-agentkit-core/cdp_agentkit_core/actions/wrap_eth.py diff --git a/cdp-agentkit-core/python/docs/Makefile b/python/cdp-agentkit-core/docs/Makefile similarity index 100% rename from cdp-agentkit-core/python/docs/Makefile rename to python/cdp-agentkit-core/docs/Makefile diff --git a/cdp-agentkit-core/typescript/README.md b/python/cdp-agentkit-core/docs/README.md similarity index 72% rename from cdp-agentkit-core/typescript/README.md rename to python/cdp-agentkit-core/docs/README.md index cb42a0b40..e284b4009 100644 --- a/cdp-agentkit-core/typescript/README.md +++ b/python/cdp-agentkit-core/docs/README.md @@ -2,7 +2,7 @@ Framework agnostic primitives that are meant to be composable and used via Agentkit framework extensions. -You can find all of the supported actions under `./src/actions`. +You can find all of the supported actions under `./cdp_agentkit_core/actions`. ## Contributing diff --git a/cdp-agentkit-core/python/docs/cdp_agentkit_core.actions.rst b/python/cdp-agentkit-core/docs/cdp_agentkit_core.actions.rst similarity index 100% rename from cdp-agentkit-core/python/docs/cdp_agentkit_core.actions.rst rename to python/cdp-agentkit-core/docs/cdp_agentkit_core.actions.rst diff --git a/cdp-agentkit-core/python/docs/cdp_agentkit_core.rst b/python/cdp-agentkit-core/docs/cdp_agentkit_core.rst similarity index 100% rename from cdp-agentkit-core/python/docs/cdp_agentkit_core.rst rename to python/cdp-agentkit-core/docs/cdp_agentkit_core.rst diff --git a/cdp-agentkit-core/python/docs/conf.py b/python/cdp-agentkit-core/docs/conf.py similarity index 100% rename from cdp-agentkit-core/python/docs/conf.py rename to python/cdp-agentkit-core/docs/conf.py diff --git a/cdp-agentkit-core/python/docs/index.rst b/python/cdp-agentkit-core/docs/index.rst similarity index 100% rename from cdp-agentkit-core/python/docs/index.rst rename to python/cdp-agentkit-core/docs/index.rst diff --git a/cdp-agentkit-core/python/docs/make.bat b/python/cdp-agentkit-core/docs/make.bat similarity index 100% rename from cdp-agentkit-core/python/docs/make.bat rename to python/cdp-agentkit-core/docs/make.bat diff --git a/cdp-agentkit-core/python/docs/modules.rst b/python/cdp-agentkit-core/docs/modules.rst similarity index 100% rename from cdp-agentkit-core/python/docs/modules.rst rename to python/cdp-agentkit-core/docs/modules.rst diff --git a/cdp-agentkit-core/python/poetry.lock b/python/cdp-agentkit-core/poetry.lock similarity index 99% rename from cdp-agentkit-core/python/poetry.lock rename to python/cdp-agentkit-core/poetry.lock index c30b470b1..fd25e30fd 100644 --- a/cdp-agentkit-core/python/poetry.lock +++ b/python/cdp-agentkit-core/poetry.lock @@ -191,13 +191,13 @@ files = [ [[package]] name = "attrs" -version = "24.3.0" +version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" files = [ - {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, - {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, + {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, + {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] [package.extras] @@ -509,13 +509,13 @@ web3 = ">=7.6.0,<8.0.0" [[package]] name = "certifi" -version = "2024.12.14" +version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, - {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, ] [[package]] diff --git a/cdp-agentkit-core/python/pyproject.toml b/python/cdp-agentkit-core/pyproject.toml similarity index 100% rename from cdp-agentkit-core/python/pyproject.toml rename to python/cdp-agentkit-core/pyproject.toml diff --git a/cdp-agentkit-core/python/tests/__init__.py b/python/cdp-agentkit-core/tests/__init__.py similarity index 100% rename from cdp-agentkit-core/python/tests/__init__.py rename to python/cdp-agentkit-core/tests/__init__.py diff --git a/cdp-agentkit-core/python/tests/actions/__init__.py b/python/cdp-agentkit-core/tests/actions/__init__.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/__init__.py rename to python/cdp-agentkit-core/tests/actions/__init__.py diff --git a/cdp-agentkit-core/python/tests/actions/morpho/test_deposit.py b/python/cdp-agentkit-core/tests/actions/morpho/test_deposit.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/morpho/test_deposit.py rename to python/cdp-agentkit-core/tests/actions/morpho/test_deposit.py diff --git a/cdp-agentkit-core/python/tests/actions/morpho/test_withdraw.py b/python/cdp-agentkit-core/tests/actions/morpho/test_withdraw.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/morpho/test_withdraw.py rename to python/cdp-agentkit-core/tests/actions/morpho/test_withdraw.py diff --git a/cdp-agentkit-core/python/tests/actions/pyth/test_fetch_price.py b/python/cdp-agentkit-core/tests/actions/pyth/test_fetch_price.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/pyth/test_fetch_price.py rename to python/cdp-agentkit-core/tests/actions/pyth/test_fetch_price.py diff --git a/cdp-agentkit-core/python/tests/actions/pyth/test_fetch_price_feed_id.py b/python/cdp-agentkit-core/tests/actions/pyth/test_fetch_price_feed_id.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/pyth/test_fetch_price_feed_id.py rename to python/cdp-agentkit-core/tests/actions/pyth/test_fetch_price_feed_id.py diff --git a/cdp-agentkit-core/python/tests/actions/superfluid/test_create_flow.py b/python/cdp-agentkit-core/tests/actions/superfluid/test_create_flow.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/superfluid/test_create_flow.py rename to python/cdp-agentkit-core/tests/actions/superfluid/test_create_flow.py diff --git a/cdp-agentkit-core/python/tests/actions/superfluid/test_delete_flow.py b/python/cdp-agentkit-core/tests/actions/superfluid/test_delete_flow.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/superfluid/test_delete_flow.py rename to python/cdp-agentkit-core/tests/actions/superfluid/test_delete_flow.py diff --git a/cdp-agentkit-core/python/tests/actions/superfluid/test_update_flow.py b/python/cdp-agentkit-core/tests/actions/superfluid/test_update_flow.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/superfluid/test_update_flow.py rename to python/cdp-agentkit-core/tests/actions/superfluid/test_update_flow.py diff --git a/cdp-agentkit-core/python/tests/actions/test_address_reputation.py b/python/cdp-agentkit-core/tests/actions/test_address_reputation.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_address_reputation.py rename to python/cdp-agentkit-core/tests/actions/test_address_reputation.py diff --git a/cdp-agentkit-core/python/tests/actions/test_deploy_contract.py b/python/cdp-agentkit-core/tests/actions/test_deploy_contract.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_deploy_contract.py rename to python/cdp-agentkit-core/tests/actions/test_deploy_contract.py diff --git a/cdp-agentkit-core/python/tests/actions/test_deploy_nft.py b/python/cdp-agentkit-core/tests/actions/test_deploy_nft.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_deploy_nft.py rename to python/cdp-agentkit-core/tests/actions/test_deploy_nft.py diff --git a/cdp-agentkit-core/python/tests/actions/test_deploy_token.py b/python/cdp-agentkit-core/tests/actions/test_deploy_token.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_deploy_token.py rename to python/cdp-agentkit-core/tests/actions/test_deploy_token.py diff --git a/cdp-agentkit-core/python/tests/actions/test_get_balance_nft.py b/python/cdp-agentkit-core/tests/actions/test_get_balance_nft.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_get_balance_nft.py rename to python/cdp-agentkit-core/tests/actions/test_get_balance_nft.py diff --git a/cdp-agentkit-core/python/tests/actions/test_get_wallet_details.py b/python/cdp-agentkit-core/tests/actions/test_get_wallet_details.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_get_wallet_details.py rename to python/cdp-agentkit-core/tests/actions/test_get_wallet_details.py diff --git a/cdp-agentkit-core/python/tests/actions/test_mint_nft.py b/python/cdp-agentkit-core/tests/actions/test_mint_nft.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_mint_nft.py rename to python/cdp-agentkit-core/tests/actions/test_mint_nft.py diff --git a/cdp-agentkit-core/python/tests/actions/test_register_basename.py b/python/cdp-agentkit-core/tests/actions/test_register_basename.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_register_basename.py rename to python/cdp-agentkit-core/tests/actions/test_register_basename.py diff --git a/cdp-agentkit-core/python/tests/actions/test_trade.py b/python/cdp-agentkit-core/tests/actions/test_trade.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_trade.py rename to python/cdp-agentkit-core/tests/actions/test_trade.py diff --git a/cdp-agentkit-core/python/tests/actions/test_transfer.py b/python/cdp-agentkit-core/tests/actions/test_transfer.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_transfer.py rename to python/cdp-agentkit-core/tests/actions/test_transfer.py diff --git a/cdp-agentkit-core/python/tests/actions/test_transfer_nft.py b/python/cdp-agentkit-core/tests/actions/test_transfer_nft.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_transfer_nft.py rename to python/cdp-agentkit-core/tests/actions/test_transfer_nft.py diff --git a/cdp-agentkit-core/python/tests/actions/test_wrap_eth.py b/python/cdp-agentkit-core/tests/actions/test_wrap_eth.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/test_wrap_eth.py rename to python/cdp-agentkit-core/tests/actions/test_wrap_eth.py diff --git a/cdp-agentkit-core/python/tests/actions/wow/test_buy_token.py b/python/cdp-agentkit-core/tests/actions/wow/test_buy_token.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/wow/test_buy_token.py rename to python/cdp-agentkit-core/tests/actions/wow/test_buy_token.py diff --git a/cdp-agentkit-core/python/tests/actions/wow/test_create_token.py b/python/cdp-agentkit-core/tests/actions/wow/test_create_token.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/wow/test_create_token.py rename to python/cdp-agentkit-core/tests/actions/wow/test_create_token.py diff --git a/cdp-agentkit-core/python/tests/actions/wow/test_sell_token.py b/python/cdp-agentkit-core/tests/actions/wow/test_sell_token.py similarity index 100% rename from cdp-agentkit-core/python/tests/actions/wow/test_sell_token.py rename to python/cdp-agentkit-core/tests/actions/wow/test_sell_token.py diff --git a/cdp-agentkit-core/python/tests/conftest.py b/python/cdp-agentkit-core/tests/conftest.py similarity index 100% rename from cdp-agentkit-core/python/tests/conftest.py rename to python/cdp-agentkit-core/tests/conftest.py diff --git a/cdp-agentkit-core/python/tests/factories/asset_factory.py b/python/cdp-agentkit-core/tests/factories/asset_factory.py similarity index 100% rename from cdp-agentkit-core/python/tests/factories/asset_factory.py rename to python/cdp-agentkit-core/tests/factories/asset_factory.py diff --git a/cdp-agentkit-core/python/tests/factories/contract_invocation_factory.py b/python/cdp-agentkit-core/tests/factories/contract_invocation_factory.py similarity index 100% rename from cdp-agentkit-core/python/tests/factories/contract_invocation_factory.py rename to python/cdp-agentkit-core/tests/factories/contract_invocation_factory.py diff --git a/cdp-agentkit-core/python/tests/factories/smart_contract_factory.py b/python/cdp-agentkit-core/tests/factories/smart_contract_factory.py similarity index 100% rename from cdp-agentkit-core/python/tests/factories/smart_contract_factory.py rename to python/cdp-agentkit-core/tests/factories/smart_contract_factory.py diff --git a/cdp-agentkit-core/python/tests/factories/trade_factory.py b/python/cdp-agentkit-core/tests/factories/trade_factory.py similarity index 100% rename from cdp-agentkit-core/python/tests/factories/trade_factory.py rename to python/cdp-agentkit-core/tests/factories/trade_factory.py diff --git a/cdp-agentkit-core/python/tests/factories/transfer_factory.py b/python/cdp-agentkit-core/tests/factories/transfer_factory.py similarity index 100% rename from cdp-agentkit-core/python/tests/factories/transfer_factory.py rename to python/cdp-agentkit-core/tests/factories/transfer_factory.py diff --git a/cdp-agentkit-core/python/tests/factories/wallet_factory.py b/python/cdp-agentkit-core/tests/factories/wallet_factory.py similarity index 100% rename from cdp-agentkit-core/python/tests/factories/wallet_factory.py rename to python/cdp-agentkit-core/tests/factories/wallet_factory.py diff --git a/cdp-langchain/python/CHANGELOG.md b/python/cdp-langchain/CHANGELOG.md similarity index 100% rename from cdp-langchain/python/CHANGELOG.md rename to python/cdp-langchain/CHANGELOG.md diff --git a/cdp-langchain/python/Makefile b/python/cdp-langchain/Makefile similarity index 100% rename from cdp-langchain/python/Makefile rename to python/cdp-langchain/Makefile diff --git a/cdp-langchain/typescript/README.md b/python/cdp-langchain/README.md similarity index 52% rename from cdp-langchain/typescript/README.md rename to python/cdp-langchain/README.md index 5934554ca..d336f16c9 100644 --- a/cdp-langchain/typescript/README.md +++ b/python/cdp-langchain/README.md @@ -1,6 +1,6 @@ -# CDP Agentkit Extension - Langchain Toolkit +# CDP Agentkit Extension - LangChain Toolkit -CDP integration with Langchain to enable agentic workflows using the core primitives defined in `cdp-agentkit-core`. +CDP integration with LangChain to enable agentic workflows using the core primitives defined in `cdp-agentkit-core`. This toolkit contains tools that enable an LLM agent to interact with the [Coinbase Developer Platform](https://docs.cdp.coinbase.com/). The toolkit provides a wrapper around the CDP SDK, allowing agents to perform onchain operations like transfers, trades, and smart contract interactions. @@ -10,12 +10,12 @@ This toolkit contains tools that enable an LLM agent to interact with the [Coinb - [CDP API Key](https://portal.cdp.coinbase.com/access/api) - [OpenAI API Key](https://platform.openai.com/docs/quickstart#create-and-export-an-api-key) -- Node.js 18 or higher +- Python 3.10 or higher ### Installation ```bash -npm install @coinbase/cdp-langchain +pip install cdp-langchain ``` ### Environment Setup @@ -33,18 +33,20 @@ export NETWORK_ID=base-sepolia # Optional: Defaults to base-sepolia ### Basic Setup -```typescript -import { CdpToolkit } from "@coinbase/cdp-langchain"; -import { CdpAgentkit } from "@coinbase/cdp-agentkit-core"; +```python +from cdp_langchain.agent_toolkits import CdpToolkit +from cdp_langchain.utils import CdpAgentkitWrapper -// Initialize CDP AgentKit -const agentkit = await CdpAgentkit.configureWithWallet(); +# Initialize CDP wrapper +cdp = CdpAgentkitWrapper() -// Create toolkit -const toolkit = new CdpToolkit(agentkit); +# Create toolkit from wrapper +toolkit = CdpToolkit.from_cdp_agentkit_wrapper(cdp) -// Get available tools -const tools = toolkit.getTools(); +# Get available tools +tools = toolkit.get_tools() +for tool in tools: + print(tool.name) ``` The toolkit provides the following tools: @@ -63,44 +65,44 @@ The toolkit provides the following tools: 12. **pyth_fetch_price_feed_id** - Fetch the price feed ID for a given token symbol from Pyth Network 13. **register_basename** - Register a basename for the wallet 14. **request_faucet_funds** - Request test tokens from faucet -15. **trade** - Trade assets (Mainnet only) -16. **transfer** - Transfer assets between addresses -17. **transfer_nft** - Transfer an NFT (ERC-721) -18. **wow_buy_token** - Buy Zora Wow ERC20 memecoin with ETH -19. **wow_create_token** - Deploy a token using Zora's Wow Launcher (Bonding Curve) -20. **wow_sell_token** - Sell Zora Wow ERC20 memecoin for ETH -21. **wrap_eth** - Wrap ETH to WETH +15. **superfluid_create_flow** - Create a flow using Superfluid +16. **superfluid_update_flow** - Update a flow using Superfluid +17. **superfluid_delete_flow** - Delete a flow using Superfluid +18. **trade** - Trade assets (Mainnet only) +19. **transfer** - Transfer assets between addresses +20. **transfer_nft** - Transfer an NFT (ERC-721) +21. **wow_buy_token** - Buy Zora Wow ERC20 memecoin with ETH +22. **wow_create_token** - Deploy a token using Zora's Wow Launcher (Bonding Curve) +23. **wow_sell_token** - Sell Zora Wow ERC20 memecoin for ETH +24. **wrap_eth** - Wrap ETH to WETH ### Using with an Agent -#### Additional Installations +```python +from langchain_openai import ChatOpenAI +from langgraph.prebuilt import create_react_agent -```bash -npm install @langchain/langgraph @langchain/openai -``` - -```typescript -import { ChatOpenAI } from "@langchain/openai"; -import { HumanMessage } from "@langchain/core/messages"; -import { createReactAgent } from "@langchain/langgraph/prebuilt"; +# Initialize LLM +llm = ChatOpenAI(model="gpt-4o-mini") -// Initialize LLM -const model = new ChatOpenAI({ - model: "gpt-4o-mini", -}); +# Get tools and create agent +tools = toolkit.get_tools() +agent_executor = create_react_agent(llm, tools) -// Create agent executor -const agent = createReactAgent({ - llm: model, - tools, -}); +# Example usage +events = agent_executor.stream( + {"messages": [("user", "Send 0.005 ETH to john2879.base.eth")]}, + stream_mode="values" +) -// Example usage -const result = await agent.invoke({ - messages: [new HumanMessage("Send 0.005 ETH to john2879.base.eth")], -}); - -console.log(result.messages[result.messages.length - 1].content); +for event in events: + event["messages"][-1].pretty_print() +``` +Expected output: +``` +Transferred 0.005 of eth to john2879.base.eth. +Transaction hash for the transfer: 0x78c7c2878659a0de216d0764fc87eff0d38b47f3315fa02ba493a83d8e782d1e +Transaction link for the transfer: https://sepolia.basescan.org/tx/0x78c7c2878659a0de216d0764fc87eff0d38b47f3315fa02ba493a83d8e782d1 ``` ## CDP Toolkit Specific Features @@ -109,17 +111,18 @@ console.log(result.messages[result.messages.length - 1].content); The toolkit maintains an MPC wallet that persists between sessions: -```typescript -// Export wallet data -const walletData = await agentkit.exportWallet(); +```python +# Export wallet data +wallet_data = cdp.export_wallet() -// Import wallet data -const importedAgentkit = await CdpAgentkit.configureWithWallet({ cdpWalletData: walletData }); +# Import wallet data +values = {"cdp_wallet_data": wallet_data} +cdp = CdpAgentkitWrapper(**values) ``` ### Network Support -The toolkit supports [multiple networks](https://docs.cdp.coinbase.com/cdp-sdk/docs/networks). +The toolkit supports [multiple networks](https://docs.cdp.coinbase.com/cdp-apis/docs/networks). ### Gasless Transactions @@ -130,8 +133,8 @@ The following operations support gasless transactions on Base Mainnet: ## Examples -Check out [cdp-langchain/examples](./examples) for inspiration and help getting started! -- [Chatbot Typescript](./examples/chatbot-typescript/README.md): Simple example of a Node.js Chatbot that can perform complex onchain interactions, using OpenAI. +Check out [../examples](../examples) for inspiration and help getting started! +- [Chatbot Python](../examples/cdp-langchain-chatbot/README.md): Simple example of a Python Chatbot that can perform complex onchain interactions, using OpenAI. ## Contributing diff --git a/cdp-langchain/python/cdp_langchain/__init__.py b/python/cdp-langchain/cdp_langchain/__init__.py similarity index 100% rename from cdp-langchain/python/cdp_langchain/__init__.py rename to python/cdp-langchain/cdp_langchain/__init__.py diff --git a/cdp-langchain/python/cdp_langchain/__version__.py b/python/cdp-langchain/cdp_langchain/__version__.py similarity index 100% rename from cdp-langchain/python/cdp_langchain/__version__.py rename to python/cdp-langchain/cdp_langchain/__version__.py diff --git a/cdp-langchain/python/cdp_langchain/agent_toolkits/__init__.py b/python/cdp-langchain/cdp_langchain/agent_toolkits/__init__.py similarity index 100% rename from cdp-langchain/python/cdp_langchain/agent_toolkits/__init__.py rename to python/cdp-langchain/cdp_langchain/agent_toolkits/__init__.py diff --git a/cdp-langchain/python/cdp_langchain/agent_toolkits/cdp_toolkit.py b/python/cdp-langchain/cdp_langchain/agent_toolkits/cdp_toolkit.py similarity index 100% rename from cdp-langchain/python/cdp_langchain/agent_toolkits/cdp_toolkit.py rename to python/cdp-langchain/cdp_langchain/agent_toolkits/cdp_toolkit.py diff --git a/cdp-langchain/python/cdp_langchain/constants.py b/python/cdp-langchain/cdp_langchain/constants.py similarity index 100% rename from cdp-langchain/python/cdp_langchain/constants.py rename to python/cdp-langchain/cdp_langchain/constants.py diff --git a/cdp-langchain/python/cdp_langchain/tools/__init__.py b/python/cdp-langchain/cdp_langchain/tools/__init__.py similarity index 100% rename from cdp-langchain/python/cdp_langchain/tools/__init__.py rename to python/cdp-langchain/cdp_langchain/tools/__init__.py diff --git a/cdp-langchain/python/cdp_langchain/tools/cdp_tool.py b/python/cdp-langchain/cdp_langchain/tools/cdp_tool.py similarity index 100% rename from cdp-langchain/python/cdp_langchain/tools/cdp_tool.py rename to python/cdp-langchain/cdp_langchain/tools/cdp_tool.py diff --git a/cdp-langchain/python/cdp_langchain/utils/__init__.py b/python/cdp-langchain/cdp_langchain/utils/__init__.py similarity index 100% rename from cdp-langchain/python/cdp_langchain/utils/__init__.py rename to python/cdp-langchain/cdp_langchain/utils/__init__.py diff --git a/cdp-langchain/python/cdp_langchain/utils/cdp_agentkit_wrapper.py b/python/cdp-langchain/cdp_langchain/utils/cdp_agentkit_wrapper.py similarity index 100% rename from cdp-langchain/python/cdp_langchain/utils/cdp_agentkit_wrapper.py rename to python/cdp-langchain/cdp_langchain/utils/cdp_agentkit_wrapper.py diff --git a/cdp-langchain/python/docs/Makefile b/python/cdp-langchain/docs/Makefile similarity index 100% rename from cdp-langchain/python/docs/Makefile rename to python/cdp-langchain/docs/Makefile diff --git a/cdp-langchain/python/README.md b/python/cdp-langchain/docs/README.md similarity index 100% rename from cdp-langchain/python/README.md rename to python/cdp-langchain/docs/README.md diff --git a/cdp-langchain/python/docs/cdp_langchain.agent_toolkits.rst b/python/cdp-langchain/docs/cdp_langchain.agent_toolkits.rst similarity index 100% rename from cdp-langchain/python/docs/cdp_langchain.agent_toolkits.rst rename to python/cdp-langchain/docs/cdp_langchain.agent_toolkits.rst diff --git a/cdp-langchain/python/docs/cdp_langchain.rst b/python/cdp-langchain/docs/cdp_langchain.rst similarity index 100% rename from cdp-langchain/python/docs/cdp_langchain.rst rename to python/cdp-langchain/docs/cdp_langchain.rst diff --git a/cdp-langchain/python/docs/cdp_langchain.tools.rst b/python/cdp-langchain/docs/cdp_langchain.tools.rst similarity index 100% rename from cdp-langchain/python/docs/cdp_langchain.tools.rst rename to python/cdp-langchain/docs/cdp_langchain.tools.rst diff --git a/cdp-langchain/python/docs/cdp_langchain.utils.rst b/python/cdp-langchain/docs/cdp_langchain.utils.rst similarity index 100% rename from cdp-langchain/python/docs/cdp_langchain.utils.rst rename to python/cdp-langchain/docs/cdp_langchain.utils.rst diff --git a/cdp-langchain/python/docs/conf.py b/python/cdp-langchain/docs/conf.py similarity index 100% rename from cdp-langchain/python/docs/conf.py rename to python/cdp-langchain/docs/conf.py diff --git a/cdp-langchain/python/docs/index.rst b/python/cdp-langchain/docs/index.rst similarity index 100% rename from cdp-langchain/python/docs/index.rst rename to python/cdp-langchain/docs/index.rst diff --git a/cdp-langchain/python/docs/make.bat b/python/cdp-langchain/docs/make.bat similarity index 100% rename from cdp-langchain/python/docs/make.bat rename to python/cdp-langchain/docs/make.bat diff --git a/cdp-langchain/python/docs/modules.rst b/python/cdp-langchain/docs/modules.rst similarity index 100% rename from cdp-langchain/python/docs/modules.rst rename to python/cdp-langchain/docs/modules.rst diff --git a/cdp-langchain/python/poetry.lock b/python/cdp-langchain/poetry.lock similarity index 99% rename from cdp-langchain/python/poetry.lock rename to python/cdp-langchain/poetry.lock index a359b1660..6d6444ae5 100644 --- a/cdp-langchain/python/poetry.lock +++ b/python/cdp-langchain/poetry.lock @@ -191,13 +191,13 @@ files = [ [[package]] name = "attrs" -version = "24.3.0" +version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" files = [ - {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, - {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, + {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, + {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] [package.extras] @@ -502,7 +502,7 @@ web3 = "^7.6.0" [package.source] type = "directory" -url = "../../cdp-agentkit-core/python" +url = "../cdp-agentkit-core" [[package]] name = "cdp-sdk" @@ -527,13 +527,13 @@ web3 = ">=7.6.0,<8.0.0" [[package]] name = "certifi" -version = "2024.12.14" +version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, - {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, ] [[package]] @@ -1855,19 +1855,19 @@ files = [ [[package]] name = "langchain" -version = "0.3.15" +version = "0.3.17" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain-0.3.15-py3-none-any.whl", hash = "sha256:2657735184054cae8181ac43fce6cbc9ee64ca81a2ad2aed3ccd6e5d6fe1f19f"}, - {file = "langchain-0.3.15.tar.gz", hash = "sha256:1204d67f8469cd8da5621d2b39501650a824d4c0d5a74264dfe3df9a7528897e"}, + {file = "langchain-0.3.17-py3-none-any.whl", hash = "sha256:4d6d3cf454cc261a5017fd1fa5014cffcc7aeaccd0ec0530fc10c5f71e6e97a0"}, + {file = "langchain-0.3.17.tar.gz", hash = "sha256:cef56f0a7c8369f35f1fa2690ecf0caa4504a36a5383de0eb29b8a5e26f625a0"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.3.31,<0.4.0" +langchain-core = ">=0.3.33,<0.4.0" langchain-text-splitters = ">=0.3.3,<0.4.0" langsmith = ">=0.1.17,<0.4" numpy = [ @@ -1882,13 +1882,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" [[package]] name = "langchain-core" -version = "0.3.31" +version = "0.3.33" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_core-0.3.31-py3-none-any.whl", hash = "sha256:882e64ad95887c951dce8e835889e43263b11848c394af3b73e06912624bd743"}, - {file = "langchain_core-0.3.31.tar.gz", hash = "sha256:5ffa56354c07de9efaa4139609659c63e7d9b29da2c825f6bab9392ec98300df"}, + {file = "langchain_core-0.3.33-py3-none-any.whl", hash = "sha256:269706408a2223f863ff1f9616f31903a5712403199d828b50aadbc4c28b553a"}, + {file = "langchain_core-0.3.33.tar.gz", hash = "sha256:b5dd93a4e7f8198d2fc6048723b0bfecf7aaf128b0d268cbac19c34c1579b953"}, ] [package.dependencies] @@ -1935,13 +1935,13 @@ langchain-core = ">=0.3.29,<0.4.0" [[package]] name = "langgraph" -version = "0.2.67" +version = "0.2.69" description = "Building stateful, multi-actor applications with LLMs" optional = false python-versions = "<4.0,>=3.9.0" files = [ - {file = "langgraph-0.2.67-py3-none-any.whl", hash = "sha256:79a76d8fd7581bf117aaa90453d780df2c96a49ed6f5e25086d9adadef8e945f"}, - {file = "langgraph-0.2.67.tar.gz", hash = "sha256:80d034b612d998ec5f6a77362ba8ebe697b5e7b25f8ebbc4333b82bbd9bca8f6"}, + {file = "langgraph-0.2.69-py3-none-any.whl", hash = "sha256:b64a5755fa2c7f2f67608ff4ce0ef8c168b30a0fb551a6c1d2e19bf1d2268ce4"}, + {file = "langgraph-0.2.69.tar.gz", hash = "sha256:77bd6efd967b4f092ec31d2148b3e6ba3c31e202b4f3a975dbb082b19b5bb057"}, ] [package.dependencies] @@ -1981,13 +1981,13 @@ orjson = ">=3.10.1" [[package]] name = "langsmith" -version = "0.3.1" +version = "0.3.4" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langsmith-0.3.1-py3-none-any.whl", hash = "sha256:b6afbb214ae82b6d96b8134718db3a7d2598b2a7eb4ab1212bcd6d96e04eda10"}, - {file = "langsmith-0.3.1.tar.gz", hash = "sha256:9242a49d37e2176a344ddec97bf57b958dc0e1f0437e150cefd0fb70195f0e26"}, + {file = "langsmith-0.3.4-py3-none-any.whl", hash = "sha256:f3b818ce31dc3bdf1f797e75bf32a8a7b062a411f146bd4ffdfc2be0b4b03233"}, + {file = "langsmith-0.3.4.tar.gz", hash = "sha256:79fd516e68bbc30f408ab0b30a92175e5be0f5c21002e30a7804c59cb72cfe1a"}, ] [package.dependencies] @@ -2528,13 +2528,13 @@ files = [ [[package]] name = "openai" -version = "1.60.1" +version = "1.61.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.60.1-py3-none-any.whl", hash = "sha256:714181ec1c452353d456f143c22db892de7b373e3165063d02a2b798ed575ba1"}, - {file = "openai-1.60.1.tar.gz", hash = "sha256:beb1541dfc38b002bd629ab68b0d6fe35b870c5f4311d9bc4404d85af3214d5e"}, + {file = "openai-1.61.0-py3-none-any.whl", hash = "sha256:e8c512c0743accbdbe77f3429a1490d862f8352045de8dc81969301eb4a4f666"}, + {file = "openai-1.61.0.tar.gz", hash = "sha256:216f325a24ed8578e929b0f1b3fb2052165f3b04b0461818adaa51aa29c71f8a"}, ] [package.dependencies] @@ -4616,4 +4616,4 @@ cffi = ["cffi (>=1.11)"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "5d4cb1f18d079e32530fe0d50ed250a80b2b4bb577935015be10c97fd53c3e74" +content-hash = "0bc5a6edd744018e341a1c91d9961ff3e53661449005329657e116c27f9c4781" diff --git a/cdp-langchain/python/pyproject.toml b/python/cdp-langchain/pyproject.toml similarity index 94% rename from cdp-langchain/python/pyproject.toml rename to python/cdp-langchain/pyproject.toml index 5c23d56e4..1bda13b20 100644 --- a/cdp-langchain/python/pyproject.toml +++ b/python/cdp-langchain/pyproject.toml @@ -29,7 +29,7 @@ sphinx-autobuild = "^2024.9.19" sphinxcontrib-napoleon = "^0.7" sphinx-autodoc-typehints = "^2.4.4" myst-parser = "^4.0.0" -cdp-agentkit-core = { path = "../../cdp-agentkit-core/python", develop = true } +cdp-agentkit-core = { path = "../cdp-agentkit-core", develop = true } [build-system] requires = ["poetry-core"] diff --git a/cdp-langchain/python/tests/__init__.py b/python/cdp-langchain/tests/__init__.py similarity index 100% rename from cdp-langchain/python/tests/__init__.py rename to python/cdp-langchain/tests/__init__.py diff --git a/cdp-langchain/python/tests/tools/__init__.py b/python/cdp-langchain/tests/tools/__init__.py similarity index 100% rename from cdp-langchain/python/tests/tools/__init__.py rename to python/cdp-langchain/tests/tools/__init__.py diff --git a/cdp-langchain/python/tests/tools/test_cdp_tool.py b/python/cdp-langchain/tests/tools/test_cdp_tool.py similarity index 100% rename from cdp-langchain/python/tests/tools/test_cdp_tool.py rename to python/cdp-langchain/tests/tools/test_cdp_tool.py diff --git a/cdp-langchain/python/tests/utils/__init__.py b/python/cdp-langchain/tests/utils/__init__.py similarity index 100% rename from cdp-langchain/python/tests/utils/__init__.py rename to python/cdp-langchain/tests/utils/__init__.py diff --git a/cdp-langchain/python/tests/utils/test_cdp_agentkit_wrapper.py b/python/cdp-langchain/tests/utils/test_cdp_agentkit_wrapper.py similarity index 100% rename from cdp-langchain/python/tests/utils/test_cdp_agentkit_wrapper.py rename to python/cdp-langchain/tests/utils/test_cdp_agentkit_wrapper.py diff --git a/cdp-langchain/examples/chatbot-python/.env.example b/python/examples/cdp-langchain-chatbot/.env.example similarity index 71% rename from cdp-langchain/examples/chatbot-python/.env.example rename to python/examples/cdp-langchain-chatbot/.env.example index 2764b63c1..8cde60f43 100644 --- a/cdp-langchain/examples/chatbot-python/.env.example +++ b/python/examples/cdp-langchain-chatbot/.env.example @@ -1,3 +1,3 @@ CDP_API_KEY_NAME= # Place your CDP API key name here CDP_API_KEY_PRIVATE_KEY= # Place your CDP API key private key here -OPENAI_API_KEY= # Place your OpenAI API key here \ No newline at end of file +OPENAI_API_KEY= # Place your OpenAI API key here diff --git a/cdp-langchain/examples/chatbot-python/Makefile b/python/examples/cdp-langchain-chatbot/Makefile similarity index 100% rename from cdp-langchain/examples/chatbot-python/Makefile rename to python/examples/cdp-langchain-chatbot/Makefile diff --git a/cdp-langchain/examples/chatbot-python/README.md b/python/examples/cdp-langchain-chatbot/README.md similarity index 95% rename from cdp-langchain/examples/chatbot-python/README.md rename to python/examples/cdp-langchain-chatbot/README.md index a7fcc436b..4b257fbb1 100644 --- a/cdp-langchain/examples/chatbot-python/README.md +++ b/python/examples/cdp-langchain-chatbot/README.md @@ -1,4 +1,4 @@ -# CDP Agentkit Langchain Extension Examples - Chatbot Python +# CDP Agentkit LangChain Extension Examples - Chatbot Python This example demonstrates an agent setup as a terminal style chatbot with access to the full set of CDP Agentkit actions. diff --git a/cdp-langchain/examples/chatbot-python/chatbot.py b/python/examples/cdp-langchain-chatbot/chatbot.py similarity index 100% rename from cdp-langchain/examples/chatbot-python/chatbot.py rename to python/examples/cdp-langchain-chatbot/chatbot.py diff --git a/cdp-langchain/examples/chatbot-python/poetry.lock b/python/examples/cdp-langchain-chatbot/poetry.lock similarity index 99% rename from cdp-langchain/examples/chatbot-python/poetry.lock rename to python/examples/cdp-langchain-chatbot/poetry.lock index 0c3b93df1..50247418a 100644 --- a/cdp-langchain/examples/chatbot-python/poetry.lock +++ b/python/examples/cdp-langchain-chatbot/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -180,13 +180,13 @@ files = [ [[package]] name = "attrs" -version = "24.3.0" +version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" files = [ - {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, - {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, + {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, + {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] [package.extras] @@ -493,13 +493,13 @@ web3 = ">=7.6.0,<8.0.0" [[package]] name = "certifi" -version = "2024.12.14" +version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, - {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, ] [[package]] @@ -1650,19 +1650,19 @@ files = [ [[package]] name = "langchain" -version = "0.3.15" +version = "0.3.17" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain-0.3.15-py3-none-any.whl", hash = "sha256:2657735184054cae8181ac43fce6cbc9ee64ca81a2ad2aed3ccd6e5d6fe1f19f"}, - {file = "langchain-0.3.15.tar.gz", hash = "sha256:1204d67f8469cd8da5621d2b39501650a824d4c0d5a74264dfe3df9a7528897e"}, + {file = "langchain-0.3.17-py3-none-any.whl", hash = "sha256:4d6d3cf454cc261a5017fd1fa5014cffcc7aeaccd0ec0530fc10c5f71e6e97a0"}, + {file = "langchain-0.3.17.tar.gz", hash = "sha256:cef56f0a7c8369f35f1fa2690ecf0caa4504a36a5383de0eb29b8a5e26f625a0"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.3.31,<0.4.0" +langchain-core = ">=0.3.33,<0.4.0" langchain-text-splitters = ">=0.3.3,<0.4.0" langsmith = ">=0.1.17,<0.4" numpy = [ @@ -1677,13 +1677,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" [[package]] name = "langchain-core" -version = "0.3.31" +version = "0.3.33" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_core-0.3.31-py3-none-any.whl", hash = "sha256:882e64ad95887c951dce8e835889e43263b11848c394af3b73e06912624bd743"}, - {file = "langchain_core-0.3.31.tar.gz", hash = "sha256:5ffa56354c07de9efaa4139609659c63e7d9b29da2c825f6bab9392ec98300df"}, + {file = "langchain_core-0.3.33-py3-none-any.whl", hash = "sha256:269706408a2223f863ff1f9616f31903a5712403199d828b50aadbc4c28b553a"}, + {file = "langchain_core-0.3.33.tar.gz", hash = "sha256:b5dd93a4e7f8198d2fc6048723b0bfecf7aaf128b0d268cbac19c34c1579b953"}, ] [package.dependencies] @@ -1730,13 +1730,13 @@ langchain-core = ">=0.3.29,<0.4.0" [[package]] name = "langgraph" -version = "0.2.67" +version = "0.2.69" description = "Building stateful, multi-actor applications with LLMs" optional = false python-versions = "<4.0,>=3.9.0" files = [ - {file = "langgraph-0.2.67-py3-none-any.whl", hash = "sha256:79a76d8fd7581bf117aaa90453d780df2c96a49ed6f5e25086d9adadef8e945f"}, - {file = "langgraph-0.2.67.tar.gz", hash = "sha256:80d034b612d998ec5f6a77362ba8ebe697b5e7b25f8ebbc4333b82bbd9bca8f6"}, + {file = "langgraph-0.2.69-py3-none-any.whl", hash = "sha256:b64a5755fa2c7f2f67608ff4ce0ef8c168b30a0fb551a6c1d2e19bf1d2268ce4"}, + {file = "langgraph-0.2.69.tar.gz", hash = "sha256:77bd6efd967b4f092ec31d2148b3e6ba3c31e202b4f3a975dbb082b19b5bb057"}, ] [package.dependencies] @@ -1776,13 +1776,13 @@ orjson = ">=3.10.1" [[package]] name = "langsmith" -version = "0.3.1" +version = "0.3.4" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langsmith-0.3.1-py3-none-any.whl", hash = "sha256:b6afbb214ae82b6d96b8134718db3a7d2598b2a7eb4ab1212bcd6d96e04eda10"}, - {file = "langsmith-0.3.1.tar.gz", hash = "sha256:9242a49d37e2176a344ddec97bf57b958dc0e1f0437e150cefd0fb70195f0e26"}, + {file = "langsmith-0.3.4-py3-none-any.whl", hash = "sha256:f3b818ce31dc3bdf1f797e75bf32a8a7b062a411f146bd4ffdfc2be0b4b03233"}, + {file = "langsmith-0.3.4.tar.gz", hash = "sha256:79fd516e68bbc30f408ab0b30a92175e5be0f5c21002e30a7804c59cb72cfe1a"}, ] [package.dependencies] @@ -2088,13 +2088,13 @@ files = [ [[package]] name = "openai" -version = "1.60.1" +version = "1.61.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.60.1-py3-none-any.whl", hash = "sha256:714181ec1c452353d456f143c22db892de7b373e3165063d02a2b798ed575ba1"}, - {file = "openai-1.60.1.tar.gz", hash = "sha256:beb1541dfc38b002bd629ab68b0d6fe35b870c5f4311d9bc4404d85af3214d5e"}, + {file = "openai-1.61.0-py3-none-any.whl", hash = "sha256:e8c512c0743accbdbe77f3429a1490d862f8352045de8dc81969301eb4a4f666"}, + {file = "openai-1.61.0.tar.gz", hash = "sha256:216f325a24ed8578e929b0f1b3fb2052165f3b04b0461818adaa51aa29c71f8a"}, ] [package.dependencies] diff --git a/cdp-langchain/examples/chatbot-python/pyproject.toml b/python/examples/cdp-langchain-chatbot/pyproject.toml similarity index 100% rename from cdp-langchain/examples/chatbot-python/pyproject.toml rename to python/examples/cdp-langchain-chatbot/pyproject.toml diff --git a/twitter-langchain/examples/chatbot-python/.env-local b/python/examples/twitter-langchain-chatbot/.env-local similarity index 100% rename from twitter-langchain/examples/chatbot-python/.env-local rename to python/examples/twitter-langchain-chatbot/.env-local diff --git a/twitter-langchain/examples/chatbot-python/Makefile b/python/examples/twitter-langchain-chatbot/Makefile similarity index 100% rename from twitter-langchain/examples/chatbot-python/Makefile rename to python/examples/twitter-langchain-chatbot/Makefile diff --git a/twitter-langchain/examples/chatbot-python/README.md b/python/examples/twitter-langchain-chatbot/README.md similarity index 95% rename from twitter-langchain/examples/chatbot-python/README.md rename to python/examples/twitter-langchain-chatbot/README.md index eb76ea5b2..7d7f12c35 100644 --- a/twitter-langchain/examples/chatbot-python/README.md +++ b/python/examples/twitter-langchain-chatbot/README.md @@ -1,4 +1,4 @@ -# CDP Agentkit Twitter Langchain Extension Examples - Chatbot Python +# CDP Agentkit Twitter LangChain Extension Examples - Chatbot Python This example demonstrates an agent setup as a terminal style chatbot with access to Twitter (X) API actions. diff --git a/twitter-langchain/examples/chatbot-python/chatbot.py b/python/examples/twitter-langchain-chatbot/chatbot.py similarity index 100% rename from twitter-langchain/examples/chatbot-python/chatbot.py rename to python/examples/twitter-langchain-chatbot/chatbot.py diff --git a/twitter-langchain/examples/chatbot-python/pyproject.toml b/python/examples/twitter-langchain-chatbot/pyproject.toml similarity index 100% rename from twitter-langchain/examples/chatbot-python/pyproject.toml rename to python/examples/twitter-langchain-chatbot/pyproject.toml diff --git a/twitter-langchain/python/CHANGELOG.md b/python/twitter-langchain/CHANGELOG.md similarity index 100% rename from twitter-langchain/python/CHANGELOG.md rename to python/twitter-langchain/CHANGELOG.md diff --git a/twitter-langchain/python/Makefile b/python/twitter-langchain/Makefile similarity index 100% rename from twitter-langchain/python/Makefile rename to python/twitter-langchain/Makefile diff --git a/python/twitter-langchain/README.md b/python/twitter-langchain/README.md new file mode 100644 index 000000000..24a8b927e --- /dev/null +++ b/python/twitter-langchain/README.md @@ -0,0 +1,119 @@ +# Twitter (X) LangChain Toolkit + +LangChain extension of AgentKit. Enables agentic workflows to interact with Twitter, such as to post a tweet. + +This toolkit contains tools that enable an LLM agent to interact with [Twitter](https://developer.x.com/en/docs/x-api). The toolkit provides a wrapper around the Twitter (X) API, allowing agents to perform social operations like posting text. + +## Setup + +### Prerequisites + +- [OpenAI API Key](https://platform.openai.com/api-keys) +- [Twitter (X) App Developer Keys](https://developer.x.com/en/portal/dashboard) +- Python 3.10 or higher + +### Installation + +```bash +pip install twitter-langchain +``` + +### Environment Setup + +Set the following environment variables: + +```bash +export OPENAI_API_KEY= +export TWITTER_API_KEY= +export TWITTER_API_SECRET= +export TWITTER_ACCESS_TOKEN= +export TWITTER_ACCESS_TOKEN_SECRET= +export TWITTER_BEARER_TOKEN= +``` + +## Usage + +### Basic Setup + +```python +from twitter_langchain import ( + TwitterApiWrapper, + TwitterToolkit +) + +# Initialize TwitterApiwrapper +twitter_api_wrapper = TwitterApiWrapper() + +# Create TwitterToolkit from the api wrapper +twitter_toolkit = TwitterToolkit.from_twitter_api_wrapper(twitter_api_wrapper) +``` + +View available tools: +```python +tools = twitter_toolkit.get_tools() +for tool in tools: + print(tool.name) +``` + +### Available Tools + +The toolkit provides the following tools: + +1. **account_details** - Get the authenticated account details +2. **account_mentions** - Get mentions for the account +3. **post_tweet** - Post a tweet to the account +3. **post_tweet_reply** - Post a reply to a tweet on Twitter + +### Using with an Agent + +```python +import uuid + +from langchain_openai import ChatOpenAI +from langchain_core.messages import HumanMessage +from langgraph.prebuilt import create_react_agent + +llm = ChatOpenAI(model="gpt-4o-mini") + +# Create agent +agent_executor = create_react_agent(llm, tools) + +# Example - post tweet +events = agent_executor.stream( + { + "messages": [ + HumanMessage(content=f"Please post 'hello, world! {uuid.uuid4().hex}' to twitter"), + ], + }, + stream_mode="values", +) + +for event in events: + event["messages"][-1].pretty_print() +``` + +Expected output: +``` +================================ Human Message ================================= +Please post 'hello, world! c4b8e3744c2e4345be9e0622b4c0a8aa' to twitter +================================== Ai Message ================================== +Tool Calls: + post_tweet (call_xVx4BMCSlCmCcbEQG1yyebbq) + Call ID: call_xVx4BMCSlCmCcbEQG1yyebbq + Args: + tweet: hello, world! c4b8e3744c2e4345be9e0622b4c0a8aa +================================= Tool Message ================================= +Name: post_tweet +Successfully posted! +================================== Ai Message ================================== +The message "hello, world! c4b8e3744c2e4345be9e0622b4c0a8aa" has been successfully posted to Twitter! +``` + +## Examples + +Check out [../examples](../examples) for inspiration and help getting started! +- [Chatbot Python](../examples/twitter-langchain-chatbot/README.md): Simple example of a Python Chatbot that can interact on Twitter (X), using OpenAI. + +## Contributing + +See [CONTRIBUTING.md](../../CONTRIBUTING.md) for detailed setup instructions and contribution guidelines. diff --git a/twitter-langchain/python/docs/Makefile b/python/twitter-langchain/docs/Makefile similarity index 100% rename from twitter-langchain/python/docs/Makefile rename to python/twitter-langchain/docs/Makefile diff --git a/twitter-langchain/python/README.md b/python/twitter-langchain/docs/README.md similarity index 100% rename from twitter-langchain/python/README.md rename to python/twitter-langchain/docs/README.md diff --git a/twitter-langchain/python/docs/conf.py b/python/twitter-langchain/docs/conf.py similarity index 100% rename from twitter-langchain/python/docs/conf.py rename to python/twitter-langchain/docs/conf.py diff --git a/twitter-langchain/python/docs/index.rst b/python/twitter-langchain/docs/index.rst similarity index 100% rename from twitter-langchain/python/docs/index.rst rename to python/twitter-langchain/docs/index.rst diff --git a/twitter-langchain/python/docs/make.bat b/python/twitter-langchain/docs/make.bat similarity index 100% rename from twitter-langchain/python/docs/make.bat rename to python/twitter-langchain/docs/make.bat diff --git a/twitter-langchain/python/docs/modules.rst b/python/twitter-langchain/docs/modules.rst similarity index 100% rename from twitter-langchain/python/docs/modules.rst rename to python/twitter-langchain/docs/modules.rst diff --git a/twitter-langchain/python/docs/twitter_langchain.rst b/python/twitter-langchain/docs/twitter_langchain.rst similarity index 100% rename from twitter-langchain/python/docs/twitter_langchain.rst rename to python/twitter-langchain/docs/twitter_langchain.rst diff --git a/twitter-langchain/python/poetry.lock b/python/twitter-langchain/poetry.lock similarity index 99% rename from twitter-langchain/python/poetry.lock rename to python/twitter-langchain/poetry.lock index a1e6a0f4d..d638fef0f 100644 --- a/twitter-langchain/python/poetry.lock +++ b/python/twitter-langchain/poetry.lock @@ -191,13 +191,13 @@ files = [ [[package]] name = "attrs" -version = "24.3.0" +version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" files = [ - {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, - {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, + {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, + {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] [package.extras] @@ -502,7 +502,7 @@ web3 = "^7.6.0" [package.source] type = "directory" -url = "../../cdp-agentkit-core/python" +url = "../cdp-agentkit-core" [[package]] name = "cdp-sdk" @@ -527,13 +527,13 @@ web3 = ">=7.6.0,<8.0.0" [[package]] name = "certifi" -version = "2024.12.14" +version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, - {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, ] [[package]] @@ -1759,19 +1759,19 @@ files = [ [[package]] name = "langchain" -version = "0.3.15" +version = "0.3.17" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain-0.3.15-py3-none-any.whl", hash = "sha256:2657735184054cae8181ac43fce6cbc9ee64ca81a2ad2aed3ccd6e5d6fe1f19f"}, - {file = "langchain-0.3.15.tar.gz", hash = "sha256:1204d67f8469cd8da5621d2b39501650a824d4c0d5a74264dfe3df9a7528897e"}, + {file = "langchain-0.3.17-py3-none-any.whl", hash = "sha256:4d6d3cf454cc261a5017fd1fa5014cffcc7aeaccd0ec0530fc10c5f71e6e97a0"}, + {file = "langchain-0.3.17.tar.gz", hash = "sha256:cef56f0a7c8369f35f1fa2690ecf0caa4504a36a5383de0eb29b8a5e26f625a0"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.3.31,<0.4.0" +langchain-core = ">=0.3.33,<0.4.0" langchain-text-splitters = ">=0.3.3,<0.4.0" langsmith = ">=0.1.17,<0.4" numpy = [ @@ -1786,13 +1786,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" [[package]] name = "langchain-core" -version = "0.3.31" +version = "0.3.33" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_core-0.3.31-py3-none-any.whl", hash = "sha256:882e64ad95887c951dce8e835889e43263b11848c394af3b73e06912624bd743"}, - {file = "langchain_core-0.3.31.tar.gz", hash = "sha256:5ffa56354c07de9efaa4139609659c63e7d9b29da2c825f6bab9392ec98300df"}, + {file = "langchain_core-0.3.33-py3-none-any.whl", hash = "sha256:269706408a2223f863ff1f9616f31903a5712403199d828b50aadbc4c28b553a"}, + {file = "langchain_core-0.3.33.tar.gz", hash = "sha256:b5dd93a4e7f8198d2fc6048723b0bfecf7aaf128b0d268cbac19c34c1579b953"}, ] [package.dependencies] @@ -1823,13 +1823,13 @@ langchain-core = ">=0.3.29,<0.4.0" [[package]] name = "langsmith" -version = "0.3.1" +version = "0.3.4" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langsmith-0.3.1-py3-none-any.whl", hash = "sha256:b6afbb214ae82b6d96b8134718db3a7d2598b2a7eb4ab1212bcd6d96e04eda10"}, - {file = "langsmith-0.3.1.tar.gz", hash = "sha256:9242a49d37e2176a344ddec97bf57b958dc0e1f0437e150cefd0fb70195f0e26"}, + {file = "langsmith-0.3.4-py3-none-any.whl", hash = "sha256:f3b818ce31dc3bdf1f797e75bf32a8a7b062a411f146bd4ffdfc2be0b4b03233"}, + {file = "langsmith-0.3.4.tar.gz", hash = "sha256:79fd516e68bbc30f408ab0b30a92175e5be0f5c21002e30a7804c59cb72cfe1a"}, ] [package.dependencies] @@ -4360,4 +4360,4 @@ cffi = ["cffi (>=1.11)"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "7f377fe36df17a75ea0ee324d9b75cb3eca5d07423c2c296bc6191a5c1e54144" +content-hash = "757da08e3084db7e7636f60390075f47553cc4382b62282386b067ecd3b1dd1a" diff --git a/twitter-langchain/python/pyproject.toml b/python/twitter-langchain/pyproject.toml similarity index 94% rename from twitter-langchain/python/pyproject.toml rename to python/twitter-langchain/pyproject.toml index 90a29cc51..b4f7a1041 100644 --- a/twitter-langchain/python/pyproject.toml +++ b/python/twitter-langchain/pyproject.toml @@ -26,7 +26,7 @@ sphinx = "^8.0.2" sphinx-autobuild = "^2024.9.19" sphinxcontrib-napoleon = "^0.7" sphinx-autodoc-typehints = "^2.4.4" -cdp-agentkit-core = { path = "../../cdp-agentkit-core/python", develop = true } +cdp-agentkit-core = { path = "../cdp-agentkit-core", develop = true } [build-system] requires = ["poetry-core"] diff --git a/twitter-langchain/python/tests/__init__.py b/python/twitter-langchain/tests/__init__.py similarity index 100% rename from twitter-langchain/python/tests/__init__.py rename to python/twitter-langchain/tests/__init__.py diff --git a/twitter-langchain/python/tests/actions/__init__.py b/python/twitter-langchain/tests/actions/__init__.py similarity index 100% rename from twitter-langchain/python/tests/actions/__init__.py rename to python/twitter-langchain/tests/actions/__init__.py diff --git a/twitter-langchain/python/tests/actions/test_account_details.py b/python/twitter-langchain/tests/actions/test_account_details.py similarity index 100% rename from twitter-langchain/python/tests/actions/test_account_details.py rename to python/twitter-langchain/tests/actions/test_account_details.py diff --git a/twitter-langchain/python/tests/actions/test_account_mentions.py b/python/twitter-langchain/tests/actions/test_account_mentions.py similarity index 100% rename from twitter-langchain/python/tests/actions/test_account_mentions.py rename to python/twitter-langchain/tests/actions/test_account_mentions.py diff --git a/twitter-langchain/python/tests/actions/test_post_tweet.py b/python/twitter-langchain/tests/actions/test_post_tweet.py similarity index 100% rename from twitter-langchain/python/tests/actions/test_post_tweet.py rename to python/twitter-langchain/tests/actions/test_post_tweet.py diff --git a/twitter-langchain/python/tests/actions/test_post_tweet_reply.py b/python/twitter-langchain/tests/actions/test_post_tweet_reply.py similarity index 100% rename from twitter-langchain/python/tests/actions/test_post_tweet_reply.py rename to python/twitter-langchain/tests/actions/test_post_tweet_reply.py diff --git a/twitter-langchain/python/tests/conftest.py b/python/twitter-langchain/tests/conftest.py similarity index 100% rename from twitter-langchain/python/tests/conftest.py rename to python/twitter-langchain/tests/conftest.py diff --git a/twitter-langchain/python/tests/factories/twitter_factory.py b/python/twitter-langchain/tests/factories/twitter_factory.py similarity index 100% rename from twitter-langchain/python/tests/factories/twitter_factory.py rename to python/twitter-langchain/tests/factories/twitter_factory.py diff --git a/twitter-langchain/python/twitter_langchain/__init__.py b/python/twitter-langchain/twitter_langchain/__init__.py similarity index 100% rename from twitter-langchain/python/twitter_langchain/__init__.py rename to python/twitter-langchain/twitter_langchain/__init__.py diff --git a/twitter-langchain/python/twitter_langchain/twitter_api_wrapper.py b/python/twitter-langchain/twitter_langchain/twitter_api_wrapper.py similarity index 100% rename from twitter-langchain/python/twitter_langchain/twitter_api_wrapper.py rename to python/twitter-langchain/twitter_langchain/twitter_api_wrapper.py diff --git a/twitter-langchain/python/twitter_langchain/twitter_tool.py b/python/twitter-langchain/twitter_langchain/twitter_tool.py similarity index 100% rename from twitter-langchain/python/twitter_langchain/twitter_tool.py rename to python/twitter-langchain/twitter_langchain/twitter_tool.py diff --git a/twitter-langchain/python/twitter_langchain/twitter_toolkit.py b/python/twitter-langchain/twitter_langchain/twitter_toolkit.py similarity index 100% rename from twitter-langchain/python/twitter_langchain/twitter_toolkit.py rename to python/twitter-langchain/twitter_langchain/twitter_toolkit.py diff --git a/tsconfig.base.json b/tsconfig.base.json index f366229d4..84f2b2193 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -12,7 +12,9 @@ "forceConsistentCasingInFileNames": true, "declaration": true, "noImplicitAny": false, - "removeComments": false + "removeComments": false, + "experimentalDecorators": true, + "emitDecoratorMetadata": true }, "include": ["src/**/*.ts"], "exclude": ["node_modules", "dist", "**/tests/**/**"] diff --git a/twitter-langchain/README.md b/twitter-langchain/README.md deleted file mode 100644 index cad56408d..000000000 --- a/twitter-langchain/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Twitter (X) Langchain Toolkit - -Twitter integration with Langchain to enable agentic workflows using the core primitives defined in `cdp-agentkit-core`. - -This toolkit contains tools that enable an LLM agent to interact with [Twitter](https://developer.x.com/en/docs/x-api). The toolkit provides a wrapper around the Twitter (X) API, allowing agents to perform social operations like posting text. - -For Python, see [twitter-langchain/python](./python/README.md). -For TypeScript, see [twitter-langchain/typescript](./typescript/README.md). diff --git a/twitter-langchain/examples/chatbot-python/poetry.lock b/twitter-langchain/examples/chatbot-python/poetry.lock deleted file mode 100644 index e221feb0b..000000000 --- a/twitter-langchain/examples/chatbot-python/poetry.lock +++ /dev/null @@ -1,3590 +0,0 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. - -[[package]] -name = "aiohappyeyeballs" -version = "2.4.4" -description = "Happy Eyeballs for asyncio" -optional = false -python-versions = ">=3.8" -files = [ - {file = "aiohappyeyeballs-2.4.4-py3-none-any.whl", hash = "sha256:a980909d50efcd44795c4afeca523296716d50cd756ddca6af8c65b996e27de8"}, - {file = "aiohappyeyeballs-2.4.4.tar.gz", hash = "sha256:5fdd7d87889c63183afc18ce9271f9b0a7d32c2303e394468dd45d514a757745"}, -] - -[[package]] -name = "aiohttp" -version = "3.11.11" -description = "Async http client/server framework (asyncio)" -optional = false -python-versions = ">=3.9" -files = [ - {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, - {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, - {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, - {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, - {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, - {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, - {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, - {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, - {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, - {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, - {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, - {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, - {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, - {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, - {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, - {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, - {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, - {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, - {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, - {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, - {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, - {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, - {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, - {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, - {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, - {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, - {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, - {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, -] - -[package.dependencies] -aiohappyeyeballs = ">=2.3.0" -aiosignal = ">=1.1.2" -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" -propcache = ">=0.2.0" -yarl = ">=1.17.0,<2.0" - -[package.extras] -speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] - -[[package]] -name = "aiosignal" -version = "1.3.2" -description = "aiosignal: a list of registered asynchronous callbacks" -optional = false -python-versions = ">=3.9" -files = [ - {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"}, - {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"}, -] - -[package.dependencies] -frozenlist = ">=1.1.0" - -[[package]] -name = "annotated-types" -version = "0.7.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, - {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, -] - -[[package]] -name = "anyio" -version = "4.8.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.9" -files = [ - {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, - {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" -typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} - -[package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] -trio = ["trio (>=0.26.1)"] - -[[package]] -name = "asn1crypto" -version = "1.5.1" -description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP" -optional = false -python-versions = "*" -files = [ - {file = "asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67"}, - {file = "asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"}, -] - -[[package]] -name = "async-timeout" -version = "4.0.3" -description = "Timeout context manager for asyncio programs" -optional = false -python-versions = ">=3.7" -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"}, -] - -[[package]] -name = "attrs" -version = "24.3.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.8" -files = [ - {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, - {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, -] - -[package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] - -[[package]] -name = "bip-utils" -version = "2.9.3" -description = "Generation of mnemonics, seeds, private/public keys and addresses for different types of cryptocurrencies" -optional = false -python-versions = ">=3.7" -files = [ - {file = "bip_utils-2.9.3-py3-none-any.whl", hash = "sha256:ee26b8417a576c7f89b847da37316db01a5cece1994c1609d37fbeefb91ad45e"}, - {file = "bip_utils-2.9.3.tar.gz", hash = "sha256:72a8c95484b57e92311b0b2a3d5195b0ce4395c19a0b157d4a289e8b1300f48a"}, -] - -[package.dependencies] -cbor2 = ">=5.1.2,<6.0.0" -coincurve = [ - {version = ">=16.0.0", markers = "python_version == \"3.10\""}, - {version = ">=18.0.0", markers = "python_version == \"3.11\""}, - {version = ">=19.0.1", markers = "python_version >= \"3.12\""}, -] -crcmod = ">=1.7,<2.0" -ecdsa = ">=0.17,<1.0" -ed25519-blake2b = [ - {version = ">=1.4,<2.0.0", markers = "python_version < \"3.12\""}, - {version = ">=1.4.1,<2.0.0", markers = "python_version >= \"3.12\""}, -] -py-sr25519-bindings = [ - {version = ">=0.1.4,<2.0.0", markers = "python_version == \"3.10\""}, - {version = ">=0.2.0,<2.0.0", markers = "python_version >= \"3.11\""}, -] -pycryptodome = ">=3.15,<4.0" -pynacl = ">=1.5,<2.0" - -[package.extras] -develop = ["coverage (>=5.3)", "flake8 (>=3.8)", "isort (>=5.8)", "mypy (>=0.900)", "prospector[with-mypy,with-pyroma] (>=1.7)", "pytest (>=7.0)", "pytest-cov (>=2.10)"] - -[[package]] -name = "bitarray" -version = "3.0.0" -description = "efficient arrays of booleans -- C extension" -optional = false -python-versions = "*" -files = [ - {file = "bitarray-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ddbf71a97ad1d6252e6e93d2d703b624d0a5b77c153b12f9ea87d83e1250e0c"}, - {file = "bitarray-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0e7f24a0b01e6e6a0191c50b06ca8edfdec1988d9d2b264d669d2487f4f4680"}, - {file = "bitarray-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:150b7b29c36d9f1a24779aea723fdfc73d1c1c161dc0ea14990da27d4e947092"}, - {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8330912be6cb8e2fbfe8eb69f82dee139d605730cadf8d50882103af9ac83bb4"}, - {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e56ba8be5f17dee0ffa6d6ce85251e062ded2faa3cbd2558659c671e6c3bf96d"}, - {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd94b4803811c738e504a4b499fb2f848b2f7412d71e6b517508217c1d7929d"}, - {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0255bd05ec7165e512c115423a5255a3f301417973d20a80fc5bfc3f3640bcb"}, - {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe606e728842389943a939258809dc5db2de831b1d2e0118515059e87f7bbc1a"}, - {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e89ea59a3ed86a6eb150d016ed28b1bedf892802d0ed32b5659d3199440f3ced"}, - {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cf0cc2e91dd38122dec2e6541efa99aafb0a62e118179218181eff720b4b8153"}, - {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2d9fe3ee51afeb909b68f97e14c6539ace3f4faa99b21012e610bbe7315c388d"}, - {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:37be5482b9df3105bad00fdf7dc65244e449b130867c3879c9db1db7d72e508b"}, - {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0027b8f3bb2bba914c79115e96a59b9924aafa1a578223a7c4f0a7242d349842"}, - {file = "bitarray-3.0.0-cp310-cp310-win32.whl", hash = "sha256:628f93e9c2c23930bd1cfe21c634d6c84ec30f45f23e69aefe1fcd262186d7bb"}, - {file = "bitarray-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:0b655c3110e315219e266b2732609fddb0857bc69593de29f3c2ba74b7d3f51a"}, - {file = "bitarray-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:44c3e78b60070389b824d5a654afa1c893df723153c81904088d4922c3cfb6ac"}, - {file = "bitarray-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:545d36332de81e4742a845a80df89530ff193213a50b4cbef937ed5a44c0e5e5"}, - {file = "bitarray-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a9eb510cde3fa78c2e302bece510bf5ed494ec40e6b082dec753d6e22d5d1b1"}, - {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e3727ab63dfb6bde00b281934e2212bb7529ea3006c0031a556a84d2268bea5"}, - {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2055206ed653bee0b56628f6a4d248d53e5660228d355bbec0014bdfa27050ae"}, - {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:147542299f458bdb177f798726e5f7d39ab8491de4182c3c6d9885ed275a3c2b"}, - {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f761184b93092077c7f6b7dad7bd4e671c1620404a76620da7872ceb576a94"}, - {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e008b7b4ce6c7f7a54b250c45c28d4243cc2a3bbfd5298fa7dac92afda229842"}, - {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dfea514e665af278b2e1d4deb542de1cd4f77413bee83dd15ae16175976ea8d5"}, - {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:66d6134b7bb737b88f1d16478ad0927c571387f6054f4afa5557825a4c1b78e2"}, - {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3cd565253889940b4ec4768d24f101d9fe111cad4606fdb203ea16f9797cf9ed"}, - {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4800c91a14656789d2e67d9513359e23e8a534c8ee1482bb9b517a4cfc845200"}, - {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c2945e0390d1329c585c584c6b6d78be017d9c6a1288f9c92006fe907f69cc28"}, - {file = "bitarray-3.0.0-cp311-cp311-win32.whl", hash = "sha256:c23286abba0cb509733c6ce8f4013cd951672c332b2e184dbefbd7331cd234c8"}, - {file = "bitarray-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ca79f02a98cbda1472449d440592a2fe2ad96fe55515a0447fa8864a38017cf8"}, - {file = "bitarray-3.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:184972c96e1c7e691be60c3792ca1a51dd22b7f25d96ebea502fe3c9b554f25d"}, - {file = "bitarray-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:787db8da5e9e29be712f7a6bce153c7bc8697ccc2c38633e347bb9c82475d5c9"}, - {file = "bitarray-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2da91ab3633c66999c2a352f0ca9ae064f553e5fc0eca231d28e7e305b83e942"}, - {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7edb83089acbf2c86c8002b96599071931dc4ea5e1513e08306f6f7df879a48b"}, - {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996d1b83eb904589f40974538223eaed1ab0f62be8a5105c280b9bd849e685c4"}, - {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4817d73d995bd2b977d9cde6050be8d407791cf1f84c8047fa0bea88c1b815bc"}, - {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d47bc4ff9b0e1624d613563c6fa7b80aebe7863c56c3df5ab238bb7134e8755"}, - {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aca0a9cd376beaccd9f504961de83e776dd209c2de5a4c78dc87a78edf61839b"}, - {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:572a61fba7e3a710a8324771322fba8488d134034d349dcd036a7aef74723a80"}, - {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a817ad70c1aff217530576b4f037dd9b539eb2926603354fcac605d824082ad1"}, - {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2ac67b658fa5426503e9581a3fb44a26a3b346c1abd17105735f07db572195b3"}, - {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:12f19ede03e685c5c588ab5ed63167999295ffab5e1126c5fe97d12c0718c18f"}, - {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcef31b062f756ba7eebcd7890c5d5de84b9d64ee877325257bcc9782288564a"}, - {file = "bitarray-3.0.0-cp312-cp312-win32.whl", hash = "sha256:656db7bdf1d81ec3b57b3cad7ec7276765964bcfd0eb81c5d1331f385298169c"}, - {file = "bitarray-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f785af6b7cb07a9b1e5db0dea9ef9e3e8bb3d74874a0a61303eab9c16acc1999"}, - {file = "bitarray-3.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7cb885c043000924554fe2124d13084c8fdae03aec52c4086915cd4cb87fe8be"}, - {file = "bitarray-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7814c9924a0b30ecd401f02f082d8697fc5a5be3f8d407efa6e34531ff3c306a"}, - {file = "bitarray-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bcf524a087b143ba736aebbb054bb399d49e77cf7c04ed24c728e411adc82bfa"}, - {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1d5abf1d6d910599ac16afdd9a0ed3e24f3b46af57f3070cf2792f236f36e0b"}, - {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9929051feeaf8d948cc0b1c9ce57748079a941a1a15c89f6014edf18adaade84"}, - {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96cf0898f8060b2d3ae491762ae871b071212ded97ff9e1e3a5229e9fefe544c"}, - {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab37da66a8736ad5a75a58034180e92c41e864da0152b84e71fcc253a2f69cd4"}, - {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeb79e476d19b91fd6a3439853e4e5ba1b3b475920fa40d62bde719c8af786f"}, - {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f75fc0198c955d840b836059bd43e0993edbf119923029ca60c4fc017cefa54a"}, - {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f12cc7c7638074918cdcc7491aff897df921b092ffd877227892d2686e98f876"}, - {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dbe1084935b942fab206e609fa1ed3f46ad1f2612fb4833e177e9b2a5e006c96"}, - {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac06dd72ee1e1b6e312504d06f75220b5894af1fb58f0c20643698f5122aea76"}, - {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00f9a88c56e373009ac3c73c55205cfbd9683fbd247e2f9a64bae3da78795252"}, - {file = "bitarray-3.0.0-cp313-cp313-win32.whl", hash = "sha256:9c6e52005e91803eb4e08c0a08a481fb55ddce97f926bae1f6fa61b3396b5b61"}, - {file = "bitarray-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:cb98d5b6eac4b2cf2a5a69f60a9c499844b8bea207059e9fc45c752436e6bb49"}, - {file = "bitarray-3.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:eb27c01b747649afd7e1c342961680893df6d8d81f832a6f04d8c8e03a8a54cc"}, - {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4683bff52f5a0fd523fb5d3138161ef87611e63968e1fcb6cf4b0c6a86970fe0"}, - {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb7302dbcfcb676f0b66f15891f091d0233c4fc23e1d4b9dc9b9e958156e347f"}, - {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:153d7c416a70951dcfa73487af05d2f49c632e95602f1620cd9a651fa2033695"}, - {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251cd5bd47f542893b2b61860eded54f34920ea47fd5bff038d85e7a2f7ae99b"}, - {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fa4b4d9fa90124b33b251ef74e44e737021f253dc7a9174e1b39f097451f7ca"}, - {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:18abdce7ab5d2104437c39670821cba0b32fdb9b2da9e6d17a4ff295362bd9dc"}, - {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:2855cc01ee370f7e6e3ec97eebe44b1453c83fb35080313145e2c8c3c5243afb"}, - {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:0cecaf2981c9cd2054547f651537b4f4939f9fe225d3fc2b77324b597c124e40"}, - {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:22b00f65193fafb13aa644e16012c8b49e7d5cbb6bb72825105ff89aadaa01e3"}, - {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:20f30373f0af9cb583e4122348cefde93c82865dbcbccc4997108b3d575ece84"}, - {file = "bitarray-3.0.0-cp36-cp36m-win32.whl", hash = "sha256:aef404d5400d95c6ec86664df9924bde667c8865f8e33c9b7bd79823d53b3e5d"}, - {file = "bitarray-3.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ec5b0f2d13da53e0975ac15ecbe8badb463bdb0bebaa09457f4df3320421915c"}, - {file = "bitarray-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:041c889e69c847b8a96346650e50f728b747ae176889199c49a3f31ae1de0e23"}, - {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc83ea003dd75e9ade3291ef0585577dd5524aec0c8c99305c0aaa2a7570d6db"}, - {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c33129b49196aa7965ac0f16fcde7b6ad8614b606caf01669a0277cef1afe1d"}, - {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ef5c787c8263c082a73219a69eb60a500e157a4ac69d1b8515ad836b0e71fb4"}, - {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e15c94d79810c5ab90ddf4d943f71f14332890417be896ca253f21fa3d78d2b1"}, - {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cd021ada988e73d649289cee00428b75564c46d55fbdcb0e3402e504b0ae5ea"}, - {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7f1c24be7519f16a47b7e2ad1a1ef73023d34d8cbe1a3a59b185fc14baabb132"}, - {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:000df24c183011b5d27c23d79970f49b6762e5bb5aacd25da9c3e9695c693222"}, - {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:42bf1b222c698b467097f58b9f59dc850dfa694dde4e08237407a6a103757aa3"}, - {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:648e7ce794928e8d11343b5da8ecc5b910af75a82ea1a4264d5d0a55c3785faa"}, - {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f536fc4d1a683025f9caef0bebeafd60384054579ffe0825bb9bd8c59f8c55b8"}, - {file = "bitarray-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:a754c1464e7b946b1cac7300c582c6fba7d66e535cd1dab76d998ad285ac5a37"}, - {file = "bitarray-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e91d46d12781a14ccb8b284566b14933de4e3b29f8bc5e1c17de7a2001ad3b5b"}, - {file = "bitarray-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:904c1d5e3bd24f0c0d37a582d2461312033c91436a6a4f3bdeeceb4bea4a899d"}, - {file = "bitarray-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:47ccf9887bd595d4a0536f2310f0dcf89e17ab83b8befa7dc8727b8017120fda"}, - {file = "bitarray-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71ad0139c95c9acf4fb62e203b428f9906157b15eecf3f30dc10b55919225896"}, - {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e002ac1073ac70e323a7a4bfa9ab95e7e1a85c79160799e265563f342b1557"}, - {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acc07211a59e2f245e9a06f28fa374d094fb0e71cf5366eef52abbb826ddc81e"}, - {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98a4070ddafabddaee70b2aa7cc6286cf73c37984169ab03af1782da2351059a"}, - {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7d09ef06ba57bea646144c29764bf6b870fb3c5558ca098191e07b6a1d40bf7"}, - {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce249ed981f428a8b61538ca82d3875847733d579dd40084ab8246549160f8a4"}, - {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea40e98d751ed4b255db4a88fe8fb743374183f78470b9e9305aab186bf28ede"}, - {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:928b8b6dfcd015e1a81334cfdac02815da2a2407854492a80cf8a3a922b04052"}, - {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:fbb645477595ce2a0fbb678d1cfd08d3b896e5d56196d40fb9e114eeab9382b3"}, - {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:dc1937a0ff2671797d35243db4b596329842480d125a65e9fe964bcffaf16dfc"}, - {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a4f49ac31734fe654a68e2515c0da7f5bbdf2d52755ba09a42ac406f1f08c9d0"}, - {file = "bitarray-3.0.0-cp38-cp38-win32.whl", hash = "sha256:6d2a2ce73f9897268f58857ad6893a1a6680c5a6b28f79d21c7d33285a5ae646"}, - {file = "bitarray-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:b1047999f1797c3ea7b7c85261649249c243308dcf3632840d076d18fa72f142"}, - {file = "bitarray-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:39b38a3d45dac39d528c87b700b81dfd5e8dc8e9e1a102503336310ef837c3fd"}, - {file = "bitarray-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0e104f9399144fab6a892d379ba1bb4275e56272eb465059beef52a77b4e5ce6"}, - {file = "bitarray-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0879f839ec8f079fa60c3255966c2e1aa7196699a234d4e5b7898fbc321901b5"}, - {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9502c2230d59a4ace2fddfd770dad8e8b414cbd99517e7e56c55c20997c28b8d"}, - {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57d5ef854f8ec434f2ffd9ddcefc25a10848393fe2976e2be2c8c773cf5fef42"}, - {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3c36b2fcfebe15ad1c10a90c1d52a42bebe960adcbce340fef867203028fbe7"}, - {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66a33a537e781eac3a352397ce6b07eedf3a8380ef4a804f8844f3f45e335544"}, - {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa54c7e1da8cf4be0aab941ea284ec64033ede5d6de3fd47d75e77cafe986e9d"}, - {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a667ea05ba1ea81b722682276dbef1d36990f8908cf51e570099fd505a89f931"}, - {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d756bfeb62ca4fe65d2af7a39249d442c05070c047d03729ad6cd4c2e9b0f0bd"}, - {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c9e9fef0754867d88e948ce8351c9fd7e507d8514e0f242fd67c907b9cdf98b3"}, - {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:67a0b56dd02f2713f6f52cacb3f251afd67c94c5f0748026d307d87a81a8e15c"}, - {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d8c36ddc1923bcc4c11b9994c54eaae25034812a42400b7b8a86fe6d242166a2"}, - {file = "bitarray-3.0.0-cp39-cp39-win32.whl", hash = "sha256:1414a7102a3c4986f241480544f5c99f5d32258fb9b85c9c04e84e48c490ab35"}, - {file = "bitarray-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:8c9733d2ff9b7838ac04bf1048baea153174753e6a47312be14c83c6a395424b"}, - {file = "bitarray-3.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fef4e3b3f2084b4dae3e5316b44cda72587dcc81f68b4eb2dbda1b8d15261b61"}, - {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e9eee03f187cef1e54a4545124109ee0afc84398628b4b32ebb4852b4a66393"}, - {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb5702dd667f4bb10fed056ffdc4ddaae8193a52cd74cb2cdb54e71f4ef2dd1"}, - {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:666e44b0458bb2894b64264a29f2cc7b5b2cbcc4c5e9cedfe1fdbde37a8e329a"}, - {file = "bitarray-3.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c756a92cf1c1abf01e56a4cc40cb89f0ff9147f2a0be5b557ec436a23ff464d8"}, - {file = "bitarray-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7e51e7f8289bf6bb631e1ef2a8f5e9ca287985ff518fe666abbdfdb6a848cb26"}, - {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fa5d8e4b28388b337face6ce4029be73585651a44866901513df44be9a491ab"}, - {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3963b80a68aedcd722a9978d261ae53cb9bb6a8129cc29790f0f10ce5aca287a"}, - {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b555006a7dea53f6bebc616a4d0249cecbf8f1fadf77860120a2e5dbdc2f167"}, - {file = "bitarray-3.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4ac2027ca650a7302864ed2528220d6cc6921501b383e9917afc7a2424a1e36d"}, - {file = "bitarray-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bf90aba4cff9e72e24ecdefe33bad608f147a23fa5c97790a5bab0e72fe62b6d"}, - {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a199e6d7c3bad5ba9d0e4dc00dde70ee7d111c9dfc521247fa646ef59fa57e"}, - {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43b6c7c4f4a7b80e86e24a76f4c6b9b67d03229ea16d7d403520616535c32196"}, - {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fc13da3518f14825b239374734fce93c1a9299ed7b558c3ec1d659ec7e4c70"}, - {file = "bitarray-3.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:369b6d457af94af901d632c7e625ca6caf0a7484110fc91c6290ce26bc4f1478"}, - {file = "bitarray-3.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ee040ad3b7dfa05e459713099f16373c1f2a6f68b43cb0575a66718e7a5daef4"}, - {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dad7ba2af80f9ec1dd988c3aca7992408ec0d0b4c215b65d353d95ab0070b10"}, - {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4839d3b64af51e4b8bb4a602563b98b9faeb34fd6c00ed23d7834e40a9d080fc"}, - {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f71f24b58e75a889b9915e3197865302467f13e7390efdea5b6afc7424b3a2ea"}, - {file = "bitarray-3.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bcf0150ae0bcc4aa97bdfcb231b37bad1a59083c1b5012643b266012bf420e68"}, - {file = "bitarray-3.0.0.tar.gz", hash = "sha256:a2083dc20f0d828a7cdf7a16b20dae56aab0f43dc4f347a3b3039f6577992b03"}, -] - -[[package]] -name = "cbor2" -version = "5.6.5" -description = "CBOR (de)serializer with extensive tag support" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cbor2-5.6.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e16c4a87fc999b4926f5c8f6c696b0d251b4745bc40f6c5aee51d69b30b15ca2"}, - {file = "cbor2-5.6.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87026fc838370d69f23ed8572939bd71cea2b3f6c8f8bb8283f573374b4d7f33"}, - {file = "cbor2-5.6.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a88f029522aec5425fc2f941b3df90da7688b6756bd3f0472ab886d21208acbd"}, - {file = "cbor2-5.6.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9d15b638539b68aa5d5eacc56099b4543a38b2d2c896055dccf7e83d24b7955"}, - {file = "cbor2-5.6.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:47261f54a024839ec649b950013c4de5b5f521afe592a2688eebbe22430df1dc"}, - {file = "cbor2-5.6.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:559dcf0d897260a9e95e7b43556a62253e84550b77147a1ad4d2c389a2a30192"}, - {file = "cbor2-5.6.5-cp310-cp310-win_amd64.whl", hash = "sha256:5b856fda4c50c5bc73ed3664e64211fa4f015970ed7a15a4d6361bd48462feaf"}, - {file = "cbor2-5.6.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:863e0983989d56d5071270790e7ed8ddbda88c9e5288efdb759aba2efee670bc"}, - {file = "cbor2-5.6.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5cff06464b8f4ca6eb9abcba67bda8f8334a058abc01005c8e616728c387ad32"}, - {file = "cbor2-5.6.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c7dbcdc59ea7f5a745d3e30ee5e6b6ff5ce7ac244aa3de6786391b10027bb3"}, - {file = "cbor2-5.6.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34cf5ab0dc310c3d0196caa6ae062dc09f6c242e2544bea01691fe60c0230596"}, - {file = "cbor2-5.6.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6797b824b26a30794f2b169c0575301ca9b74ae99064e71d16e6ba0c9057de51"}, - {file = "cbor2-5.6.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:73b9647eed1493097db6aad61e03d8f1252080ee041a1755de18000dd2c05f37"}, - {file = "cbor2-5.6.5-cp311-cp311-win_amd64.whl", hash = "sha256:6e14a1bf6269d25e02ef1d4008e0ce8880aa271d7c6b4c329dba48645764f60e"}, - {file = "cbor2-5.6.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e25c2aebc9db99af7190e2261168cdde8ed3d639ca06868e4f477cf3a228a8e9"}, - {file = "cbor2-5.6.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fde21ac1cf29336a31615a2c469a9cb03cf0add3ae480672d4d38cda467d07fc"}, - {file = "cbor2-5.6.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8947c102cac79d049eadbd5e2ffb8189952890df7cbc3ee262bbc2f95b011a9"}, - {file = "cbor2-5.6.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38886c41bebcd7dca57739439455bce759f1e4c551b511f618b8e9c1295b431b"}, - {file = "cbor2-5.6.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae2b49226224e92851c333b91d83292ec62eba53a19c68a79890ce35f1230d70"}, - {file = "cbor2-5.6.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2764804ffb6553283fc4afb10a280715905a4cea4d6dc7c90d3e89c4a93bc8d"}, - {file = "cbor2-5.6.5-cp312-cp312-win_amd64.whl", hash = "sha256:a3ac50485cf67dfaab170a3e7b527630e93cb0a6af8cdaa403054215dff93adf"}, - {file = "cbor2-5.6.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f0d0a9c5aabd48ecb17acf56004a7542a0b8d8212be52f3102b8218284bd881e"}, - {file = "cbor2-5.6.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61ceb77e6aa25c11c814d4fe8ec9e3bac0094a1f5bd8a2a8c95694596ea01e08"}, - {file = "cbor2-5.6.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97a7e409b864fecf68b2ace8978eb5df1738799a333ec3ea2b9597bfcdd6d7d2"}, - {file = "cbor2-5.6.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6d69f38f7d788b04c09ef2b06747536624b452b3c8b371ab78ad43b0296fab"}, - {file = "cbor2-5.6.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f91e6d74fa6917df31f8757fdd0e154203b0dd0609ec53eb957016a2b474896a"}, - {file = "cbor2-5.6.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5ce13a27ef8fddf643fc17a753fe34aa72b251d03c23da6a560c005dc171085b"}, - {file = "cbor2-5.6.5-cp313-cp313-win_amd64.whl", hash = "sha256:54c72a3207bb2d4480c2c39dad12d7971ce0853a99e3f9b8d559ce6eac84f66f"}, - {file = "cbor2-5.6.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4586a4f65546243096e56a3f18f29d60752ee9204722377021b3119a03ed99ff"}, - {file = "cbor2-5.6.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d1a18b3a58dcd9b40ab55c726160d4a6b74868f2a35b71f9e726268b46dc6a2"}, - {file = "cbor2-5.6.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a83b76367d1c3e69facbcb8cdf65ed6948678e72f433137b41d27458aa2a40cb"}, - {file = "cbor2-5.6.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90bfa36944caccec963e6ab7e01e64e31cc6664535dc06e6295ee3937c999cbb"}, - {file = "cbor2-5.6.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:37096663a5a1c46a776aea44906cbe5fa3952f29f50f349179c00525d321c862"}, - {file = "cbor2-5.6.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93676af02bd9a0b4a62c17c5b20f8e9c37b5019b1a24db70a2ee6cb770423568"}, - {file = "cbor2-5.6.5-cp38-cp38-win_amd64.whl", hash = "sha256:8f747b7a9aaa58881a0c5b4cd4a9b8fb27eca984ed261a769b61de1f6b5bd1e6"}, - {file = "cbor2-5.6.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:94885903105eec66d7efb55f4ce9884fdc5a4d51f3bd75b6fedc68c5c251511b"}, - {file = "cbor2-5.6.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fe11c2eb518c882cfbeed456e7a552e544893c17db66fe5d3230dbeaca6b615c"}, - {file = "cbor2-5.6.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66dd25dd919cddb0b36f97f9ccfa51947882f064729e65e6bef17c28535dc459"}, - {file = "cbor2-5.6.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa61a02995f3a996c03884cf1a0b5733f88cbfd7fa0e34944bf678d4227ee712"}, - {file = "cbor2-5.6.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:824f202b556fc204e2e9a67d6d6d624e150fbd791278ccfee24e68caec578afd"}, - {file = "cbor2-5.6.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7488aec919f8408f9987a3a32760bd385d8628b23a35477917aa3923ff6ad45f"}, - {file = "cbor2-5.6.5-cp39-cp39-win_amd64.whl", hash = "sha256:a34ee99e86b17444ecbe96d54d909dd1a20e2da9f814ae91b8b71cf1ee2a95e4"}, - {file = "cbor2-5.6.5-py3-none-any.whl", hash = "sha256:3038523b8fc7de312bb9cdcbbbd599987e64307c4db357cd2030c472a6c7d468"}, - {file = "cbor2-5.6.5.tar.gz", hash = "sha256:b682820677ee1dbba45f7da11898d2720f92e06be36acec290867d5ebf3d7e09"}, -] - -[package.extras] -benchmarks = ["pytest-benchmark (==4.0.0)"] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.3.0)", "typing-extensions"] -test = ["coverage (>=7)", "hypothesis", "pytest"] - -[[package]] -name = "cdp-agentkit-core" -version = "0.0.11" -description = "CDP Agentkit core primitives" -optional = false -python-versions = "<4.0,>=3.10" -files = [ - {file = "cdp_agentkit_core-0.0.11-py3-none-any.whl", hash = "sha256:103259f7780e690da0aa13a00e6c40f95d0f1ea568d340adc40f309621a8f2c0"}, - {file = "cdp_agentkit_core-0.0.11.tar.gz", hash = "sha256:00e30358877f01f8d0c2018b27c3cfa900e6e9a62fa766859321202abe3f9bea"}, -] - -[package.dependencies] -cdp-sdk = ">=0.15.0,<0.16.0" -pydantic = ">=2.0,<3.0" -web3 = ">=7.6.0,<8.0.0" - -[[package]] -name = "cdp-sdk" -version = "0.15.0" -description = "CDP Python SDK" -optional = false -python-versions = "<4.0,>=3.10" -files = [ - {file = "cdp_sdk-0.15.0-py3-none-any.whl", hash = "sha256:f640c1cad0aee829ad24ee1b41dc3f40f74472a1da4d53e257ba996527a64f95"}, - {file = "cdp_sdk-0.15.0.tar.gz", hash = "sha256:f7b015b2d3811d69db4ea5cb29cefc33fb47e7d2ce587f70222742ab602f610c"}, -] - -[package.dependencies] -bip-utils = ">=2.9.3,<3.0.0" -coincurve = ">=20.0.0,<21.0.0" -cryptography = ">=44.0.0,<45.0.0" -pydantic = ">=2.10.3,<3.0.0" -pyjwt = ">=2.10.1,<3.0.0" -python-dateutil = ">=2.9.0.post0,<3.0.0" -urllib3 = ">=2.2.3,<3.0.0" -web3 = ">=7.6.0,<8.0.0" - -[[package]] -name = "certifi" -version = "2024.12.14" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, - {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, -] - -[[package]] -name = "cffi" -version = "1.17.1" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.4.1" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7" -files = [ - {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, - {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, - {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, -] - -[[package]] -name = "ckzg" -version = "2.0.1" -description = "Python bindings for C-KZG-4844" -optional = false -python-versions = "*" -files = [ - {file = "ckzg-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b7f9ba6d215f8981c5545f952aac84875bd564a63da02fb22a3d1321662ecdc0"}, - {file = "ckzg-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8fdec3ff96399acba9baeef9e1b0b5258c08f73245780e6c69f7b73def5e8d0a"}, - {file = "ckzg-2.0.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1644369af9900a9f109d417d6760693edf134118f3100d0c68f56667de775b80"}, - {file = "ckzg-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0a2146f122d489ac7e67ae0c0743f8d0db1718e6aeed8f05717340594fe07dd"}, - {file = "ckzg-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:979841be50f2782b447762db38e9bc927ae251f6ca86c54a26561a52068ee779"}, - {file = "ckzg-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4516d86647ee4e8ea9470f4adf68fbebb6dc1bdedff7d9592c2504fe53145908"}, - {file = "ckzg-2.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:91866fc58a29b4829201efd9ffadfac3ffeca6359254a54a360ff6a189c34bf5"}, - {file = "ckzg-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed35508dac059b2c0a7994383bc7a92eaf35d0b9ce790016819e2619e0f4b8a9"}, - {file = "ckzg-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:449c4fe38017351eca362106420eeb2d28d50b7e54aa8668b3af29a8ab780132"}, - {file = "ckzg-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:260608a22e2f2cadcd31f4495832d45d6460438c38faba9761b92df885a99d88"}, - {file = "ckzg-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1015f99c50215098751b07d7e459ba9a2790d3692ca81552eed29996128e90d"}, - {file = "ckzg-2.0.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dd350d97554c161dc5b8c7b32c2dc8e659632c374f60e2669fb3c9b5b294827"}, - {file = "ckzg-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eec7724fa8dc4ae95757efe4a87e7b2d4b880cb348c72ce7355fc0c4f64bc298"}, - {file = "ckzg-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3fa0f4398fa67fb71f0a2b34a652cc89e6e0e6af1340b0dc771db1a5f3e089c"}, - {file = "ckzg-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f865a0297aabeeb638187a46f7df445763360417b9df4dea60560d512c2cda09"}, - {file = "ckzg-2.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b6ec738350771dbf5974fb70cc8bbb20a4df784af770f7e655922adc08a2171"}, - {file = "ckzg-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9b4b669fc77edeb16adc182efc32b3737b36f741a2e33a170d40619e8b171a94"}, - {file = "ckzg-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:decb97f4a17c7338b2130dcc4b045df4cc0e7785ece872c764b554c7c73a99ff"}, - {file = "ckzg-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:285cf3121b8a8c5609c5b706314f68d2ba2784ab02c5bb7487c6ae1714ecb27f"}, - {file = "ckzg-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f927bc41c2551b0ef0056a649a7ebed29d9665680a10795f4cee5002c69ddb7"}, - {file = "ckzg-2.0.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fd9fb690c88919f30c9f3ab7cc46a7ecd734d5ff4c9ccea383c119b9b7cc4da"}, - {file = "ckzg-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fabc3bd41b306d1c7025d561c3281a007c2aca8ceaf998582dc3894904d9c73e"}, - {file = "ckzg-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eb50c53efdb9c34f762bd0c8006cf79bc92a9daf47aa6b541e496988484124f"}, - {file = "ckzg-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7960cc62f959403293fb53a3c2404778369ae7cefc6d7f202e5e00567cf98c4b"}, - {file = "ckzg-2.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d721bcd492294c70eca39da0b0a433c29b6a571dbac2f7084bab06334904af06"}, - {file = "ckzg-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dde2391d025b5033ef0eeacf62b11ecfe446aea25682b5f547a907766ad0a8cb"}, - {file = "ckzg-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fab8859d9420f6f7df4e094ee3639bc49d18c8dab0df81bee825e2363dd67a09"}, - {file = "ckzg-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9747d92883199d4f8f3a3d7018134745fddcf692dfe67115434e4b32609ea785"}, - {file = "ckzg-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b2cf58fb9e165da97f0ffe9f4a6efb73992645fac8e0fa223a6cc7ec486a434a"}, - {file = "ckzg-2.0.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d25d006899d76bb8c9d3e8b27981dd6b66a78f9826e33c1bf981af6577a69a19"}, - {file = "ckzg-2.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a04bf0b32f04f5ea5e4b8518e292d3321bc05596fde95f9c3b4f504e5e4bc780"}, - {file = "ckzg-2.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0cf3dccd72376bff10e1833641cc9d642f34f60ca63972626d9dfcfdc8e77f"}, - {file = "ckzg-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:770809c7e93087470cc524724419b0f85590edb033c7c73ba94aef70b36ca18b"}, - {file = "ckzg-2.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e31b59b8124148d5e21f7e41b35532d7af98260c44a77c3917958adece84296d"}, - {file = "ckzg-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:174f0c356df644d6e349ce03b7284d83dbec859e11ca5d1b1b3bace8b8fbc65d"}, - {file = "ckzg-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:30e375cd45142e56b5dbfdec05ce4deb2368d7f7dedfc7408ba37d5639af05ff"}, - {file = "ckzg-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:abdee71958b214730a8341b16bdd413d0fab1b1a2504fbdb7b0ef2aeee9f9d22"}, - {file = "ckzg-2.0.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b4442667058db791325fe231f22e4fc7aaa3495d535d75af5595bc5f4f86036"}, - {file = "ckzg-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c3c9aa9d4477ad52f3561b717e776c1a8a442d9d8b06600c7d8a2857d1ecf05"}, - {file = "ckzg-2.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68e0a9cde35f11e80b4e560d22990f2f29dd200a95d3141acde137cb6c883f9a"}, - {file = "ckzg-2.0.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:4508a089e53330866d3360000d76483400eeab5f8057b8e1f3e344ce2cc0097b"}, - {file = "ckzg-2.0.1-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:828cecee16ec576dcf4386beac4eedfd058fd32ee90827f2282e7156a53600be"}, - {file = "ckzg-2.0.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:bd437ec1dfb4f5609979328b5f465a74307f45d46d24234868c67d44da96903b"}, - {file = "ckzg-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:70406b10acf68469ac62110047044a6c1a998f5d5fcd6e27cb3ec2d5760d0490"}, - {file = "ckzg-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2f53fba88febac17e82a96eb83dc38ecf4b28abcdd15c0246534c358bd3b26c4"}, - {file = "ckzg-2.0.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be8e0d5015e7755af4ddaab9ae1a4084f72c84b2cbb53628f4366aeed46cc380"}, - {file = "ckzg-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:261414121091042d29f28fc319d7c9a7f950f91f8bf54c010b581ee6a0499473"}, - {file = "ckzg-2.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524e1e66edd2be2c38b660824aa7b5d4525b41b30ac029d80738a8eee491aeb5"}, - {file = "ckzg-2.0.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:4a12a1d8ef8f475d9f0af9a538e1674057e007806cb1204bb269ea00d9f8c1e5"}, - {file = "ckzg-2.0.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:4cc4bb5f62417a58065deeaf124e178cb1787ef3228e6032600d1e0a2775765b"}, - {file = "ckzg-2.0.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:e7b015f5615bcb82fa0d935481a209fc1dcd9308fb52fb1a7e5400108df67a94"}, - {file = "ckzg-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0518933ff3b9550f9dd60d833cdb74e8e97cc1cc58f0560b706916606dfd47d0"}, - {file = "ckzg-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ac0bca0795990076cde1930ecec307379b5303e34367c6e6e8a16bdba5a7ba5"}, - {file = "ckzg-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8086d23a41020ede312843bda7ea4ee0c9831265379027904106f99f2f8ed469"}, - {file = "ckzg-2.0.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31d1b141d41fa51aeac9440c936b812e885aef5719adfbd3a27550d8dc433997"}, - {file = "ckzg-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60a58e4d8cb91bad669ca111b7ccdd05c32de6787fdb571bb599625b043ad75b"}, - {file = "ckzg-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633e143385622d7a43fcb5c4f400ec5ec15df0b1c74ab7d6449a41a7abed24ad"}, - {file = "ckzg-2.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:4876313614ea01f9a0039b5ca2c754340ba40aa8405f8756912d90ae55718011"}, - {file = "ckzg-2.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:19c86c8102200484074afac06b3946b457ba9915636de187f63854522be2e3bd"}, - {file = "ckzg-2.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:564abf27878f129781e1df4d33b1c4e264e5b25f89c1bdf95b7d6256e4bceb6c"}, - {file = "ckzg-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:bc2da29bb970d3f5de04fb60797dbb4490c010ffc683cbc6016349dd6fa60d14"}, - {file = "ckzg-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9c1869671140ae7e698520b678b594ebd26fb59ef476711403541597d7d32c01"}, - {file = "ckzg-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1dd2aec2c61e8cc2ec815900f6768c6fe74b8fd29810e79b57c4150c6db32fb6"}, - {file = "ckzg-2.0.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9632ef17285dbdd3fcd9780f599c266da736d9b2897decc4ea02ba8690bdf72"}, - {file = "ckzg-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5747d7926873e3af0f6af5fca666feb0097d06cab525950e2664a6fbcb90165d"}, - {file = "ckzg-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75484ffb78aaebaeb3a30f1194a9143b904312b0f365fc4101e58e1bf5f89f66"}, - {file = "ckzg-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b2f72bc861b8bee9bac3314c58586d1ab2d23530f932a8f0a8562c8a4a6a45f9"}, - {file = "ckzg-2.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6f85e5802fea5b77f52fc3a14c8dec18a3f2b7c7070c811a4608940834f563cc"}, - {file = "ckzg-2.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:583a0b6b531a16974676439b23e7defb3dfe9732f18d13d2316152019c538af1"}, - {file = "ckzg-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:fafb9ac36b3398f8091d40773d9a450e5f74883dad8ca4ee22d472e7a231ef4d"}, - {file = "ckzg-2.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a12e96f20dce35e5222f898a5c8355054ef7c5ee038eeb97dbb694640b57577b"}, - {file = "ckzg-2.0.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:4e0ebc55253addaa24dd2cd871bbe3b8f57855f32b5f74e70bf2cb76b6f7da54"}, - {file = "ckzg-2.0.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f917a7bf363a3735db30559e1ed63cf1ccf414234433ba687fa72c007abd756"}, - {file = "ckzg-2.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30f08c984286853271d4adae219e9ba87275a15047dbaa262ab8dd6c01be97b0"}, - {file = "ckzg-2.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fa1ea4888417e1f109fd5e57965788fb7f53b674329b937a65604a3c1ca1d03"}, - {file = "ckzg-2.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0b249914aeaf05cabc71c5c3797e3d6c126cb2c64192b7eb6755ef6aa5ab2f11"}, - {file = "ckzg-2.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a038e26baf650e1c733dcaa066ec948e75556b0c485e8c790c9a758875c71a93"}, - {file = "ckzg-2.0.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d6deb2c822122bdd32b555fa3b9216c86a355f24a2cc6a46b9b5743b412b60c"}, - {file = "ckzg-2.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50f6f2fbceba9ece3fbc1d2613a246f4e6ec4d787f542859e70c358928c0e4a1"}, - {file = "ckzg-2.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33ca40ef30129e2347bff3c95ad093403a0d5703476705ab92c92fbffe89bd5a"}, - {file = "ckzg-2.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:700b989c2f7089edc8fac6dfbd1b4677e85b966216ebedee8eb5e7894765c188"}, - {file = "ckzg-2.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f11933c007c3df02446a81957ac6e2488058b969e2eff5357c98ab569a0c7999"}, - {file = "ckzg-2.0.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:3dbc9580eccecbd485f22e48f6044c48cbe6d838a7b7514cce179c085c65a960"}, - {file = "ckzg-2.0.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad6eb83f343fea6dd9a13fd1bce87b9cd26abeeb72f0674a62d26e40fe0b8aca"}, - {file = "ckzg-2.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:269f82b992facbd20461310cf5784551c77d11017b7d4b85d741d70359be6794"}, - {file = "ckzg-2.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:895d67cfd43130652e1ae39b90465b392d9a72c7c7e6f250eaf14689bfda6351"}, - {file = "ckzg-2.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:369cf1aeaf336c31f2050a7f54ae21cf46f4b2db23ebb013fff621144ab361bb"}, - {file = "ckzg-2.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:24fda2637598a467e7b11ff664805ee7fdf4f6c7b0c043d6d0a6ccb69b5681ee"}, - {file = "ckzg-2.0.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea27baabe5b22b92901c428768eacf93b992ac7681f93768ab24818ad26ccfed"}, - {file = "ckzg-2.0.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a33f71e382020f2bc4ead2bd6881a9bd3811d929f272da239ac01ad615a00802"}, - {file = "ckzg-2.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:926507c569727bb4c851a1eea702c5e902267de96e06ce2d685019f973f72968"}, - {file = "ckzg-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f5f29518b0a4555d8f2a28559209bd1d4080547aa629ff9ee51799346573b3f"}, - {file = "ckzg-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4595db84ce63c227e4448de0f7b39d3043e3477d78394ff651708c37fee6c486"}, - {file = "ckzg-2.0.1.tar.gz", hash = "sha256:62c5adc381637affa7e1df465c57750b356a761b8a3164c3106589b02532b9c9"}, -] - -[[package]] -name = "coincurve" -version = "20.0.0" -description = "Cross-platform Python CFFI bindings for libsecp256k1" -optional = false -python-versions = ">=3.8" -files = [ - {file = "coincurve-20.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d559b22828638390118cae9372a1bb6f6594f5584c311deb1de6a83163a0919b"}, - {file = "coincurve-20.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33d7f6ebd90fcc550f819f7f2cce2af525c342aac07f0ccda46ad8956ad9d99b"}, - {file = "coincurve-20.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22d70dd55d13fd427418eb41c20fde0a20a5e5f016e2b1bb94710701e759e7e0"}, - {file = "coincurve-20.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f18d481eaae72c169f334cde1fd22011a884e0c9c6adc3fdc1fd13df8236a3"}, - {file = "coincurve-20.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9de1ec57f43c3526bc462be58fb97910dc1fdd5acab6c71eda9f9719a5bd7489"}, - {file = "coincurve-20.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a6f007c44c726b5c0b3724093c0d4fb8e294f6b6869beb02d7473b21777473a3"}, - {file = "coincurve-20.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0ff1f3b81330db5092c24da2102e4fcba5094f14945b3eb40746456ceabdd6d9"}, - {file = "coincurve-20.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82f7de97694d9343f26bd1c8e081b168e5f525894c12445548ce458af227f536"}, - {file = "coincurve-20.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e905b4b084b4f3b61e5a5d58ac2632fd1d07b7b13b4c6d778335a6ca1dafd7a3"}, - {file = "coincurve-20.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:3657bb5ed0baf1cf8cf356e7d44aa90a7902cc3dd4a435c6d4d0bed0553ad4f7"}, - {file = "coincurve-20.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:44087d1126d43925bf9a2391ce5601bf30ce0dba4466c239172dc43226696018"}, - {file = "coincurve-20.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ccf0ba38b0f307a9b3ce28933f6c71dc12ef3a0985712ca09f48591afd597c8"}, - {file = "coincurve-20.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:566bc5986debdf8572b6be824fd4de03d533c49f3de778e29f69017ae3fe82d8"}, - {file = "coincurve-20.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4d70283168e146f025005c15406086513d5d35e89a60cf4326025930d45013a"}, - {file = "coincurve-20.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:763c6122dd7d5e7a81c86414ce360dbe9a2d4afa1ca6c853ee03d63820b3d0c5"}, - {file = "coincurve-20.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f00c361c356bcea386d47a191bb8ac60429f4b51c188966a201bfecaf306ff7f"}, - {file = "coincurve-20.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4af57bdadd2e64d117dd0b33cfefe76e90c7a6c496a7b034fc65fd01ec249b15"}, - {file = "coincurve-20.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a26437b7cbde13fb6e09261610b788ca2a0ca2195c62030afd1e1e0d1a62e035"}, - {file = "coincurve-20.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ed51f8bba35e6c7676ad65539c3dbc35acf014fc402101fa24f6b0a15a74ab9e"}, - {file = "coincurve-20.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:594b840fc25d74118407edbbbc754b815f1bba9759dbf4f67f1c2b78396df2d3"}, - {file = "coincurve-20.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4df4416a6c0370d777aa725a25b14b04e45aa228da1251c258ff91444643f688"}, - {file = "coincurve-20.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1ccc3e4db55abf3fc0e604a187fdb05f0702bc5952e503d9a75f4ae6eeb4cb3a"}, - {file = "coincurve-20.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac8335b1658a2ef5b3eb66d52647742fe8c6f413ad5b9d5310d7ea6d8060d40f"}, - {file = "coincurve-20.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7ac025e485a0229fd5394e0bf6b4a75f8a4f6cee0dcf6f0b01a2ef05c5210ff"}, - {file = "coincurve-20.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e46e3f1c21b3330857bcb1a3a5b942f645c8bce912a8a2b252216f34acfe4195"}, - {file = "coincurve-20.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:df9ff9b17a1d27271bf476cf3fa92df4c151663b11a55d8cea838b8f88d83624"}, - {file = "coincurve-20.0.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4155759f071375699282e03b3d95fb473ee05c022641c077533e0d906311e57a"}, - {file = "coincurve-20.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0530b9dd02fc6f6c2916716974b79bdab874227f560c422801ade290e3fc5013"}, - {file = "coincurve-20.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:eacf9c0ce8739c84549a89c083b1f3526c8780b84517ee75d6b43d276e55f8a0"}, - {file = "coincurve-20.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:52a67bfddbd6224dfa42085c88ad176559801b57d6a8bd30d92ee040de88b7b3"}, - {file = "coincurve-20.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61e951b1d695b62376f60519a84c4facaf756eeb9c5aff975bea0942833f185d"}, - {file = "coincurve-20.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e9e548db77f4ea34c0d748dddefc698adb0ee3fab23ed19f80fb2118dac70f6"}, - {file = "coincurve-20.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdbf0da0e0809366fdfff236b7eb6e663669c7b1f46361a4c4d05f5b7e94c57"}, - {file = "coincurve-20.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d72222b4ecd3952e8ffcbf59bc7e0d1b181161ba170b60e5c8e1f359a43bbe7e"}, - {file = "coincurve-20.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9add43c4807f0c17a940ce4076334c28f51d09c145cd478400e89dcfb83fb59d"}, - {file = "coincurve-20.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc94cceea6ec8863815134083e6221a034b1ecef822d0277cf6ad2e70009b7f"}, - {file = "coincurve-20.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ffbdfef6a6d147988eabaed681287a9a7e6ba45ecc0a8b94ba62ad0a7656d97"}, - {file = "coincurve-20.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:13335c19c7e5f36eaba2a53c68073d981980d7dc7abfee68d29f2da887ccd24e"}, - {file = "coincurve-20.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:7fbfb8d16cf2bea2cf48fc5246d4cb0a06607d73bb5c57c007c9aed7509f855e"}, - {file = "coincurve-20.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4870047704cddaae7f0266a549c927407c2ba0ec92d689e3d2b511736812a905"}, - {file = "coincurve-20.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81ce41263517b0a9f43cd570c87720b3c13324929584fa28d2e4095969b6015d"}, - {file = "coincurve-20.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:572083ccce6c7b514d482f25f394368f4ae888f478bd0b067519d33160ea2fcc"}, - {file = "coincurve-20.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee5bc78a31a2f1370baf28aaff3949bc48f940a12b0359d1cd2c4115742874e6"}, - {file = "coincurve-20.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2895d032e281c4e747947aae4bcfeef7c57eabfd9be22886c0ca4e1365c7c1f"}, - {file = "coincurve-20.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d3e2f21957ada0e1742edbde117bb41758fa8691b69c8d186c23e9e522ea71cd"}, - {file = "coincurve-20.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c2baa26b1aad1947ca07b3aa9e6a98940c5141c6bdd0f9b44d89e36da7282ffa"}, - {file = "coincurve-20.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7eacc7944ddf9e2b7448ecbe84753841ab9874b8c332a4f5cc3b2f184db9f4a2"}, - {file = "coincurve-20.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:c293c095dc690178b822cadaaeb81de3cc0d28f8bdf8216ed23551dcce153a26"}, - {file = "coincurve-20.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:11a47083a0b7092d3eb50929f74ffd947c4a5e7035796b81310ea85289088c7a"}, - {file = "coincurve-20.0.0.tar.gz", hash = "sha256:872419e404300302e938849b6b92a196fabdad651060b559dc310e52f8392829"}, -] - -[package.dependencies] -asn1crypto = "*" -cffi = ">=1.3.0" - -[package.extras] -dev = ["coverage", "pytest", "pytest-benchmark"] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "crcmod" -version = "1.7" -description = "CRC Generator" -optional = false -python-versions = "*" -files = [ - {file = "crcmod-1.7.tar.gz", hash = "sha256:dc7051a0db5f2bd48665a990d3ec1cc305a466a77358ca4492826f41f283601e"}, -] - -[[package]] -name = "cryptography" -version = "44.0.0" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = "!=3.9.0,!=3.9.1,>=3.7" -files = [ - {file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, - {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, - {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, - {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, - {file = "cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd"}, - {file = "cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, - {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, - {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, - {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, - {file = "cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c"}, - {file = "cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02"}, -] - -[package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] -docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] -pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] -sdist = ["build (>=1.0.0)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==44.0.0)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] -test-randomorder = ["pytest-randomly"] - -[[package]] -name = "cytoolz" -version = "1.0.1" -description = "Cython implementation of Toolz: High performance functional utilities" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cytoolz-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cec9af61f71fc3853eb5dca3d42eb07d1f48a4599fa502cbe92adde85f74b042"}, - {file = "cytoolz-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:140bbd649dbda01e91add7642149a5987a7c3ccc251f2263de894b89f50b6608"}, - {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e90124bdc42ff58b88cdea1d24a6bc5f776414a314cc4d94f25c88badb3a16d1"}, - {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e74801b751e28f7c5cc3ad264c123954a051f546f2fdfe089f5aa7a12ccfa6da"}, - {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:582dad4545ddfb5127494ef23f3fa4855f1673a35d50c66f7638e9fb49805089"}, - {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7bd0618e16efe03bd12f19c2a26a27e6e6b75d7105adb7be1cd2a53fa755d8"}, - {file = "cytoolz-1.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d74cca6acf1c4af58b2e4a89cc565ed61c5e201de2e434748c93e5a0f5c541a5"}, - {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:823a3763828d8d457f542b2a45d75d6b4ced5e470b5c7cf2ed66a02f508ed442"}, - {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:51633a14e6844c61db1d68c1ffd077cf949f5c99c60ed5f1e265b9e2966f1b52"}, - {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f3ec9b01c45348f1d0d712507d54c2bfd69c62fbd7c9ef555c9d8298693c2432"}, - {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1855022b712a9c7a5bce354517ab4727a38095f81e2d23d3eabaf1daeb6a3b3c"}, - {file = "cytoolz-1.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9930f7288c4866a1dc1cc87174f0c6ff4cad1671eb1f6306808aa6c445857d78"}, - {file = "cytoolz-1.0.1-cp310-cp310-win32.whl", hash = "sha256:a9baad795d72fadc3445ccd0f122abfdbdf94269157e6d6d4835636dad318804"}, - {file = "cytoolz-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:ad95b386a84e18e1f6136f6d343d2509d4c3aae9f5a536f3dc96808fcc56a8cf"}, - {file = "cytoolz-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d958d4f04d9d7018e5c1850790d9d8e68b31c9a2deebca74b903706fdddd2b6"}, - {file = "cytoolz-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f445b8b731fc0ecb1865b8e68a070084eb95d735d04f5b6c851db2daf3048ab"}, - {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f546a96460a7e28eb2ec439f4664fa646c9b3e51c6ebad9a59d3922bbe65e30"}, - {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0317681dd065532d21836f860b0563b199ee716f55d0c1f10de3ce7100c78a3b"}, - {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c0ef52febd5a7821a3fd8d10f21d460d1a3d2992f724ba9c91fbd7a96745d41"}, - {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebaf419acf2de73b643cf96108702b8aef8e825cf4f63209ceb078d5fbbbfd"}, - {file = "cytoolz-1.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f7f04eeb4088947585c92d6185a618b25ad4a0f8f66ea30c8db83cf94a425e3"}, - {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f61928803bb501c17914b82d457c6f50fe838b173fb40d39c38d5961185bd6c7"}, - {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d2960cb4fa01ccb985ad1280db41f90dc97a80b397af970a15d5a5de403c8c61"}, - {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b2b407cc3e9defa8df5eb46644f6f136586f70ba49eba96f43de67b9a0984fd3"}, - {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8245f929144d4d3bd7b972c9593300195c6cea246b81b4c46053c48b3f044580"}, - {file = "cytoolz-1.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e37385db03af65763933befe89fa70faf25301effc3b0485fec1c15d4ce4f052"}, - {file = "cytoolz-1.0.1-cp311-cp311-win32.whl", hash = "sha256:50f9c530f83e3e574fc95c264c3350adde8145f4f8fc8099f65f00cc595e5ead"}, - {file = "cytoolz-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:b7f6b617454b4326af7bd3c7c49b0fc80767f134eb9fd6449917a058d17a0e3c"}, - {file = "cytoolz-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fcb8f7d0d65db1269022e7e0428471edee8c937bc288ebdcb72f13eaa67c2fe4"}, - {file = "cytoolz-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:207d4e4b445e087e65556196ff472ff134370d9a275d591724142e255f384662"}, - {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21cdf6bac6fd843f3b20280a66fd8df20dea4c58eb7214a2cd8957ec176f0bb3"}, - {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a55ec098036c0dea9f3bdc021f8acd9d105a945227d0811589f0573f21c9ce1"}, - {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a13ab79ff4ce202e03ab646a2134696988b554b6dc4b71451e948403db1331d8"}, - {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e2d944799026e1ff08a83241f1027a2d9276c41f7a74224cd98b7df6e03957d"}, - {file = "cytoolz-1.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88ba85834cd523b91fdf10325e1e6d71c798de36ea9bdc187ca7bd146420de6f"}, - {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a750b1af7e8bf6727f588940b690d69e25dc47cce5ce467925a76561317eaf7"}, - {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44a71870f7eae31d263d08b87da7c2bf1176f78892ed8bdade2c2850478cb126"}, - {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c8231b9abbd8e368e036f4cc2e16902c9482d4cf9e02a6147ed0e9a3cd4a9ab0"}, - {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa87599ccc755de5a096a4d6c34984de6cd9dc928a0c5eaa7607457317aeaf9b"}, - {file = "cytoolz-1.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67cd16537df51baabde3baa770ab7b8d16839c4d21219d5b96ac59fb012ebd2d"}, - {file = "cytoolz-1.0.1-cp312-cp312-win32.whl", hash = "sha256:fb988c333f05ee30ad4693fe4da55d95ec0bb05775d2b60191236493ea2e01f9"}, - {file = "cytoolz-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b"}, - {file = "cytoolz-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6944bb93b287032a4c5ca6879b69bcd07df46f3079cf8393958cf0b0454f50c0"}, - {file = "cytoolz-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e027260fd2fc5cb041277158ac294fc13dca640714527219f702fb459a59823a"}, - {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88662c0e07250d26f5af9bc95911e6137e124a5c1ec2ce4a5d74de96718ab242"}, - {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309dffa78b0961b4c0cf55674b828fbbc793cf2d816277a5c8293c0c16155296"}, - {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:edb34246e6eb40343c5860fc51b24937698e4fa1ee415917a73ad772a9a1746b"}, - {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54da7a8e4348a18d45d4d5bc84af6c716d7f131113a4f1cc45569d37edff1b"}, - {file = "cytoolz-1.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:241c679c3b1913c0f7259cf1d9639bed5084c86d0051641d537a0980548aa266"}, - {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5bfc860251a8f280ac79696fc3343cfc3a7c30b94199e0240b6c9e5b6b01a2a5"}, - {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c8edd1547014050c1bdad3ff85d25c82bd1c2a3c96830c6181521eb78b9a42b3"}, - {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b349bf6162e8de215403d7f35f8a9b4b1853dc2a48e6e1a609a5b1a16868b296"}, - {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1b18b35256219b6c3dd0fa037741b85d0bea39c552eab0775816e85a52834140"}, - {file = "cytoolz-1.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:738b2350f340ff8af883eb301054eb724997f795d20d90daec7911c389d61581"}, - {file = "cytoolz-1.0.1-cp313-cp313-win32.whl", hash = "sha256:9cbd9c103df54fcca42be55ef40e7baea624ac30ee0b8bf1149f21146d1078d9"}, - {file = "cytoolz-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297"}, - {file = "cytoolz-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f3a509e4ac8e711703c368476b9bbce921fcef6ebb87fa3501525f7000e44185"}, - {file = "cytoolz-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a7eecab6373e933dfbf4fdc0601d8fd7614f8de76793912a103b5fccf98170cd"}, - {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e55ed62087f6e3e30917b5f55350c3b6be6470b849c6566018419cd159d2cebc"}, - {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43de33d99a4ccc07234cecd81f385456b55b0ea9c39c9eebf42f024c313728a5"}, - {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:139bed875828e1727018aa0982aa140e055cbafccb7fd89faf45cbb4f2a21514"}, - {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22c12671194b518aa8ce2f4422bd5064f25ab57f410ba0b78705d0a219f4a97a"}, - {file = "cytoolz-1.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79888f2f7dc25709cd5d37b032a8833741e6a3692c8823be181d542b5999128e"}, - {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:51628b4eb41fa25bd428f8f7b5b74fbb05f3ae65fbd265019a0dd1ded4fdf12a"}, - {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:1db9eb7179285403d2fb56ba1ff6ec35a44921b5e2fa5ca19d69f3f9f0285ea5"}, - {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:08ab7efae08e55812340bfd1b3f09f63848fe291675e2105eab1aa5327d3a16e"}, - {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e5fdc5264f884e7c0a1711a81dff112708a64b9c8561654ee578bfdccec6be09"}, - {file = "cytoolz-1.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:90d6a2e6ab891043ee655ec99d5e77455a9bee9e1131bdfcfb745edde81200dd"}, - {file = "cytoolz-1.0.1-cp38-cp38-win32.whl", hash = "sha256:08946e083faa5147751b34fbf78ab931f149ef758af5c1092932b459e18dcf5c"}, - {file = "cytoolz-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:a91b4e10a9c03796c0dc93e47ebe25bb41ecc6fafc3cf5197c603cf767a3d44d"}, - {file = "cytoolz-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:980c323e626ba298b77ae62871b2de7c50b9d7219e2ddf706f52dd34b8be7349"}, - {file = "cytoolz-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:45f6fa1b512bc2a0f2de5123db932df06c7f69d12874fe06d67772b2828e2c8b"}, - {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93f42d9100c415155ad1f71b0de362541afd4ac95e3153467c4c79972521b6b"}, - {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a76d20dec9c090cdf4746255bbf06a762e8cc29b5c9c1d138c380bbdb3122ade"}, - {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:239039585487c69aa50c5b78f6a422016297e9dea39755761202fb9f0530fe87"}, - {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c28307640ca2ab57b9fbf0a834b9bf563958cd9e038378c3a559f45f13c3c541"}, - {file = "cytoolz-1.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:454880477bb901cee3a60f6324ec48c95d45acc7fecbaa9d49a5af737ded0595"}, - {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:902115d1b1f360fd81e44def30ac309b8641661150fcbdde18ead446982ada6a"}, - {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e68e6b38473a3a79cee431baa22be31cac39f7df1bf23eaa737eaff42e213883"}, - {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:32fba3f63fcb76095b0a22f4bdcc22bc62a2bd2d28d58bf02fd21754c155a3ec"}, - {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:0724ba4cf41eb40b6cf75250820ab069e44bdf4183ff78857aaf4f0061551075"}, - {file = "cytoolz-1.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c42420e0686f887040d5230420ed44f0e960ccbfa29a0d65a3acd9ca52459209"}, - {file = "cytoolz-1.0.1-cp39-cp39-win32.whl", hash = "sha256:4ba8b16358ea56b1fe8e637ec421e36580866f2e787910bac1cf0a6997424a34"}, - {file = "cytoolz-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:92d27f84bf44586853d9562bfa3610ecec000149d030f793b4cb614fd9da1813"}, - {file = "cytoolz-1.0.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:83d19d55738ad9c60763b94f3f6d3c6e4de979aeb8d76841c1401081e0e58d96"}, - {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f112a71fad6ea824578e6393765ce5c054603afe1471a5c753ff6c67fd872d10"}, - {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a515df8f8aa6e1eaaf397761a6e4aff2eef73b5f920aedf271416d5471ae5ee"}, - {file = "cytoolz-1.0.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92c398e7b7023460bea2edffe5fcd0a76029580f06c3f6938ac3d198b47156f3"}, - {file = "cytoolz-1.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3237e56211e03b13df47435b2369f5df281e02b04ad80a948ebd199b7bc10a47"}, - {file = "cytoolz-1.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba0d1da50aab1909b165f615ba1125c8b01fcc30d606c42a61c42ea0269b5e2c"}, - {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25b6e8dec29aa5a390092d193abd673e027d2c0b50774ae816a31454286c45c7"}, - {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36cd6989ebb2f18fe9af8f13e3c61064b9f741a40d83dc5afeb0322338ad25f2"}, - {file = "cytoolz-1.0.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47394f8ab7fca3201f40de61fdeea20a2baffb101485ae14901ea89c3f6c95d"}, - {file = "cytoolz-1.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d00ac423542af944302e034e618fb055a0c4e87ba704cd6a79eacfa6ac83a3c9"}, - {file = "cytoolz-1.0.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a5ca923d1fa632f7a4fb33c0766c6fba7f87141a055c305c3e47e256fb99c413"}, - {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:058bf996bcae9aad3acaeeb937d42e0c77c081081e67e24e9578a6a353cb7fb2"}, - {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69e2a1f41a3dad94a17aef4a5cc003323359b9f0a9d63d4cc867cb5690a2551d"}, - {file = "cytoolz-1.0.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67daeeeadb012ec2b59d63cb29c4f2a2023b0c4957c3342d354b8bb44b209e9a"}, - {file = "cytoolz-1.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:54d3d36bbf0d4344d1afa22c58725d1668e30ff9de3a8f56b03db1a6da0acb11"}, - {file = "cytoolz-1.0.1.tar.gz", hash = "sha256:89cc3161b89e1bb3ed7636f74ed2e55984fd35516904fc878cae216e42b2c7d6"}, -] - -[package.dependencies] -toolz = ">=0.8.0" - -[package.extras] -cython = ["cython"] - -[[package]] -name = "distro" -version = "1.9.0" -description = "Distro - an OS platform information API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, - {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, -] - -[[package]] -name = "ecdsa" -version = "0.19.0" -description = "ECDSA cryptographic signature library (pure python)" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.6" -files = [ - {file = "ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a"}, - {file = "ecdsa-0.19.0.tar.gz", hash = "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8"}, -] - -[package.dependencies] -six = ">=1.9.0" - -[package.extras] -gmpy = ["gmpy"] -gmpy2 = ["gmpy2"] - -[[package]] -name = "ed25519-blake2b" -version = "1.4.1" -description = "Ed25519 public-key signatures (BLAKE2b fork)" -optional = false -python-versions = "*" -files = [ - {file = "ed25519-blake2b-1.4.1.tar.gz", hash = "sha256:731e9f93cd1ac1a64649575f3519a99ffe0bb1e4cf7bf5f5f0be513a39df7363"}, -] - -[[package]] -name = "eth-abi" -version = "5.2.0" -description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" -optional = false -python-versions = "<4,>=3.8" -files = [ - {file = "eth_abi-5.2.0-py3-none-any.whl", hash = "sha256:17abe47560ad753f18054f5b3089fcb588f3e3a092136a416b6c1502cb7e8877"}, - {file = "eth_abi-5.2.0.tar.gz", hash = "sha256:178703fa98c07d8eecd5ae569e7e8d159e493ebb6eeb534a8fe973fbc4e40ef0"}, -] - -[package.dependencies] -eth-typing = ">=3.0.0" -eth-utils = ">=2.0.0" -parsimonious = ">=0.10.0,<0.11.0" - -[package.extras] -dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth-hash[pycryptodome]", "hypothesis (>=6.22.0,<6.108.7)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] -test = ["eth-hash[pycryptodome]", "hypothesis (>=6.22.0,<6.108.7)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=2.4.0)"] -tools = ["hypothesis (>=6.22.0,<6.108.7)"] - -[[package]] -name = "eth-account" -version = "0.13.4" -description = "eth-account: Sign Ethereum transactions and messages with local private keys" -optional = false -python-versions = "<4,>=3.8" -files = [ - {file = "eth_account-0.13.4-py3-none-any.whl", hash = "sha256:a4c109e9bad3a278243fcc028b755fb72b43e25b1e6256b3f309a44f5f7d87c3"}, - {file = "eth_account-0.13.4.tar.gz", hash = "sha256:2e1f2de240bef3d9f3d8013656135d2a79b6be6d4e7885bce9cace4334a4a376"}, -] - -[package.dependencies] -bitarray = ">=2.4.0" -ckzg = ">=2.0.0" -eth-abi = ">=4.0.0-b.2" -eth-keyfile = ">=0.7.0,<0.9.0" -eth-keys = ">=0.4.0" -eth-rlp = ">=2.1.0" -eth-utils = ">=2.0.0" -hexbytes = ">=1.2.0" -pydantic = ">=2.0.0" -rlp = ">=1.0.0" - -[package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "coverage", "hypothesis (>=4.18.0,<5)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] -test = ["coverage", "hypothesis (>=4.18.0,<5)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] - -[[package]] -name = "eth-hash" -version = "0.7.1" -description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" -optional = false -python-versions = "<4,>=3.8" -files = [ - {file = "eth_hash-0.7.1-py3-none-any.whl", hash = "sha256:0fb1add2adf99ef28883fd6228eb447ef519ea72933535ad1a0b28c6f65f868a"}, - {file = "eth_hash-0.7.1.tar.gz", hash = "sha256:d2411a403a0b0a62e8247b4117932d900ffb4c8c64b15f92620547ca5ce46be5"}, -] - -[package.dependencies] -pycryptodome = {version = ">=3.6.6,<4", optional = true, markers = "extra == \"pycryptodome\""} - -[package.extras] -dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] -pycryptodome = ["pycryptodome (>=3.6.6,<4)"] -pysha3 = ["pysha3 (>=1.0.0,<2.0.0)", "safe-pysha3 (>=1.0.0)"] -test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] - -[[package]] -name = "eth-keyfile" -version = "0.8.1" -description = "eth-keyfile: A library for handling the encrypted keyfiles used to store ethereum private keys" -optional = false -python-versions = "<4,>=3.8" -files = [ - {file = "eth_keyfile-0.8.1-py3-none-any.whl", hash = "sha256:65387378b82fe7e86d7cb9f8d98e6d639142661b2f6f490629da09fddbef6d64"}, - {file = "eth_keyfile-0.8.1.tar.gz", hash = "sha256:9708bc31f386b52cca0969238ff35b1ac72bd7a7186f2a84b86110d3c973bec1"}, -] - -[package.dependencies] -eth-keys = ">=0.4.0" -eth-utils = ">=2" -pycryptodome = ">=3.6.6,<4" - -[package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["towncrier (>=21,<22)"] -test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] - -[[package]] -name = "eth-keys" -version = "0.6.1" -description = "eth-keys: Common API for Ethereum key operations" -optional = false -python-versions = "<4,>=3.8" -files = [ - {file = "eth_keys-0.6.1-py3-none-any.whl", hash = "sha256:7deae4cd56e862e099ec58b78176232b931c4ea5ecded2f50c7b1ccbc10c24cf"}, - {file = "eth_keys-0.6.1.tar.gz", hash = "sha256:a43e263cbcabfd62fa769168efc6c27b1f5603040e4de22bb84d12567e4fd962"}, -] - -[package.dependencies] -eth-typing = ">=3" -eth-utils = ">=2" - -[package.extras] -coincurve = ["coincurve (>=12.0.0)"] -dev = ["asn1tools (>=0.146.2)", "build (>=0.9.0)", "bump_my_version (>=0.19.0)", "coincurve (>=12.0.0)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["towncrier (>=24,<25)"] -test = ["asn1tools (>=0.146.2)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)"] - -[[package]] -name = "eth-rlp" -version = "2.1.0" -description = "eth-rlp: RLP definitions for common Ethereum objects in Python" -optional = false -python-versions = ">=3.8, <4" -files = [ - {file = "eth-rlp-2.1.0.tar.gz", hash = "sha256:d5b408a8cd20ed496e8e66d0559560d29bc21cee482f893936a1f05d0dddc4a0"}, - {file = "eth_rlp-2.1.0-py3-none-any.whl", hash = "sha256:6f476eb7e37d81feaba5d98aed887e467be92648778c44b19fe594aea209cde1"}, -] - -[package.dependencies] -eth-utils = ">=2.0.0" -hexbytes = ">=1.2.0" -rlp = ">=0.6.0" -typing-extensions = {version = ">=4.0.1", markers = "python_version <= \"3.10\""} - -[package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] -test = ["eth-hash[pycryptodome]", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] - -[[package]] -name = "eth-typing" -version = "5.1.0" -description = "eth-typing: Common type annotations for ethereum python packages" -optional = false -python-versions = "<4,>=3.8" -files = [ - {file = "eth_typing-5.1.0-py3-none-any.whl", hash = "sha256:c0d6b93f5385aa84efc4b47ae2bd478da069bc0ffda8b67e0ccb573f43defd29"}, - {file = "eth_typing-5.1.0.tar.gz", hash = "sha256:8581f212ee6252aaa285377a77620f6e5f6e16ac3f144c61f098fafd47967b1a"}, -] - -[package.dependencies] -typing_extensions = ">=4.5.0" - -[package.extras] -dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] -test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] - -[[package]] -name = "eth-utils" -version = "5.2.0" -description = "eth-utils: Common utility functions for python code that interacts with Ethereum" -optional = false -python-versions = "<4,>=3.8" -files = [ - {file = "eth_utils-5.2.0-py3-none-any.whl", hash = "sha256:4d43eeb6720e89a042ad5b28d4b2111630ae764f444b85cbafb708d7f076da10"}, - {file = "eth_utils-5.2.0.tar.gz", hash = "sha256:17e474eb654df6e18f20797b22c6caabb77415a996b3ba0f3cc8df3437463134"}, -] - -[package.dependencies] -cytoolz = {version = ">=0.10.1", markers = "implementation_name == \"cpython\""} -eth-hash = ">=0.3.1" -eth-typing = ">=5.0.0" -toolz = {version = ">0.8.2", markers = "implementation_name == \"pypy\""} - -[package.extras] -dev = ["build (>=0.9.0)", "bump-my-version (>=0.19.0)", "eth-hash[pycryptodome]", "hypothesis (>=4.43.0)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=24,<25)"] -test = ["hypothesis (>=4.43.0)", "mypy (==1.10.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] - -[[package]] -name = "exceptiongroup" -version = "1.2.2" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "frozenlist" -version = "1.5.0" -description = "A list-like structure which implements collections.abc.MutableSequence" -optional = false -python-versions = ">=3.8" -files = [ - {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, - {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, - {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, - {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, - {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, - {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, - {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, - {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, - {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, - {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, - {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, - {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, - {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, - {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, - {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, - {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, - {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, - {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, - {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, - {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, - {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, - {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, - {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, - {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, - {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, - {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, - {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, - {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, - {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, - {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, - {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, - {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, - {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, - {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, - {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, - {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, - {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, - {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, - {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, - {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, - {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, - {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, - {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, - {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, - {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, - {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, - {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, - {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, - {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, - {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, - {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, - {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, - {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, - {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, - {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, - {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, - {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, - {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, - {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, - {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, - {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, - {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, - {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, - {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, - {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, - {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, - {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, - {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, - {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, - {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, - {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, - {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, - {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, - {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, - {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, - {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, - {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, - {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, - {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, - {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, - {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, - {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, - {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, - {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, - {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, - {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, - {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, - {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, - {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, - {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, - {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, - {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, -] - -[[package]] -name = "greenlet" -version = "3.1.1" -description = "Lightweight in-process concurrent programming" -optional = false -python-versions = ">=3.7" -files = [ - {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, - {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, - {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, - {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, - {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, - {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, - {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, - {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, - {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, - {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, - {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, - {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, - {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, - {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, - {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, - {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, - {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, - {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, - {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, - {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, - {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, - {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, - {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, - {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, - {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, - {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, - {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, - {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, - {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, - {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, - {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, - {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, - {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, - {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, - {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, - {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, - {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, - {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, - {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, - {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, - {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, -] - -[package.extras] -docs = ["Sphinx", "furo"] -test = ["objgraph", "psutil"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "hexbytes" -version = "1.3.0" -description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" -optional = false -python-versions = "<4,>=3.8" -files = [ - {file = "hexbytes-1.3.0-py3-none-any.whl", hash = "sha256:83720b529c6e15ed21627962938dc2dec9bb1010f17bbbd66bf1e6a8287d522c"}, - {file = "hexbytes-1.3.0.tar.gz", hash = "sha256:4a61840c24b0909a6534350e2d28ee50159ca1c9e89ce275fd31c110312cf684"}, -] - -[package.extras] -dev = ["build (>=0.9.0)", "bump_my_version (>=0.19.0)", "eth_utils (>=2.0.0)", "hypothesis (>=3.44.24,<=6.31.6)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=24,<25)"] -test = ["eth_utils (>=2.0.0)", "hypothesis (>=3.44.24,<=6.31.6)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] - -[[package]] -name = "httpcore" -version = "1.0.7" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, - {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<1.0)"] - -[[package]] -name = "httpx" -version = "0.28.1" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, - {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "idna" -version = "3.10" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.6" -files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, -] - -[package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] - -[[package]] -name = "jiter" -version = "0.8.2" -description = "Fast iterable JSON parser." -optional = false -python-versions = ">=3.8" -files = [ - {file = "jiter-0.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ca8577f6a413abe29b079bc30f907894d7eb07a865c4df69475e868d73e71c7b"}, - {file = "jiter-0.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b25bd626bde7fb51534190c7e3cb97cee89ee76b76d7585580e22f34f5e3f393"}, - {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c826a221851a8dc028eb6d7d6429ba03184fa3c7e83ae01cd6d3bd1d4bd17d"}, - {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d35c864c2dff13dfd79fb070fc4fc6235d7b9b359efe340e1261deb21b9fcb66"}, - {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f557c55bc2b7676e74d39d19bcb8775ca295c7a028246175d6a8b431e70835e5"}, - {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:580ccf358539153db147e40751a0b41688a5ceb275e6f3e93d91c9467f42b2e3"}, - {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af102d3372e917cffce49b521e4c32c497515119dc7bd8a75665e90a718bbf08"}, - {file = "jiter-0.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cadcc978f82397d515bb2683fc0d50103acff2a180552654bb92d6045dec2c49"}, - {file = "jiter-0.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba5bdf56969cad2019d4e8ffd3f879b5fdc792624129741d3d83fc832fef8c7d"}, - {file = "jiter-0.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3b94a33a241bee9e34b8481cdcaa3d5c2116f575e0226e421bed3f7a6ea71cff"}, - {file = "jiter-0.8.2-cp310-cp310-win32.whl", hash = "sha256:6e5337bf454abddd91bd048ce0dca5134056fc99ca0205258766db35d0a2ea43"}, - {file = "jiter-0.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:4a9220497ca0cb1fe94e3f334f65b9b5102a0b8147646118f020d8ce1de70105"}, - {file = "jiter-0.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2dd61c5afc88a4fda7d8b2cf03ae5947c6ac7516d32b7a15bf4b49569a5c076b"}, - {file = "jiter-0.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a6c710d657c8d1d2adbbb5c0b0c6bfcec28fd35bd6b5f016395f9ac43e878a15"}, - {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9584de0cd306072635fe4b89742bf26feae858a0683b399ad0c2509011b9dc0"}, - {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a90a923338531b7970abb063cfc087eebae6ef8ec8139762007188f6bc69a9f"}, - {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21974d246ed0181558087cd9f76e84e8321091ebfb3a93d4c341479a736f099"}, - {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32475a42b2ea7b344069dc1e81445cfc00b9d0e3ca837f0523072432332e9f74"}, - {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9931fd36ee513c26b5bf08c940b0ac875de175341cbdd4fa3be109f0492586"}, - {file = "jiter-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0820f4a3a59ddced7fce696d86a096d5cc48d32a4183483a17671a61edfddc"}, - {file = "jiter-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ffc86ae5e3e6a93765d49d1ab47b6075a9c978a2b3b80f0f32628f39caa0c88"}, - {file = "jiter-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5127dc1abd809431172bc3fbe8168d6b90556a30bb10acd5ded41c3cfd6f43b6"}, - {file = "jiter-0.8.2-cp311-cp311-win32.whl", hash = "sha256:66227a2c7b575720c1871c8800d3a0122bb8ee94edb43a5685aa9aceb2782d44"}, - {file = "jiter-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:cde031d8413842a1e7501e9129b8e676e62a657f8ec8166e18a70d94d4682855"}, - {file = "jiter-0.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e6ec2be506e7d6f9527dae9ff4b7f54e68ea44a0ef6b098256ddf895218a2f8f"}, - {file = "jiter-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76e324da7b5da060287c54f2fabd3db5f76468006c811831f051942bf68c9d44"}, - {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:180a8aea058f7535d1c84183c0362c710f4750bef66630c05f40c93c2b152a0f"}, - {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025337859077b41548bdcbabe38698bcd93cfe10b06ff66617a48ff92c9aec60"}, - {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecff0dc14f409599bbcafa7e470c00b80f17abc14d1405d38ab02e4b42e55b57"}, - {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd9fee7d0775ebaba131f7ca2e2d83839a62ad65e8e02fe2bd8fc975cedeb9e"}, - {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14601dcac4889e0a1c75ccf6a0e4baf70dbc75041e51bcf8d0e9274519df6887"}, - {file = "jiter-0.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92249669925bc1c54fcd2ec73f70f2c1d6a817928480ee1c65af5f6b81cdf12d"}, - {file = "jiter-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e725edd0929fa79f8349ab4ec7f81c714df51dc4e991539a578e5018fa4a7152"}, - {file = "jiter-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bf55846c7b7a680eebaf9c3c48d630e1bf51bdf76c68a5f654b8524335b0ad29"}, - {file = "jiter-0.8.2-cp312-cp312-win32.whl", hash = "sha256:7efe4853ecd3d6110301665a5178b9856be7e2a9485f49d91aa4d737ad2ae49e"}, - {file = "jiter-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:83c0efd80b29695058d0fd2fa8a556490dbce9804eac3e281f373bbc99045f6c"}, - {file = "jiter-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ca1f08b8e43dc3bd0594c992fb1fd2f7ce87f7bf0d44358198d6da8034afdf84"}, - {file = "jiter-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5672a86d55416ccd214c778efccf3266b84f87b89063b582167d803246354be4"}, - {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58dc9bc9767a1101f4e5e22db1b652161a225874d66f0e5cb8e2c7d1c438b587"}, - {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b2998606d6dadbb5ccda959a33d6a5e853252d921fec1792fc902351bb4e2c"}, - {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab9a87f3784eb0e098f84a32670cfe4a79cb6512fd8f42ae3d0709f06405d18"}, - {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79aec8172b9e3c6d05fd4b219d5de1ac616bd8da934107325a6c0d0e866a21b6"}, - {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:711e408732d4e9a0208008e5892c2966b485c783cd2d9a681f3eb147cf36c7ef"}, - {file = "jiter-0.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:653cf462db4e8c41995e33d865965e79641ef45369d8a11f54cd30888b7e6ff1"}, - {file = "jiter-0.8.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:9c63eaef32b7bebac8ebebf4dabebdbc6769a09c127294db6babee38e9f405b9"}, - {file = "jiter-0.8.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:eb21aaa9a200d0a80dacc7a81038d2e476ffe473ffdd9c91eb745d623561de05"}, - {file = "jiter-0.8.2-cp313-cp313-win32.whl", hash = "sha256:789361ed945d8d42850f919342a8665d2dc79e7e44ca1c97cc786966a21f627a"}, - {file = "jiter-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:ab7f43235d71e03b941c1630f4b6e3055d46b6cb8728a17663eaac9d8e83a865"}, - {file = "jiter-0.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b426f72cd77da3fec300ed3bc990895e2dd6b49e3bfe6c438592a3ba660e41ca"}, - {file = "jiter-0.8.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2dd880785088ff2ad21ffee205e58a8c1ddabc63612444ae41e5e4b321b39c0"}, - {file = "jiter-0.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:3ac9f578c46f22405ff7f8b1f5848fb753cc4b8377fbec8470a7dc3997ca7566"}, - {file = "jiter-0.8.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9e1fa156ee9454642adb7e7234a383884452532bc9d53d5af2d18d98ada1d79c"}, - {file = "jiter-0.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cf5dfa9956d96ff2efb0f8e9c7d055904012c952539a774305aaaf3abdf3d6c"}, - {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e52bf98c7e727dd44f7c4acb980cb988448faeafed8433c867888268899b298b"}, - {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a2ecaa3c23e7a7cf86d00eda3390c232f4d533cd9ddea4b04f5d0644faf642c5"}, - {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08d4c92bf480e19fc3f2717c9ce2aa31dceaa9163839a311424b6862252c943e"}, - {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99d9a1eded738299ba8e106c6779ce5c3893cffa0e32e4485d680588adae6db8"}, - {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20be8b7f606df096e08b0b1b4a3c6f0515e8dac296881fe7461dfa0fb5ec817"}, - {file = "jiter-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d33f94615fcaf872f7fd8cd98ac3b429e435c77619777e8a449d9d27e01134d1"}, - {file = "jiter-0.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:317b25e98a35ffec5c67efe56a4e9970852632c810d35b34ecdd70cc0e47b3b6"}, - {file = "jiter-0.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fc9043259ee430ecd71d178fccabd8c332a3bf1e81e50cae43cc2b28d19e4cb7"}, - {file = "jiter-0.8.2-cp38-cp38-win32.whl", hash = "sha256:fc5adda618205bd4678b146612ce44c3cbfdee9697951f2c0ffdef1f26d72b63"}, - {file = "jiter-0.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cd646c827b4f85ef4a78e4e58f4f5854fae0caf3db91b59f0d73731448a970c6"}, - {file = "jiter-0.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e41e75344acef3fc59ba4765df29f107f309ca9e8eace5baacabd9217e52a5ee"}, - {file = "jiter-0.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f22b16b35d5c1df9dfd58843ab2cd25e6bf15191f5a236bed177afade507bfc"}, - {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7200b8f7619d36aa51c803fd52020a2dfbea36ffec1b5e22cab11fd34d95a6d"}, - {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70bf4c43652cc294040dbb62256c83c8718370c8b93dd93d934b9a7bf6c4f53c"}, - {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9d471356dc16f84ed48768b8ee79f29514295c7295cb41e1133ec0b2b8d637d"}, - {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859e8eb3507894093d01929e12e267f83b1d5f6221099d3ec976f0c995cb6bd9"}, - {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa58399c01db555346647a907b4ef6d4f584b123943be6ed5588c3f2359c9f4"}, - {file = "jiter-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f2d5ed877f089862f4c7aacf3a542627c1496f972a34d0474ce85ee7d939c27"}, - {file = "jiter-0.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:03c9df035d4f8d647f8c210ddc2ae0728387275340668fb30d2421e17d9a0841"}, - {file = "jiter-0.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8bd2a824d08d8977bb2794ea2682f898ad3d8837932e3a74937e93d62ecbb637"}, - {file = "jiter-0.8.2-cp39-cp39-win32.whl", hash = "sha256:ca29b6371ebc40e496995c94b988a101b9fbbed48a51190a4461fcb0a68b4a36"}, - {file = "jiter-0.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:1c0dfbd1be3cbefc7510102370d86e35d1d53e5a93d48519688b1bf0f761160a"}, - {file = "jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d"}, -] - -[[package]] -name = "jsonpatch" -version = "1.33" -description = "Apply JSON-Patches (RFC 6902)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, - {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, -] - -[package.dependencies] -jsonpointer = ">=1.9" - -[[package]] -name = "jsonpointer" -version = "3.0.0" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, - {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, -] - -[[package]] -name = "langchain" -version = "0.3.15" -description = "Building applications with LLMs through composability" -optional = false -python-versions = "<4.0,>=3.9" -files = [ - {file = "langchain-0.3.15-py3-none-any.whl", hash = "sha256:2657735184054cae8181ac43fce6cbc9ee64ca81a2ad2aed3ccd6e5d6fe1f19f"}, - {file = "langchain-0.3.15.tar.gz", hash = "sha256:1204d67f8469cd8da5621d2b39501650a824d4c0d5a74264dfe3df9a7528897e"}, -] - -[package.dependencies] -aiohttp = ">=3.8.3,<4.0.0" -async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.3.31,<0.4.0" -langchain-text-splitters = ">=0.3.3,<0.4.0" -langsmith = ">=0.1.17,<0.4" -numpy = [ - {version = ">=1.22.4,<2", markers = "python_version < \"3.12\""}, - {version = ">=1.26.2,<3", markers = "python_version >= \"3.12\""}, -] -pydantic = ">=2.7.4,<3.0.0" -PyYAML = ">=5.3" -requests = ">=2,<3" -SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10" - -[[package]] -name = "langchain-core" -version = "0.3.31" -description = "Building applications with LLMs through composability" -optional = false -python-versions = "<4.0,>=3.9" -files = [ - {file = "langchain_core-0.3.31-py3-none-any.whl", hash = "sha256:882e64ad95887c951dce8e835889e43263b11848c394af3b73e06912624bd743"}, - {file = "langchain_core-0.3.31.tar.gz", hash = "sha256:5ffa56354c07de9efaa4139609659c63e7d9b29da2c825f6bab9392ec98300df"}, -] - -[package.dependencies] -jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.125,<0.4" -packaging = ">=23.2,<25" -pydantic = [ - {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, - {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, -] -PyYAML = ">=5.3" -tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10.0.0" -typing-extensions = ">=4.7" - -[[package]] -name = "langchain-openai" -version = "0.3.2" -description = "An integration package connecting OpenAI and LangChain" -optional = false -python-versions = "<4.0,>=3.9" -files = [ - {file = "langchain_openai-0.3.2-py3-none-any.whl", hash = "sha256:8674183805e26d3ae3f78cc44f79fe0b2066f61e2de0e7e18be3b86f0d3b2759"}, - {file = "langchain_openai-0.3.2.tar.gz", hash = "sha256:c2c80ac0208eb7cefdef96f6353b00fa217979ffe83f0a21cc8666001df828c1"}, -] - -[package.dependencies] -langchain-core = ">=0.3.31,<0.4.0" -openai = ">=1.58.1,<2.0.0" -tiktoken = ">=0.7,<1" - -[[package]] -name = "langchain-text-splitters" -version = "0.3.5" -description = "LangChain text splitting utilities" -optional = false -python-versions = "<4.0,>=3.9" -files = [ - {file = "langchain_text_splitters-0.3.5-py3-none-any.whl", hash = "sha256:8c9b059827438c5fa8f327b4df857e307828a5ec815163c9b5c9569a3e82c8ee"}, - {file = "langchain_text_splitters-0.3.5.tar.gz", hash = "sha256:11cb7ca3694e5bdd342bc16d3875b7f7381651d4a53cbb91d34f22412ae16443"}, -] - -[package.dependencies] -langchain-core = ">=0.3.29,<0.4.0" - -[[package]] -name = "langgraph" -version = "0.2.67" -description = "Building stateful, multi-actor applications with LLMs" -optional = false -python-versions = "<4.0,>=3.9.0" -files = [ - {file = "langgraph-0.2.67-py3-none-any.whl", hash = "sha256:79a76d8fd7581bf117aaa90453d780df2c96a49ed6f5e25086d9adadef8e945f"}, - {file = "langgraph-0.2.67.tar.gz", hash = "sha256:80d034b612d998ec5f6a77362ba8ebe697b5e7b25f8ebbc4333b82bbd9bca8f6"}, -] - -[package.dependencies] -langchain-core = ">=0.2.43,<0.3.0 || >0.3.0,<0.3.1 || >0.3.1,<0.3.2 || >0.3.2,<0.3.3 || >0.3.3,<0.3.4 || >0.3.4,<0.3.5 || >0.3.5,<0.3.6 || >0.3.6,<0.3.7 || >0.3.7,<0.3.8 || >0.3.8,<0.3.9 || >0.3.9,<0.3.10 || >0.3.10,<0.3.11 || >0.3.11,<0.3.12 || >0.3.12,<0.3.13 || >0.3.13,<0.3.14 || >0.3.14,<0.3.15 || >0.3.15,<0.3.16 || >0.3.16,<0.3.17 || >0.3.17,<0.3.18 || >0.3.18,<0.3.19 || >0.3.19,<0.3.20 || >0.3.20,<0.3.21 || >0.3.21,<0.3.22 || >0.3.22,<0.4.0" -langgraph-checkpoint = ">=2.0.10,<3.0.0" -langgraph-sdk = ">=0.1.42,<0.2.0" - -[[package]] -name = "langgraph-checkpoint" -version = "2.0.10" -description = "Library with base interfaces for LangGraph checkpoint savers." -optional = false -python-versions = "<4.0.0,>=3.9.0" -files = [ - {file = "langgraph_checkpoint-2.0.10-py3-none-any.whl", hash = "sha256:0d592cfda2df93844c6ea44d142170a8f7e5ba5320274e0e5e60e27f2749392c"}, - {file = "langgraph_checkpoint-2.0.10.tar.gz", hash = "sha256:2dcc04e09091d588bb6209e49d83ff5406d7231c2590d6ff18fb29ab8b140129"}, -] - -[package.dependencies] -langchain-core = ">=0.2.38,<0.4" -msgpack = ">=1.1.0,<2.0.0" - -[[package]] -name = "langgraph-sdk" -version = "0.1.51" -description = "SDK for interacting with LangGraph API" -optional = false -python-versions = "<4.0.0,>=3.9.0" -files = [ - {file = "langgraph_sdk-0.1.51-py3-none-any.whl", hash = "sha256:ce2b58466d1700d06149782ed113157a8694a6d7932c801f316cd13fab315fe4"}, - {file = "langgraph_sdk-0.1.51.tar.gz", hash = "sha256:dea1363e72562cb1e82a2d156be8d5b1a69ff3fe8815eee0e1e7a2f423242ec1"}, -] - -[package.dependencies] -httpx = ">=0.25.2" -orjson = ">=3.10.1" - -[[package]] -name = "langsmith" -version = "0.3.1" -description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." -optional = false -python-versions = "<4.0,>=3.9" -files = [ - {file = "langsmith-0.3.1-py3-none-any.whl", hash = "sha256:b6afbb214ae82b6d96b8134718db3a7d2598b2a7eb4ab1212bcd6d96e04eda10"}, - {file = "langsmith-0.3.1.tar.gz", hash = "sha256:9242a49d37e2176a344ddec97bf57b958dc0e1f0437e150cefd0fb70195f0e26"}, -] - -[package.dependencies] -httpx = ">=0.23.0,<1" -orjson = {version = ">=3.9.14,<4.0.0", markers = "platform_python_implementation != \"PyPy\""} -pydantic = [ - {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, - {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, -] -requests = ">=2,<3" -requests-toolbelt = ">=1.0.0,<2.0.0" -zstandard = ">=0.23.0,<0.24.0" - -[package.extras] -langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2,<0.2.0)"] -pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4,<14.0.0)"] - -[[package]] -name = "msgpack" -version = "1.1.0" -description = "MessagePack serializer" -optional = false -python-versions = ">=3.8" -files = [ - {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, - {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, - {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"}, - {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"}, - {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"}, - {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"}, - {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"}, - {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"}, - {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"}, - {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"}, - {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"}, - {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"}, - {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"}, - {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"}, - {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"}, - {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"}, - {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"}, - {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"}, - {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"}, - {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"}, - {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"}, - {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"}, - {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"}, - {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"}, - {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"}, - {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"}, - {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"}, - {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"}, - {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"}, - {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"}, - {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"}, - {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"}, - {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"}, - {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"}, - {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"}, - {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"}, - {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"}, - {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"}, - {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"}, - {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"}, - {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"}, - {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"}, - {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"}, - {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"}, - {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec"}, - {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96"}, - {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870"}, - {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7"}, - {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb"}, - {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f"}, - {file = "msgpack-1.1.0-cp38-cp38-win32.whl", hash = "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b"}, - {file = "msgpack-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb"}, - {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"}, - {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"}, - {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"}, - {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"}, - {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"}, - {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"}, - {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"}, - {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"}, - {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"}, - {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"}, - {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"}, - {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"}, -] - -[[package]] -name = "multidict" -version = "6.1.0" -description = "multidict implementation" -optional = false -python-versions = ">=3.8" -files = [ - {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, - {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, - {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, - {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, - {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, - {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, - {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, - {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, - {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, - {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, - {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, - {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, - {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, - {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, - {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, - {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, - {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "numpy" -version = "1.26.4" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, -] - -[[package]] -name = "numpy" -version = "2.2.2" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.10" -files = [ - {file = "numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a"}, - {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97"}, - {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957"}, - {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d"}, - {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd"}, - {file = "numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160"}, - {file = "numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e"}, - {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c"}, - {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f"}, - {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826"}, - {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8"}, - {file = "numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50"}, - {file = "numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37"}, - {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748"}, - {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0"}, - {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278"}, - {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba"}, - {file = "numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283"}, - {file = "numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be"}, - {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84"}, - {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff"}, - {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0"}, - {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de"}, - {file = "numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9"}, - {file = "numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49"}, - {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2"}, - {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7"}, - {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb"}, - {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648"}, - {file = "numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4"}, - {file = "numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60"}, - {file = "numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"}, -] - -[[package]] -name = "oauthlib" -version = "3.2.2" -description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -optional = false -python-versions = ">=3.6" -files = [ - {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, - {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, -] - -[package.extras] -rsa = ["cryptography (>=3.0.0)"] -signals = ["blinker (>=1.4.0)"] -signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] - -[[package]] -name = "openai" -version = "1.60.1" -description = "The official Python library for the openai API" -optional = false -python-versions = ">=3.8" -files = [ - {file = "openai-1.60.1-py3-none-any.whl", hash = "sha256:714181ec1c452353d456f143c22db892de7b373e3165063d02a2b798ed575ba1"}, - {file = "openai-1.60.1.tar.gz", hash = "sha256:beb1541dfc38b002bd629ab68b0d6fe35b870c5f4311d9bc4404d85af3214d5e"}, -] - -[package.dependencies] -anyio = ">=3.5.0,<5" -distro = ">=1.7.0,<2" -httpx = ">=0.23.0,<1" -jiter = ">=0.4.0,<1" -pydantic = ">=1.9.0,<3" -sniffio = "*" -tqdm = ">4" -typing-extensions = ">=4.11,<5" - -[package.extras] -datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -realtime = ["websockets (>=13,<15)"] - -[[package]] -name = "orjson" -version = "3.10.15" -description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -optional = false -python-versions = ">=3.8" -files = [ - {file = "orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c2c79fa308e6edb0ffab0a31fd75a7841bf2a79a20ef08a3c6e3b26814c8ca8"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cb85490aa6bf98abd20607ab5c8324c0acb48d6da7863a51be48505646c814"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763dadac05e4e9d2bc14938a45a2d0560549561287d41c465d3c58aec818b164"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a330b9b4734f09a623f74a7490db713695e13b67c959713b78369f26b3dee6bf"}, - {file = "orjson-3.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a61a4622b7ff861f019974f73d8165be1bd9a0855e1cad18ee167acacabeb061"}, - {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd271247691574416b3228db667b84775c497b245fa275c6ab90dc1ffbbd2b3"}, - {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4759b109c37f635aa5c5cc93a1b26927bfde24b254bcc0e1149a9fada253d2d"}, - {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e992fd5cfb8b9f00bfad2fd7a05a4299db2bbe92e6440d9dd2fab27655b3182"}, - {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f95fb363d79366af56c3f26b71df40b9a583b07bbaaf5b317407c4d58497852e"}, - {file = "orjson-3.10.15-cp310-cp310-win32.whl", hash = "sha256:f9875f5fea7492da8ec2444839dcc439b0ef298978f311103d0b7dfd775898ab"}, - {file = "orjson-3.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:17085a6aa91e1cd70ca8533989a18b5433e15d29c574582f76f821737c8d5806"}, - {file = "orjson-3.10.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4cc83960ab79a4031f3119cc4b1a1c627a3dc09df125b27c4201dff2af7eaa6"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbeef2481d895ab8be5185f2432c334d6dec1f5d1933a9c83014d188e102cef"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e590a0477b23ecd5b0ac865b1b907b01b3c5535f5e8a8f6ab0e503efb896334"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6be38bd103d2fd9bdfa31c2720b23b5d47c6796bcb1d1b598e3924441b4298d"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff4f6edb1578960ed628a3b998fa54d78d9bb3e2eb2cfc5c2a09732431c678d0"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0482b21d0462eddd67e7fce10b89e0b6ac56570424662b685a0d6fccf581e13"}, - {file = "orjson-3.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bb5cc3527036ae3d98b65e37b7986a918955f85332c1ee07f9d3f82f3a6899b5"}, - {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d569c1c462912acdd119ccbf719cf7102ea2c67dd03b99edcb1a3048651ac96b"}, - {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1e6d33efab6b71d67f22bf2962895d3dc6f82a6273a965fab762e64fa90dc399"}, - {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c33be3795e299f565681d69852ac8c1bc5c84863c0b0030b2b3468843be90388"}, - {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eea80037b9fae5339b214f59308ef0589fc06dc870578b7cce6d71eb2096764c"}, - {file = "orjson-3.10.15-cp311-cp311-win32.whl", hash = "sha256:d5ac11b659fd798228a7adba3e37c010e0152b78b1982897020a8e019a94882e"}, - {file = "orjson-3.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:cf45e0214c593660339ef63e875f32ddd5aa3b4adc15e662cdb80dc49e194f8e"}, - {file = "orjson-3.10.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d11c0714fc85bfcf36ada1179400862da3288fc785c30e8297844c867d7505a"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba5a1e85d554e3897fa9fe6fbcff2ed32d55008973ec9a2b992bd9a65d2352d"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7723ad949a0ea502df656948ddd8b392780a5beaa4c3b5f97e525191b102fff0"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fd9bc64421e9fe9bd88039e7ce8e58d4fead67ca88e3a4014b143cec7684fd4"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dadba0e7b6594216c214ef7894c4bd5f08d7c0135f4dd0145600be4fbcc16767"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48f59114fe318f33bbaee8ebeda696d8ccc94c9e90bc27dbe72153094e26f41"}, - {file = "orjson-3.10.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:035fb83585e0f15e076759b6fedaf0abb460d1765b6a36f48018a52858443514"}, - {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d13b7fe322d75bf84464b075eafd8e7dd9eae05649aa2a5354cfa32f43c59f17"}, - {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7066b74f9f259849629e0d04db6609db4cf5b973248f455ba5d3bd58a4daaa5b"}, - {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88dc3f65a026bd3175eb157fea994fca6ac7c4c8579fc5a86fc2114ad05705b7"}, - {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b342567e5465bd99faa559507fe45e33fc76b9fb868a63f1642c6bc0735ad02a"}, - {file = "orjson-3.10.15-cp312-cp312-win32.whl", hash = "sha256:0a4f27ea5617828e6b58922fdbec67b0aa4bb844e2d363b9244c47fa2180e665"}, - {file = "orjson-3.10.15-cp312-cp312-win_amd64.whl", hash = "sha256:ef5b87e7aa9545ddadd2309efe6824bd3dd64ac101c15dae0f2f597911d46eaa"}, - {file = "orjson-3.10.15-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bae0e6ec2b7ba6895198cd981b7cca95d1487d0147c8ed751e5632ad16f031a6"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93ce145b2db1252dd86af37d4165b6faa83072b46e3995ecc95d4b2301b725a"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c203f6f969210128af3acae0ef9ea6aab9782939f45f6fe02d05958fe761ef9"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8918719572d662e18b8af66aef699d8c21072e54b6c82a3f8f6404c1f5ccd5e0"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f71eae9651465dff70aa80db92586ad5b92df46a9373ee55252109bb6b703307"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e117eb299a35f2634e25ed120c37c641398826c2f5a3d3cc39f5993b96171b9e"}, - {file = "orjson-3.10.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13242f12d295e83c2955756a574ddd6741c81e5b99f2bef8ed8d53e47a01e4b7"}, - {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7946922ada8f3e0b7b958cc3eb22cfcf6c0df83d1fe5521b4a100103e3fa84c8"}, - {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b7155eb1623347f0f22c38c9abdd738b287e39b9982e1da227503387b81b34ca"}, - {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:208beedfa807c922da4e81061dafa9c8489c6328934ca2a562efa707e049e561"}, - {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eca81f83b1b8c07449e1d6ff7074e82e3fd6777e588f1a6632127f286a968825"}, - {file = "orjson-3.10.15-cp313-cp313-win32.whl", hash = "sha256:c03cd6eea1bd3b949d0d007c8d57049aa2b39bd49f58b4b2af571a5d3833d890"}, - {file = "orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf"}, - {file = "orjson-3.10.15-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e8afd6200e12771467a1a44e5ad780614b86abb4b11862ec54861a82d677746"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9a18c500f19273e9e104cca8c1f0b40a6470bcccfc33afcc088045d0bf5ea6"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb00b7bfbdf5d34a13180e4805d76b4567025da19a197645ca746fc2fb536586"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33aedc3d903378e257047fee506f11e0833146ca3e57a1a1fb0ddb789876c1e1"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd0099ae6aed5eb1fc84c9eb72b95505a3df4267e6962eb93cdd5af03be71c98"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c864a80a2d467d7786274fce0e4f93ef2a7ca4ff31f7fc5634225aaa4e9e98c"}, - {file = "orjson-3.10.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c25774c9e88a3e0013d7d1a6c8056926b607a61edd423b50eb5c88fd7f2823ae"}, - {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e78c211d0074e783d824ce7bb85bf459f93a233eb67a5b5003498232ddfb0e8a"}, - {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:43e17289ffdbbac8f39243916c893d2ae41a2ea1a9cbb060a56a4d75286351ae"}, - {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:781d54657063f361e89714293c095f506c533582ee40a426cb6489c48a637b81"}, - {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6875210307d36c94873f553786a808af2788e362bd0cf4c8e66d976791e7b528"}, - {file = "orjson-3.10.15-cp38-cp38-win32.whl", hash = "sha256:305b38b2b8f8083cc3d618927d7f424349afce5975b316d33075ef0f73576b60"}, - {file = "orjson-3.10.15-cp38-cp38-win_amd64.whl", hash = "sha256:5dd9ef1639878cc3efffed349543cbf9372bdbd79f478615a1c633fe4e4180d1"}, - {file = "orjson-3.10.15-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ffe19f3e8d68111e8644d4f4e267a069ca427926855582ff01fc012496d19969"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d433bf32a363823863a96561a555227c18a522a8217a6f9400f00ddc70139ae2"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da03392674f59a95d03fa5fb9fe3a160b0511ad84b7a3914699ea5a1b3a38da2"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a63bb41559b05360ded9132032239e47983a39b151af1201f07ec9370715c82"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3766ac4702f8f795ff3fa067968e806b4344af257011858cc3d6d8721588b53f"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a1c73dcc8fadbd7c55802d9aa093b36878d34a3b3222c41052ce6b0fc65f8e8"}, - {file = "orjson-3.10.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b299383825eafe642cbab34be762ccff9fd3408d72726a6b2a4506d410a71ab3"}, - {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:abc7abecdbf67a173ef1316036ebbf54ce400ef2300b4e26a7b843bd446c2480"}, - {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:3614ea508d522a621384c1d6639016a5a2e4f027f3e4a1c93a51867615d28829"}, - {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:295c70f9dc154307777ba30fe29ff15c1bcc9dfc5c48632f37d20a607e9ba85a"}, - {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:63309e3ff924c62404923c80b9e2048c1f74ba4b615e7584584389ada50ed428"}, - {file = "orjson-3.10.15-cp39-cp39-win32.whl", hash = "sha256:a2f708c62d026fb5340788ba94a55c23df4e1869fec74be455e0b2f5363b8507"}, - {file = "orjson-3.10.15-cp39-cp39-win_amd64.whl", hash = "sha256:efcf6c735c3d22ef60c4aa27a5238f1a477df85e9b15f2142f9d669beb2d13fd"}, - {file = "orjson-3.10.15.tar.gz", hash = "sha256:05ca7fe452a2e9d8d9d706a2984c95b9c2ebc5db417ce0b7a49b91d50642a23e"}, -] - -[[package]] -name = "packaging" -version = "24.2" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, -] - -[[package]] -name = "parsimonious" -version = "0.10.0" -description = "(Soon to be) the fastest pure-Python PEG parser I could muster" -optional = false -python-versions = "*" -files = [ - {file = "parsimonious-0.10.0-py3-none-any.whl", hash = "sha256:982ab435fabe86519b57f6b35610aa4e4e977e9f02a14353edf4bbc75369fc0f"}, - {file = "parsimonious-0.10.0.tar.gz", hash = "sha256:8281600da180ec8ae35427a4ab4f7b82bfec1e3d1e52f80cb60ea82b9512501c"}, -] - -[package.dependencies] -regex = ">=2022.3.15" - -[[package]] -name = "propcache" -version = "0.2.1" -description = "Accelerated property cache" -optional = false -python-versions = ">=3.9" -files = [ - {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, - {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, - {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, - {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, - {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, - {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, - {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, - {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, - {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, - {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, - {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, - {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, - {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, - {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, - {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, -] - -[[package]] -name = "py-sr25519-bindings" -version = "0.2.1" -description = "Python bindings for schnorrkel RUST crate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "py_sr25519_bindings-0.2.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10489c399768dc4ac91c90a6c8da60aeb77a48b21a81944244d41b0d4c4be2f"}, - {file = "py_sr25519_bindings-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8358a7b3048765008a79733447dfdcafdce3f66859c98634055fee6868252e12"}, - {file = "py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:202af5a516614907ddaef073104ae6d0a98ec96743d11cb87faa09d2b235a6b4"}, - {file = "py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0b0d977c9ba6063d7807dda84264f10b1951736ba528b4d4078e5c9989051b1"}, - {file = "py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e6c46cbbb87eb9db3c7deebd71c296d67c0725d9379ee737255e22c15c64bae"}, - {file = "py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9368e9ca0bc1c967db0dd5cfc401f23d364064e99a48d21ea12a068612ccce7e"}, - {file = "py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9f1ade92569b0281ff24476bd93333865370d86746b2d7949545f1ca70ac4e14"}, - {file = "py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7286da1662afc300038441620092a0ae527430f7c50b0768e826d46893dd5095"}, - {file = "py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1afbf451ecb78d5a1fa3be0f1cafb914aa2d4464ce15374bbff495cc384b1947"}, - {file = "py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:873c0ec12fed805f4086e36ebbb673c95af09e4007ea66d5a9bbd2cc29dfa076"}, - {file = "py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5917f8584cf6a81e32f03547d9fbd8c783db2372d49bd9ff8c5c57d969ea1039"}, - {file = "py_sr25519_bindings-0.2.1-cp310-none-win32.whl", hash = "sha256:09f184393e01d0d2b62d3782a6d18dd0824a225444e0171c08e03f8cf3920e7b"}, - {file = "py_sr25519_bindings-0.2.1-cp310-none-win_amd64.whl", hash = "sha256:2d548a8ea057c6f150572059475761101ba8ef15e3b349d2d0cb108652f6aaf8"}, - {file = "py_sr25519_bindings-0.2.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4941e6e0e180f7e72565043ed3ba7190455c9feaa2ab9ee6038904f2b4bb6c5b"}, - {file = "py_sr25519_bindings-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b63d7cf5bb4d9b986d7f7012c80b92be70311dc9b75862f7880e03b71a29543d"}, - {file = "py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6752bf3b109446d99f3a368e3ba805812fc5bc09e52ef1c82f5a47e43b19973"}, - {file = "py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0368dcdf5ec8d2bb9c13273c78c3c5b033211d37a70a2f1d2080f29a7d118340"}, - {file = "py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2618b02b4a3babac07b8bb61fe9550f911f038bb079665682ca76b2e664e5258"}, - {file = "py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab1bc4dc524efefaecf3a85f4a0ff05c1ca9509d4d64056199984550f3c98b3"}, - {file = "py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ccdc89d5e3ae0dd163c8150ec76b6bb3291c1cec9746eb79e9544b3423f35f9"}, - {file = "py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ae6545c414cfa5d7207c9c77aaa576bb374982fb2105a7a9c2764afa5621f6d4"}, - {file = "py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7046774e39e0166d3c12632969c9d1713e6ad9ca8206bbe82923ba6935b0a01f"}, - {file = "py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cba9a8821176895b080ea761e5ab9cd8727660bf401478a6532a30ae3429573d"}, - {file = "py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c31aba05819e5b6b26746dc1b078cf680bd471f135c55e376e95c7774e22e936"}, - {file = "py_sr25519_bindings-0.2.1-cp311-none-win32.whl", hash = "sha256:d4bfb9c9a5c46563ccf12e74862ee95d2961556ba7aca62c9e4d6e4f7c37b4e0"}, - {file = "py_sr25519_bindings-0.2.1-cp311-none-win_amd64.whl", hash = "sha256:4f0d5c065d5e6122e53e771035aa335534363b451358b408d211df1c46773617"}, - {file = "py_sr25519_bindings-0.2.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:01ef73c0b3d3f703b54ee69c0f5ff4aa54b4233212c466fd497c7a84d170963a"}, - {file = "py_sr25519_bindings-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7ce8ac85e5ea82825a863f3f6f071e5ead610d7675820eb8ffe772267445ec0b"}, - {file = "py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f59ac8c03c8ef819db063627f4a8247aab0db11d88b21562abbe371612cf66ab"}, - {file = "py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d2c11fc77b57308e3ada9a40e7c343027129b582d3091ebd992c99b1832ac8c1"}, - {file = "py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92af2831d6896f0b3fef792d1f2da780fabf6c78dac12535b394cbdb51c0d257"}, - {file = "py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc99f7f310b7641e510810c1d6a6b51792ab2ccefac3ab288445a9fcbc9a8265"}, - {file = "py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1dc4995a352a6e5851a41cb0ea37d8c9083d173515b7fd2f381b014f57dc1cda"}, - {file = "py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f103dc5c420057c4447bd6ebf28b2b68ff3ab8da85a5f7ff39c405293de80c78"}, - {file = "py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:902ee675497b8d356a2abe2abc4278cd76c503f76d06ef2bcd797c1df59e84b7"}, - {file = "py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5dd9748f4bd9a3bc4d5c1245f6edcc723075b1470b4c36add4474df4c53604e8"}, - {file = "py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c24bc55699d12948571969c26e65138a942bdaca062171288c40c44b9a4f266"}, - {file = "py_sr25519_bindings-0.2.1-cp312-none-win32.whl", hash = "sha256:d4799c9a8f280abdfe564d397bad45da380275c8d22604e059bd7b3d5af404b5"}, - {file = "py_sr25519_bindings-0.2.1-cp312-none-win_amd64.whl", hash = "sha256:0746befd71d1766d8747910cfeb2cec2be2c859c3b3618eda1dc3cb4a1b85175"}, - {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfb80d71c010654638873e594e348a0add78dba66d089ef07d02998712744e80"}, - {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:761e48147e3b1e65b9c5ed3f547e600126f02d6b8e99aa99eb8faeb2c69166c2"}, - {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a14ce5fa0759710d45848cc98b49a10f7db3f1002726b61c57b9cdaf91c2f5f"}, - {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d731da6f49ee67dcd90ed25a393f9027e7a0caece837b1a66ffba10e63861356"}, - {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:507ae0d8894307642056f99df4acf2da9fe11153fd6e9d9e255d1d05db1b348e"}, - {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a3dad5382f60696161e91d6dd2d9381e9de61af1bf5699084939780d86115e12"}, - {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-musllinux_1_2_armv7l.whl", hash = "sha256:f913f2ddb478232a7a716603b47d276a4ab29230a4d3e87406523a0f1ae5c191"}, - {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:4844e2999a1d0ac5e9a166a2cc3557aedce6144b886bc9efd7b3f2e081feca97"}, - {file = "py_sr25519_bindings-0.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f81ad03ff65d92c9a6deba451c922204af97dbc9a0d0680a91495ad523944929"}, - {file = "py_sr25519_bindings-0.2.1-cp37-none-win32.whl", hash = "sha256:87ac70b8424b91ba5a446a6e6dcf33d55eb4acadf1cec393294ec740d26aa7c6"}, - {file = "py_sr25519_bindings-0.2.1-cp37-none-win_amd64.whl", hash = "sha256:593b639e25a6d334a25c4b51ab2eeb80f13d510433a42abf5f2302876e637435"}, - {file = "py_sr25519_bindings-0.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5059645a99bcb77a8cadacd1a5b01dc3041b3f684595e47669a484dc6e862bc1"}, - {file = "py_sr25519_bindings-0.2.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3ce9bef8a02542a1f80560137a67e011f74e0cd77b168214d2e564225f73aa01"}, - {file = "py_sr25519_bindings-0.2.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:007e6b548bfbf4bf4d0daa30784c7e03935bf47081cc9a3095cf52712ae64c72"}, - {file = "py_sr25519_bindings-0.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5b65131461d87062c75f2076a2c99aea4072e4886275e87e8616b3433e5c456"}, - {file = "py_sr25519_bindings-0.2.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db721395bb9c7d61392ab3957781450cba281b814c94f1888bb576891d3016d1"}, - {file = "py_sr25519_bindings-0.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b590397aaf2f222a5768f0b74bf08315ef105bc70c50f9bf5f3e6b97458d772d"}, - {file = "py_sr25519_bindings-0.2.1-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:a5b43cdf722f40f042ed05607bca7032055df4cdc413f52746e972ec393aa82f"}, - {file = "py_sr25519_bindings-0.2.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:46033ed3fe67ad11fa0f46f19483175a83185a02af6eb93d7391e81b3219c5a8"}, - {file = "py_sr25519_bindings-0.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4e3c1d51ae59b1bf295f1c5af21adc1acab60a7a018e081873f124456492db88"}, - {file = "py_sr25519_bindings-0.2.1-cp38-none-win32.whl", hash = "sha256:6b34f32efccb5a26c14f4ec1666f2821760981a709e04a486357bc0a152f5d94"}, - {file = "py_sr25519_bindings-0.2.1-cp38-none-win_amd64.whl", hash = "sha256:9ab1d3c8c3458a74217b849ffed3e03c98e746d488c9cf9b773f55ad8d3031ad"}, - {file = "py_sr25519_bindings-0.2.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:89014247bb398acf99e508a0eff7b1dee8cea4b1d441ceeee8de275b1944812f"}, - {file = "py_sr25519_bindings-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3ce7c463b73864909391bfad078b1c88ebbc1eb84f58336c605cbcaf3cecd2f"}, - {file = "py_sr25519_bindings-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a2c28840138ba0a4e6f8c6953821cbd1d80d2e52404ff9722030a22d26addd"}, - {file = "py_sr25519_bindings-0.2.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b0cea045676c3c482423232d19b6aac2458925416fcceec0a37c938f8bc9c00d"}, - {file = "py_sr25519_bindings-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cedbcc9779630c7cd364a66e686aa5c2ad0dd81fbb95edb689a6f63eb3323d6"}, - {file = "py_sr25519_bindings-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d064e6154554e18f3c40349c7df01297d812da5f6c4bcb825fa9f4fe2dd402d"}, - {file = "py_sr25519_bindings-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6156c50f92b705d89f82b0dcb51eb0eaf0f22fba9fa51648a5e0c8274b0e0502"}, - {file = "py_sr25519_bindings-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a915deadf311592c9d7dc6cf6b0550830aeb08c5029cb06e882c32dcb560125b"}, - {file = "py_sr25519_bindings-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:8b56ceec5f83dd9c4b809f3be3ef4262d1e833d1ed8f16d7d8283fb2c5ae1a75"}, - {file = "py_sr25519_bindings-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:73948c2b022287ff478a276b725a98a3bea34920cfe0edbedc0154f9a6125061"}, - {file = "py_sr25519_bindings-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a8bc937794b947b9da2f20fa0d8f5002d20d2bfc2656a21ef834e1af2d3fdca4"}, - {file = "py_sr25519_bindings-0.2.1-cp39-none-win32.whl", hash = "sha256:d27b882546d5ad78f71c1ec48033267a0dd812fb1583881c39a75b3180a7e80b"}, - {file = "py_sr25519_bindings-0.2.1-cp39-none-win_amd64.whl", hash = "sha256:5ad0d7b14339452072773bae6d4570684895658a046279bebd3410941846ea65"}, - {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50f8b34fed2c98814dcd414379ef43bf63cd4c05d7d90b83c590cca60fe804d6"}, - {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:141b0f8fb99cb249984f7c9ec67dd1768aae4d137d47ea0eca027d669503e132"}, - {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45cfef18bdfde67d445650a388bfafecbd1844a64c19087e9e4267548998c100"}, - {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:639410c0258a543bb84b0518616af724716737054ac5c78daa4d956d17841b17"}, - {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a98e5a395445046f37fc4e365556ce06fa344e3b711de0564ac3fd2b351a1b3e"}, - {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:7935b79a91aa72db42b5015117018554980c320256e63bc930b8bd148a0765a4"}, - {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:cedf5d0669c23ddab8804982f665c7e99b13e8452db78128f231217b8528c31a"}, - {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:9ea24db07992f756409729adad1e3ec9aa0a9d4fece5da90768a56ac1563f0f4"}, - {file = "py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8b7e42cd4a5177dd83bbcdef77591fd72d3da02616545011ebcdd872f8cc39d"}, - {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0db53685c6282b29d118ccac3bdaad257723494c07c38dc9a4f31027dc41885"}, - {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6e42e6edca45b9f116c97068416eb96c6606498289c056731dc08b645592b1ec"}, - {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:927d773693d41f6fb9644148649d78875ac27d21dcfd3436502d68c5cc6b0f30"}, - {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d169fd6a803a80c3554562c38894d942da8a408a43685b723bcd3a79ce884ee4"}, - {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:37f48ba05b3306b2aa9b97b6b91361c83467ce8b77348c2ecb28090fae193d6d"}, - {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-musllinux_1_2_i686.whl", hash = "sha256:9c9385e98e166cb293dda2a0691b511d770a5ffa0d7fe8495fd558387cbe06fe"}, - {file = "py_sr25519_bindings-0.2.1-pp37-pypy37_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:0855eb9ad70f3673d88e25cae4d799aff0e9fcfb6cbd24a8a41e1c7915f5f5a8"}, - {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1662dc8161fbb4e5220a89e8f4fd42a1ce5d71471e5d5a9398ed07ced12d2dc"}, - {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c3bca18a20ea6f12f662f4a38e8132f952f3ec77e4a1e0b4654a5fc0aeb54eb"}, - {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b857902b2c74269ae4fb9d1ac915993bbd55291351f6b8bb2bb6a08b5631bb5"}, - {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:04f44054b3244e13c1f9440b616251ff200fe679ce7d934783f214065a22f78e"}, - {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:7f8e2c3e0ecb086648c64274a98d6663bece7aaafbee8b7e229fc3f024d4ffb5"}, - {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:23edd08e0866b5ccf9fdbafa7e6a0646070b37ad6869723252136a2c47b5b5fc"}, - {file = "py_sr25519_bindings-0.2.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5bfd4d91329889109d8d5cbd22fa4138e778cb7522704f45f451b23a5573b1aa"}, - {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:858b80041b18fdde666427ec9843303931ab2184cdf698285e8d34f3f6c4fad0"}, - {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d9a848030227b8099c26c4f38b35fbae55cb78e0d3fab69804bf220e60a85455"}, - {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de7afdcc714fd83fc3636b9cea6c2ef6515e59f97410e73210276c3e0e64a28b"}, - {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9333d891f1305f686f6ef4b9aef204df3090d037056e9f6e1276165c29ef70c2"}, - {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:970e0635104f2d5e771de3b8863eb0f7d04617c164d49d17e02ecc60c3a97182"}, - {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:995e2c49dd0df3adb7907b2dc5a30d4df64160023205d89256b88a956c64637c"}, - {file = "py_sr25519_bindings-0.2.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4177bf68b73080ca0a21cf1231877dbec4f4485ee22bc97b7d447a0e29fe9c30"}, - {file = "py_sr25519_bindings-0.2.1.tar.gz", hash = "sha256:1b96d3dde43adcf86ab427a9fd72b2c6291dca36eb40747df631588c16f01c1a"}, -] - -[[package]] -name = "pycparser" -version = "2.22" -description = "C parser in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, -] - -[[package]] -name = "pycryptodome" -version = "3.21.0" -description = "Cryptographic library for Python" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pycryptodome-3.21.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:dad9bf36eda068e89059d1f07408e397856be9511d7113ea4b586642a429a4fd"}, - {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a1752eca64c60852f38bb29e2c86fca30d7672c024128ef5d70cc15868fa10f4"}, - {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ba4cc304eac4d4d458f508d4955a88ba25026890e8abff9b60404f76a62c55e"}, - {file = "pycryptodome-3.21.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cb087b8612c8a1a14cf37dd754685be9a8d9869bed2ffaaceb04850a8aeef7e"}, - {file = "pycryptodome-3.21.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:26412b21df30b2861424a6c6d5b1d8ca8107612a4cfa4d0183e71c5d200fb34a"}, - {file = "pycryptodome-3.21.0-cp27-cp27m-win32.whl", hash = "sha256:cc2269ab4bce40b027b49663d61d816903a4bd90ad88cb99ed561aadb3888dd3"}, - {file = "pycryptodome-3.21.0-cp27-cp27m-win_amd64.whl", hash = "sha256:0fa0a05a6a697ccbf2a12cec3d6d2650b50881899b845fac6e87416f8cb7e87d"}, - {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6cce52e196a5f1d6797ff7946cdff2038d3b5f0aba4a43cb6bf46b575fd1b5bb"}, - {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:a915597ffccabe902e7090e199a7bf7a381c5506a747d5e9d27ba55197a2c568"}, - {file = "pycryptodome-3.21.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e74c522d630766b03a836c15bff77cb657c5fdf098abf8b1ada2aebc7d0819"}, - {file = "pycryptodome-3.21.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:a3804675283f4764a02db05f5191eb8fec2bb6ca34d466167fc78a5f05bbe6b3"}, - {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2480ec2c72438430da9f601ebc12c518c093c13111a5c1644c82cdfc2e50b1e4"}, - {file = "pycryptodome-3.21.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:de18954104667f565e2fbb4783b56667f30fb49c4d79b346f52a29cb198d5b6b"}, - {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de4b7263a33947ff440412339cb72b28a5a4c769b5c1ca19e33dd6cd1dcec6e"}, - {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0714206d467fc911042d01ea3a1847c847bc10884cf674c82e12915cfe1649f8"}, - {file = "pycryptodome-3.21.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d85c1b613121ed3dbaa5a97369b3b757909531a959d229406a75b912dd51dd1"}, - {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:8898a66425a57bcf15e25fc19c12490b87bd939800f39a03ea2de2aea5e3611a"}, - {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_i686.whl", hash = "sha256:932c905b71a56474bff8a9c014030bc3c882cee696b448af920399f730a650c2"}, - {file = "pycryptodome-3.21.0-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:18caa8cfbc676eaaf28613637a89980ad2fd96e00c564135bf90bc3f0b34dd93"}, - {file = "pycryptodome-3.21.0-cp36-abi3-win32.whl", hash = "sha256:280b67d20e33bb63171d55b1067f61fbd932e0b1ad976b3a184303a3dad22764"}, - {file = "pycryptodome-3.21.0-cp36-abi3-win_amd64.whl", hash = "sha256:b7aa25fc0baa5b1d95b7633af4f5f1838467f1815442b22487426f94e0d66c53"}, - {file = "pycryptodome-3.21.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2cb635b67011bc147c257e61ce864879ffe6d03342dc74b6045059dfbdedafca"}, - {file = "pycryptodome-3.21.0-pp27-pypy_73-win32.whl", hash = "sha256:4c26a2f0dc15f81ea3afa3b0c87b87e501f235d332b7f27e2225ecb80c0b1cdd"}, - {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d5ebe0763c982f069d3877832254f64974139f4f9655058452603ff559c482e8"}, - {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ee86cbde706be13f2dec5a42b52b1c1d1cbb90c8e405c68d0755134735c8dc6"}, - {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fd54003ec3ce4e0f16c484a10bc5d8b9bd77fa662a12b85779a2d2d85d67ee0"}, - {file = "pycryptodome-3.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5dfafca172933506773482b0e18f0cd766fd3920bd03ec85a283df90d8a17bc6"}, - {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:590ef0898a4b0a15485b05210b4a1c9de8806d3ad3d47f74ab1dc07c67a6827f"}, - {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35e442630bc4bc2e1878482d6f59ea22e280d7121d7adeaedba58c23ab6386b"}, - {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff99f952db3db2fbe98a0b355175f93ec334ba3d01bbde25ad3a5a33abc02b58"}, - {file = "pycryptodome-3.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8acd7d34af70ee63f9a849f957558e49a98f8f1634f86a59d2be62bb8e93f71c"}, - {file = "pycryptodome-3.21.0.tar.gz", hash = "sha256:f7787e0d469bdae763b876174cf2e6c0f7be79808af26b1da96f1a64bcf47297"}, -] - -[[package]] -name = "pydantic" -version = "2.10.6" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, - {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, -] - -[package.dependencies] -annotated-types = ">=0.6.0" -pydantic-core = "2.27.2" -typing-extensions = ">=4.12.2" - -[package.extras] -email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] - -[[package]] -name = "pydantic-core" -version = "2.27.2" -description = "Core functionality for Pydantic validation and serialization" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, - {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, - {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, - {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, - {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, - {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, - {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, - {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, - {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, - {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, - {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, - {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, - {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, - {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, - {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, - {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, - {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, - {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, - {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, - {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, - {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, - {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, - {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, - {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, - {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, - {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, - {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, - {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, - {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, - {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, - {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, - {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, - {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, - {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, - {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, - {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, - {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, - {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, - {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, - {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, - {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, - {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, - {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, - {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, - {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, - {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, - {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, - {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, - {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, - {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, - {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, - {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, - {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, - {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, -] - -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - -[[package]] -name = "pyjwt" -version = "2.10.1" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, - {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - -[[package]] -name = "pynacl" -version = "1.5.0" -description = "Python binding to the Networking and Cryptography (NaCl) library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, - {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, -] - -[package.dependencies] -cffi = ">=1.4.1" - -[package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] -tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pyunormalize" -version = "16.0.0" -description = "Unicode normalization forms (NFC, NFKC, NFD, NFKD). A library independent of the Python core Unicode database." -optional = false -python-versions = ">=3.6" -files = [ - {file = "pyunormalize-16.0.0-py3-none-any.whl", hash = "sha256:c647d95e5d1e2ea9a2f448d1d95d8518348df24eab5c3fd32d2b5c3300a49152"}, - {file = "pyunormalize-16.0.0.tar.gz", hash = "sha256:2e1dfbb4a118154ae26f70710426a52a364b926c9191f764601f5a8cb12761f7"}, -] - -[[package]] -name = "pywin32" -version = "308" -description = "Python for Window Extensions" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, - {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, - {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, - {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, - {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, - {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, - {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, - {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, - {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, - {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, - {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, - {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, - {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, - {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, - {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, - {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, - {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, - {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, -] - -[[package]] -name = "regex" -version = "2024.11.6" -description = "Alternative regular expression module, to replace re." -optional = false -python-versions = ">=3.8" -files = [ - {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]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-oauthlib" -version = "2.0.0" -description = "OAuthlib authentication support for Requests." -optional = false -python-versions = ">=3.4" -files = [ - {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, - {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, -] - -[package.dependencies] -oauthlib = ">=3.0.0" -requests = ">=2.0.0" - -[package.extras] -rsa = ["oauthlib[signedtoken] (>=3.0.0)"] - -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, - {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, -] - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "rlp" -version = "4.0.1" -description = "rlp: A package for Recursive Length Prefix encoding and decoding" -optional = false -python-versions = "<4,>=3.8" -files = [ - {file = "rlp-4.0.1-py3-none-any.whl", hash = "sha256:ff6846c3c27b97ee0492373aa074a7c3046aadd973320f4fffa7ac45564b0258"}, - {file = "rlp-4.0.1.tar.gz", hash = "sha256:bcefb11013dfadf8902642337923bd0c786dc8a27cb4c21da6e154e52869ecb1"}, -] - -[package.dependencies] -eth-utils = ">=2" - -[package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "hypothesis (==5.19.0)", "ipython", "pre-commit (>=3.4.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] -rust-backend = ["rusty-rlp (>=0.2.1)"] -test = ["hypothesis (==5.19.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] - -[[package]] -name = "six" -version = "1.17.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, - {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "sqlalchemy" -version = "2.0.37" -description = "Database Abstraction Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "SQLAlchemy-2.0.37-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da36c3b0e891808a7542c5c89f224520b9a16c7f5e4d6a1156955605e54aef0e"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e7402ff96e2b073a98ef6d6142796426d705addd27b9d26c3b32dbaa06d7d069"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6f5d254a22394847245f411a2956976401e84da4288aa70cbcd5190744062c1"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41296bbcaa55ef5fdd32389a35c710133b097f7b2609d8218c0eabded43a1d84"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bedee60385c1c0411378cbd4dc486362f5ee88deceea50002772912d798bb00f"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6c67415258f9f3c69867ec02fea1bf6508153709ecbd731a982442a590f2b7e4"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-win32.whl", hash = "sha256:650dcb70739957a492ad8acff65d099a9586b9b8920e3507ca61ec3ce650bb72"}, - {file = "SQLAlchemy-2.0.37-cp310-cp310-win_amd64.whl", hash = "sha256:93d1543cd8359040c02b6614421c8e10cd7a788c40047dbc507ed46c29ae5636"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:78361be6dc9073ed17ab380985d1e45e48a642313ab68ab6afa2457354ff692c"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b661b49d0cb0ab311a189b31e25576b7ac3e20783beb1e1817d72d9d02508bf5"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d57bafbab289e147d064ffbd5cca2d7b1394b63417c0636cea1f2e93d16eb9e8"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fa2c0913f02341d25fb858e4fb2031e6b0813494cca1ba07d417674128ce11b"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9df21b8d9e5c136ea6cde1c50d2b1c29a2b5ff2b1d610165c23ff250e0704087"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db18ff6b8c0f1917f8b20f8eca35c28bbccb9f83afa94743e03d40203ed83de9"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-win32.whl", hash = "sha256:46954173612617a99a64aee103bcd3f078901b9a8dcfc6ae80cbf34ba23df989"}, - {file = "SQLAlchemy-2.0.37-cp311-cp311-win_amd64.whl", hash = "sha256:7b7e772dc4bc507fdec4ee20182f15bd60d2a84f1e087a8accf5b5b7a0dcf2ba"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2952748ecd67ed3b56773c185e85fc084f6bdcdec10e5032a7c25a6bc7d682ef"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3151822aa1db0eb5afd65ccfafebe0ef5cda3a7701a279c8d0bf17781a793bb4"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaa8039b6d20137a4e02603aba37d12cd2dde7887500b8855356682fc33933f4"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cdba1f73b64530c47b27118b7053b8447e6d6f3c8104e3ac59f3d40c33aa9fd"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1b2690456528a87234a75d1a1644cdb330a6926f455403c8e4f6cad6921f9098"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf5ae8a9dcf657fd72144a7fd01f243236ea39e7344e579a121c4205aedf07bb"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-win32.whl", hash = "sha256:ea308cec940905ba008291d93619d92edaf83232ec85fbd514dcb329f3192761"}, - {file = "SQLAlchemy-2.0.37-cp312-cp312-win_amd64.whl", hash = "sha256:635d8a21577341dfe4f7fa59ec394b346da12420b86624a69e466d446de16aff"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8c4096727193762e72ce9437e2a86a110cf081241919ce3fab8e89c02f6b6658"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e4fb5ac86d8fe8151966814f6720996430462e633d225497566b3996966b9bdb"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e56a139bfe136a22c438478a86f8204c1eb5eed36f4e15c4224e4b9db01cb3e4"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f95fc8e3f34b5f6b3effb49d10ac97c569ec8e32f985612d9b25dd12d0d2e94"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c505edd429abdfe3643fa3b2e83efb3445a34a9dc49d5f692dd087be966020e0"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:12b0f1ec623cccf058cf21cb544f0e74656618165b083d78145cafde156ea7b6"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-win32.whl", hash = "sha256:293f9ade06b2e68dd03cfb14d49202fac47b7bb94bffcff174568c951fbc7af2"}, - {file = "SQLAlchemy-2.0.37-cp313-cp313-win_amd64.whl", hash = "sha256:d70f53a0646cc418ca4853da57cf3ddddbccb8c98406791f24426f2dd77fd0e2"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44f569d0b1eb82301b92b72085583277316e7367e038d97c3a1a899d9a05e342"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2eae3423e538c10d93ae3e87788c6a84658c3ed6db62e6a61bb9495b0ad16bb"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfff7be361048244c3aa0f60b5e63221c5e0f0e509f4e47b8910e22b57d10ae7"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:5bc3339db84c5fb9130ac0e2f20347ee77b5dd2596ba327ce0d399752f4fce39"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:84b9f23b0fa98a6a4b99d73989350a94e4a4ec476b9a7dfe9b79ba5939f5e80b"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-win32.whl", hash = "sha256:51bc9cfef83e0ac84f86bf2b10eaccb27c5a3e66a1212bef676f5bee6ef33ebb"}, - {file = "SQLAlchemy-2.0.37-cp37-cp37m-win_amd64.whl", hash = "sha256:8e47f1af09444f87c67b4f1bb6231e12ba6d4d9f03050d7fc88df6d075231a49"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6b788f14c5bb91db7f468dcf76f8b64423660a05e57fe277d3f4fad7b9dcb7ce"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521ef85c04c33009166777c77e76c8a676e2d8528dc83a57836b63ca9c69dcd1"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75311559f5c9881a9808eadbeb20ed8d8ba3f7225bef3afed2000c2a9f4d49b9"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cce918ada64c956b62ca2c2af59b125767097ec1dca89650a6221e887521bfd7"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9d087663b7e1feabea8c578d6887d59bb00388158e8bff3a76be11aa3f748ca2"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cf95a60b36997dad99692314c4713f141b61c5b0b4cc5c3426faad570b31ca01"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-win32.whl", hash = "sha256:d75ead7dd4d255068ea0f21492ee67937bd7c90964c8f3c2bea83c7b7f81b95f"}, - {file = "SQLAlchemy-2.0.37-cp38-cp38-win_amd64.whl", hash = "sha256:74bbd1d0a9bacf34266a7907d43260c8d65d31d691bb2356f41b17c2dca5b1d0"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:648ec5acf95ad59255452ef759054f2176849662af4521db6cb245263ae4aa33"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:35bd2df269de082065d4b23ae08502a47255832cc3f17619a5cea92ce478b02b"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f581d365af9373a738c49e0c51e8b18e08d8a6b1b15cc556773bcd8a192fa8b"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82df02816c14f8dc9f4d74aea4cb84a92f4b0620235daa76dde002409a3fbb5a"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94b564e38b344d3e67d2e224f0aec6ba09a77e4582ced41e7bfd0f757d926ec9"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:955a2a765aa1bd81aafa69ffda179d4fe3e2a3ad462a736ae5b6f387f78bfeb8"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-win32.whl", hash = "sha256:03f0528c53ca0b67094c4764523c1451ea15959bbf0a8a8a3096900014db0278"}, - {file = "SQLAlchemy-2.0.37-cp39-cp39-win_amd64.whl", hash = "sha256:4b12885dc85a2ab2b7d00995bac6d967bffa8594123b02ed21e8eb2205a7584b"}, - {file = "SQLAlchemy-2.0.37-py3-none-any.whl", hash = "sha256:a8998bf9f8658bd3839cbc44ddbe982955641863da0c1efe5b00c1ab4f5c16b1"}, - {file = "sqlalchemy-2.0.37.tar.gz", hash = "sha256:12b28d99a9c14eaf4055810df1001557176716de0167b91026e648e65229bffb"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} -typing-extensions = ">=4.6.0" - -[package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] -mssql = ["pyodbc"] -mssql-pymssql = ["pymssql"] -mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0)"] -mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=8)"] -oracle-oracledb = ["oracledb (>=1.0.1)"] -postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.29.1)"] -postgresql-psycopg = ["psycopg (>=3.0.7)"] -postgresql-psycopg2binary = ["psycopg2-binary"] -postgresql-psycopg2cffi = ["psycopg2cffi"] -postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] -pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3_binary"] - -[[package]] -name = "standard-imghdr" -version = "3.13.0" -description = "Standard library imghdr redistribution. \"dead battery\"." -optional = false -python-versions = "*" -files = [ - {file = "standard_imghdr-3.13.0-py3-none-any.whl", hash = "sha256:30a1bff5465605bb496f842a6ac3cc1f2131bf3025b0da28d4877d6d4b7cc8e9"}, - {file = "standard_imghdr-3.13.0.tar.gz", hash = "sha256:8d9c68058d882f6fc3542a8d39ef9ff94d2187dc90bd0c851e0902776b7b7a42"}, -] - -[[package]] -name = "tenacity" -version = "9.0.0" -description = "Retry code until it succeeds" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, - {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, -] - -[package.extras] -doc = ["reno", "sphinx"] -test = ["pytest", "tornado (>=4.5)", "typeguard"] - -[[package]] -name = "tiktoken" -version = "0.8.0" -description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" -optional = false -python-versions = ">=3.9" -files = [ - {file = "tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e"}, - {file = "tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21"}, - {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560"}, - {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2"}, - {file = "tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9"}, - {file = "tiktoken-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005"}, - {file = "tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1"}, - {file = "tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a"}, - {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d"}, - {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47"}, - {file = "tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419"}, - {file = "tiktoken-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99"}, - {file = "tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586"}, - {file = "tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b"}, - {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab"}, - {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04"}, - {file = "tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc"}, - {file = "tiktoken-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db"}, - {file = "tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24"}, - {file = "tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a"}, - {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5"}, - {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953"}, - {file = "tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7"}, - {file = "tiktoken-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69"}, - {file = "tiktoken-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e17807445f0cf1f25771c9d86496bd8b5c376f7419912519699f3cc4dc5c12e"}, - {file = "tiktoken-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:886f80bd339578bbdba6ed6d0567a0d5c6cfe198d9e587ba6c447654c65b8edc"}, - {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6adc8323016d7758d6de7313527f755b0fc6c72985b7d9291be5d96d73ecd1e1"}, - {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b591fb2b30d6a72121a80be24ec7a0e9eb51c5500ddc7e4c2496516dd5e3816b"}, - {file = "tiktoken-0.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:845287b9798e476b4d762c3ebda5102be87ca26e5d2c9854002825d60cdb815d"}, - {file = "tiktoken-0.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:1473cfe584252dc3fa62adceb5b1c763c1874e04511b197da4e6de51d6ce5a02"}, - {file = "tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2"}, -] - -[package.dependencies] -regex = ">=2022.1.18" -requests = ">=2.26.0" - -[package.extras] -blobfile = ["blobfile (>=2)"] - -[[package]] -name = "toolz" -version = "1.0.0" -description = "List processing tools and functional utilities" -optional = false -python-versions = ">=3.8" -files = [ - {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, - {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, -] - -[[package]] -name = "tqdm" -version = "4.67.1" -description = "Fast, Extensible Progress Meter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, - {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] -discord = ["requests"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "tweepy" -version = "4.15.0" -description = "Twitter library for Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "tweepy-4.15.0-py3-none-any.whl", hash = "sha256:64adcea317158937059e4e2897b3ceb750b0c2dd5df58938c2da8f7eb3b88e6a"}, - {file = "tweepy-4.15.0.tar.gz", hash = "sha256:1345cbcdf0a75e2d89f424c559fd49fda4d8cd7be25cd5131e3b57bad8a21d76"}, -] - -[package.dependencies] -oauthlib = ">=3.2.0,<4" -requests = ">=2.27.0,<3" -requests-oauthlib = ">=1.2.0,<3" - -[package.extras] -async = ["aiohttp (>=3.7.3,<4)", "async-lru (>=1.0.3,<3)"] -dev = ["coverage (>=4.4.2)", "coveralls (>=2.1.0)", "tox (>=3.21.0)"] -docs = ["myst-parser (==0.15.2)", "readthedocs-sphinx-search (==0.1.1)", "sphinx (==4.2.0)", "sphinx-hoverxref (==0.7b1)", "sphinx-tabs (==3.2.0)", "sphinx_rtd_theme (==1.0.0)"] -socks = ["requests[socks] (>=2.27.0,<3)"] -test = ["urllib3 (<2)", "vcrpy (>=1.10.3)"] - -[[package]] -name = "twitter-langchain" -version = "0.0.11" -description = "Twitter Langchain Toolkit" -optional = false -python-versions = "<4.0,>=3.10" -files = [ - {file = "twitter_langchain-0.0.11-py3-none-any.whl", hash = "sha256:42657011c4752066862bf4de2bd36e69913654ea02bab6d9f995ce40793db461"}, - {file = "twitter_langchain-0.0.11.tar.gz", hash = "sha256:34445bbc0bcd2684197b917aff8e5e5f3db164d38e754fb67f6dc2359ca194c3"}, -] - -[package.dependencies] -cdp-agentkit-core = ">=0.0.11,<0.0.12" -langchain = ">=0.3.7,<0.4.0" -pydantic = ">=2.9.2,<3.0.0" -standard-imghdr = ">=3.13.0,<4.0.0" -tweepy = ">=4.14.0,<5.0.0" - -[[package]] -name = "types-requests" -version = "2.32.0.20241016" -description = "Typing stubs for requests" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"}, - {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"}, -] - -[package.dependencies] -urllib3 = ">=2" - -[[package]] -name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, -] - -[[package]] -name = "urllib3" -version = "2.3.0" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.9" -files = [ - {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, - {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "web3" -version = "7.7.0" -description = "web3: A Python library for interacting with Ethereum" -optional = false -python-versions = "<4,>=3.8" -files = [ - {file = "web3-7.7.0-py3-none-any.whl", hash = "sha256:2e29147c0f43cf191af788af8f004368b70994db40162f1240607f663dc68ea6"}, - {file = "web3-7.7.0.tar.gz", hash = "sha256:4d0332b9a78b855e57ccebd9e1e74c8e855b95869ac7b8fe5878731593e76408"}, -] - -[package.dependencies] -aiohttp = ">=3.7.4.post0" -eth-abi = ">=5.0.1" -eth-account = ">=0.13.1" -eth-hash = {version = ">=0.5.1", extras = ["pycryptodome"]} -eth-typing = ">=5.0.0" -eth-utils = ">=5.0.0" -hexbytes = ">=1.2.0" -pydantic = ">=2.4.0" -pyunormalize = ">=15.0.0" -pywin32 = {version = ">=223", markers = "platform_system == \"Windows\""} -requests = ">=2.23.0" -types-requests = ">=2.0.0" -typing-extensions = ">=4.0.1" -websockets = ">=10.0.0,<14.0.0" - -[package.extras] -dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-tester[py-evm] (>=0.12.0b1,<0.13.0b1)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "ipython", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "py-geth (>=5.1.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.18.1,<0.23)", "pytest-mock (>=1.10)", "pytest-xdist (>=2.4.0)", "setuptools (>=38.6.0)", "sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "tqdm (>4.32)", "twine (>=1.13)", "wheel"] -docs = ["sphinx (>=6.0.0)", "sphinx-autobuild (>=2021.3.14)", "sphinx_rtd_theme (>=1.0.0)", "towncrier (>=21,<22)"] -test = ["eth-tester[py-evm] (>=0.12.0b1,<0.13.0b1)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "mypy (==1.10.0)", "pre-commit (>=3.4.0)", "py-geth (>=5.1.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.18.1,<0.23)", "pytest-mock (>=1.10)", "pytest-xdist (>=2.4.0)", "tox (>=4.0.0)"] -tester = ["eth-tester[py-evm] (>=0.12.0b1,<0.13.0b1)", "py-geth (>=5.1.0)"] - -[[package]] -name = "websockets" -version = "13.1" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -optional = false -python-versions = ">=3.8" -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"}, -] - -[[package]] -name = "yarl" -version = "1.18.3" -description = "Yet another URL library" -optional = false -python-versions = ">=3.9" -files = [ - {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, - {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, - {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, - {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, - {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, - {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, - {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, - {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, - {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, - {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, - {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, - {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, - {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, - {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, - {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, - {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, - {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, - {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, - {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, - {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, - {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, - {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, - {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, - {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, - {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, - {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, - {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" -propcache = ">=0.2.0" - -[[package]] -name = "zstandard" -version = "0.23.0" -description = "Zstandard bindings for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9"}, - {file = "zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e"}, - {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0"}, - {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c"}, - {file = "zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813"}, - {file = "zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4"}, - {file = "zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e"}, - {file = "zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca"}, - {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78"}, - {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473"}, - {file = "zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160"}, - {file = "zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0"}, - {file = "zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094"}, - {file = "zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373"}, - {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90"}, - {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35"}, - {file = "zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d"}, - {file = "zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b"}, - {file = "zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9"}, - {file = "zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed"}, - {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057"}, - {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33"}, - {file = "zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd"}, - {file = "zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b"}, - {file = "zstandard-0.23.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc"}, - {file = "zstandard-0.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152"}, - {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b"}, - {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e"}, - {file = "zstandard-0.23.0-cp38-cp38-win32.whl", hash = "sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9"}, - {file = "zstandard-0.23.0-cp38-cp38-win_amd64.whl", hash = "sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f"}, - {file = "zstandard-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb"}, - {file = "zstandard-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58"}, - {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2"}, - {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5"}, - {file = "zstandard-0.23.0-cp39-cp39-win32.whl", hash = "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274"}, - {file = "zstandard-0.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58"}, - {file = "zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09"}, -] - -[package.dependencies] -cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\""} - -[package.extras] -cffi = ["cffi (>=1.11)"] - -[metadata] -lock-version = "2.0" -python-versions = "^3.10" -content-hash = "92276e8e4c27a9770c62956b1e2fd8856c28e62f7baae6eec2fe7c29b74be69f" diff --git a/twitter-langchain/examples/chatbot-typescript/.prettierignore b/twitter-langchain/examples/chatbot-typescript/.prettierignore deleted file mode 100644 index a6949181a..000000000 --- a/twitter-langchain/examples/chatbot-typescript/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -docs/ -dist/ -coverage/ -.github/ -src/client -**/**/*.json -*.md \ No newline at end of file diff --git a/twitter-langchain/examples/chatbot-typescript/.prettierrc b/twitter-langchain/examples/chatbot-typescript/.prettierrc deleted file mode 100644 index ffb416b74..000000000 --- a/twitter-langchain/examples/chatbot-typescript/.prettierrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "tabWidth": 2, - "useTabs": false, - "semi": true, - "singleQuote": false, - "trailingComma": "all", - "bracketSpacing": true, - "arrowParens": "avoid", - "printWidth": 100, - "proseWrap": "never" -} diff --git a/twitter-langchain/python/docs/README.md b/twitter-langchain/python/docs/README.md deleted file mode 120000 index 32d46ee88..000000000 --- a/twitter-langchain/python/docs/README.md +++ /dev/null @@ -1 +0,0 @@ -../README.md \ No newline at end of file diff --git a/twitter-langchain/typescript/.eslintrc.json b/twitter-langchain/typescript/.eslintrc.json deleted file mode 100644 index 91571ba7a..000000000 --- a/twitter-langchain/typescript/.eslintrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "extends": ["../../.eslintrc.base.json"] -} diff --git a/twitter-langchain/typescript/.prettierignore b/twitter-langchain/typescript/.prettierignore deleted file mode 100644 index 20de531f4..000000000 --- a/twitter-langchain/typescript/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -docs/ -dist/ -coverage/ -.github/ -src/client -**/**/*.json -*.md diff --git a/twitter-langchain/typescript/.prettierrc b/twitter-langchain/typescript/.prettierrc deleted file mode 100644 index ffb416b74..000000000 --- a/twitter-langchain/typescript/.prettierrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "tabWidth": 2, - "useTabs": false, - "semi": true, - "singleQuote": false, - "trailingComma": "all", - "bracketSpacing": true, - "arrowParens": "avoid", - "printWidth": 100, - "proseWrap": "never" -} diff --git a/twitter-langchain/typescript/CHANGELOG.md b/twitter-langchain/typescript/CHANGELOG.md deleted file mode 100644 index 99ed16d14..000000000 --- a/twitter-langchain/typescript/CHANGELOG.md +++ /dev/null @@ -1,45 +0,0 @@ -# CDP Agentkit Extension - Twitter Toolkit Changelog - -## Unreleased - -## [0.0.12] - 2025-01-24 - -### Added - -- Bump `@coinbase/cdp-agentkit-core` dependency to `0.0.14` - -## [0.0.11] - 2025-01-22 - -### Added - -- Bump `@coinbase/cdp-agentkit-core` dependency to `0.0.13` - -## [0.0.10] - 2025-01-17 - -### Added - -- Bump `@coinbase/cdp-agentkit-core` dependency to `0.0.12` - -## [0.0.9] - 2025-01-13 - -### Added - -- Bump `@coinbase/cdp-agentkit-core` dependency to `0.0.11` - -## [0.0.8] - 2025-01-09 - -### Added - -- Bump `@coinbase/cdp-agentkit-core` dependency to `0.0.10` - -## [0.0.7] - 2025-01-08 - -### Added - -- Bump `@coinbase/cdp-agentkit-core` dependency to `0.0.9` - -## [0.0.6] - 2024-12-09 - -### Added - -- Initial release of the CDP AgentKit.js Twitter Extension. diff --git a/twitter-langchain/typescript/README.md b/twitter-langchain/typescript/README.md deleted file mode 100644 index e5d889789..000000000 --- a/twitter-langchain/typescript/README.md +++ /dev/null @@ -1,99 +0,0 @@ -# Twitter (X) Langchain Toolkit - -Twitter integration with Langchain to enable agentic workflows using the core primitives defined in `cdp-agentkit-core`. - -This toolkit contains tools that enable an LLM agent to interact with [Twitter](https://developer.x.com/en/docs/x-api). The toolkit provides a wrapper around the Twitter (X) API, allowing agents to perform social operations like posting text. - -## Setup - -### Prerequisites - -- [OpenAI API Key](https://platform.openai.com/api-keys) -- [Twitter (X) App Developer Keys](https://developer.x.com/en/portal/dashboard) -- Node.js 18 or higher - -### Installation - -```bash -npm install @coinbase/twitter-langchain -``` - -### Environment Setup - -Set the following environment variables: - -```bash -export OPENAI_API_KEY= -export TWITTER_API_KEY= -export TWITTER_API_SECRET= -export TWITTER_ACCESS_TOKEN= -export TWITTER_ACCESS_TOKEN_SECRET= -export TWITTER_BEARER_TOKEN= -``` - -## Usage - -### Basic Setup - -```typescript -import { TwitterAgentkit } from "@coinbase/cdp-agentkit-core"; -import { TwitterToolkit } from "@coinbase/twitter-langchain"; - -// Initialize Twitter AgentKit -const agentkit = new TwitterAgentkit(); - -// Create toolkit -const toolkit = new TwitterToolkit(agentkit); - -// Get available tools -const tools = toolkit.getTools(); -``` - -### Available Tools - -The toolkit provides the following tools: - -1. **account_details** - Get the authenticated account details -2. **account_mentions** - Get mentions for the account -3. **post_tweet** - Post a tweet to the account -3. **post_tweet_reply** - Post a reply to a tweet on Twitter - -### Using with an Agent - -#### Additional Installations - -```bash -npm install @langchain/langgraph @langchain/openai -``` - -```typescript -import { ChatOpenAI } from "@langchain/openai"; -import { createReactAgent } from "@langchain/langgraph/prebuilt"; - -// Initialize LLM -const model = new ChatOpenAI({ - model: "gpt-4o-mini", -}); - -// Create agent executor -const agent = createReactAgent({ - llm: model, - tools, -}); - -// Example usage -const result = await agent.invoke({ - messages: [new HumanMessage("please post 'hello, world!' to twitter")], -}); - -console.log(result.messages[result.messages.length - 1].content); -``` - -## Examples - -Check out [twitter-langchain/examples](./examples) for inspiration and help getting started! -- [Chatbot Typescript](./examples/chatbot-typescript/README.md): Simple example of a Node.js Chatbot that can interact on Twitter (X), using OpenAI. - -## Contributing - -See [CONTRIBUTING.md](../CONTRIBUTING.md) for detailed setup instructions and contribution guidelines. diff --git a/twitter-langchain/typescript/jest.config.cjs b/twitter-langchain/typescript/jest.config.cjs deleted file mode 100644 index 2dceab682..000000000 --- a/twitter-langchain/typescript/jest.config.cjs +++ /dev/null @@ -1,14 +0,0 @@ -const baseConfig = require("../../jest.config.base.cjs"); - -module.exports = { - ...baseConfig, - coveragePathIgnorePatterns: ["node_modules", "dist", "docs", "index.ts"], - coverageThreshold: { - "./src/**": { - branches: 30, - functions: 50, - statements: 50, - lines: 50, - }, - }, -}; diff --git a/twitter-langchain/typescript/package.json b/twitter-langchain/typescript/package.json deleted file mode 100644 index ca5727c43..000000000 --- a/twitter-langchain/typescript/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "@coinbase/twitter-langchain", - "version": "0.0.12", - "description": "Twitter (X) langchain Toolkit extension of CDP Agentkit", - "repository": "https://github.com/coinbase/agentkit", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "files": ["dist"], - "scripts": { - "build": "tsc", - "lint": "npx --yes eslint -c .eslintrc.json src/**/*.ts", - "lint:fix": "npx --yes eslint -c .eslintrc.json src/**/*.ts --fix", - "format": "npx --yes prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"", - "format-check": "npx --yes prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"", - "check": "tsc --noEmit", - "test": "npx jest --no-cache --testMatch='**/*_test.ts'", - "test:dry-run": "npm install && npm ci && npm publish --dry-run", - "test:e2e": "npx jest --no-cache --testMatch=**/e2e.ts --coverageThreshold '{}'", - "test:types": "tsd --files src/tests/types.test-d.ts", - "clean": "rm -rf dist/*", - "prepack": "tsc", - "docs": "npx --yes typedoc --entryPoints ./src --entryPointStrategy expand --exclude ./src/tests/**/*.ts", - "docs:serve": "http-server ./docs", - "dev": "tsc --watch" - }, - "keywords": [ - "cdp", - "sdk", - "agentkit", - "ai", - "agent", - "nodejs", - "typescript", - "twitter", - "langchain" - ], - "dependencies": { - "@coinbase/cdp-agentkit-core": "^0.0.14", - "@langchain/core": "^0.3.19", - "twitter-api-v2": "^1.18.2", - "zod": "^3.22.4" - }, - "peerDependencies": { - "@coinbase/coinbase-sdk": "^0.15.0" - } -} diff --git a/twitter-langchain/typescript/src/index.ts b/twitter-langchain/typescript/src/index.ts deleted file mode 100644 index 67e8464b8..000000000 --- a/twitter-langchain/typescript/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Export Twitter (X) tool -export { TwitterTool } from "./twitter_tool"; - -// Export Twitter (X) toolkit -export { TwitterToolkit } from "./twitter_toolkit"; diff --git a/twitter-langchain/typescript/src/tests/twitter_tool_test.ts b/twitter-langchain/typescript/src/tests/twitter_tool_test.ts deleted file mode 100644 index 591200b03..000000000 --- a/twitter-langchain/typescript/src/tests/twitter_tool_test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - TwitterAction, - TwitterActionSchemaAny, - TwitterAgentkit, -} from "@coinbase/cdp-agentkit-core"; -import { TwitterTool } from "../twitter_tool"; -import { z } from "zod"; - -const MOCK_DESCRIPTION = "Twitter Test Action"; -const MOCK_NAME = "test_action"; - -describe("TwitterTool", () => { - let mockAgentkit: jest.Mocked; - let mockAction: jest.Mocked>; - let twitterTool: TwitterTool; - - beforeEach(() => { - mockAgentkit = { - run: jest.fn((action, args) => action.func(mockAgentkit, args)), - } as unknown as jest.Mocked; - - mockAction = { - name: MOCK_NAME, - description: MOCK_DESCRIPTION, - argsSchema: z.object({ test_param: z.string() }), - func: jest.fn().mockResolvedValue("success"), - } as unknown as jest.Mocked>; - - twitterTool = new TwitterTool(mockAction, mockAgentkit); - }); - - it("should initialize with correct properties", () => { - expect(twitterTool.name).toBe(MOCK_NAME); - expect(twitterTool.description).toBe(MOCK_DESCRIPTION); - expect(twitterTool.schema).toEqual(mockAction.argsSchema); - }); - - it("should execute action with valid args", async () => { - const args = { test_param: "test" }; - const response = await twitterTool.call(args); - - expect(mockAction.func).toHaveBeenCalledWith(mockAgentkit, args); - expect(response).toBe("success"); - }); - - it("should handle schema validation errors", async () => { - const invalidargs = { invalid_param: "test" }; - await expect(twitterTool.call(invalidargs)).rejects.toThrow(); - expect(mockAction.func).not.toHaveBeenCalled(); - }); - - it("should return error message on action execution failure", async () => { - mockAction.func.mockRejectedValue(new Error("Execution failed")); - const args = { test_param: "test" }; - const response = await twitterTool.call(args); - expect(response).toContain("Error executing test_action: Execution failed"); - }); -}); diff --git a/twitter-langchain/typescript/src/tests/twitter_toolkit_test.ts b/twitter-langchain/typescript/src/tests/twitter_toolkit_test.ts deleted file mode 100644 index c0f69f5e6..000000000 --- a/twitter-langchain/typescript/src/tests/twitter_toolkit_test.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { TwitterToolkit } from "../twitter_toolkit"; -import { TwitterTool } from "../twitter_tool"; -import { - TwitterAction, - TwitterActionSchemaAny, - TwitterAgentkit, -} from "@coinbase/cdp-agentkit-core"; -import { z } from "zod"; - -describe("TwitterToolkit", () => { - let mockAgentkit: jest.Mocked; - let mockActions: jest.Mocked>[]; - let twitterToolkit: TwitterToolkit; - - beforeEach(() => { - mockAgentkit = { - run: jest.fn((action, args) => action.func(mockAgentkit, args)), - } as unknown as jest.Mocked; - - mockActions = [ - { - name: "account_details", - description: "Get Twitter account details", - argsSchema: z.object({ userId: z.string() }), - func: jest.fn().mockResolvedValue("@user123 - Joined 2023"), - }, - { - name: "post_tweet", - description: "Post a new tweet", - argsSchema: z.object({ content: z.string() }), - func: jest.fn().mockResolvedValue("Tweet posted successfully"), - }, - ]; - - twitterToolkit = new TwitterToolkit(mockAgentkit); - twitterToolkit.tools = mockActions.map(action => new TwitterTool(action, mockAgentkit)); - }); - - it("should initialize with correct tools", () => { - expect(twitterToolkit.tools).toHaveLength(mockActions.length); - expect(twitterToolkit.tools[0].name).toBe("account_details"); - expect(twitterToolkit.tools[1].name).toBe("post_tweet"); - }); - - it("should execute action from toolkit", async () => { - const tool = twitterToolkit.tools[0]; - const args = { userId: "user123" }; - const response = await tool.call(args); - - expect(mockActions[0].func).toHaveBeenCalledWith(mockAgentkit, args); - expect(response).toBe("@user123 - Joined 2023"); - }); - - it("should handle action execution failure", async () => { - const error = new Error("Failed to fetch account details"); - mockActions[0].func.mockRejectedValue(error); - - const tool = twitterToolkit.tools[0]; - const args = { userId: "user123" }; - const response = await tool.call(args); - - expect(response).toContain(`Error executing account_details: ${error.message}`); - }); - - it("should return all available tools", () => { - const tools = twitterToolkit.getTools(); - - expect(tools).toHaveLength(mockActions.length); - expect(tools[0].name).toBe("account_details"); - expect(tools[1].name).toBe("post_tweet"); - }); -}); diff --git a/twitter-langchain/typescript/src/twitter_tool.ts b/twitter-langchain/typescript/src/twitter_tool.ts deleted file mode 100644 index 9e5e6ec68..000000000 --- a/twitter-langchain/typescript/src/twitter_tool.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { StructuredTool } from "@langchain/core/tools"; -import { z } from "zod"; -import { - TwitterAction, - TwitterActionSchemaAny, - TwitterAgentkit, -} from "@coinbase/cdp-agentkit-core"; - -/** - * This tool allows agents to interact with the Twitter (X) API and control an authenticated Twitter account. - * - * To use this tool, you must first set the following environment variables: - * - TWITTER_API_KEY - * - TWITTER_API_SECRET - * - TWITTER_ACCESS_TOKEN - * - TWITTER_ACCESS_TOKEN_SECRET - * - TWITTER_BEARER_TOKEN - */ -export class TwitterTool extends StructuredTool { - /** - * Schema definition for the tool's input. - */ - public schema: TActionSchema; - - /** - * The name of the tool. - */ - public name: string; - - /** - * The description of the tool. - */ - public description: string; - - /** - * The Twitter (X) Agentkit instance. - */ - private agentkit: TwitterAgentkit; - - /** - * The Twitter (X) Action. - */ - private action: TwitterAction; - - /** - * Constructor for the Twitter (X) Tool class. - * - * @param action - The Twitter (X) action to execute. - * @param agentkit - The Twitter (X) wrapper to use. - */ - constructor(action: TwitterAction, agentkit: TwitterAgentkit) { - super(); - - this.action = action; - this.agentkit = agentkit; - this.name = action.name; - this.description = action.description; - this.schema = action.argsSchema; - } - - /** - * Executes the Twitter (X) action with the provided input. - * - * @param input - An object containing either instructions or schema-validated arguments. - * @returns A promise that resolves to the result of the Twitter (X) action. - */ - protected async _call( - input: z.infer & Record, - ): Promise { - try { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let args: any; - - // If we have a schema, try to validate against it - if (this.schema) { - try { - const validatedInput = this.schema.parse(input); - args = validatedInput; - } catch (validationError) { - // If schema validation fails, fall back to instructions-only mode - args = input; - } - } - // No schema, use instructions mode - else { - args = input; - } - - return await this.agentkit.run(this.action, args); - } catch (error: unknown) { - if (error instanceof Error) { - return `Error executing ${this.name}: ${error.message}`; - } - return `Error executing ${this.name}: Unknown error occurred`; - } - } -} diff --git a/twitter-langchain/typescript/src/twitter_toolkit.ts b/twitter-langchain/typescript/src/twitter_toolkit.ts deleted file mode 100644 index f8df4137b..000000000 --- a/twitter-langchain/typescript/src/twitter_toolkit.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { StructuredToolInterface, BaseToolkit as Toolkit } from "@langchain/core/tools"; -import { TWITTER_ACTIONS, TwitterAgentkit } from "@coinbase/cdp-agentkit-core"; -import { TwitterTool } from "./twitter_tool"; - -/** - * Twitter (X) Toolkit. - * - * Security Note: This toolkit contains tools that can read and modify - * the state of a service; e.g., by creating, deleting, or updating, - * reading underlying data. - * - * For example, this toolkit can be used to get account details, - * account mentions, post tweets, post tweet replies, and anything, - * else you can implement with the Twitter (X) API! - * - * Setup: - * You will need to set the following environment variables: - * ```bash - * export OPENAI_API_KEY= - * export TWITTER_API_KEY= - * export TWITTER_API_SECRET= - * export TWITTER_ACCESS_TOKEN= - * export TWITTER_ACCESS_TOKEN_SECRET= - * ``` - * - * Example usage: - * ```typescript - * // optional if not available via the ENV - * const options = { - * apiKey: "", - * apiSecret: "", - * accessToken: "", - * accessTokenSecret: "", - * }; - * - * const agentkit = await TwitterAgentkit.configureWithOptions(options); - * const toolkit = new TwitterToolkit(agentkit); - * const tools = toolkit.getTools(); - * - * // Available tools include: - * // - account_details - * // - account_mentions - * // - post_tweet - * // - post_tweet_reply - * ``` - */ -export class TwitterToolkit extends Toolkit { - tools: StructuredToolInterface[]; - - /** - * Creates a new Twitter (X) Toolkit instance - * - * @param agentkit - Twitter (X) agentkit instance - */ - constructor(agentkit: TwitterAgentkit) { - super(); - const actions = TWITTER_ACTIONS; - const tools = actions.map(action => new TwitterTool(action, agentkit)); - this.tools = tools; - } -} diff --git a/twitter-langchain/typescript/tsconfig.json b/twitter-langchain/typescript/tsconfig.json deleted file mode 100644 index 2e2cc2c33..000000000 --- a/twitter-langchain/typescript/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": "./src" - }, - "include": ["src/**/*.ts"], - "exclude": ["src/tests"] -} diff --git a/typescript/README.md b/typescript/README.md new file mode 100644 index 000000000..a65e3700f --- /dev/null +++ b/typescript/README.md @@ -0,0 +1,18 @@ +# AgentKit TypeScript + +## 📦 Packages + +### `@coinbase/agentkit` + +The core primitives and framework-agnostic actions that are meant to be composable and used via AgentKit framework extensions (ie, `@coinbase/agentkit-langchain`). + +See [AgentKit](./agentkit/README.md) to get started! + +### Framework Extensions + +#### `@coinbase/agentkit-langchain` + +LangChain extension of AgentKit. Enables agentic workflows to interact with onchain actions. + +See [AgentKit LangChain](./framework-extensions/langchain/README.md) to get started! + diff --git a/cdp-agentkit-core/typescript/.eslintrc.json b/typescript/agentkit/.eslintrc.json similarity index 100% rename from cdp-agentkit-core/typescript/.eslintrc.json rename to typescript/agentkit/.eslintrc.json diff --git a/cdp-agentkit-core/typescript/.prettierignore b/typescript/agentkit/.prettierignore similarity index 100% rename from cdp-agentkit-core/typescript/.prettierignore rename to typescript/agentkit/.prettierignore diff --git a/cdp-agentkit-core/typescript/.prettierrc b/typescript/agentkit/.prettierrc similarity index 100% rename from cdp-agentkit-core/typescript/.prettierrc rename to typescript/agentkit/.prettierrc diff --git a/cdp-agentkit-core/typescript/CHANGELOG.md b/typescript/agentkit/CHANGELOG.md similarity index 89% rename from cdp-agentkit-core/typescript/CHANGELOG.md rename to typescript/agentkit/CHANGELOG.md index 3422736fe..65a072643 100644 --- a/cdp-agentkit-core/typescript/CHANGELOG.md +++ b/typescript/agentkit/CHANGELOG.md @@ -1,7 +1,16 @@ -# CDP AgentKit Core Changelog +# AgentKit Changelog ## Unreleased +## [0.1.0] - 2025-02-01 + +### Added + +- Added Action Provider Paradigm +- Added Wallet Provider Paradigm +- Refactored directory structure +- Updated package name to `@coinbase/agentkit` + ## [0.0.14] - 2025-01-24 ### Added diff --git a/typescript/agentkit/README.md b/typescript/agentkit/README.md new file mode 100644 index 000000000..4208b6e20 --- /dev/null +++ b/typescript/agentkit/README.md @@ -0,0 +1,305 @@ +# Agentkit + +AgentKit is a framework for easily enabling AI agents to take actions onchain. It is designed to be framework-agnostic, so you can use it with any AI framework, and wallet-agnostic, so you can use it with any wallet. + +## Table of Contents + +- [Agentkit](#agentkit) +- [Getting Started](#getting-started) +- [Installation](#installation) +- [Usage](#usage) + - [Create an AgentKit instance](#1-create-an-agentkit-instance) + - [Create an AgentKit instance with a specified wallet provider](#2-create-an-agentkit-instance-with-a-specified-wallet-provider) + - [Create an AgentKit instance with a specified action providers](#3-create-an-agentkit-instance-with-a-specified-action-providers) +- [Wallet Providers](#wallet-providers) + - [CdpWalletProvider](#cdpwalletprovider) + - [Network Configuration](#network-configuration) + - [Configuring from an existing CDP API Wallet](#configuring-from-an-existing-cdp-api-wallet) + - [Configuring from a mnemonic phrase](#configuring-from-a-mnemonic-phrase) + - [Exporting a wallet](#exporting-a-wallet) + - [Importing a wallet from WalletData JSON string](#importing-a-wallet-from-walletdata-json-string) + - [ViemWalletProvider](#viemwalletprovider) +- [Contributing](#contributing) + +## Getting Started + +*Prerequisites*: +- [Node.js 18+](https://nodejs.org/en/download/) +- [CDP Secret API Key](https://docs.cdp.coinbase.com/get-started/docs/cdp-api-keys#creating-secret-api-keys) + +## Installation + +```bash +npm install @coinbase/agentkit +``` + +## Usage + +1. Create an AgentKit instance. If no wallet or action providers are specified, the agent will use the `CdpWalletProvider` and `WalletProvider` action provider. + +```typescript +const agentKit = await AgentKit.from({ + cdpApiKeyName: "CDP API KEY NAME", + cdpApiKeyPrivate: "CDP API KEY PRIVATE KEY", +}); +``` + +2. Create an AgentKit instance with a specified wallet provider. + +```typescript +import { CdpWalletProvider } from "@coinbase/agentkit"; + +const walletProvider = await CdpWalletProvider.configureWithWallet({ + apiKeyName: "CDP API KEY NAME", + apiKeyPrivate: "CDP API KEY PRIVATE KEY", + networkId: "base-mainnet", +}); + +const agentKit = await AgentKit.from({ + walletProvider, +}); +``` + +3. Create an AgentKit instance with a specified action providers. + +```typescript +import { cdpApiActionProvider, pythActionProvider } from "@coinbase/agentkit"; + +const agentKit = await AgentKit.from({ + walletProvider, + actionProviders: [ + cdpApiActionProvider({ + apiKeyName: "CDP API KEY NAME", + apiKeyPrivate: "CDP API KEY PRIVATE KEY", + }), + pythActionProvider(), + ], +}); +``` + +4. Use the agent's actions with a framework extension. For example, using LangChain + OpenAI. + +*Prerequisites*: +- [OpenAI API Key](https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key) +- Set `OPENAI_API_KEY` environment variable. + +```bash +npm install @langchain @langchain/langgraph @langchain/openai +``` + +```typescript +import { getLangChainTools } from "@coinbase/agentkit-langchain"; +import { createReactAgent } from "@langchain/langgraph/prebuilt"; +import { ChatOpenAI } from "@langchain/openai"; + +const tools = await getLangChainTools(agentKit); + +const llm = new ChatOpenAI({ + model: "gpt-4o-mini", +}); + +const agent = createReactAgent({ + llm, + tools, +}); +``` + +## Creating an Action Provider + +Action providers are used to define the actions that an agent can take. They are defined as a class that extends the `ActionProvider` abstract class. + +```typescript +import { ActionProvider, WalletProvider, Network } from "@coinbase/agentkit"; + +// Define an action provider that uses a wallet provider. +class MyActionProvider extends ActionProvider { + constructor() { + super("my-action-provider", []); + } + + // Define if the action provider supports the given network + supportsNetwork = (network: Network) => true; +} +``` + +### Adding Actions to your Action Provider + +Actions are defined as instance methods on the action provider class with the `@CreateAction` decorator. Actions can use a wallet provider or not and always return a Promise that resolves to a string. + +1. Define the action schema. Action schemas are defined using the `zod` library. + +```typescript +import { z } from "zod"; + +export const MyActionSchema = z.object({ + myField: z.string(), +}); +``` + +2. Define the action. + +```typescript +import { ActionProvider, WalletProvider, Network, CreateAction } from "@coinbase/agentkit"; + +class MyActionProvider extends ActionProvider { + constructor() { + super("my-action-provider", []); + } + + @CreateAction({ + name: "my-action", + description: "My action description", + schema: MyActionSchema, + }) + async myAction(args: z.infer): Promise { + return args.myField; + } + + supportsNetwork = (network: Network) => true; +} + +export const myActionProvider = () => new MyActionProvider(); +``` + +#### Adding Actions to your Action Provider that use a Wallet Provider + +Actions that use a wallet provider can be defined as instance methods on the action provider class with the `@CreateAction` decorator that have a `WalletProvider` as the first parameter. + +```typescript +class MyActionProvider extends ActionProvider { + constructor() { + super("my-action-provider", []); + } + + @CreateAction({ + name: "my-action", + description: "My action description", + schema: MyActionSchema, + }) + async myAction(walletProvider: WalletProvider, args: z.infer): Promise { + return walletProvider.signMessage(args.myField); + } + + supportsNetwork = (network: Network) => true; +} +``` + +### Adding an Action Provider to your AgentKit instance. + +This gives your agent access to the actions defined in the action provider. + +```typescript +const agentKit = new AgentKit({ + cdpApiKeyName: "CDP API KEY NAME", + cdpApiKeyPrivate: "CDP API KEY PRIVATE KEY", + actionProviders: [myActionProvider()], +}); +``` + +## Wallet Providers + +Wallet providers give an agent access to a wallet. AgentKit currently supports the following wallet providers: + +EVM: +- [CdpWalletProvider](./src/wallet-providers/cdpWalletProvider.ts) +- [ViemWalletProvider](./src/wallet-providers/viemWalletProvider.ts) + +### CdpWalletProvider + +The `CdpWalletProvider` is a wallet provider that uses the Coinbase Developer Platform (CDP) [API Wallet](https://docs.cdp.coinbase.com/wallet-api/docs/welcome). + +#### Network Configuration + +The `CdpWalletProvider` can be configured to use a specific network by passing the `networkId` parameter to the `configureWithWallet` method. The `networkId` is the ID of the network you want to use. You can find a list of [supported networks on the CDP API docs](https://docs.cdp.coinbase.com/cdp-apis/docs/networks). + +```typescript +import { CdpWalletProvider } from "@coinbase/agentkit"; + +const walletProvider = await CdpWalletProvider.configureWithWallet({ + apiKeyName: "CDP API KEY NAME", + apiKeyPrivate: "CDP API KEY PRIVATE KEY", + networkId: "base-mainnet", +}); +``` + +#### Configuring from an existing CDP API Wallet + +If you already have a CDP API Wallet, you can configure the `CdpWalletProvider` by passing the `wallet` parameter to the `configureWithWallet` method. + +```typescript +import { CdpWalletProvider } from "@coinbase/agentkit"; +import { Wallet } from "@coinbase/coinbase-sdk"; +const walletProvider = await CdpWalletProvider.configureWithWallet({ + wallet, + apiKeyName: "CDP API KEY NAME", + apiKeyPrivate: "CDP API KEY PRIVATE KEY", +}); +``` + +#### Configuring from a mnemonic phrase + +The `CdpWalletProvider` can be configured from a mnemonic phrase by passing the `mnemonicPhrase` parameter to the `configureWithWallet` method. + +```typescript +import { CdpWalletProvider } from "@coinbase/agentkit"; + +const walletProvider = await CdpWalletProvider.configureWithWallet({ + mnemonicPhrase: "MNEMONIC PHRASE", +}); +``` + +#### Exporting a wallet + +The `CdpWalletProvider` can export a wallet by calling the `exportWallet` method. + +```typescript +import { CdpWalletProvider } from "@coinbase/agentkit"; + +const walletProvider = await CdpWalletProvider.configureWithWallet({ + mnemonicPhrase: "MNEMONIC PHRASE", +}); + +const walletData = await walletProvider.exportWallet(); +``` + +#### Importing a wallet from `WalletData` JSON string + +The `CdpWalletProvider` can import a wallet from a `WalletData` JSON string by passing the `cdpWalletData` parameter to the `configureWithWallet` method. + +```typescript +import { CdpWalletProvider } from "@coinbase/agentkit"; + +const walletProvider = await CdpWalletProvider.configureWithWallet({ + cdpWalletData: "WALLET DATA JSON STRING", + apiKeyName: "CDP API KEY NAME", + apiKeyPrivate: "CDP API KEY PRIVATE KEY", +}); +``` + +### ViemWalletProvider + +The `ViemWalletProvider` is a wallet provider that uses the [Viem library](https://viem.sh/docs/getting-started). It is useful for interacting with any EVM-compatible chain. + +```typescript +import { ViemWalletProvider } from "@coinbase/agentkit"; +import { privateKeyToAccount } from "viem/accounts"; +import { baseSepolia } from "viem/chains"; +import { http } from "viem/transports"; +import { createWalletClient } from "viem"; + +const account = privateKeyToAccount( + "0x4c0883a69102937d6231471b5dbb6208ffd70c02a813d7f2da1c54f2e3be9f38", +); + +const client = createWalletClient({ + account, + chain: baseSepolia, + transport: http(), +}); + +const walletProvider = new ViemWalletProvider(client); +``` + +## Contributing + +See [CONTRIBUTING.md](../../CONTRIBUTING.md) for more information. diff --git a/farcaster-langchain/typescript/jest.config.cjs b/typescript/agentkit/jest.config.cjs similarity index 56% rename from farcaster-langchain/typescript/jest.config.cjs rename to typescript/agentkit/jest.config.cjs index 2dceab682..eb8b9b610 100644 --- a/farcaster-langchain/typescript/jest.config.cjs +++ b/typescript/agentkit/jest.config.cjs @@ -3,12 +3,5 @@ const baseConfig = require("../../jest.config.base.cjs"); module.exports = { ...baseConfig, coveragePathIgnorePatterns: ["node_modules", "dist", "docs", "index.ts"], - coverageThreshold: { - "./src/**": { - branches: 30, - functions: 50, - statements: 50, - lines: 50, - }, - }, + coverageThreshold: {}, }; diff --git a/cdp-agentkit-core/typescript/package.json b/typescript/agentkit/package.json similarity index 62% rename from cdp-agentkit-core/typescript/package.json rename to typescript/agentkit/package.json index 37d9eb8e0..6a1515558 100644 --- a/cdp-agentkit-core/typescript/package.json +++ b/typescript/agentkit/package.json @@ -1,27 +1,29 @@ { - "name": "@coinbase/cdp-agentkit-core", - "description": "CDP Agentkit core primitives", + "name": "@coinbase/agentkit", + "description": "Coinbase AgentKit core primitives", "repository": "https://github.com/coinbase/agentkit", - "version": "0.0.14", + "version": "0.1.0", "author": "Coinbase Inc.", "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", - "files": ["dist"], + "files": [ + "dist" + ], "scripts": { "build": "tsc", - "lint": "npx --yes eslint -c .eslintrc.json src/**/*.ts", - "lint:fix": "npx --yes eslint -c .eslintrc.json src/**/*.ts --fix", - "format": "npx --yes prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"", - "format-check": "npx --yes prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"", + "lint": "eslint -c .eslintrc.json \"src/**/*.ts\"", + "lint:fix": "eslint -c .eslintrc.json \"src/**/*.ts\" --fix", + "format": "prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"", + "format:check": "prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"", "check": "tsc --noEmit", - "test": "npx jest --no-cache --testMatch='**/*_test.ts'", + "test": "npx jest --no-cache --testMatch='**/*.test.ts'", "test:dry-run": "npm install && npm ci && npm publish --dry-run", "test:e2e": "npx jest --no-cache --testMatch=**/e2e.ts --coverageThreshold '{}'", "test:types": "tsd --files src/tests/types.test-d.ts", "clean": "rm -rf dist/*", "prepack": "tsc", - "docs": "npx --yes typedoc --entryPoints ./src --entryPointStrategy expand --exclude ./src/tests/**/*.ts", + "docs": "typedoc --entryPoints ./src --entryPointStrategy expand --exclude ./src/tests/**/*.ts", "docs:serve": "http-server ./docs", "dev": "tsc --watch" }, @@ -37,9 +39,11 @@ "typescript" ], "dependencies": { - "@coinbase/coinbase-sdk": "^0.15.0", + "@coinbase/coinbase-sdk": "^0.17.0", + "md5": "^2.3.0", + "reflect-metadata": "^0.2.2", "twitter-api-v2": "^1.18.2", - "viem": "^2.21.51", + "viem": "^2.22.16", "zod": "^3.23.8" }, "devDependencies": { diff --git a/typescript/agentkit/src/action-providers/actionDecorator.ts b/typescript/agentkit/src/action-providers/actionDecorator.ts new file mode 100644 index 000000000..fa77d617b --- /dev/null +++ b/typescript/agentkit/src/action-providers/actionDecorator.ts @@ -0,0 +1,179 @@ +import { z } from "zod"; +import { WalletProvider } from "../wallet-providers"; +import { sendAnalyticsEvent } from "../analytics"; + +import "reflect-metadata"; + +/** + * Parameters for the create action decorator + */ +export interface CreateActionDecoratorParams { + /** + * The name of the action + */ + name: string; + + /** + * The description of the action + */ + description: string; + + /** + * The schema of the action + */ + schema: z.ZodSchema; +} + +/** + * Metadata key for the action decorator + */ +export const ACTION_DECORATOR_KEY = Symbol("agentkit:action"); + +/** + * Metadata for AgentKit actions + */ +export interface ActionMetadata { + /** + * The name of the action + */ + name: string; + + /** + * The description of the action + */ + description: string; + + /** + * The schema of the action + */ + schema: z.ZodSchema; + + /** + * The function to invoke the action + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + invoke: (...args: any[]) => any; + + /** + * The wallet provider to use for the action + */ + walletProvider: boolean; +} + +/** + * A map of action names to their metadata + */ +export type StoredActionMetadata = Map; + +/** + * Decorator to embed metadata on class methods to indicate they are actions accessible to the agent + * + * @param params - The parameters for the action decorator + * @returns A decorator function + * + * @example + * ```typescript + * class MyActionProvider extends ActionProvider { + * @CreateAction({ name: "my_action", description: "My action", schema: myActionSchema }) + * public myAction(args: z.infer) { + * // ... + * } + * } + * ``` + */ +export function CreateAction(params: CreateActionDecoratorParams) { + return (target: object, propertyKey: string, descriptor: PropertyDescriptor) => { + const prefixedActionName = `${target.constructor.name}_${params.name}`; + + const originalMethod = descriptor.value; + + const { isWalletProvider } = validateActionMethodArguments(target, propertyKey); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + descriptor.value = function (...args: any[]) { + let walletMetrics: Record = {}; + + if (isWalletProvider) { + walletMetrics = { + wallet_provider: args[0].getName(), + wallet_address: args[0].getAddress(), + network_id: args[0].getNetwork().networkId, + chain_id: args[0].getNetwork().chainId, + protocol_family: args[0].getNetwork().protocolFamily, + }; + } + + sendAnalyticsEvent({ + name: "agent_action_invocation", + action: "invoke_action", + component: "agent_action", + action_name: prefixedActionName, + class_name: target.constructor.name, + method_name: propertyKey, + ...walletMetrics, + }); + + return originalMethod.apply(this, args); + }; + + const existingMetadata: StoredActionMetadata = + Reflect.getMetadata(ACTION_DECORATOR_KEY, target.constructor) || new Map(); + + const metaData: ActionMetadata = { + name: prefixedActionName, + description: params.description, + schema: params.schema, + invoke: descriptor.value, + walletProvider: isWalletProvider, + }; + + existingMetadata.set(propertyKey, metaData); + + Reflect.defineMetadata(ACTION_DECORATOR_KEY, existingMetadata, target.constructor); + + return target; + }; +} + +/** + * Validates the arguments of an action method + * + * @param target - The target object + * @param propertyKey - The property key + * @returns An object containing the wallet provider flag + */ +function validateActionMethodArguments( + target: object, + propertyKey: string, +): { + isWalletProvider: boolean; +} { + const className = target instanceof Object ? target.constructor.name : undefined; + + const params = Reflect.getMetadata("design:paramtypes", target, propertyKey); + + if (params == null) { + throw new Error( + `Failed to get parameters for action method ${propertyKey} on class ${className}`, + ); + } + + if (params.length > 2) { + throw new Error( + `Action method ${propertyKey} on class ${className} has more than 2 parameters`, + ); + } + + const walletProviderParam = params.find(param => { + if (!param || !param.prototype) { + return false; + } + + if (param === WalletProvider) return true; + return param.prototype instanceof WalletProvider; + }); + + return { + isWalletProvider: !!walletProviderParam, + }; +} diff --git a/typescript/agentkit/src/action-providers/actionProvider.ts b/typescript/agentkit/src/action-providers/actionProvider.ts new file mode 100644 index 000000000..282db3c3a --- /dev/null +++ b/typescript/agentkit/src/action-providers/actionProvider.ts @@ -0,0 +1,103 @@ +import { z } from "zod"; +import { WalletProvider } from "../wallet-providers"; +import { Network } from "../network"; +import { StoredActionMetadata, ACTION_DECORATOR_KEY } from "./actionDecorator"; + +/** + * Action is the interface for all actions. + */ +export interface Action { + name: string; + description: string; + schema: TActionSchema; + invoke: (args: z.infer) => Promise; +} + +/** + * ActionProvider is the abstract base class for all action providers. + * + * @abstract + */ +export abstract class ActionProvider { + /** + * The name of the action provider. + */ + public readonly name: string; + + /** + * The action providers to combine. + */ + public readonly actionProviders: ActionProvider[]; + + /** + * The constructor for the action provider. + * + * @param name - The name of the action provider. + * @param actionProviders - The action providers to combine. + */ + constructor( + name: string, + // Update parameter type to match property type + actionProviders: ActionProvider[], + ) { + this.name = name; + this.actionProviders = actionProviders; + } + + /** + * Gets the actions of the action provider bound to the given wallet provider. + * + * @param walletProvider - The wallet provider. + * @returns The actions of the action provider. + */ + getActions(walletProvider: TWalletProvider): Action[] { + const actions: Action[] = []; + + const actionProviders = [this, ...this.actionProviders]; + + for (const actionProvider of actionProviders) { + const actionsMetadataMap: StoredActionMetadata | undefined = Reflect.getMetadata( + ACTION_DECORATOR_KEY, + actionProvider.constructor, + ); + + if (!actionsMetadataMap) { + if (!(actionProvider instanceof ActionProvider)) { + console.warn(`Warning: ${actionProvider} is not an instance of ActionProvider.`); + } else { + console.warn(`Warning: ${actionProvider} has no actions.`); + } + + continue; + } + + for (const actionMetadata of actionsMetadataMap.values()) { + actions.push({ + name: actionMetadata.name, + description: actionMetadata.description, + schema: actionMetadata.schema, + invoke: schemaArgs => { + const args: unknown[] = []; + if (actionMetadata.walletProvider) { + args[0] = walletProvider; + } + + args.push(schemaArgs); + + return actionMetadata.invoke.apply(actionProvider, args); + }, + }); + } + } + + return actions; + } + + /** + * Checks if the action provider supports the given network. + * + * @param network - The network to check. + * @returns True if the action provider supports the network, false otherwise. + */ + abstract supportsNetwork(network: Network): boolean; +} diff --git a/typescript/agentkit/src/action-providers/basename/basenameActionProvider.test.ts b/typescript/agentkit/src/action-providers/basename/basenameActionProvider.test.ts new file mode 100644 index 000000000..582461d82 --- /dev/null +++ b/typescript/agentkit/src/action-providers/basename/basenameActionProvider.test.ts @@ -0,0 +1,180 @@ +import { encodeFunctionData, namehash, parseEther } from "viem"; + +import { basenameActionProvider } from "./basenameActionProvider"; +import { + BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET, + REGISTRATION_DURATION, + L2_RESOLVER_ADDRESS_MAINNET, + L2_RESOLVER_ABI, + REGISTRAR_ABI, + BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET, + L2_RESOLVER_ADDRESS_TESTNET, +} from "./constants"; +import { RegisterBasenameSchema } from "./schemas"; +import { EvmWalletProvider } from "../../wallet-providers"; +import { Coinbase } from "@coinbase/coinbase-sdk"; + +const MOCK_AMOUNT = "0.123"; +const MOCK_BASENAME = "test-basename"; + +describe("Register Basename Input", () => { + it("should successfully parse valid input", () => { + const validInput = { + amount: MOCK_AMOUNT, + basename: MOCK_BASENAME, + }; + + const result = RegisterBasenameSchema.safeParse(validInput); + + expect(result.success).toBe(true); + expect(result.data).toEqual(validInput); + }); + + it("should fail parsing empty input", () => { + const emptyInput = {}; + const result = RegisterBasenameSchema.safeParse(emptyInput); + + expect(result.success).toBe(false); + }); +}); + +describe("Register Basename Action", () => { + /** + * This is the default network. + */ + const NETWORK_ID = Coinbase.networks.BaseMainnet; + + /** + * This is a 40 character hexadecimal string that requires lowercase alpha characters. + */ + const ADDRESS_ID = "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83"; + + let mockWallet: jest.Mocked; + + const actionProvider = basenameActionProvider(); + + beforeEach(() => { + mockWallet = { + getAddress: jest.fn().mockReturnValue(ADDRESS_ID), + getNetwork: jest.fn().mockReturnValue({ networkId: NETWORK_ID }), + sendTransaction: jest.fn(), + waitForTransactionReceipt: jest.fn(), + } as unknown as jest.Mocked; + + mockWallet.sendTransaction.mockResolvedValue("some-hash" as `0x${string}`); + mockWallet.waitForTransactionReceipt.mockResolvedValue({}); + }); + + it(`should Successfully respond with ${MOCK_BASENAME}.base.eth for network: ${Coinbase.networks.BaseMainnet}`, async () => { + const args = { + amount: MOCK_AMOUNT, + basename: MOCK_BASENAME, + }; + + const name = `${MOCK_BASENAME}.base.eth`; + + mockWallet.getNetwork.mockReturnValue({ + protocolFamily: "evm", + networkId: Coinbase.networks.BaseMainnet, + }); + + const response = await actionProvider.register(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET, + data: encodeFunctionData({ + abi: REGISTRAR_ABI, + functionName: "register", + args: [ + { + name: MOCK_BASENAME, + owner: ADDRESS_ID, + duration: REGISTRATION_DURATION, + resolver: L2_RESOLVER_ADDRESS_MAINNET, + data: [ + encodeFunctionData({ + abi: L2_RESOLVER_ABI, + functionName: "setAddr", + args: [namehash(name), ADDRESS_ID], + }), + encodeFunctionData({ + abi: L2_RESOLVER_ABI, + functionName: "setName", + args: [namehash(name), name], + }), + ], + reverseRecord: true, + }, + ], + }), + value: parseEther(MOCK_AMOUNT), + }); + expect(mockWallet.waitForTransactionReceipt).toHaveBeenCalledWith("some-hash"); + expect(response).toContain(`Successfully registered basename ${MOCK_BASENAME}.base.eth`); + expect(response).toContain(`for address ${ADDRESS_ID}`); + }); + + it(`should Successfully respond with ${MOCK_BASENAME}.basetest.eth for any other network`, async () => { + const args = { + amount: MOCK_AMOUNT, + basename: MOCK_BASENAME, + }; + + const name = `${MOCK_BASENAME}.basetest.eth`; + + mockWallet.getNetwork.mockReturnValue({ + protocolFamily: "evm", + networkId: "anything-else", + }); + + const response = await actionProvider.register(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET, + data: encodeFunctionData({ + abi: REGISTRAR_ABI, + functionName: "register", + args: [ + { + name: MOCK_BASENAME, + owner: ADDRESS_ID, + duration: REGISTRATION_DURATION, + resolver: L2_RESOLVER_ADDRESS_TESTNET, + data: [ + encodeFunctionData({ + abi: L2_RESOLVER_ABI, + functionName: "setAddr", + args: [namehash(name), ADDRESS_ID], + }), + encodeFunctionData({ + abi: L2_RESOLVER_ABI, + functionName: "setName", + args: [namehash(name), name], + }), + ], + reverseRecord: true, + }, + ], + }), + value: parseEther(MOCK_AMOUNT), + }); + expect(mockWallet.waitForTransactionReceipt).toHaveBeenCalledWith("some-hash"); + expect(response).toContain(`Successfully registered basename ${MOCK_BASENAME}.basetest.eth`); + expect(response).toContain(`for address ${ADDRESS_ID}`); + }); + + it("should fail with an error", async () => { + const args = { + amount: MOCK_AMOUNT, + basename: MOCK_BASENAME, + }; + + const error = new Error("Failed to register basename"); + mockWallet.sendTransaction.mockRejectedValue(error); + + await actionProvider.register(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalled(); + expect(`Error registering basename: ${error}`); + }); +}); diff --git a/typescript/agentkit/src/action-providers/basename/basenameActionProvider.ts b/typescript/agentkit/src/action-providers/basename/basenameActionProvider.ts new file mode 100644 index 000000000..6457d8f69 --- /dev/null +++ b/typescript/agentkit/src/action-providers/basename/basenameActionProvider.ts @@ -0,0 +1,113 @@ +import { encodeFunctionData, Hex, namehash, parseEther } from "viem"; +import { z } from "zod"; +import { ActionProvider } from "../actionProvider"; +import { Network } from "../../network"; +import { CreateAction } from "../actionDecorator"; +import { + L2_RESOLVER_ADDRESS_MAINNET, + L2_RESOLVER_ADDRESS_TESTNET, + L2_RESOLVER_ABI, + REGISTRATION_DURATION, + BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET, + BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET, + REGISTRAR_ABI, +} from "./constants"; +import { RegisterBasenameSchema } from "./schemas"; +import { EvmWalletProvider } from "../../wallet-providers"; + +/** + * Action provider for registering Basenames. + */ +export class BasenameActionProvider extends ActionProvider { + /** + * Constructs a new BasenameActionProvider. + */ + constructor() { + super("basename", []); + } + + /** + * Registers a Basename. + * + * @param wallet - The wallet to use for the registration. + * @param args - The arguments for the registration. + * @returns A string indicating the success or failure of the registration. + */ + @CreateAction({ + name: "register_basename", + description: ` +This tool will register a Basename for the agent. The agent should have a wallet associated to register a Basename. +When your network ID is 'base-mainnet' (also sometimes known simply as 'base'), the name must end with .base.eth, and when your network ID is 'base-sepolia', it must ends with .basetest.eth. +Do not suggest any alternatives and never try to register a Basename with another postfix. The prefix of the name must be unique so if the registration of the +Basename fails, you should prompt to try again with a more unique name. +`, + schema: RegisterBasenameSchema, + }) + async register( + wallet: EvmWalletProvider, + args: z.infer, + ): Promise { + const address = wallet.getAddress(); + const isMainnet = wallet.getNetwork().networkId === "base-mainnet"; + + const suffix = isMainnet ? ".base.eth" : ".basetest.eth"; + if (!args.basename.endsWith(suffix)) { + args.basename += suffix; + } + + const l2ResolverAddress = isMainnet ? L2_RESOLVER_ADDRESS_MAINNET : L2_RESOLVER_ADDRESS_TESTNET; + + const addressData = encodeFunctionData({ + abi: L2_RESOLVER_ABI, + functionName: "setAddr", + args: [namehash(args.basename), address], + }); + const nameData = encodeFunctionData({ + abi: L2_RESOLVER_ABI, + functionName: "setName", + args: [namehash(args.basename), args.basename], + }); + + try { + const contractAddress = isMainnet + ? BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET + : BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET; + + const hash = await wallet.sendTransaction({ + to: contractAddress, + data: encodeFunctionData({ + abi: REGISTRAR_ABI, + functionName: "register", + args: [ + { + name: args.basename.replace(suffix, ""), + owner: address as Hex, + duration: REGISTRATION_DURATION, + resolver: l2ResolverAddress, + data: [addressData, nameData], + reverseRecord: true, + }, + ], + }), + value: parseEther(args.amount), + }); + + await wallet.waitForTransactionReceipt(hash); + + return `Successfully registered basename ${args.basename} for address ${address}`; + } catch (error) { + return `Error registering basename: Error: ${error}`; + } + } + + /** + * Checks if the Basename action provider supports the given network. + * + * @param network - The network to check. + * @returns True if the Basename action provider supports the network, false otherwise. + */ + supportsNetwork = (network: Network) => + network.networkId === "base-mainnet" || network.networkId === "base-sepolia"; +} + +export const basenameActionProvider = () => new BasenameActionProvider(); diff --git a/typescript/agentkit/src/action-providers/basename/constants.ts b/typescript/agentkit/src/action-providers/basename/constants.ts new file mode 100644 index 000000000..191254b21 --- /dev/null +++ b/typescript/agentkit/src/action-providers/basename/constants.ts @@ -0,0 +1,84 @@ +// Contract addresses +export const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET = + "0x4cCb0BB02FCABA27e82a56646E81d8c5bC4119a5"; +export const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET = + "0x49aE3cC2e3AA768B1e5654f5D3C6002144A59581"; + +export const L2_RESOLVER_ADDRESS_MAINNET = "0xC6d566A56A1aFf6508b41f6c90ff131615583BCD"; +export const L2_RESOLVER_ADDRESS_TESTNET = "0x6533C94869D28fAA8dF77cc63f9e2b2D6Cf77eBA"; + +// Default registration duration (1 year in seconds) +export const REGISTRATION_DURATION = 31557600n; + +// Relevant ABI for L2 Resolver Contract. +export const L2_RESOLVER_ABI = [ + { + inputs: [ + { internalType: "bytes32", name: "node", type: "bytes32" }, + { internalType: "address", name: "a", type: "address" }, + ], + name: "setAddr", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { internalType: "bytes32", name: "node", type: "bytes32" }, + { internalType: "string", name: "newName", type: "string" }, + ], + name: "setName", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +]; + +// Relevant ABI for Basenames Registrar Controller Contract. +export const REGISTRAR_ABI = [ + { + inputs: [ + { + components: [ + { + internalType: "string", + name: "name", + type: "string", + }, + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "uint256", + name: "duration", + type: "uint256", + }, + { + internalType: "address", + name: "resolver", + type: "address", + }, + { + internalType: "bytes[]", + name: "data", + type: "bytes[]", + }, + { + internalType: "bool", + name: "reverseRecord", + type: "bool", + }, + ], + internalType: "struct RegistrarController.RegisterRequest", + name: "request", + type: "tuple", + }, + ], + name: "register", + outputs: [], + stateMutability: "payable", + type: "function", + }, +] as const; diff --git a/typescript/agentkit/src/action-providers/basename/index.ts b/typescript/agentkit/src/action-providers/basename/index.ts new file mode 100644 index 000000000..00799e7c6 --- /dev/null +++ b/typescript/agentkit/src/action-providers/basename/index.ts @@ -0,0 +1,2 @@ +export * from "./basenameActionProvider"; +export * from "./schemas"; diff --git a/typescript/agentkit/src/action-providers/basename/schemas.ts b/typescript/agentkit/src/action-providers/basename/schemas.ts new file mode 100644 index 000000000..e36763892 --- /dev/null +++ b/typescript/agentkit/src/action-providers/basename/schemas.ts @@ -0,0 +1,12 @@ +import { z } from "zod"; + +/** + * Input schema for registering a Basename. + */ +export const RegisterBasenameSchema = z + .object({ + basename: z.string().describe("The Basename to assign to the agent"), + amount: z.string().default("0.002").describe("The amount of ETH to pay for registration"), + }) + .strip() + .describe("Instructions for registering a Basename"); diff --git a/typescript/agentkit/src/action-providers/cdp/README.md b/typescript/agentkit/src/action-providers/cdp/README.md new file mode 100644 index 000000000..4f893e2aa --- /dev/null +++ b/typescript/agentkit/src/action-providers/cdp/README.md @@ -0,0 +1 @@ +# CDP (Coinbase Developer Platform) Action Provider diff --git a/typescript/agentkit/src/action-providers/cdp/cdpApiActionProvider.test.ts b/typescript/agentkit/src/action-providers/cdp/cdpApiActionProvider.test.ts new file mode 100644 index 000000000..90d364f50 --- /dev/null +++ b/typescript/agentkit/src/action-providers/cdp/cdpApiActionProvider.test.ts @@ -0,0 +1,168 @@ +import { EvmWalletProvider } from "../../wallet-providers"; +import { CdpApiActionProvider } from "./cdpApiActionProvider"; +import { AddressReputationSchema, RequestFaucetFundsSchema } from "./schemas"; + +// Mock the entire module +jest.mock("@coinbase/coinbase-sdk"); + +// Get the mocked constructor +const { ExternalAddress } = jest.requireMock("@coinbase/coinbase-sdk"); + +describe("CDP API Action Provider Input Schemas", () => { + describe("Address Reputation Schema", () => { + it("should successfully parse valid input", () => { + const validInput = { + address: "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83", + network: "base-mainnet", + }; + + const result = AddressReputationSchema.safeParse(validInput); + + expect(result.success).toBe(true); + expect(result.data).toEqual(validInput); + }); + + it("should fail parsing invalid address", () => { + const invalidInput = { + address: "invalid-address", + network: "base-mainnet", + }; + const result = AddressReputationSchema.safeParse(invalidInput); + + expect(result.success).toBe(false); + }); + }); + + describe("Request Faucet Funds Schema", () => { + it("should successfully parse with optional assetId", () => { + const validInput = { + assetId: "eth", + }; + + const result = RequestFaucetFundsSchema.safeParse(validInput); + + expect(result.success).toBe(true); + expect(result.data).toEqual(validInput); + }); + + it("should successfully parse without assetId", () => { + const validInput = {}; + const result = RequestFaucetFundsSchema.safeParse(validInput); + + expect(result.success).toBe(true); + expect(result.data).toEqual(validInput); + }); + }); +}); + +describe("CDP API Action Provider", () => { + let actionProvider: CdpApiActionProvider; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let mockExternalAddressInstance: jest.Mocked; + let mockWallet: jest.Mocked; + + beforeEach(() => { + // Reset all mocks before each test + jest.clearAllMocks(); + + actionProvider = new CdpApiActionProvider(); + mockExternalAddressInstance = { + reputation: jest.fn(), + faucet: jest.fn(), + }; + + // Mock the constructor to return our mock instance + (ExternalAddress as jest.Mock).mockImplementation(() => mockExternalAddressInstance); + + mockWallet = { + deployToken: jest.fn(), + deployContract: jest.fn(), + getAddress: jest.fn().mockReturnValue("0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83"), + getNetwork: jest.fn().mockReturnValue({ networkId: "base-sepolia" }), + } as unknown as jest.Mocked; + }); + + describe("addressReputation", () => { + it("should successfully check address reputation", async () => { + const args = { + address: "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83", + network: "base-mainnet", + }; + + mockExternalAddressInstance.reputation.mockResolvedValue("Good reputation"); + + const result = await actionProvider.addressReputation(args); + + expect(ExternalAddress).toHaveBeenCalledWith(args.network, args.address); + expect(ExternalAddress).toHaveBeenCalledTimes(1); + expect(mockExternalAddressInstance.reputation).toHaveBeenCalled(); + expect(mockExternalAddressInstance.reputation).toHaveBeenCalledTimes(1); + expect(result).toBe("Good reputation"); + }); + + it("should handle errors when checking reputation", async () => { + const args = { + address: "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83", + network: "base-mainnet", + }; + + const error = new Error("Reputation check failed"); + mockExternalAddressInstance.reputation.mockRejectedValue(error); + + const result = await actionProvider.addressReputation(args); + + expect(ExternalAddress).toHaveBeenCalledWith(args.network, args.address); + expect(ExternalAddress).toHaveBeenCalledTimes(1); + expect(mockExternalAddressInstance.reputation).toHaveBeenCalled(); + expect(mockExternalAddressInstance.reputation).toHaveBeenCalledTimes(1); + expect(result).toBe(`Error checking address reputation: ${error}`); + }); + }); + + describe("faucet", () => { + beforeEach(() => { + mockExternalAddressInstance.faucet.mockResolvedValue({ + wait: jest.fn().mockResolvedValue({ + getTransactionLink: jest.fn().mockReturnValue("tx-link"), + }), + }); + }); + + it("should successfully request faucet funds with assetId", async () => { + const args = { + assetId: "eth", + }; + + const result = await actionProvider.faucet(mockWallet, args); + + expect(ExternalAddress).toHaveBeenCalledWith("base-sepolia", mockWallet.getAddress()); + expect(ExternalAddress).toHaveBeenCalledTimes(1); + expect(mockExternalAddressInstance.faucet).toHaveBeenCalledWith("eth"); + expect(mockExternalAddressInstance.faucet).toHaveBeenCalledTimes(1); + expect(result).toContain("Received eth from the faucet"); + expect(result).toContain("tx-link"); + }); + + it("should successfully request faucet funds without assetId", async () => { + const args = {}; + + const result = await actionProvider.faucet(mockWallet, args); + + expect(ExternalAddress).toHaveBeenCalledWith("base-sepolia", mockWallet.getAddress()); + expect(ExternalAddress).toHaveBeenCalledTimes(1); + expect(mockExternalAddressInstance.faucet).toHaveBeenCalledWith(undefined); + expect(mockExternalAddressInstance.faucet).toHaveBeenCalledTimes(1); + expect(result).toContain("Received ETH from the faucet"); + }); + + it("should handle faucet errors", async () => { + const args = {}; + const error = new Error("Faucet request failed"); + mockExternalAddressInstance.faucet.mockRejectedValue(error); + + const result = await actionProvider.faucet(mockWallet, args); + + expect(result).toBe(`Error requesting faucet funds: ${error}`); + }); + }); +}); diff --git a/typescript/agentkit/src/action-providers/cdp/cdpApiActionProvider.ts b/typescript/agentkit/src/action-providers/cdp/cdpApiActionProvider.ts new file mode 100644 index 000000000..d1f96782a --- /dev/null +++ b/typescript/agentkit/src/action-providers/cdp/cdpApiActionProvider.ts @@ -0,0 +1,105 @@ +import { Coinbase, ExternalAddress } from "@coinbase/coinbase-sdk"; +import { z } from "zod"; + +import { CreateAction } from "../actionDecorator"; +import { ActionProvider } from "../actionProvider"; +import { Network } from "../../network"; +import { CdpProviderConfig, EvmWalletProvider } from "../../wallet-providers"; + +import { AddressReputationSchema, RequestFaucetFundsSchema } from "./schemas"; + +/** + * CdpApiActionProvider is an action provider for CDP API. + * + * This provider is used for any action that uses the CDP API, but does not require a CDP Wallet. + */ +export class CdpApiActionProvider extends ActionProvider { + /** + * Constructor for the CdpApiActionProvider class. + * + * @param config - The configuration options for the CdpApiActionProvider. + */ + constructor(config: CdpProviderConfig = {}) { + super("cdp_api", []); + + if (config.apiKeyName && config.apiKeyPrivateKey) { + Coinbase.configure({ apiKeyName: config.apiKeyName, privateKey: config.apiKeyPrivateKey }); + } else { + Coinbase.configureFromJson(); + } + } + + /** + * Check the reputation of an address. + * + * @param args - The input arguments for the action + * @returns A string containing reputation data or error message + */ + @CreateAction({ + name: "address_reputation", + description: ` +This tool checks the reputation of an address on a given network. It takes: + +- network: The network to check the address on (e.g. "base-mainnet") +- address: The Ethereum address to check +`, + schema: AddressReputationSchema, + }) + async addressReputation(args: z.infer): Promise { + try { + const address = new ExternalAddress(args.network, args.address); + const reputation = await address.reputation(); + return reputation.toString(); + } catch (error) { + return `Error checking address reputation: ${error}`; + } + } + + /** + * Requests test tokens from the faucet for the default address in the wallet. + * + * @param walletProvider - The wallet provider to request funds from. + * @param args - The input arguments for the action. + * @returns A confirmation message with transaction details. + */ + @CreateAction({ + name: "request_faucet_funds", + description: `This tool will request test tokens from the faucet for the default address in the wallet. It takes the wallet and asset ID as input. +If no asset ID is provided the faucet defaults to ETH. Faucet is only allowed on 'base-sepolia' and can only provide asset ID 'eth' or 'usdc'. +You are not allowed to faucet with any other network or asset ID. If you are on another network, suggest that the user sends you some ETH +from another wallet and provide the user with your wallet details.`, + schema: RequestFaucetFundsSchema, + }) + async faucet( + walletProvider: EvmWalletProvider, + args: z.infer, + ): Promise { + try { + const address = new ExternalAddress( + walletProvider.getNetwork().networkId!, + walletProvider.getAddress(), + ); + + const faucetTx = await address.faucet(args.assetId || undefined); + + const result = await faucetTx.wait(); + + return `Received ${ + args.assetId || "ETH" + } from the faucet. Transaction: ${result.getTransactionLink()}`; + } catch (error) { + return `Error requesting faucet funds: ${error}`; + } + } + + /** + * Checks if the Cdp action provider supports the given network. + * + * @param _ - The network to check. + * @returns True if the Cdp action provider supports the network, false otherwise. + */ + supportsNetwork = (_: Network) => true; +} + +export const cdpApiActionProvider = (config: CdpProviderConfig = {}) => + new CdpApiActionProvider(config); diff --git a/typescript/agentkit/src/action-providers/cdp/cdpWalletActionProvider.test.ts b/typescript/agentkit/src/action-providers/cdp/cdpWalletActionProvider.test.ts new file mode 100644 index 000000000..0e621f67e --- /dev/null +++ b/typescript/agentkit/src/action-providers/cdp/cdpWalletActionProvider.test.ts @@ -0,0 +1,320 @@ +import { CdpWalletProvider } from "../../wallet-providers"; +import { CdpWalletActionProvider } from "./cdpWalletActionProvider"; +import { DeployNftSchema, DeployTokenSchema, DeployContractSchema } from "./schemas"; +import { SmartContract, Trade } from "@coinbase/coinbase-sdk"; + +// Mock the entire module +jest.mock("@coinbase/coinbase-sdk"); + +// Get the mocked constructor +const { ExternalAddress } = jest.requireMock("@coinbase/coinbase-sdk"); + +describe("CDP Wallet Action Provider Input Schemas", () => { + describe("Deploy NFT Schema", () => { + it("should successfully parse valid input", () => { + const validInput = { + baseURI: "https://www.test.xyz/metadata/", + name: "Test Token", + symbol: "TEST", + }; + + const result = DeployNftSchema.safeParse(validInput); + + expect(result.success).toBe(true); + expect(result.data).toEqual(validInput); + }); + + it("should fail parsing empty input", () => { + const emptyInput = {}; + const result = DeployNftSchema.safeParse(emptyInput); + + expect(result.success).toBe(false); + }); + }); + + describe("Deploy Token Schema", () => { + it("should successfully parse valid input", () => { + const validInput = { + name: "Test Token", + symbol: "TEST", + totalSupply: 1000000000000000000n, + }; + + const result = DeployTokenSchema.safeParse(validInput); + + expect(result.success).toBe(true); + expect(result.data).toEqual(validInput); + }); + }); + + describe("Deploy Contract Schema", () => { + it("should successfully parse valid input", () => { + const validInput = { + solidityVersion: "0.8.0", + solidityInputJson: "{}", + contractName: "Test Contract", + constructorArgs: {}, + }; + + const result = DeployContractSchema.safeParse(validInput); + + expect(result.success).toBe(true); + expect(result.data).toEqual(validInput); + }); + + it("should fail parsing empty input", () => { + const emptyInput = {}; + const result = DeployContractSchema.safeParse(emptyInput); + + expect(result.success).toBe(false); + }); + }); +}); + +describe("CDP Wallet Action Provider", () => { + let actionProvider: CdpWalletActionProvider; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let mockExternalAddressInstance: jest.Mocked; + let mockWallet: jest.Mocked; + + beforeEach(() => { + // Reset all mocks before each test + jest.clearAllMocks(); + + actionProvider = new CdpWalletActionProvider(); + mockExternalAddressInstance = { + reputation: jest.fn(), + faucet: jest.fn(), + }; + + // Mock the constructor to return our mock instance + (ExternalAddress as jest.Mock).mockImplementation(() => mockExternalAddressInstance); + + mockWallet = { + createTrade: jest.fn(), + deployToken: jest.fn(), + deployContract: jest.fn(), + getAddress: jest.fn().mockReturnValue("0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83"), + getNetwork: jest.fn().mockReturnValue({ networkId: "base-sepolia" }), + } as unknown as jest.Mocked; + }); + + describe("deployNft", () => { + let mockWallet: jest.Mocked; + const MOCK_NFT_BASE_URI = "https://www.test.xyz/metadata/"; + const MOCK_NFT_NAME = "Test Token"; + const MOCK_NFT_SYMBOL = "TEST"; + const CONTRACT_ADDRESS = "0x123456789abcdef"; + const NETWORK_ID = "base-sepolia"; + const TRANSACTION_HASH = "0xghijkl987654321"; + const TRANSACTION_LINK = `https://etherscan.io/tx/${TRANSACTION_HASH}`; + + beforeEach(() => { + mockWallet = { + deployNFT: jest.fn().mockResolvedValue({ + wait: jest.fn().mockResolvedValue({ + getContractAddress: jest.fn().mockReturnValue(CONTRACT_ADDRESS), + getTransaction: jest.fn().mockReturnValue({ + getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), + getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), + }), + }), + }), + getNetwork: jest.fn().mockReturnValue({ networkId: NETWORK_ID }), + } as unknown as jest.Mocked; + }); + + it("should successfully deploy an NFT", async () => { + const args = { + name: MOCK_NFT_NAME, + symbol: MOCK_NFT_SYMBOL, + baseURI: MOCK_NFT_BASE_URI, + }; + + const result = await actionProvider.deployNFT(mockWallet, args); + + expect(mockWallet.deployNFT).toHaveBeenCalledWith(args); + expect(result).toContain(`Deployed NFT Collection ${MOCK_NFT_NAME}:`); + expect(result).toContain(`- to address ${CONTRACT_ADDRESS}`); + expect(result).toContain(`- on network ${NETWORK_ID}`); + expect(result).toContain(`Transaction hash: ${TRANSACTION_HASH}`); + expect(result).toContain(`Transaction link: ${TRANSACTION_LINK}`); + }); + + it("should handle deployment errors", async () => { + const args = { + name: MOCK_NFT_NAME, + symbol: MOCK_NFT_SYMBOL, + baseURI: MOCK_NFT_BASE_URI, + }; + + const error = new Error("An error has occurred"); + mockWallet.deployNFT.mockRejectedValue(error); + + const result = await actionProvider.deployNFT(mockWallet, args); + + expect(mockWallet.deployNFT).toHaveBeenCalledWith(args); + expect(result).toBe(`Error deploying NFT: ${error}`); + }); + }); + + describe("deployToken", () => { + beforeEach(() => { + mockWallet = { + deployToken: jest.fn().mockResolvedValue({ + wait: jest.fn().mockResolvedValue({ + getContractAddress: jest.fn().mockReturnValue("0x123"), + getTransaction: jest.fn().mockReturnValue({ + getTransactionLink: jest.fn().mockReturnValue("tx-link"), + }), + }), + }), + } as unknown as jest.Mocked; + }); + + it("should successfully deploy a token", async () => { + const args = { + name: "Test Token", + symbol: "TEST", + totalSupply: 1000000000000000000n, + }; + + const result = await actionProvider.deployToken(mockWallet, args); + + expect(mockWallet.deployToken).toHaveBeenCalledWith(args); + expect(mockWallet.deployToken).toHaveBeenCalledTimes(1); + expect(result).toContain( + "Deployed ERC20 token contract Test Token (TEST) with total supply of 1000000000000000000 tokens at address 0x123. Transaction link: tx-link", + ); + }); + + it("should handle errors when deploying a token", async () => { + const args = { + name: "Test Token", + symbol: "TEST", + totalSupply: 1000000000000000000n, + }; + + const error = new Error("Token deployment failed"); + mockWallet.deployToken.mockRejectedValue(error); + + const result = await actionProvider.deployToken(mockWallet, args); + + expect(result).toBe(`Error deploying token: ${error}`); + }); + }); + + describe("deployContract", () => { + const CONTRACT_ADDRESS = "0x123456789abcdef"; + const TRANSACTION_LINK = "https://etherscan.io/tx/0xghijkl987654321"; + const MOCK_CONTRACT_NAME = "Test Contract"; + const MOCK_SOLIDITY_VERSION = "0.8.0"; + const MOCK_SOLIDITY_INPUT_JSON = "{}"; + const MOCK_CONSTRUCTOR_ARGS = { arg1: "value1", arg2: "value2" }; + + beforeEach(() => { + mockWallet.deployContract.mockResolvedValue({ + wait: jest.fn().mockResolvedValue({ + getContractAddress: jest.fn().mockReturnValue(CONTRACT_ADDRESS), + getTransaction: jest.fn().mockReturnValue({ + getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), + }), + }), + } as unknown as SmartContract); + }); + + it("should successfully deploy a contract", async () => { + const args = { + solidityVersion: MOCK_SOLIDITY_VERSION, + solidityInputJson: MOCK_SOLIDITY_INPUT_JSON, + contractName: MOCK_CONTRACT_NAME, + constructorArgs: MOCK_CONSTRUCTOR_ARGS, + }; + + const response = await actionProvider.deployContract(mockWallet, args); + + expect(mockWallet.deployContract).toHaveBeenCalledWith({ + solidityVersion: "0.8.0+commit.c7dfd78e", + solidityInputJson: MOCK_SOLIDITY_INPUT_JSON, + contractName: MOCK_CONTRACT_NAME, + constructorArgs: MOCK_CONSTRUCTOR_ARGS, + }); + expect(response).toContain( + `Deployed contract ${MOCK_CONTRACT_NAME} at address ${CONTRACT_ADDRESS}`, + ); + expect(response).toContain(`Transaction link: ${TRANSACTION_LINK}`); + }); + + it("should handle deployment errors", async () => { + const args = { + solidityVersion: MOCK_SOLIDITY_VERSION, + solidityInputJson: MOCK_SOLIDITY_INPUT_JSON, + contractName: MOCK_CONTRACT_NAME, + constructorArgs: MOCK_CONSTRUCTOR_ARGS, + }; + + const error = new Error("An error has occurred"); + mockWallet.deployContract.mockRejectedValue(error); + + const response = await actionProvider.deployContract(mockWallet, args); + + expect(mockWallet.deployContract).toHaveBeenCalledWith({ + solidityVersion: "0.8.0+commit.c7dfd78e", + solidityInputJson: MOCK_SOLIDITY_INPUT_JSON, + contractName: MOCK_CONTRACT_NAME, + constructorArgs: MOCK_CONSTRUCTOR_ARGS, + }); + expect(response).toBe(`Error deploying contract: ${error}`); + }); + }); + + describe("trade", () => { + const TRANSACTION_HASH = "0xghijkl987654321"; + const TRANSACTION_LINK = "https://etherscan.io/tx/0xghijkl987654321"; + const TO_AMOUNT = "100"; + + beforeEach(() => { + mockWallet.createTrade.mockResolvedValue({ + wait: jest.fn().mockResolvedValue({ + getTransaction: jest.fn().mockReturnValue({ + getTransactionHash: jest.fn().mockReturnValue(TRANSACTION_HASH), + getTransactionLink: jest.fn().mockReturnValue(TRANSACTION_LINK), + }), + getToAmount: jest.fn().mockReturnValue(TO_AMOUNT), + }), + } as unknown as Trade); + }); + + it("should successfully trade assets", async () => { + const args = { + amount: 1n, + fromAssetId: "eth", + toAssetId: "usdc", + }; + + const result = await actionProvider.trade(mockWallet, args); + + expect(mockWallet.createTrade).toHaveBeenCalledWith(args); + expect(result).toContain( + `Traded ${args.amount} of ${args.fromAssetId} for ${TO_AMOUNT} of ${args.toAssetId}`, + ); + expect(result).toContain(`Transaction hash for the trade: ${TRANSACTION_HASH}`); + expect(result).toContain(`Transaction link for the trade: ${TRANSACTION_LINK}`); + }); + + it("should handle trade errors", async () => { + const args = { + amount: 1000000000000000000n, + fromAssetId: "eth", + toAssetId: "usdc", + }; + + const error = new Error("An error has occurred"); + mockWallet.createTrade.mockRejectedValue(error); + + const result = await actionProvider.trade(mockWallet, args); + + expect(result).toBe(`Error trading assets: ${error}`); + }); + }); +}); diff --git a/typescript/agentkit/src/action-providers/cdp/cdpWalletActionProvider.ts b/typescript/agentkit/src/action-providers/cdp/cdpWalletActionProvider.ts new file mode 100644 index 000000000..1bdab4dd9 --- /dev/null +++ b/typescript/agentkit/src/action-providers/cdp/cdpWalletActionProvider.ts @@ -0,0 +1,214 @@ +import { Coinbase } from "@coinbase/coinbase-sdk"; +import { z } from "zod"; + +import { CreateAction } from "../actionDecorator"; +import { ActionProvider } from "../actionProvider"; +import { Network } from "../../network"; +import { CdpWalletProvider, CdpProviderConfig } from "../../wallet-providers"; + +import { SolidityVersions } from "./constants"; +import { DeployContractSchema, DeployNftSchema, DeployTokenSchema, TradeSchema } from "./schemas"; + +/** + * CdpWalletActionProvider is an action provider for Cdp. + * + * This provider is used for any action that requires a CDP Wallet. + */ +export class CdpWalletActionProvider extends ActionProvider { + /** + * Constructor for the CdpWalletActionProvider class. + * + * @param config - The configuration options for the CdpWalletActionProvider. + */ + constructor(config: CdpProviderConfig = {}) { + super("cdp_wallet", []); + + if (config.apiKeyName && config.apiKeyPrivateKey) { + Coinbase.configure({ apiKeyName: config.apiKeyName, privateKey: config.apiKeyPrivateKey }); + } else { + Coinbase.configureFromJson(); + } + } + + /** + * Deploys a contract. + * + * @param walletProvider - The wallet provider to deploy the contract from + * @param args - The input arguments for the action + * @returns A message containing the deployed contract address and details + */ + @CreateAction({ + name: "deploy_contract", + description: ` +Deploys smart contract with required args: solidity version (string), solidity input json (string), contract name (string), and optional constructor args (Dict[str, Any]) + +Input json structure: +{"language":"Solidity","settings":{"remappings":[],"outputSelection":{"*":{"*":["abi","evm.bytecode"]}}},"sources":{}} + +You must set the outputSelection to {"*":{"*":["abi","evm.bytecode"]}} in the settings. The solidity version must be >= 0.8.0 and <= 0.8.28. + +Sources should contain one or more contracts with the following structure: +{"contract_name.sol":{"content":"contract code"}} + +The contract code should be escaped. Contracts cannot import from external contracts but can import from one another. + +Constructor args are required if the contract has a constructor. They are a key-value +map where the key is the arg name and the value is the arg value. Encode uint/int/bytes/string/address values as strings, boolean values as true/false. For arrays/tuples, encode based on contained type.`, + schema: DeployContractSchema, + }) + async deployContract( + walletProvider: CdpWalletProvider, + args: z.infer, + ): Promise { + try { + const solidityVersion = SolidityVersions[args.solidityVersion]; + + const contract = await walletProvider.deployContract({ + solidityVersion: solidityVersion, + solidityInputJson: args.solidityInputJson, + contractName: args.contractName, + constructorArgs: args.constructorArgs ?? {}, + }); + + const result = await contract.wait(); + + return `Deployed contract ${args.contractName} at address ${result.getContractAddress()}. Transaction link: ${result + .getTransaction()! + .getTransactionLink()}`; + } catch (error) { + return `Error deploying contract: ${error}`; + } + } + + /** + * Deploys an NFT (ERC-721) token collection onchain from the wallet. + * + * @param walletProvider - The wallet provider to deploy the NFT from. + * @param args - The input arguments for the action. + * @returns A message containing the NFT token deployment details. + */ + @CreateAction({ + name: "deploy_nft", + description: `This tool will deploy an NFT (ERC-721) contract onchain from the wallet. + It takes the name of the NFT collection, the symbol of the NFT collection, and the base URI for the token metadata as inputs.`, + schema: DeployNftSchema, + }) + async deployNFT( + walletProvider: CdpWalletProvider, + args: z.infer, + ): Promise { + try { + const nftContract = await walletProvider.deployNFT({ + name: args.name, + symbol: args.symbol, + baseURI: args.baseURI, + }); + + const result = await nftContract.wait(); + + const transaction = result.getTransaction()!; + const networkId = walletProvider.getNetwork().networkId; + const contractAddress = result.getContractAddress(); + + return [ + `Deployed NFT Collection ${args.name}:`, + `- to address ${contractAddress}`, + `- on network ${networkId}.`, + `Transaction hash: ${transaction.getTransactionHash()}`, + `Transaction link: ${transaction.getTransactionLink()}`, + ].join("\n"); + } catch (error) { + return `Error deploying NFT: ${error}`; + } + } + + /** + * Deploys a token. + * + * @param walletProvider - The wallet provider to deploy the token. + * @param args - The arguments for the token deployment. + * @returns The deployed token. + */ + @CreateAction({ + name: "deploy_token", + description: `This tool will deploy an ERC20 token smart contract. It takes the token name, symbol, and total supply as input. +The token will be deployed using the wallet's default address as the owner and initial token holder.`, + schema: DeployTokenSchema, + }) + async deployToken(walletProvider: CdpWalletProvider, args: z.infer) { + try { + const tokenContract = await walletProvider.deployToken({ + name: args.name, + symbol: args.symbol, + totalSupply: args.totalSupply, + }); + + const result = await tokenContract.wait(); + + return `Deployed ERC20 token contract ${args.name} (${args.symbol}) with total supply of ${ + args.totalSupply + } tokens at address ${result.getContractAddress()}. Transaction link: ${result + .getTransaction()! + .getTransactionLink()}`; + } catch (error) { + return `Error deploying token: ${error}`; + } + } + + /** + * Trades a specified amount of a from asset to a to asset for the wallet. + * + * @param walletProvider - The wallet provider to trade the asset from. + * @param args - The input arguments for the action. + * @returns A message containing the trade details. + */ + @CreateAction({ + name: "trade", + description: `This tool will trade a specified amount of a 'from asset' to a 'to asset' for the wallet. +It takes the following inputs: +- The amount of the 'from asset' to trade +- The from asset ID to trade +- The asset ID to receive from the trade + +Important notes: +- Trades are only supported on mainnet networks (ie, 'base-mainnet', 'base', 'ethereum-mainnet', 'ethereum', etc.) +- Never allow trades on any non-mainnet network (ie, 'base-sepolia', 'ethereum-sepolia', etc.) +- When selling a native asset (e.g. 'eth' on base-mainnet), ensure there is sufficient balance to pay for the trade AND the gas cost of this trade`, + schema: TradeSchema, + }) + async trade( + walletProvider: CdpWalletProvider, + args: z.infer, + ): Promise { + try { + const tradeResult = await walletProvider.createTrade({ + amount: args.amount, + fromAssetId: args.fromAssetId, + toAssetId: args.toAssetId, + }); + + const result = await tradeResult.wait(); + + return `Traded ${args.amount} of ${args.fromAssetId} for ${result.getToAmount()} of ${ + args.toAssetId + }.\nTransaction hash for the trade: ${result + .getTransaction() + .getTransactionHash()}\nTransaction link for the trade: ${result + .getTransaction() + .getTransactionLink()}`; + } catch (error) { + return `Error trading assets: ${error}`; + } + } + + /** + * Checks if the Cdp action provider supports the given network. + * + * @param _ - The network to check. + * @returns True if the Cdp action provider supports the network, false otherwise. + */ + supportsNetwork = (_: Network) => true; +} + +export const cdpWalletActionProvider = (config: CdpProviderConfig = {}) => + new CdpWalletActionProvider(config); diff --git a/typescript/agentkit/src/action-providers/cdp/constants.ts b/typescript/agentkit/src/action-providers/cdp/constants.ts new file mode 100644 index 000000000..68e49edfd --- /dev/null +++ b/typescript/agentkit/src/action-providers/cdp/constants.ts @@ -0,0 +1,31 @@ +export const SolidityVersions = { + "0.8.28": "0.8.28+commit.7893614a", + "0.8.27": "0.8.27+commit.40a35a09", + "0.8.26": "0.8.26+commit.8a97fa7a", + "0.8.25": "0.8.25+commit.b61c2a91", + "0.8.24": "0.8.24+commit.e11b9ed9", + "0.8.23": "0.8.23+commit.f704f362", + "0.8.22": "0.8.22+commit.4fc1097e", + "0.8.21": "0.8.21+commit.d9974bed", + "0.8.20": "0.8.20+commit.a1b79de6", + "0.8.19": "0.8.19+commit.7dd6d404", + "0.8.18": "0.8.18+commit.87f61d96", + "0.8.17": "0.8.17+commit.8df45f5f", + "0.8.16": "0.8.16+commit.07a7930e", + "0.8.15": "0.8.15+commit.e14f2714", + "0.8.14": "0.8.14+commit.80d49f37", + "0.8.13": "0.8.13+commit.abaa5c0e", + "0.8.12": "0.8.12+commit.f00d7308", + "0.8.11": "0.8.11+commit.d7f03943", + "0.8.10": "0.8.10+commit.fc410830", + "0.8.9": "0.8.9+commit.e5eed63a", + "0.8.8": "0.8.8+commit.dddeac2f", + "0.8.7": "0.8.7+commit.e28d00a7", + "0.8.6": "0.8.6+commit.11564f7e", + "0.8.5": "0.8.5+commit.a4f2e591", + "0.8.4": "0.8.4+commit.c7e474f2", + "0.8.3": "0.8.3+commit.8d00100c", + "0.8.2": "0.8.2+commit.661d1103", + "0.8.1": "0.8.1+commit.df193b15", + "0.8.0": "0.8.0+commit.c7dfd78e", +} as const; diff --git a/typescript/agentkit/src/action-providers/cdp/index.ts b/typescript/agentkit/src/action-providers/cdp/index.ts new file mode 100644 index 000000000..377149961 --- /dev/null +++ b/typescript/agentkit/src/action-providers/cdp/index.ts @@ -0,0 +1,3 @@ +export * from "./schemas"; +export * from "./cdpApiActionProvider"; +export * from "./cdpWalletActionProvider"; diff --git a/typescript/agentkit/src/action-providers/cdp/schemas.ts b/typescript/agentkit/src/action-providers/cdp/schemas.ts new file mode 100644 index 000000000..362a7a73e --- /dev/null +++ b/typescript/agentkit/src/action-providers/cdp/schemas.ts @@ -0,0 +1,80 @@ +import { z } from "zod"; +import { SolidityVersions } from "./constants"; + +/** + * Input schema for address reputation check. + */ +export const AddressReputationSchema = z + .object({ + address: z + .string() + .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") + .describe("The Ethereum address to check"), + network: z.string().describe("The network to check the address on"), + }) + .strip() + .describe("Input schema for address reputation check"); + +/** + * Input schema for deploy contract action. + */ +export const DeployContractSchema = z + .object({ + solidityVersion: z + .enum(Object.keys(SolidityVersions) as [string, ...string[]]) + .describe("The solidity compiler version"), + solidityInputJson: z.string().describe("The input json for the solidity compiler"), + contractName: z.string().describe("The name of the contract class to be deployed"), + constructorArgs: z + .record(z.string(), z.any()) + .describe("The constructor arguments for the contract") + .optional(), + }) + .strip() + .describe("Instructions for deploying an arbitrary contract"); + +/** + * Input schema for deploy NFT action + */ +export const DeployNftSchema = z + .object({ + name: z.string().describe("The name of the NFT collection"), + symbol: z.string().describe("The symbol of the NFT collection"), + baseURI: z.string().describe("The base URI for the token metadata"), + }) + .strip() + .describe("Instructions for deploying an NFT collection"); + +/** + * Input schema for deploy token action. + */ +export const DeployTokenSchema = z + .object({ + name: z.string().describe("The name of the token"), + symbol: z.string().describe("The token symbol"), + totalSupply: z.custom().describe("The total supply of tokens to mint"), + }) + .strip() + .describe("Instructions for deploying a token"); + +/** + * Input schema for request faucet funds action. + */ +export const RequestFaucetFundsSchema = z + .object({ + assetId: z.string().optional().describe("The optional asset ID to request from faucet"), + }) + .strip() + .describe("Instructions for requesting faucet funds"); + +/** + * Input schema for trade action. + */ +export const TradeSchema = z + .object({ + amount: z.custom().describe("The amount of the from asset to trade"), + fromAssetId: z.string().describe("The from asset ID to trade"), + toAssetId: z.string().describe("The to asset ID to receive from the trade"), + }) + .strip() + .describe("Instructions for trading assets"); diff --git a/typescript/agentkit/src/action-providers/customActionProvider.ts b/typescript/agentkit/src/action-providers/customActionProvider.ts new file mode 100644 index 000000000..73f8af789 --- /dev/null +++ b/typescript/agentkit/src/action-providers/customActionProvider.ts @@ -0,0 +1,89 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { z } from "zod"; +import { CreateAction } from "./actionDecorator"; +import { ActionProvider } from "./actionProvider"; +import { Network } from "../network"; +import { WalletProvider } from "../wallet-providers"; + +interface CustomActionProviderOptions { + name: string; + description: string; + schema: z.ZodSchema; + invoke: + | ((args: any) => Promise) + | ((walletProvider: TWalletProvider, args: any) => Promise); +} + +/** + * CustomActionProvider is a custom action provider that allows for custom action registration + */ +export class CustomActionProvider extends ActionProvider { + /** + * Creates a new CustomActionProvider that dynamically adds decorated action methods + * + * @param actions - Array of custom actions to be added to the provider + */ + constructor(actions: CustomActionProviderOptions[]) { + super("custom", []); + + actions.forEach(({ name, description, schema, invoke }) => { + // Check if the invoke function expects a wallet provider + const takesWalletProvider = invoke.length === 2; + + // Define the method on the prototype with the correct signature + Object.defineProperty(CustomActionProvider.prototype, name, { + value: takesWalletProvider + ? async function (walletProvider: WalletProvider, args: unknown) { + const parsedArgs = schema.parse(args); + return await (invoke as any)(walletProvider, parsedArgs); + } + : async function (args: unknown) { + const parsedArgs = schema.parse(args); + return await (invoke as any)(parsedArgs); + }, + configurable: true, + writable: true, + enumerable: true, + }); + + // Manually set the parameter metadata + const paramTypes = takesWalletProvider ? [WalletProvider, Object] : [Object]; + Reflect.defineMetadata("design:paramtypes", paramTypes, CustomActionProvider.prototype, name); + + // Apply the decorator using original name + const decoratedMethod = CreateAction({ + name, + description, + schema, + })( + CustomActionProvider.prototype, + name, + Object.getOwnPropertyDescriptor(CustomActionProvider.prototype, name)!, + ); + + // Add the decorated method to the instance + Object.defineProperty(this, name, { + value: decoratedMethod, + configurable: true, + writable: true, + }); + }); + } + + /** + * Custom action providers are supported on all networks + * + * @param _ - The network to checkpointSaver + * @returns true + */ + supportsNetwork(_: Network): boolean { + return true; + } +} + +export const customActionProvider = ( + actions: + | CustomActionProviderOptions + | CustomActionProviderOptions[], +) => new CustomActionProvider(Array.isArray(actions) ? actions : [actions]); diff --git a/typescript/agentkit/src/action-providers/erc20/README.md b/typescript/agentkit/src/action-providers/erc20/README.md new file mode 100644 index 000000000..2385121d7 --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc20/README.md @@ -0,0 +1 @@ +# ERC20 Action Provider \ No newline at end of file diff --git a/typescript/agentkit/src/action-providers/erc20/constants.ts b/typescript/agentkit/src/action-providers/erc20/constants.ts new file mode 100644 index 000000000..2167286d4 --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc20/constants.ts @@ -0,0 +1,188 @@ +export const abi = [ + { + type: "event", + name: "Approval", + inputs: [ + { + indexed: true, + name: "owner", + type: "address", + }, + { + indexed: true, + name: "spender", + type: "address", + }, + { + indexed: false, + name: "value", + type: "uint256", + }, + ], + }, + { + type: "event", + name: "Transfer", + inputs: [ + { + indexed: true, + name: "from", + type: "address", + }, + { + indexed: true, + name: "to", + type: "address", + }, + { + indexed: false, + name: "value", + type: "uint256", + }, + ], + }, + { + type: "function", + name: "allowance", + stateMutability: "view", + inputs: [ + { + name: "owner", + type: "address", + }, + { + name: "spender", + type: "address", + }, + ], + outputs: [ + { + type: "uint256", + }, + ], + }, + { + type: "function", + name: "approve", + stateMutability: "nonpayable", + inputs: [ + { + name: "spender", + type: "address", + }, + { + name: "amount", + type: "uint256", + }, + ], + outputs: [ + { + type: "bool", + }, + ], + }, + { + type: "function", + name: "balanceOf", + stateMutability: "view", + inputs: [ + { + name: "account", + type: "address", + }, + ], + outputs: [ + { + type: "uint256", + }, + ], + }, + { + type: "function", + name: "decimals", + stateMutability: "view", + inputs: [], + outputs: [ + { + type: "uint8", + }, + ], + }, + { + type: "function", + name: "name", + stateMutability: "view", + inputs: [], + outputs: [ + { + type: "string", + }, + ], + }, + { + type: "function", + name: "symbol", + stateMutability: "view", + inputs: [], + outputs: [ + { + type: "string", + }, + ], + }, + { + type: "function", + name: "totalSupply", + stateMutability: "view", + inputs: [], + outputs: [ + { + type: "uint256", + }, + ], + }, + { + type: "function", + name: "transfer", + stateMutability: "nonpayable", + inputs: [ + { + name: "recipient", + type: "address", + }, + { + name: "amount", + type: "uint256", + }, + ], + outputs: [ + { + type: "bool", + }, + ], + }, + { + type: "function", + name: "transferFrom", + stateMutability: "nonpayable", + inputs: [ + { + name: "sender", + type: "address", + }, + { + name: "recipient", + type: "address", + }, + { + name: "amount", + type: "uint256", + }, + ], + outputs: [ + { + type: "bool", + }, + ], + }, +] as const; diff --git a/typescript/agentkit/src/action-providers/erc20/erc20ActionProvider.test.ts b/typescript/agentkit/src/action-providers/erc20/erc20ActionProvider.test.ts new file mode 100644 index 000000000..079ee2200 --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc20/erc20ActionProvider.test.ts @@ -0,0 +1,147 @@ +import { erc20ActionProvider } from "./erc20ActionProvider"; +import { TransferSchema } from "./schemas"; +import { EvmWalletProvider } from "../../wallet-providers"; +import { encodeFunctionData, Hex } from "viem"; +import { abi } from "./constants"; + +const MOCK_AMOUNT = 15; +const MOCK_CONTRACT_ADDRESS = "0x1234567890123456789012345678901234567890"; +const MOCK_DESTINATION = "0x9876543210987654321098765432109876543210"; +const MOCK_ADDRESS = "0x1234567890123456789012345678901234567890"; + +describe("Transfer Schema", () => { + it("should successfully parse valid input", () => { + const validInput = { + amount: MOCK_AMOUNT, + contractAddress: MOCK_CONTRACT_ADDRESS, + destination: MOCK_DESTINATION, + }; + + const result = TransferSchema.safeParse(validInput); + + expect(result.success).toBe(true); + expect(result.data).toEqual(validInput); + }); + + it("should fail parsing empty input", () => { + const emptyInput = {}; + const result = TransferSchema.safeParse(emptyInput); + + expect(result.success).toBe(false); + }); +}); + +describe("Get Balance Action", () => { + let mockWallet: jest.Mocked; + const actionProvider = erc20ActionProvider(); + + beforeEach(async () => { + mockWallet = { + getAddress: jest.fn().mockReturnValue(MOCK_ADDRESS), + readContract: jest.fn(), + } as unknown as jest.Mocked; + + mockWallet.readContract.mockResolvedValue(MOCK_AMOUNT); + }); + + it("should successfully respond", async () => { + const args = { + contractAddress: MOCK_CONTRACT_ADDRESS, + }; + + const response = await actionProvider.getBalance(mockWallet, args); + + expect(mockWallet.readContract).toHaveBeenCalledWith({ + address: args.contractAddress as Hex, + abi, + functionName: "balanceOf", + args: [mockWallet.getAddress()], + }); + expect(response).toContain(`Balance of ${MOCK_CONTRACT_ADDRESS} is ${MOCK_AMOUNT}`); + }); + + it("should fail with an error", async () => { + const args = { + contractAddress: MOCK_CONTRACT_ADDRESS, + }; + + const error = new Error("Failed to get balance"); + mockWallet.readContract.mockRejectedValue(error); + + const response = await actionProvider.getBalance(mockWallet, args); + + expect(mockWallet.readContract).toHaveBeenCalledWith({ + address: args.contractAddress as Hex, + abi, + functionName: "balanceOf", + args: [mockWallet.getAddress()], + }); + + expect(response).toContain(`Error getting balance: ${error}`); + }); +}); + +describe("Transfer Action", () => { + const TRANSACTION_HASH = "0xghijkl987654321"; + + let mockWallet: jest.Mocked; + + const actionProvider = erc20ActionProvider(); + + beforeEach(async () => { + mockWallet = { + sendTransaction: jest.fn(), + waitForTransactionReceipt: jest.fn(), + } as unknown as jest.Mocked; + + mockWallet.sendTransaction.mockResolvedValue(TRANSACTION_HASH); + mockWallet.waitForTransactionReceipt.mockResolvedValue({}); + }); + + it("should successfully respond", async () => { + const args = { + amount: BigInt(MOCK_AMOUNT), + contractAddress: MOCK_CONTRACT_ADDRESS, + destination: MOCK_DESTINATION, + }; + + const response = await actionProvider.transfer(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: args.contractAddress as Hex, + data: encodeFunctionData({ + abi, + functionName: "transfer", + args: [args.destination as Hex, BigInt(args.amount)], + }), + }); + expect(mockWallet.waitForTransactionReceipt).toHaveBeenCalledWith(TRANSACTION_HASH); + expect(response).toContain( + `Transferred ${MOCK_AMOUNT} of ${MOCK_CONTRACT_ADDRESS} to ${MOCK_DESTINATION}`, + ); + expect(response).toContain(`Transaction hash for the transfer: ${TRANSACTION_HASH}`); + }); + + it("should fail with an error", async () => { + const args = { + amount: BigInt(MOCK_AMOUNT), + contractAddress: MOCK_CONTRACT_ADDRESS, + destination: MOCK_DESTINATION, + }; + + const error = new Error("Failed to execute transfer"); + mockWallet.sendTransaction.mockRejectedValue(error); + + const response = await actionProvider.transfer(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: args.contractAddress as Hex, + data: encodeFunctionData({ + abi, + functionName: "transfer", + args: [args.destination as Hex, BigInt(args.amount)], + }), + }); + expect(response).toContain(`Error transferring the asset: ${error}`); + }); +}); diff --git a/typescript/agentkit/src/action-providers/erc20/erc20ActionProvider.ts b/typescript/agentkit/src/action-providers/erc20/erc20ActionProvider.ts new file mode 100644 index 000000000..0da78bba8 --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc20/erc20ActionProvider.ts @@ -0,0 +1,109 @@ +import { z } from "zod"; +import { ActionProvider } from "../actionProvider"; +import { Network } from "../../network"; +import { CreateAction } from "../actionDecorator"; +import { GetBalanceSchema, TransferSchema } from "./schemas"; +import { abi } from "./constants"; +import { encodeFunctionData, Hex } from "viem"; +import { EvmWalletProvider } from "../../wallet-providers"; + +/** + * ERC20ActionProvider is an action provider for ERC20 tokens. + */ +export class ERC20ActionProvider extends ActionProvider { + /** + * Constructor for the ERC20ActionProvider. + */ + constructor() { + super("erc20", []); + } + + /** + * Gets the balance of an ERC20 token. + * + * @param walletProvider - The wallet provider to get the balance from. + * @param args - The input arguments for the action. + * @returns A message containing the balance. + */ + @CreateAction({ + name: "get_balance", + description: ` + This tool will get the balance of an ERC20 asset in the wallet. It takes the contract address as input. + `, + schema: GetBalanceSchema, + }) + async getBalance( + walletProvider: EvmWalletProvider, + args: z.infer, + ): Promise { + try { + const balance = await walletProvider.readContract({ + address: args.contractAddress as Hex, + abi, + functionName: "balanceOf", + args: [walletProvider.getAddress()], + }); + + return `Balance of ${args.contractAddress} is ${balance}`; + } catch (error) { + return `Error getting balance: ${error}`; + } + } + + /** + * Transfers a specified amount of an ERC20 token to a destination onchain. + * + * @param walletProvider - The wallet provider to transfer the asset from. + * @param args - The input arguments for the action. + * @returns A message containing the transfer details. + */ + @CreateAction({ + name: "transfer", + description: ` + This tool will transfer an ERC20 token from the wallet to another onchain address. + +It takes the following inputs: +- amount: The amount to transfer +- contractAddress: The contract address of the token to transfer +- destination: Where to send the funds (can be an onchain address, ENS 'example.eth', or Basename 'example.base.eth') + +Important notes: +- Ensure sufficient balance of the input asset before transferring +- When sending native assets (e.g. 'eth' on base-mainnet), ensure there is sufficient balance for the transfer itself AND the gas cost of this transfer + `, + schema: TransferSchema, + }) + async transfer( + walletProvider: EvmWalletProvider, + args: z.infer, + ): Promise { + try { + const hash = await walletProvider.sendTransaction({ + to: args.contractAddress as Hex, + data: encodeFunctionData({ + abi, + functionName: "transfer", + args: [args.destination as Hex, BigInt(args.amount)], + }), + }); + + await walletProvider.waitForTransactionReceipt(hash); + + return `Transferred ${args.amount} of ${args.contractAddress} to ${ + args.destination + }.\nTransaction hash for the transfer: ${hash}`; + } catch (error) { + return `Error transferring the asset: ${error}`; + } + } + + /** + * Checks if the ERC20 action provider supports the given network. + * + * @param _ - The network to check. + * @returns True if the ERC20 action provider supports the network, false otherwise. + */ + supportsNetwork = (_: Network) => true; +} + +export const erc20ActionProvider = () => new ERC20ActionProvider(); diff --git a/typescript/agentkit/src/action-providers/erc20/index.ts b/typescript/agentkit/src/action-providers/erc20/index.ts new file mode 100644 index 000000000..a34e022af --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc20/index.ts @@ -0,0 +1 @@ +export * from "./erc20ActionProvider"; diff --git a/typescript/agentkit/src/action-providers/erc20/schemas.ts b/typescript/agentkit/src/action-providers/erc20/schemas.ts new file mode 100644 index 000000000..fc0412ae0 --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc20/schemas.ts @@ -0,0 +1,25 @@ +import { z } from "zod"; + +/** + * Input schema for transfer action. + */ +export const TransferSchema = z + .object({ + amount: z.custom().describe("The amount of the asset to transfer"), + contractAddress: z.string().describe("The contract address of the token to transfer"), + destination: z.string().describe("The destination to transfer the funds"), + }) + .strip() + .describe("Instructions for transferring assets"); + +/** + * Input schema for get balance action. + */ +export const GetBalanceSchema = z + .object({ + contractAddress: z + .string() + .describe("The contract address of the token to get the balance for"), + }) + .strip() + .describe("Instructions for getting wallet balance"); diff --git a/typescript/agentkit/src/action-providers/erc721/README.md b/typescript/agentkit/src/action-providers/erc721/README.md new file mode 100644 index 000000000..65372aef7 --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc721/README.md @@ -0,0 +1 @@ +# ERC721 Action Provider diff --git a/typescript/agentkit/src/action-providers/erc721/constants.ts b/typescript/agentkit/src/action-providers/erc721/constants.ts new file mode 100644 index 000000000..0a4ef9de4 --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc721/constants.ts @@ -0,0 +1,298 @@ +export const ERC721_ABI = [ + { + inputs: [ + { internalType: "address", name: "to", type: "address" }, + { internalType: "uint256", name: "tokenId", type: "uint256" }, + ], + name: "mint", + outputs: [], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes4", + name: "interfaceId", + type: "bytes4", + }, + ], + name: "supportsInterface", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "approved", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "operator", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "approved", + type: "bool", + }, + ], + name: "ApprovalForAll", + type: "event", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "balance", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "ownerOf", + outputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "safeTransferFrom", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "safeTransferFrom", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "approve", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "operator", + type: "address", + }, + { + internalType: "bool", + name: "approved", + type: "bool", + }, + ], + name: "setApprovalForAll", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "getApproved", + outputs: [ + { + internalType: "address", + name: "operator", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "operator", + type: "address", + }, + ], + name: "isApprovedForAll", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; diff --git a/typescript/agentkit/src/action-providers/erc721/erc721ActionProvider.test.ts b/typescript/agentkit/src/action-providers/erc721/erc721ActionProvider.test.ts new file mode 100644 index 000000000..5fb518dec --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc721/erc721ActionProvider.test.ts @@ -0,0 +1,169 @@ +import { encodeFunctionData } from "viem"; +import { erc721ActionProvider } from "./erc721ActionProvider"; +import { ERC721_ABI } from "./constants"; +import { EvmWalletProvider } from "../../wallet-providers"; + +describe("ERC721 Action Provider", () => { + const MOCK_ADDRESS = "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83"; + const MOCK_CONTRACT = "0x1234567890123456789012345678901234567890"; + const MOCK_DESTINATION = "0x9876543210987654321098765432109876543210"; + const MOCK_TOKEN_ID = "123"; + + let mockWallet: jest.Mocked; + const actionProvider = erc721ActionProvider(); + + beforeEach(() => { + mockWallet = { + getAddress: jest.fn().mockReturnValue(MOCK_ADDRESS), + getNetwork: jest.fn().mockReturnValue({ protocolFamily: "evm" }), + sendTransaction: jest.fn(), + waitForTransactionReceipt: jest.fn(), + readContract: jest.fn(), + call: jest.fn(), + } as unknown as jest.Mocked; + + mockWallet.sendTransaction.mockResolvedValue("0xmockhash" as `0x${string}`); + mockWallet.waitForTransactionReceipt.mockResolvedValue({}); + }); + + describe("mint", () => { + it("should successfully mint an NFT", async () => { + const args = { + contractAddress: MOCK_CONTRACT, + destination: MOCK_DESTINATION, + }; + + const response = await actionProvider.mint(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: MOCK_CONTRACT, + data: encodeFunctionData({ + abi: ERC721_ABI, + functionName: "mint", + args: [MOCK_DESTINATION, 1n], + }), + }); + + expect(mockWallet.waitForTransactionReceipt).toHaveBeenCalledWith("0xmockhash"); + expect(response).toBe(`Successfully minted NFT ${MOCK_CONTRACT} to ${MOCK_DESTINATION}`); + }); + + it("should handle mint errors", async () => { + const error = new Error("Mint failed"); + mockWallet.sendTransaction.mockRejectedValue(error); + + const args = { + contractAddress: MOCK_CONTRACT, + destination: MOCK_DESTINATION, + }; + + const response = await actionProvider.mint(mockWallet, args); + expect(response).toBe(`Error minting NFT ${MOCK_CONTRACT} to ${MOCK_DESTINATION}: ${error}`); + }); + }); + + describe("transfer", () => { + it("should successfully transfer an NFT", async () => { + const args = { + contractAddress: MOCK_CONTRACT, + destination: MOCK_DESTINATION, + tokenId: MOCK_TOKEN_ID, + fromAddress: MOCK_ADDRESS, + }; + + const response = await actionProvider.transfer(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: MOCK_CONTRACT, + data: encodeFunctionData({ + abi: ERC721_ABI, + functionName: "transferFrom", + args: [MOCK_ADDRESS, MOCK_DESTINATION, BigInt(MOCK_TOKEN_ID)], + }), + }); + + expect(mockWallet.waitForTransactionReceipt).toHaveBeenCalledWith("0xmockhash"); + expect(response).toBe( + `Successfully transferred NFT ${MOCK_CONTRACT} with tokenId ${MOCK_TOKEN_ID} to ${MOCK_DESTINATION}`, + ); + }); + + it("should handle transfer errors", async () => { + const error = new Error("Transfer failed"); + mockWallet.sendTransaction.mockRejectedValue(error); + + const args = { + contractAddress: MOCK_CONTRACT, + destination: MOCK_DESTINATION, + tokenId: MOCK_TOKEN_ID, + fromAddress: MOCK_ADDRESS, + }; + + const response = await actionProvider.transfer(mockWallet, args); + expect(response).toBe( + `Error transferring NFT ${MOCK_CONTRACT} with tokenId ${MOCK_TOKEN_ID} to ${MOCK_DESTINATION}: ${error}`, + ); + }); + }); + + describe("getBalance", () => { + const MOCK_BALANCE = 1; + + beforeEach(() => { + mockWallet.readContract.mockResolvedValue(MOCK_BALANCE); + mockWallet.getAddress.mockReturnValue(MOCK_ADDRESS); + }); + + it("should successfully get the NFT balance", async () => { + const args = { + contractAddress: MOCK_CONTRACT, + address: MOCK_ADDRESS, + }; + + const response = await actionProvider.getBalance(mockWallet, args); + expect(mockWallet.readContract).toHaveBeenCalledWith({ + address: MOCK_CONTRACT, + abi: ERC721_ABI, + functionName: "balanceOf", + args: [MOCK_ADDRESS], + }); + expect(response).toBe( + `Balance of NFTs for contract ${MOCK_CONTRACT} at address ${MOCK_ADDRESS} is 1`, + ); + }); + + it("should handle get balance errors", async () => { + const error = new Error("Get balance failed"); + mockWallet.readContract.mockRejectedValue(error); + + const args = { + contractAddress: MOCK_CONTRACT, + address: MOCK_ADDRESS, + }; + + const response = await actionProvider.getBalance(mockWallet, args); + expect(mockWallet.readContract).toHaveBeenCalledWith({ + address: MOCK_CONTRACT, + abi: ERC721_ABI, + functionName: "balanceOf", + args: [MOCK_ADDRESS], + }); + expect(response).toBe(`Error getting NFT balance for contract ${MOCK_CONTRACT}: ${error}`); + }); + }); + + describe("supportsNetwork", () => { + it("should return true for EVM networks", () => { + const result = actionProvider.supportsNetwork({ protocolFamily: "evm", networkId: "any" }); + expect(result).toBe(true); + }); + + it("should return false for non-EVM networks", () => { + const result = actionProvider.supportsNetwork({ + protocolFamily: "bitcoin", + networkId: "any", + }); + expect(result).toBe(false); + }); + }); +}); diff --git a/typescript/agentkit/src/action-providers/erc721/erc721ActionProvider.ts b/typescript/agentkit/src/action-providers/erc721/erc721ActionProvider.ts new file mode 100644 index 000000000..007eb0890 --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc721/erc721ActionProvider.ts @@ -0,0 +1,153 @@ +import { z } from "zod"; +import { ActionProvider } from "../actionProvider"; +import { EvmWalletProvider } from "../../wallet-providers"; +import { CreateAction } from "../actionDecorator"; +import { GetBalanceSchema, MintSchema, TransferSchema } from "./schemas"; +import { ERC721_ABI } from "./constants"; +import { encodeFunctionData, Hex } from "viem"; +import { Network } from "../../network"; + +/** + * Erc721ActionProvider is an action provider for Erc721 contract interactions. + */ +export class Erc721ActionProvider extends ActionProvider { + /** + * Constructor for the Erc721ActionProvider class. + */ + constructor() { + super("erc721", []); + } + + /** + * Mints an NFT (ERC-721) to a specified destination address onchain. + * + * @param walletProvider - The wallet provider to mint the NFT from. + * @param args - The input arguments for the action. + * @returns A message containing the NFT mint details. + */ + @CreateAction({ + name: "mint", + description: ` +This tool will mint an NFT (ERC-721) to a specified destination address onchain via a contract invocation. +It takes the contract address of the NFT onchain and the destination address onchain that will receive the NFT as inputs. +Do not use the contract address as the destination address. If you are unsure of the destination address, please ask the user before proceeding. +`, + schema: MintSchema, + }) + async mint(walletProvider: EvmWalletProvider, args: z.infer): Promise { + try { + const data = encodeFunctionData({ + abi: ERC721_ABI, + functionName: "mint", + args: [args.destination as Hex, 1n], + }); + + const hash = await walletProvider.sendTransaction({ + to: args.contractAddress as `0x${string}`, + data, + }); + + await walletProvider.waitForTransactionReceipt(hash); + + return `Successfully minted NFT ${args.contractAddress} to ${args.destination}`; + } catch (error) { + return `Error minting NFT ${args.contractAddress} to ${args.destination}: ${error}`; + } + } + + /** + * Transfers an NFT (ERC721 token) to a destination address. + * + * @param walletProvider - The wallet provider to transfer the NFT from. + * @param args - The input arguments for the action. + * @returns A message containing the transfer details. + */ + @CreateAction({ + name: "transfer", + description: ` +This tool will transfer an NFT (ERC721 token) from the wallet to another onchain address. + +It takes the following inputs: +- contractAddress: The NFT contract address +- tokenId: The ID of the specific NFT to transfer +- destination: Onchain address to send the NFT + +Important notes: +- Ensure you have ownership of the NFT before attempting transfer +- Ensure there is sufficient native token balance for gas fees +- The wallet must either own the NFT or have approval to transfer it +`, + schema: TransferSchema, + }) + async transfer( + walletProvider: EvmWalletProvider, + args: z.infer, + ): Promise { + try { + const data = encodeFunctionData({ + abi: ERC721_ABI, + functionName: "transferFrom", + args: [args.fromAddress as Hex, args.destination as Hex, BigInt(args.tokenId)], + }); + + const hash = await walletProvider.sendTransaction({ + to: args.contractAddress as `0x${string}`, + data, + }); + + await walletProvider.waitForTransactionReceipt(hash); + + return `Successfully transferred NFT ${args.contractAddress} with tokenId ${args.tokenId} to ${args.destination}`; + } catch (error) { + return `Error transferring NFT ${args.contractAddress} with tokenId ${args.tokenId} to ${args.destination}: ${error}`; + } + } + + /** + * Gets the NFT balance for a given address and contract. + * + * @param walletProvider - The wallet provider to check the balance with. + * @param args - The input arguments for the action. + * @returns A message containing the NFT balance details. + */ + @CreateAction({ + name: "get_balance", + description: ` +This tool will check the NFT (ERC721 token) balance for a given address. + +It takes the following inputs: +- contractAddress: The NFT contract address to check balance for +- address: (Optional) The address to check NFT balance for. If not provided, uses the wallet's address +`, + schema: GetBalanceSchema, + }) + async getBalance( + walletProvider: EvmWalletProvider, + args: z.infer, + ): Promise { + try { + const address = args.address || walletProvider.getAddress(); + + const balance = await walletProvider.readContract({ + address: args.contractAddress as Hex, + abi: ERC721_ABI, + functionName: "balanceOf", + args: [address], + }); + + return `Balance of NFTs for contract ${args.contractAddress} at address ${address} is ${balance}`; + } catch (error) { + return `Error getting NFT balance for contract ${args.contractAddress}: ${error}`; + } + } + + /** + * Checks if the Erc721 action provider supports the given network. + * + * @param network - The network to check. + * @returns True if the Erc721 action provider supports the network, false otherwise. + */ + supportsNetwork = (network: Network) => network.protocolFamily === "evm"; +} + +export const erc721ActionProvider = () => new Erc721ActionProvider(); diff --git a/typescript/agentkit/src/action-providers/erc721/index.ts b/typescript/agentkit/src/action-providers/erc721/index.ts new file mode 100644 index 000000000..4de48ea6c --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc721/index.ts @@ -0,0 +1 @@ +export * from "./erc721ActionProvider"; diff --git a/typescript/agentkit/src/action-providers/erc721/schemas.ts b/typescript/agentkit/src/action-providers/erc721/schemas.ts new file mode 100644 index 000000000..982b8d039 --- /dev/null +++ b/typescript/agentkit/src/action-providers/erc721/schemas.ts @@ -0,0 +1,50 @@ +import { z } from "zod"; + +/** + * Input schema for get NFT (ERC721) balance action. + */ +export const GetBalanceSchema = z + .object({ + contractAddress: z.string().describe("The NFT contract address to check balance for"), + address: z + .string() + .optional() + .describe( + "The address to check NFT balance for. If not provided, uses the wallet's default address", + ), + }) + .strip() + .describe("Instructions for getting NFT balance"); + +/** + * Input schema for mint NFT (ERC721) action. + */ +export const MintSchema = z + .object({ + contractAddress: z.string().describe("The contract address of the NFT to mint"), + destination: z.string().describe("The onchain destination address that will receive the NFT"), + }) + .strip() + .describe("Instructions for minting an NFT"); + +/** + * Input schema for NFT (ERC721) transfer action. + */ +export const TransferSchema = z + .object({ + contractAddress: z.string().describe("The NFT contract address to interact with"), + tokenId: z.string().describe("The ID of the NFT to transfer"), + destination: z + .string() + .describe( + "The destination to transfer the NFT, e.g. `0x58dBecc0894Ab4C24F98a0e684c989eD07e4e027`, `example.eth`, `example.base.eth`", + ), + fromAddress: z + .string() + .optional() + .describe( + "The address to transfer from. If not provided, defaults to the wallet's default address", + ), + }) + .strip() + .describe("Input schema for transferring an NFT"); diff --git a/typescript/agentkit/src/action-providers/farcaster/README.md b/typescript/agentkit/src/action-providers/farcaster/README.md new file mode 100644 index 000000000..37acc8f61 --- /dev/null +++ b/typescript/agentkit/src/action-providers/farcaster/README.md @@ -0,0 +1 @@ +# Farcaster Action Provider diff --git a/typescript/agentkit/src/action-providers/farcaster/farcasterActionProvider.test.ts b/typescript/agentkit/src/action-providers/farcaster/farcasterActionProvider.test.ts new file mode 100644 index 000000000..27717c346 --- /dev/null +++ b/typescript/agentkit/src/action-providers/farcaster/farcasterActionProvider.test.ts @@ -0,0 +1,176 @@ +import { FarcasterActionProvider } from "./farcasterActionProvider"; +import { FarcasterAccountDetailsSchema, FarcasterPostCastSchema } from "./schemas"; + +// Mock fetch globally +const mockFetch = jest.fn(); +global.fetch = mockFetch; + +describe("Farcaster Action Provider Input Schemas", () => { + describe("Account Details Schema", () => { + it("should successfully parse empty input", () => { + const validInput = {}; + const result = FarcasterAccountDetailsSchema.safeParse(validInput); + + expect(result.success).toBe(true); + expect(result.data).toEqual(validInput); + }); + }); + + describe("Post Cast Schema", () => { + it("should successfully parse valid cast text", () => { + const validInput = { + castText: "Hello, Farcaster!", + }; + const result = FarcasterPostCastSchema.safeParse(validInput); + + expect(result.success).toBe(true); + expect(result.data).toEqual(validInput); + }); + + it("should fail parsing cast text over 280 characters", () => { + const invalidInput = { + castText: "a".repeat(281), + }; + const result = FarcasterPostCastSchema.safeParse(invalidInput); + + expect(result.success).toBe(false); + }); + }); +}); + +describe("Farcaster Action Provider", () => { + const mockConfig = { + neynarApiKey: "test-api-key", + signerUuid: "test-signer-uuid", + agentFid: "193", + }; + + let actionProvider: FarcasterActionProvider; + + beforeEach(() => { + jest.clearAllMocks(); + actionProvider = new FarcasterActionProvider(mockConfig); + }); + + describe("accountDetails", () => { + const mockUserResponse = { + users: [ + { + object: "user", + fid: 193, + username: "derek", + display_name: "Derek", + }, + ], + }; + + it("should successfully retrieve Farcaster account details", async () => { + mockFetch.mockResolvedValueOnce({ + json: () => Promise.resolve(mockUserResponse), + }); + + const result = await actionProvider.accountDetails({}); + + expect(mockFetch).toHaveBeenCalledWith( + `https://api.neynar.com/v2/farcaster/user/bulk?fids=${mockConfig.agentFid}`, + { + method: "GET", + headers: { + accept: "application/json", + "x-api-key": mockConfig.neynarApiKey, + "x-neynar-experimental": "true", + }, + }, + ); + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(result).toContain("Successfully retrieved Farcaster account details"); + expect(result).toContain(JSON.stringify(mockUserResponse.users[0])); + }); + + it("should handle errors when retrieving account details", async () => { + const error = new Error("API request failed"); + mockFetch.mockRejectedValueOnce(error); + + const result = await actionProvider.accountDetails({}); + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(result).toBe(`Error retrieving Farcaster account details:\n${error}`); + }); + }); + + describe("postCast", () => { + const mockCastResponse = { + hash: "0x123", + }; + + it("should successfully post a cast", async () => { + mockFetch.mockResolvedValueOnce({ + json: () => Promise.resolve(mockCastResponse), + }); + + const args = { + castText: "Hello, Farcaster!", + }; + + const result = await actionProvider.postCast(args); + + expect(mockFetch).toHaveBeenCalledWith("https://api.neynar.com/v2/farcaster/cast", { + method: "POST", + headers: { + api_key: mockConfig.neynarApiKey, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + signer_uuid: mockConfig.signerUuid, + text: args.castText, + }), + }); + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(result).toContain("Successfully posted cast to Farcaster"); + expect(result).toContain(JSON.stringify(mockCastResponse)); + }); + + it("should handle errors when posting cast", async () => { + const error = new Error("Failed to post cast"); + mockFetch.mockRejectedValueOnce(error); + + const args = { + castText: "Hello, Farcaster!", + }; + + const result = await actionProvider.postCast(args); + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(result).toBe(`Error posting to Farcaster:\n${error}`); + }); + }); + + describe("constructor", () => { + it("should use environment variables when config is not provided", () => { + const originalEnv = process.env; + process.env = { + ...originalEnv, + NEYNAR_API_KEY: "env-api-key", + NEYNAR_MANAGER_SIGNER: "env-signer-uuid", + AGENT_FID: "env-agent-fid", + }; + + const provider = new FarcasterActionProvider(); + expect(provider).toBeDefined(); + + process.env = originalEnv; + }); + + it("should throw error when required config is missing", () => { + const originalEnv = process.env; + process.env = { ...originalEnv }; + delete process.env.NEYNAR_API_KEY; + delete process.env.NEYNAR_MANAGER_SIGNER; + delete process.env.AGENT_FID; + + expect(() => new FarcasterActionProvider()).toThrow(); + + process.env = originalEnv; + }); + }); +}); diff --git a/typescript/agentkit/src/action-providers/farcaster/farcasterActionProvider.ts b/typescript/agentkit/src/action-providers/farcaster/farcasterActionProvider.ts new file mode 100644 index 000000000..340642029 --- /dev/null +++ b/typescript/agentkit/src/action-providers/farcaster/farcasterActionProvider.ts @@ -0,0 +1,155 @@ +import { z } from "zod"; +import { ActionProvider } from "../actionProvider"; +import { Network } from "../../network"; +import { CreateAction } from "../actionDecorator"; +import { FarcasterAccountDetailsSchema, FarcasterPostCastSchema } from "./schemas"; + +/** + * Configuration options for the FarcasterActionProvider. + */ +export interface FarcasterActionProviderConfig { + /** + * Neynar API Key. + */ + neynarApiKey?: string; + + /** + * Neynar managed signer UUID. + */ + signerUuid?: string; + + /** + * Agent FID. + */ + agentFid?: string; +} + +/** + * FarcasterActionProvider is an action provider for Farcaster. + */ +export class FarcasterActionProvider extends ActionProvider { + private readonly neynarApiKey: string; + private readonly signerUuid: string; + private readonly agentFid: string; + + /** + * Constructor for the FarcasterActionProvider class. + * + * @param config - The configuration options for the FarcasterActionProvider. + */ + constructor(config: FarcasterActionProviderConfig = {}) { + super("farcaster", []); + + const neynarApiKey = config.neynarApiKey || process.env.NEYNAR_API_KEY; + const signerUuid = config.signerUuid || process.env.NEYNAR_MANAGER_SIGNER; + const agentFid = config.agentFid || process.env.AGENT_FID; + + if (!neynarApiKey) { + throw new Error("NEYNAR_API_KEY is not configured."); + } + if (!signerUuid) { + throw new Error("NEYNAR_MANAGER_SIGNER is not configured."); + } + if (!agentFid) { + throw new Error("AGENT_FID is not configured."); + } + + this.neynarApiKey = neynarApiKey; + this.signerUuid = signerUuid; + this.agentFid = agentFid; + } + + /** + * Retrieves agent's Farcaster account details. + * + * @param _ - The input arguments for the action. + * @returns A message containing account details for the agent's Farcaster account. + */ + @CreateAction({ + name: "account_details", + description: ` +This tool will retrieve the account details for the agent's Farcaster account. +The tool takes the FID of the agent's account. + +A successful response will return a message with the API response as a JSON payload: + { "object": "user", "fid": 193," username": "derek", "display_name": "Derek", ... } + +A failure response will return a message with the Farcaster API request error: + Unable to retrieve account details. +`, + schema: FarcasterAccountDetailsSchema, + }) + async accountDetails(_: z.infer): Promise { + try { + const headers: HeadersInit = { + accept: "application/json", + "x-api-key": this.neynarApiKey, + "x-neynar-experimental": "true", + }; + + const response = await fetch( + `https://api.neynar.com/v2/farcaster/user/bulk?fids=${this.agentFid}`, + { + method: "GET", + headers, + }, + ); + const { users } = await response.json(); + return `Successfully retrieved Farcaster account details:\n${JSON.stringify(users[0])}`; + } catch (error) { + return `Error retrieving Farcaster account details:\n${error}`; + } + } + + /** + * Posts a cast on Farcaster. + * + * @param args - The input arguments for the action. + * @returns A message indicating the success or failure of the cast posting. + */ + @CreateAction({ + name: "post_cast", + description: ` +This tool will post a cast to Farcaster. The tool takes the text of the cast as input. Casts can be maximum 280 characters. + +A successful response will return a message with the API response as a JSON payload: + {} + +A failure response will return a message with the Farcaster API request error: + You are not allowed to post a cast with duplicate content. +`, + schema: FarcasterPostCastSchema, + }) + async postCast(args: z.infer): Promise { + try { + const headers: HeadersInit = { + api_key: this.neynarApiKey, + "Content-Type": "application/json", + }; + + const response = await fetch("https://api.neynar.com/v2/farcaster/cast", { + method: "POST", + headers, + body: JSON.stringify({ + signer_uuid: this.signerUuid, + text: args.castText, + }), + }); + const data = await response.json(); + return `Successfully posted cast to Farcaster:\n${JSON.stringify(data)}`; + } catch (error) { + return `Error posting to Farcaster:\n${error}`; + } + } + + /** + * Checks if the Farcaster action provider supports the given network. + * + * @param _ - The network to check. + * @returns True if the Farcaster action provider supports the network, false otherwise. + */ + supportsNetwork = (_: Network) => true; +} + +export const farcasterActionProvider = (config: FarcasterActionProviderConfig = {}) => + new FarcasterActionProvider(config); diff --git a/typescript/agentkit/src/action-providers/farcaster/index.ts b/typescript/agentkit/src/action-providers/farcaster/index.ts new file mode 100644 index 000000000..580a2b16c --- /dev/null +++ b/typescript/agentkit/src/action-providers/farcaster/index.ts @@ -0,0 +1,2 @@ +export * from "./schemas"; +export * from "./farcasterActionProvider"; diff --git a/typescript/agentkit/src/action-providers/farcaster/schemas.ts b/typescript/agentkit/src/action-providers/farcaster/schemas.ts new file mode 100644 index 000000000..2170ea598 --- /dev/null +++ b/typescript/agentkit/src/action-providers/farcaster/schemas.ts @@ -0,0 +1,19 @@ +import { z } from "zod"; + +/** + * Input argument schema for the account_details action. + */ +export const FarcasterAccountDetailsSchema = z + .object({}) + .strip() + .describe("Input schema for retrieving account details"); + +/** + * Input argument schema for the post cast action. + */ +export const FarcasterPostCastSchema = z + .object({ + castText: z.string().max(280, "Cast text must be a maximum of 280 characters."), + }) + .strip() + .describe("Input schema for posting a text-based cast"); diff --git a/typescript/agentkit/src/action-providers/index.ts b/typescript/agentkit/src/action-providers/index.ts new file mode 100644 index 000000000..3bb6fa270 --- /dev/null +++ b/typescript/agentkit/src/action-providers/index.ts @@ -0,0 +1,14 @@ +export * from "./actionDecorator"; +export * from "./actionProvider"; + +export * from "./pyth"; +export * from "./cdp"; +export * from "./weth"; +export * from "./erc20"; +export * from "./erc721"; +export * from "./morpho"; +export * from "./basename"; +export * from "./farcaster"; +export * from "./twitter"; +export * from "./wallet"; +export * from "./customActionProvider"; diff --git a/typescript/agentkit/src/action-providers/morpho/README.md b/typescript/agentkit/src/action-providers/morpho/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/morpho/constants.ts b/typescript/agentkit/src/action-providers/morpho/constants.ts similarity index 100% rename from cdp-agentkit-core/typescript/src/actions/cdp/defi/morpho/constants.ts rename to typescript/agentkit/src/action-providers/morpho/constants.ts diff --git a/typescript/agentkit/src/action-providers/morpho/index.ts b/typescript/agentkit/src/action-providers/morpho/index.ts new file mode 100644 index 000000000..dc10fb9c4 --- /dev/null +++ b/typescript/agentkit/src/action-providers/morpho/index.ts @@ -0,0 +1,2 @@ +export * from "./schemas"; +export * from "./morphoActionProvider"; diff --git a/typescript/agentkit/src/action-providers/morpho/morphoActionProvider.test.ts b/typescript/agentkit/src/action-providers/morpho/morphoActionProvider.test.ts new file mode 100644 index 000000000..dac1d7dec --- /dev/null +++ b/typescript/agentkit/src/action-providers/morpho/morphoActionProvider.test.ts @@ -0,0 +1,157 @@ +import { encodeFunctionData, parseEther } from "viem"; +import { EvmWalletProvider } from "../../wallet-providers"; +import { approve } from "../../utils"; +import { MorphoActionProvider } from "./morphoActionProvider"; +import { METAMORPHO_ABI } from "./constants"; + +const MOCK_VAULT_ADDRESS = "0x1234567890123456789012345678901234567890"; +const MOCK_ATOMIC_ASSETS = "1000000000000000000"; +const MOCK_WHOLE_ASSETS = "1.0"; +const MOCK_RECEIVER_ID = "0x9876543210987654321098765432109876543210"; +const MOCK_TOKEN_ADDRESS = "0x4200000000000000000000000000000000000006"; +const MOCK_TX_HASH = "0xabcdef1234567890"; +const MOCK_RECEIPT = { status: 1, blockNumber: 1234567 }; + +jest.mock("../../utils"); +const mockApprove = approve as jest.MockedFunction; + +describe("Morpho Action Provider", () => { + const actionProvider = new MorphoActionProvider(); + let mockWallet: jest.Mocked; + + beforeEach(() => { + mockWallet = { + getAddress: jest.fn().mockReturnValue(MOCK_RECEIVER_ID), + getNetwork: jest.fn().mockReturnValue({ protocolFamily: "evm", networkId: "1" }), + sendTransaction: jest.fn().mockResolvedValue(MOCK_TX_HASH as `0x${string}`), + waitForTransactionReceipt: jest.fn().mockResolvedValue(MOCK_RECEIPT), + } as unknown as jest.Mocked; + + mockApprove.mockResolvedValue("Approval successful"); + }); + + describe("deposit", () => { + it("should successfully deposit to Morpho vault", async () => { + const args = { + vaultAddress: MOCK_VAULT_ADDRESS, + assets: MOCK_WHOLE_ASSETS, + receiver: MOCK_RECEIVER_ID, + tokenAddress: MOCK_TOKEN_ADDRESS, + }; + + const atomicAssets = parseEther(MOCK_WHOLE_ASSETS); + + const response = await actionProvider.deposit(mockWallet, args); + + expect(mockApprove).toHaveBeenCalledWith( + mockWallet, + MOCK_TOKEN_ADDRESS, + MOCK_VAULT_ADDRESS, + atomicAssets, + ); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: MOCK_VAULT_ADDRESS as `0x${string}`, + data: encodeFunctionData({ + abi: METAMORPHO_ABI, + functionName: "deposit", + args: [atomicAssets, MOCK_RECEIVER_ID], + }), + }); + + expect(mockWallet.waitForTransactionReceipt).toHaveBeenCalledWith(MOCK_TX_HASH); + expect(response).toContain(`Deposited ${MOCK_WHOLE_ASSETS}`); + expect(response).toContain(MOCK_TX_HASH); + expect(response).toContain(JSON.stringify(MOCK_RECEIPT)); + }); + + it("should handle errors when depositing", async () => { + const args = { + vaultAddress: MOCK_VAULT_ADDRESS, + assets: MOCK_WHOLE_ASSETS, + receiver: MOCK_RECEIVER_ID, + tokenAddress: MOCK_TOKEN_ADDRESS, + }; + + mockWallet.sendTransaction.mockRejectedValue(new Error("Failed to deposit")); + + const response = await actionProvider.deposit(mockWallet, args); + + expect(response).toContain("Error depositing to Morpho Vault: Error: Failed to deposit"); + }); + }); + + describe("withdraw", () => { + it("should successfully withdraw from Morpho vault", async () => { + const args = { + vaultAddress: MOCK_VAULT_ADDRESS, + assets: MOCK_ATOMIC_ASSETS, + receiver: MOCK_RECEIVER_ID, + }; + + const response = await actionProvider.withdraw(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: MOCK_VAULT_ADDRESS as `0x${string}`, + data: encodeFunctionData({ + abi: METAMORPHO_ABI, + functionName: "withdraw", + args: [BigInt(MOCK_ATOMIC_ASSETS), MOCK_RECEIVER_ID, MOCK_RECEIVER_ID], + }), + }); + + expect(mockWallet.waitForTransactionReceipt).toHaveBeenCalledWith(MOCK_TX_HASH); + expect(response).toContain(`Withdrawn ${MOCK_ATOMIC_ASSETS}`); + expect(response).toContain(MOCK_TX_HASH); + expect(response).toContain(JSON.stringify(MOCK_RECEIPT)); + }); + + it("should handle errors when withdrawing", async () => { + const args = { + vaultAddress: MOCK_VAULT_ADDRESS, + assets: MOCK_ATOMIC_ASSETS, + receiver: MOCK_RECEIVER_ID, + }; + + mockWallet.sendTransaction.mockRejectedValue(new Error("Failed to withdraw")); + + const response = await actionProvider.withdraw(mockWallet, args); + + expect(response).toContain("Error withdrawing from Morpho Vault: Error: Failed to withdraw"); + }); + }); + + describe("supportsNetwork", () => { + it("should return true for Base Mainnet", () => { + const result = actionProvider.supportsNetwork({ + protocolFamily: "evm", + networkId: "base-mainnet", + }); + expect(result).toBe(true); + }); + + it("should return true for Base Sepolia", () => { + const result = actionProvider.supportsNetwork({ + protocolFamily: "evm", + networkId: "base-sepolia", + }); + expect(result).toBe(true); + }); + + it("should return false for other EVM networks", () => { + const result = actionProvider.supportsNetwork({ + protocolFamily: "evm", + networkId: "ethereum", + }); + expect(result).toBe(false); + }); + + it("should return false for non-EVM networks", () => { + const result = actionProvider.supportsNetwork({ + protocolFamily: "bitcoin", + networkId: "base-mainnet", + }); + expect(result).toBe(false); + }); + }); +}); diff --git a/typescript/agentkit/src/action-providers/morpho/morphoActionProvider.ts b/typescript/agentkit/src/action-providers/morpho/morphoActionProvider.ts new file mode 100644 index 000000000..85a5a8633 --- /dev/null +++ b/typescript/agentkit/src/action-providers/morpho/morphoActionProvider.ts @@ -0,0 +1,146 @@ +import { z } from "zod"; +import { Decimal } from "decimal.js"; +import { encodeFunctionData, parseEther } from "viem"; + +import { ActionProvider } from "../actionProvider"; +import { EvmWalletProvider } from "../../wallet-providers"; +import { CreateAction } from "../actionDecorator"; +import { approve } from "../../utils"; +import { METAMORPHO_ABI } from "./constants"; +import { DepositSchema, WithdrawSchema } from "./schemas"; +import { Network } from "../../network"; + +export const SUPPORTED_NETWORKS = ["base-mainnet", "base-sepolia"]; + +/** + * MorphoActionProvider is an action provider for Morpho Vault interactions. + */ +export class MorphoActionProvider extends ActionProvider { + /** + * Constructor for the MorphoActionProvider class. + */ + constructor() { + super("morpho", []); + } + + /** + * Deposits assets into a Morpho Vault + * + * @param wallet - The wallet instance to execute the transaction + * @param args - The input arguments for the action + * @returns A success message with transaction details or an error message + */ + @CreateAction({ + name: "deposit", + description: ` +This tool allows depositing assets into a Morpho Vault. + +It takes: +- vaultAddress: The address of the Morpho Vault to deposit to +- assets: The amount of assets to deposit in whole units + Examples for WETH: + - 1 WETH + - 0.1 WETH + - 0.01 WETH +- receiver: The address to receive the shares +- tokenAddress: The address of the token to approve + +Important notes: +- Make sure to use the exact amount provided. Do not convert units for assets for this action. +- Please use a token address (example 0x4200000000000000000000000000000000000006) for the tokenAddress field. +`, + schema: DepositSchema, + }) + async deposit(wallet: EvmWalletProvider, args: z.infer): Promise { + const assets = new Decimal(args.assets); + + if (assets.comparedTo(new Decimal(0.0)) != 1) { + return "Error: Assets amount must be greater than 0"; + } + + try { + const atomicAssets = parseEther(args.assets); + + const approvalResult = await approve( + wallet, + args.tokenAddress, + args.vaultAddress, + atomicAssets, + ); + if (approvalResult.startsWith("Error")) { + return `Error approving Morpho Vault as spender: ${approvalResult}`; + } + + const data = encodeFunctionData({ + abi: METAMORPHO_ABI, + functionName: "deposit", + args: [atomicAssets, args.receiver], + }); + + const txHash = await wallet.sendTransaction({ + to: args.vaultAddress as `0x${string}`, + data, + }); + + const receipt = await wallet.waitForTransactionReceipt(txHash); + + return `Deposited ${args.assets} to Morpho Vault ${args.vaultAddress} with transaction hash: ${txHash}\nTransaction receipt: ${JSON.stringify(receipt)}`; + } catch (error) { + return `Error depositing to Morpho Vault: ${error}`; + } + } + + /** + * Withdraws assets from a Morpho Vault + * + * @param wallet - The wallet instance to execute the transaction + * @param args - The input arguments for the action + * @returns A success message with transaction details or an error message + */ + @CreateAction({ + name: "withdraw", + description: ` +This tool allows withdrawing assets from a Morpho Vault. It takes: + +- vaultAddress: The address of the Morpho Vault to withdraw from +- assets: The amount of assets to withdraw in atomic units (wei) +- receiver: The address to receive the shares +`, + schema: WithdrawSchema, + }) + async withdraw(wallet: EvmWalletProvider, args: z.infer): Promise { + if (BigInt(args.assets) <= 0) { + return "Error: Assets amount must be greater than 0"; + } + + try { + const data = encodeFunctionData({ + abi: METAMORPHO_ABI, + functionName: "withdraw", + args: [BigInt(args.assets), args.receiver, args.receiver], + }); + + const txHash = await wallet.sendTransaction({ + to: args.vaultAddress as `0x${string}`, + data, + }); + + const receipt = await wallet.waitForTransactionReceipt(txHash); + + return `Withdrawn ${args.assets} from Morpho Vault ${args.vaultAddress} with transaction hash: ${txHash}\nTransaction receipt: ${JSON.stringify(receipt)}`; + } catch (error) { + return `Error withdrawing from Morpho Vault: ${error}`; + } + } + + /** + * Checks if the Morpho action provider supports the given network. + * + * @param network - The network to check. + * @returns True if the Morpho action provider supports the network, false otherwise. + */ + supportsNetwork = (network: Network) => + network.protocolFamily === "evm" && SUPPORTED_NETWORKS.includes(network.networkId!); +} + +export const morphoActionProvider = () => new MorphoActionProvider(); diff --git a/typescript/agentkit/src/action-providers/morpho/schemas.ts b/typescript/agentkit/src/action-providers/morpho/schemas.ts new file mode 100644 index 000000000..fcd93f363 --- /dev/null +++ b/typescript/agentkit/src/action-providers/morpho/schemas.ts @@ -0,0 +1,48 @@ +import { z } from "zod"; + +/** + * Input schema for Morpho Vault deposit action. + */ +export const DepositSchema = z + .object({ + assets: z + .string() + .regex(/^\d+(\.\d+)?$/, "Must be a valid integer or decimal value") + .describe("The quantity of assets to deposit, in whole units"), + receiver: z + .string() + .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") + .describe( + "The address that will own the position on the vault which will receive the shares", + ), + tokenAddress: z + .string() + .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") + .describe("The address of the assets token to approve for deposit"), + vaultAddress: z + .string() + .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") + .describe("The address of the Morpho Vault to deposit to"), + }) + .describe("Input schema for Morpho Vault deposit action"); + +/** + * Input schema for Morpho Vault withdraw action. + */ +export const WithdrawSchema = z + .object({ + vaultAddress: z + .string() + .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") + .describe("The address of the Morpho Vault to withdraw from"), + assets: z + .string() + .regex(/^\d+$/, "Must be a valid whole number") + .describe("The amount of assets to withdraw in atomic units e.g. 1"), + receiver: z + .string() + .regex(/^0x[a-fA-F0-9]{40}$/, "Invalid Ethereum address format") + .describe("The address to receive the shares"), + }) + .strip() + .describe("Input schema for Morpho Vault withdraw action"); diff --git a/typescript/agentkit/src/action-providers/pyth/README.md b/typescript/agentkit/src/action-providers/pyth/README.md new file mode 100644 index 000000000..0ba826595 --- /dev/null +++ b/typescript/agentkit/src/action-providers/pyth/README.md @@ -0,0 +1 @@ +# Pyth Action Provider \ No newline at end of file diff --git a/typescript/agentkit/src/action-providers/pyth/index.ts b/typescript/agentkit/src/action-providers/pyth/index.ts new file mode 100644 index 000000000..cca93726c --- /dev/null +++ b/typescript/agentkit/src/action-providers/pyth/index.ts @@ -0,0 +1,2 @@ +export * from "./pythActionProvider"; +export * from "./schemas"; diff --git a/typescript/agentkit/src/action-providers/pyth/pythActionProvider.ts b/typescript/agentkit/src/action-providers/pyth/pythActionProvider.ts new file mode 100644 index 000000000..89a05351f --- /dev/null +++ b/typescript/agentkit/src/action-providers/pyth/pythActionProvider.ts @@ -0,0 +1,115 @@ +import { z } from "zod"; +import { ActionProvider } from "../actionProvider"; +import { CreateAction } from "../actionDecorator"; +import { PythFetchPriceFeedIDSchema, PythFetchPriceSchema } from "./schemas"; + +/** + * PythActionProvider is an action provider for Pyth. + */ +export class PythActionProvider extends ActionProvider { + /** + * Constructs a new PythActionProvider. + */ + constructor() { + super("pyth", []); + } + + /** + * Fetch the price feed ID for a given token symbol from Pyth. + * + * @param args - The arguments for the action. + * @returns The price feed ID as a string. + */ + @CreateAction({ + name: "fetch_price_feed", + description: "Fetch the price feed ID for a given token symbol from Pyth.", + schema: PythFetchPriceFeedIDSchema, + }) + async fetchPriceFeed(args: z.infer): Promise { + const url = `https://hermes.pyth.network/v2/price_feeds?query=${args.tokenSymbol}&asset_type=crypto`; + const response = await fetch(url); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + + if (data.length === 0) { + throw new Error(`No price feed found for ${args.tokenSymbol}`); + } + + const filteredData = data.filter( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (item: any) => item.attributes.base.toLowerCase() === args.tokenSymbol.toLowerCase(), + ); + + if (filteredData.length === 0) { + throw new Error(`No price feed found for ${args.tokenSymbol}`); + } + + return filteredData[0].id; + } + + /** + * Fetches the price from Pyth given a Pyth price feed ID. + * + * @param args - The arguments for the action. + * @returns The price as a string. + */ + @CreateAction({ + name: "fetch_price", + description: `Fetch the price of a given price feed from Pyth. + +Inputs: +- Pyth price feed ID + +Important notes: +- Do not assume that a random ID is a Pyth price feed ID. If you are confused, ask a clarifying question. +- This action only fetches price inputs from Pyth price feeds. No other source. +- If you are asked to fetch the price from Pyth for a ticker symbol such as BTC, you must first use the pyth_fetch_price_feed_id +action to retrieve the price feed ID before invoking the pyth_Fetch_price action +`, + schema: PythFetchPriceSchema, + }) + async fetchPrice(args: z.infer): Promise { + const url = `https://hermes.pyth.network/v2/updates/price/latest?ids[]=${args.priceFeedID}`; + const response = await fetch(url); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + const parsedData = data.parsed; + + if (parsedData.length === 0) { + throw new Error(`No price data found for ${args.priceFeedID}`); + } + + const priceInfo = parsedData[0].price; + const price = BigInt(priceInfo.price); + const exponent = priceInfo.expo; + + if (exponent < 0) { + const adjustedPrice = price * BigInt(100); + const divisor = BigInt(10) ** BigInt(-exponent); + const scaledPrice = adjustedPrice / BigInt(divisor); + const priceStr = scaledPrice.toString(); + const formattedPrice = `${priceStr.slice(0, -2)}.${priceStr.slice(-2)}`; + return formattedPrice.startsWith(".") ? `0${formattedPrice}` : formattedPrice; + } + + const scaledPrice = price / BigInt(10) ** BigInt(exponent); + return scaledPrice.toString(); + } + + /** + * Checks if the Pyth action provider supports the given network. + * + * @returns True if the Pyth action provider supports the network, false otherwise. + */ + supportsNetwork = () => true; +} + +export const pythActionProvider = () => new PythActionProvider(); diff --git a/typescript/agentkit/src/action-providers/pyth/schemas.ts b/typescript/agentkit/src/action-providers/pyth/schemas.ts new file mode 100644 index 000000000..4ef3b2b8b --- /dev/null +++ b/typescript/agentkit/src/action-providers/pyth/schemas.ts @@ -0,0 +1,19 @@ +import { z } from "zod"; + +/** + * Input schema for Pyth fetch price feed ID action. + */ +export const PythFetchPriceFeedIDSchema = z + .object({ + tokenSymbol: z.string().describe("The token symbol to fetch the price feed ID for"), + }) + .strict(); + +/** + * Input schema for Pyth fetch price action. + */ +export const PythFetchPriceSchema = z + .object({ + priceFeedID: z.string().describe("The price feed ID to fetch the price for"), + }) + .strict(); diff --git a/typescript/agentkit/src/action-providers/twitter/README.md b/typescript/agentkit/src/action-providers/twitter/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/typescript/agentkit/src/action-providers/twitter/index.ts b/typescript/agentkit/src/action-providers/twitter/index.ts new file mode 100644 index 000000000..71f5928ab --- /dev/null +++ b/typescript/agentkit/src/action-providers/twitter/index.ts @@ -0,0 +1,2 @@ +export * from "./schemas"; +export * from "./twitterActionProvider"; diff --git a/typescript/agentkit/src/action-providers/twitter/schemas.ts b/typescript/agentkit/src/action-providers/twitter/schemas.ts new file mode 100644 index 000000000..67309df9b --- /dev/null +++ b/typescript/agentkit/src/action-providers/twitter/schemas.ts @@ -0,0 +1,45 @@ +import { z } from "zod"; + +/** + * Input schema for retrieving account details. + */ +export const TwitterAccountDetailsSchema = z + .object({}) + .strip() + .describe("Input schema for retrieving account details"); + +/** + * Input schema for retrieving account mentions. + */ +export const TwitterAccountMentionsSchema = z + .object({ + userId: z + .string() + .min(1, "Account ID is required.") + .describe("The Twitter (X) user id to return mentions for"), + }) + .strip() + .describe("Input schema for retrieving account mentions"); + +/** + * Input schema for posting a tweet. + */ +export const TwitterPostTweetSchema = z + .object({ + tweet: z.string().max(280, "Tweet must be a maximum of 280 characters."), + }) + .strip() + .describe("Input schema for posting a tweet"); + +/** + * Input schema for posting a tweet reply. + */ +export const TwitterPostTweetReplySchema = z + .object({ + tweetId: z.string().describe("The id of the tweet to reply to"), + tweetReply: z + .string() + .max(280, "The reply to the tweet which must be a maximum of 280 characters."), + }) + .strip() + .describe("Input schema for posting a tweet reply"); diff --git a/typescript/agentkit/src/action-providers/twitter/twitterActionProvider.test.ts b/typescript/agentkit/src/action-providers/twitter/twitterActionProvider.test.ts new file mode 100644 index 000000000..625390249 --- /dev/null +++ b/typescript/agentkit/src/action-providers/twitter/twitterActionProvider.test.ts @@ -0,0 +1,226 @@ +import { TwitterApi, TwitterApiv2 } from "twitter-api-v2"; +import { TwitterActionProvider } from "./twitterActionProvider"; +import { TweetUserMentionTimelineV2Paginator } from "twitter-api-v2"; + +const MOCK_CONFIG = { + apiKey: "test-api-key", + apiSecret: "test-api-secret", + accessToken: "test-access-token", + accessTokenSecret: "test-access-token-secret", +}; + +const MOCK_ID = "1853889445319331840"; +const MOCK_NAME = "CDP Agentkit"; +const MOCK_USERNAME = "CDPAgentkit"; +const MOCK_TWEET = "Hello, world!"; +const MOCK_TWEET_ID = "0123456789012345678"; +const MOCK_TWEET_REPLY = "Hello again!"; + +describe("TwitterActionProvider", () => { + let mockClient: jest.Mocked; + let provider: TwitterActionProvider; + + beforeEach(() => { + mockClient = { + me: jest.fn(), + userMentionTimeline: jest.fn(), + tweet: jest.fn(), + } as unknown as jest.Mocked; + + jest.spyOn(TwitterApi.prototype, "v2", "get").mockReturnValue(mockClient); + + provider = new TwitterActionProvider(MOCK_CONFIG); + }); + + describe("Constructor", () => { + it("should initialize with config values", () => { + expect(() => new TwitterActionProvider(MOCK_CONFIG)).not.toThrow(); + }); + + it("should initialize with environment variables", () => { + process.env.TWITTER_API_KEY = MOCK_CONFIG.apiKey; + process.env.TWITTER_API_SECRET = MOCK_CONFIG.apiSecret; + process.env.TWITTER_ACCESS_TOKEN = MOCK_CONFIG.accessToken; + process.env.TWITTER_ACCESS_TOKEN_SECRET = MOCK_CONFIG.accessTokenSecret; + + expect(() => new TwitterActionProvider()).not.toThrow(); + }); + + it("should throw error if no config or env vars", () => { + delete process.env.TWITTER_API_KEY; + delete process.env.TWITTER_API_SECRET; + delete process.env.TWITTER_ACCESS_TOKEN; + delete process.env.TWITTER_ACCESS_TOKEN_SECRET; + + expect(() => new TwitterActionProvider()).toThrow("TWITTER_API_KEY is not configured."); + }); + }); + + describe("Account Details Action", () => { + const mockResponse = { + data: { + id: MOCK_ID, + name: MOCK_NAME, + username: MOCK_USERNAME, + }, + }; + + beforeEach(() => { + mockClient.me.mockResolvedValue(mockResponse); + }); + + it("should successfully retrieve account details", async () => { + const response = await provider.accountDetails({}); + + expect(mockClient.me).toHaveBeenCalled(); + expect(response).toContain("Successfully retrieved authenticated user account details"); + expect(response).toContain( + JSON.stringify({ + ...mockResponse, + data: { ...mockResponse.data, url: `https://x.com/${MOCK_USERNAME}` }, + }), + ); + }); + + it("should handle errors when retrieving account details", async () => { + const error = new Error("An error has occurred"); + mockClient.me.mockRejectedValue(error); + + const response = await provider.accountDetails({}); + + expect(mockClient.me).toHaveBeenCalled(); + expect(response).toContain("Error retrieving authenticated user account details"); + expect(response).toContain(error.message); + }); + }); + + describe("Account Mentions Action", () => { + const mockResponse = { + _realData: { + data: [ + { + id: MOCK_TWEET_ID, + text: "@CDPAgentkit please reply!", + }, + ], + }, + data: [ + { + id: MOCK_TWEET_ID, + text: "@CDPAgentkit please reply!", + }, + ], + meta: {}, + _endpoint: {}, + tweets: [], + getItemArray: () => [], + refreshInstanceFromResult: () => mockResponse, + } as unknown as TweetUserMentionTimelineV2Paginator; + + beforeEach(() => { + mockClient.userMentionTimeline.mockResolvedValue(mockResponse); + }); + + it("should successfully retrieve account mentions", async () => { + const response = await provider.accountMentions({ userId: MOCK_ID }); + + expect(mockClient.userMentionTimeline).toHaveBeenCalledWith(MOCK_ID); + expect(response).toContain("Successfully retrieved account mentions"); + expect(response).toContain(JSON.stringify(mockResponse)); + }); + + it("should handle errors when retrieving mentions", async () => { + const error = new Error("An error has occurred"); + mockClient.userMentionTimeline.mockRejectedValue(error); + + const response = await provider.accountMentions({ userId: MOCK_ID }); + + expect(mockClient.userMentionTimeline).toHaveBeenCalledWith(MOCK_ID); + expect(response).toContain("Error retrieving authenticated account mentions"); + expect(response).toContain(error.message); + }); + }); + + describe("Post Tweet Action", () => { + const mockResponse = { + data: { + id: MOCK_TWEET_ID, + text: MOCK_TWEET, + edit_history_tweet_ids: [MOCK_TWEET_ID], + }, + }; + + beforeEach(() => { + mockClient.tweet.mockResolvedValue(mockResponse); + }); + + it("should successfully post a tweet", async () => { + const response = await provider.postTweet({ tweet: MOCK_TWEET }); + + expect(mockClient.tweet).toHaveBeenCalledWith(MOCK_TWEET); + expect(response).toContain("Successfully posted to Twitter"); + expect(response).toContain(JSON.stringify(mockResponse)); + }); + + it("should handle errors when posting a tweet", async () => { + const error = new Error("An error has occurred"); + mockClient.tweet.mockRejectedValue(error); + + const response = await provider.postTweet({ tweet: MOCK_TWEET }); + + expect(mockClient.tweet).toHaveBeenCalledWith(MOCK_TWEET); + expect(response).toContain("Error posting to Twitter"); + expect(response).toContain(error.message); + }); + }); + + describe("Post Tweet Reply Action", () => { + const mockResponse = { + data: { + id: MOCK_TWEET_ID, + text: MOCK_TWEET_REPLY, + edit_history_tweet_ids: [MOCK_TWEET_ID], + }, + }; + + beforeEach(() => { + mockClient.tweet.mockResolvedValue(mockResponse); + }); + + it("should successfully post a tweet reply", async () => { + const response = await provider.postTweetReply({ + tweetId: MOCK_TWEET_ID, + tweetReply: MOCK_TWEET_REPLY, + }); + + expect(mockClient.tweet).toHaveBeenCalledWith(MOCK_TWEET_REPLY, { + reply: { in_reply_to_tweet_id: MOCK_TWEET_ID }, + }); + expect(response).toContain("Successfully posted reply to Twitter"); + expect(response).toContain(JSON.stringify(mockResponse)); + }); + + it("should handle errors when posting a tweet reply", async () => { + const error = new Error("An error has occurred"); + mockClient.tweet.mockRejectedValue(error); + + const response = await provider.postTweetReply({ + tweetId: MOCK_TWEET_ID, + tweetReply: MOCK_TWEET_REPLY, + }); + + expect(mockClient.tweet).toHaveBeenCalledWith(MOCK_TWEET_REPLY, { + reply: { in_reply_to_tweet_id: MOCK_TWEET_ID }, + }); + expect(response).toContain("Error posting reply to Twitter"); + expect(response).toContain(error.message); + }); + }); + + describe("Network Support", () => { + it("should always return true for network support", () => { + expect(provider.supportsNetwork({ protocolFamily: "evm", networkId: "1" })).toBe(true); + expect(provider.supportsNetwork({ protocolFamily: "solana", networkId: "2" })).toBe(true); + }); + }); +}); diff --git a/typescript/agentkit/src/action-providers/twitter/twitterActionProvider.ts b/typescript/agentkit/src/action-providers/twitter/twitterActionProvider.ts new file mode 100644 index 000000000..bb1fdb070 --- /dev/null +++ b/typescript/agentkit/src/action-providers/twitter/twitterActionProvider.ts @@ -0,0 +1,213 @@ +import { z } from "zod"; +import { ActionProvider } from "../actionProvider"; +import { CreateAction } from "../actionDecorator"; +import { TwitterApi, TwitterApiTokens } from "twitter-api-v2"; +import { Network } from "../../network"; +import { + TwitterAccountDetailsSchema, + TwitterAccountMentionsSchema, + TwitterPostTweetSchema, + TwitterPostTweetReplySchema, +} from "./schemas"; + +/** + * Configuration options for the TwitterActionProvider. + */ +export interface TwitterActionProviderConfig { + /** + * Twitter API Key + */ + apiKey?: string; + + /** + * Twitter API Secret + */ + apiSecret?: string; + + /** + * Twitter Access Token + */ + accessToken?: string; + + /** + * Twitter Access Token Secret + */ + accessTokenSecret?: string; +} + +/** + * TwitterActionProvider is an action provider for Twitter (X) interactions. + * + * @augments ActionProvider + */ +export class TwitterActionProvider extends ActionProvider { + private readonly client: TwitterApi; + + /** + * Constructor for the TwitterActionProvider class. + * + * @param config - The configuration options for the TwitterActionProvider + */ + constructor(config: TwitterActionProviderConfig = {}) { + super("twitter", []); + + config.apiKey ||= process.env.TWITTER_API_KEY; + config.apiSecret ||= process.env.TWITTER_API_SECRET; + config.accessToken ||= process.env.TWITTER_ACCESS_TOKEN; + config.accessTokenSecret ||= process.env.TWITTER_ACCESS_TOKEN_SECRET; + + if (!config.apiKey) { + throw new Error("TWITTER_API_KEY is not configured."); + } + if (!config.apiSecret) { + throw new Error("TWITTER_API_SECRET is not configured."); + } + if (!config.accessToken) { + throw new Error("TWITTER_ACCESS_TOKEN is not configured."); + } + if (!config.accessTokenSecret) { + throw new Error("TWITTER_ACCESS_TOKEN_SECRET is not configured."); + } + + this.client = new TwitterApi({ + appKey: config.apiKey, + appSecret: config.apiSecret, + accessToken: config.accessToken, + accessSecret: config.accessTokenSecret, + } as TwitterApiTokens); + } + + /** + * Get account details for the currently authenticated Twitter (X) user. + * + * @param _ - Empty parameter object (not used) + * @returns A JSON string containing the account details or error message + */ + @CreateAction({ + name: "account_details", + description: ` +This tool will return account details for the currently authenticated Twitter (X) user context. + +A successful response will return a message with the api response as a json payload: + {"data": {"id": "1853889445319331840", "name": "CDP AgentKit", "username": "CDPAgentKit"}} + +A failure response will return a message with a Twitter API request error: + Error retrieving authenticated user account: 429 Too Many Requests`, + schema: TwitterAccountDetailsSchema, + }) + async accountDetails(_: z.infer): Promise { + try { + const response = await this.client.v2.me(); + response.data.url = `https://x.com/${response.data.username}`; + return `Successfully retrieved authenticated user account details:\n${JSON.stringify( + response, + )}`; + } catch (error) { + return `Error retrieving authenticated user account details: ${error}`; + } + } + + /** + * Get mentions for a specified Twitter (X) user. + * + * @param args - The arguments containing userId + * @returns A JSON string containing the mentions or error message + */ + @CreateAction({ + name: "account_mentions", + description: ` +This tool will return mentions for the specified Twitter (X) user id. + +A successful response will return a message with the API response as a JSON payload: + {"data": [{"id": "1857479287504584856", "text": "@CDPAgentKit reply"}]} + +A failure response will return a message with the Twitter API request error: + Error retrieving user mentions: 429 Too Many Requests`, + schema: TwitterAccountMentionsSchema, + }) + async accountMentions(args: z.infer): Promise { + try { + const response = await this.client.v2.userMentionTimeline(args.userId); + return `Successfully retrieved account mentions:\n${JSON.stringify(response)}`; + } catch (error) { + return `Error retrieving authenticated account mentions: ${error}`; + } + } + + /** + * Post a tweet on Twitter (X). + * + * @param args - The arguments containing the tweet text + * @returns A JSON string containing the posted tweet details or error message + */ + @CreateAction({ + name: "post_tweet", + description: ` +This tool will post a tweet on Twitter. The tool takes the text of the tweet as input. Tweets can be maximum 280 characters. + +A successful response will return a message with the API response as a JSON payload: + {"data": {"text": "hello, world!", "id": "0123456789012345678", "edit_history_tweet_ids": ["0123456789012345678"]}} + +A failure response will return a message with the Twitter API request error: + You are not allowed to create a Tweet with duplicate content.`, + schema: TwitterPostTweetSchema, + }) + async postTweet(args: z.infer): Promise { + try { + const response = await this.client.v2.tweet(args.tweet); + return `Successfully posted to Twitter:\n${JSON.stringify(response)}`; + } catch (error) { + return `Error posting to Twitter:\n${error}`; + } + } + + /** + * Post a reply to a tweet on Twitter (X). + * + * @param args - The arguments containing the reply text and tweet ID + * @returns A JSON string containing the posted reply details or error message + */ + @CreateAction({ + name: "post_tweet_reply", + description: ` +This tool will post a tweet on Twitter. The tool takes the text of the tweet as input. Tweets can be maximum 280 characters. + +A successful response will return a message with the API response as a JSON payload: + {"data": {"text": "hello, world!", "id": "0123456789012345678", "edit_history_tweet_ids": ["0123456789012345678"]}} + +A failure response will return a message with the Twitter API request error: + You are not allowed to create a Tweet with duplicate content.`, + schema: TwitterPostTweetReplySchema, + }) + async postTweetReply(args: z.infer): Promise { + try { + const response = await this.client.v2.tweet(args.tweetReply, { + reply: { in_reply_to_tweet_id: args.tweetId }, + }); + + return `Successfully posted reply to Twitter:\n${JSON.stringify(response)}`; + } catch (error) { + return `Error posting reply to Twitter: ${error}`; + } + } + + /** + * Checks if the Twitter action provider supports the given network. + * Twitter actions don't depend on blockchain networks, so always return true. + * + * @param _ - The network to check (not used) + * @returns Always returns true as Twitter actions are network-independent + */ + supportsNetwork(_: Network): boolean { + return true; + } +} + +/** + * Factory function to create a new TwitterActionProvider instance. + * + * @param config - The configuration options for the TwitterActionProvider + * @returns A new instance of TwitterActionProvider + */ +export const twitterActionProvider = (config: TwitterActionProviderConfig = {}) => + new TwitterActionProvider(config); diff --git a/typescript/agentkit/src/action-providers/wallet/README.md b/typescript/agentkit/src/action-providers/wallet/README.md new file mode 100644 index 000000000..10ecb5f61 --- /dev/null +++ b/typescript/agentkit/src/action-providers/wallet/README.md @@ -0,0 +1,3 @@ +# Wallet Action Provider + +This action provider provides actions for getting basic wallet information. diff --git a/typescript/agentkit/src/action-providers/wallet/index.ts b/typescript/agentkit/src/action-providers/wallet/index.ts new file mode 100644 index 000000000..169c7fbe8 --- /dev/null +++ b/typescript/agentkit/src/action-providers/wallet/index.ts @@ -0,0 +1 @@ +export * from "./walletActionProvider"; diff --git a/typescript/agentkit/src/action-providers/wallet/schemas.ts b/typescript/agentkit/src/action-providers/wallet/schemas.ts new file mode 100644 index 000000000..4f385c545 --- /dev/null +++ b/typescript/agentkit/src/action-providers/wallet/schemas.ts @@ -0,0 +1,18 @@ +import { z } from "zod"; + +/** + * Schema for the get_wallet_details action. + * This action doesn't require any input parameters, so we use an empty object schema. + */ +export const GetWalletDetailsSchema = z.object({}); + +/** + * Input schema for native transfer action. + */ +export const NativeTransferSchema = z + .object({ + to: z.string().describe("The destination address to receive the funds"), + value: z.string().describe("The amount to transfer in whole units e.g. 1 ETH or 0.00001 ETH"), + }) + .strip() + .describe("Instructions for transferring native tokens"); diff --git a/typescript/agentkit/src/action-providers/wallet/walletActionProvider.test.ts b/typescript/agentkit/src/action-providers/wallet/walletActionProvider.test.ts new file mode 100644 index 000000000..3629f0cb8 --- /dev/null +++ b/typescript/agentkit/src/action-providers/wallet/walletActionProvider.test.ts @@ -0,0 +1,145 @@ +import { WalletProvider } from "../../wallet-providers"; +import { walletActionProvider } from "./walletActionProvider"; +import { NativeTransferSchema } from "./schemas"; + +describe("Wallet Action Provider", () => { + const MOCK_ADDRESS = "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83"; + const MOCK_BALANCE = 1000000000000000000n; // 1 ETH in wei + const MOCK_NETWORK = { + protocolFamily: "evm", + networkId: "base-sepolia", + chainId: "123", + }; + const MOCK_PROVIDER_NAME = "TestWallet"; + const MOCK_TRANSACTION_HASH = "0xghijkl987654321"; + + let mockWallet: jest.Mocked; + const actionProvider = walletActionProvider(); + + beforeEach(() => { + mockWallet = { + getAddress: jest.fn().mockReturnValue(MOCK_ADDRESS), + getNetwork: jest.fn().mockReturnValue(MOCK_NETWORK), + getBalance: jest.fn().mockResolvedValue(MOCK_BALANCE), + getName: jest.fn().mockReturnValue(MOCK_PROVIDER_NAME), + nativeTransfer: jest.fn().mockResolvedValue(MOCK_TRANSACTION_HASH), + } as unknown as jest.Mocked; + }); + + describe("getWalletDetails", () => { + it("should successfully get wallet details", async () => { + const response = await actionProvider.getWalletDetails(mockWallet, {}); + + expect(mockWallet.getAddress).toHaveBeenCalled(); + expect(mockWallet.getNetwork).toHaveBeenCalled(); + expect(mockWallet.getBalance).toHaveBeenCalled(); + expect(mockWallet.getName).toHaveBeenCalled(); + + const expectedResponse = `Wallet Details: +- Provider: ${MOCK_PROVIDER_NAME} +- Address: ${MOCK_ADDRESS} +- Network: + * Protocol Family: ${MOCK_NETWORK.protocolFamily} + * Network ID: ${MOCK_NETWORK.networkId} + * Chain ID: ${MOCK_NETWORK.chainId} +- ETH Balance: 1.000000 ETH +- Native Balance: ${MOCK_BALANCE.toString()} WEI`; + + expect(response).toBe(expectedResponse); + }); + + it("should handle missing network IDs gracefully", async () => { + mockWallet.getNetwork.mockReturnValue({ + protocolFamily: "evm", + }); + + const response = await actionProvider.getWalletDetails(mockWallet, {}); + + expect(response).toContain("Network ID: N/A"); + expect(response).toContain("Chain ID: N/A"); + }); + + it("should handle errors when getting wallet details", async () => { + const error = new Error("Failed to get wallet details"); + mockWallet.getBalance.mockRejectedValue(error); + + const response = await actionProvider.getWalletDetails(mockWallet, {}); + expect(response).toBe(`Error getting wallet details: ${error}`); + }); + }); + + describe("Native Transfer", () => { + const MOCK_AMOUNT = "1.5"; // 1.5 ETH + const MOCK_DESTINATION = "0x321"; + + it("should successfully parse valid input", () => { + const validInput = { + to: MOCK_DESTINATION, + value: MOCK_AMOUNT, + }; + + const result = NativeTransferSchema.safeParse(validInput); + + expect(result.success).toBe(true); + if (result.success) { + expect(result.data).toEqual(validInput); + } + }); + + it("should fail parsing empty input", () => { + const emptyInput = {}; + const result = NativeTransferSchema.safeParse(emptyInput); + + expect(result.success).toBe(false); + }); + + it("should successfully transfer assets", async () => { + const args = { + to: MOCK_DESTINATION, + value: MOCK_AMOUNT, + }; + + const response = await actionProvider.nativeTransfer(mockWallet, args); + + expect(mockWallet.nativeTransfer).toHaveBeenCalledWith(MOCK_DESTINATION, MOCK_AMOUNT); + expect(response).toBe( + `Transferred ${MOCK_AMOUNT} ETH to ${MOCK_DESTINATION}.\nTransaction hash: ${MOCK_TRANSACTION_HASH}`, + ); + }); + + it("should handle transfer errors", async () => { + const args = { + to: MOCK_DESTINATION, + value: MOCK_AMOUNT, + }; + + const error = new Error("Failed to execute transfer"); + mockWallet.nativeTransfer.mockRejectedValue(error); + + const response = await actionProvider.nativeTransfer(mockWallet, args); + expect(response).toBe(`Error transferring the asset: ${error}`); + }); + }); + + describe("supportsNetwork", () => { + it("should return true for any network", () => { + const evmNetwork = { protocolFamily: "evm", networkId: "base-sepolia" }; + const solanaNetwork = { protocolFamily: "solana", networkId: "mainnet" }; + const bitcoinNetwork = { protocolFamily: "bitcoin", networkId: "mainnet" }; + + expect(actionProvider.supportsNetwork(evmNetwork)).toBe(true); + expect(actionProvider.supportsNetwork(solanaNetwork)).toBe(true); + expect(actionProvider.supportsNetwork(bitcoinNetwork)).toBe(true); + }); + }); + + describe("action provider setup", () => { + it("should have the correct name", () => { + expect(actionProvider.name).toBe("wallet"); + }); + + it("should have empty actionProviders array", () => { + expect(actionProvider.actionProviders).toEqual([]); + }); + }); +}); diff --git a/typescript/agentkit/src/action-providers/wallet/walletActionProvider.ts b/typescript/agentkit/src/action-providers/wallet/walletActionProvider.ts new file mode 100644 index 000000000..a066e0612 --- /dev/null +++ b/typescript/agentkit/src/action-providers/wallet/walletActionProvider.ts @@ -0,0 +1,118 @@ +import { Decimal } from "decimal.js"; +import { z } from "zod"; + +import { CreateAction } from "../actionDecorator"; +import { ActionProvider } from "../actionProvider"; +import { WalletProvider } from "../../wallet-providers"; +import { Network } from "../../network"; + +import { NativeTransferSchema, GetWalletDetailsSchema } from "./schemas"; + +/** + * WalletActionProvider provides actions for getting basic wallet information. + */ +export class WalletActionProvider extends ActionProvider { + /** + * Constructor for the WalletActionProvider. + */ + constructor() { + super("wallet", []); + } + + /** + * Gets the details of the connected wallet including address, network, and balance. + * + * @param walletProvider - The wallet provider to get the details from. + * @param _ - Empty args object (not used). + * @returns A formatted string containing the wallet details. + */ + @CreateAction({ + name: "get_wallet_details", + description: ` + This tool will return the details of the connected wallet including: + - Wallet address + - Network information (protocol family, network ID, chain ID) + - ETH token balance + - Native token balance + - Wallet provider name + `, + schema: GetWalletDetailsSchema, + }) + async getWalletDetails( + walletProvider: WalletProvider, + _: z.infer, + ): Promise { + try { + const address = walletProvider.getAddress(); + const network = walletProvider.getNetwork(); + const balance = await walletProvider.getBalance(); + const name = walletProvider.getName(); + + // Convert balance from Wei to ETH using Decimal for precision + const ethBalance = new Decimal(balance.toString()).div(new Decimal(10).pow(18)); + + return `Wallet Details: +- Provider: ${name} +- Address: ${address} +- Network: + * Protocol Family: ${network.protocolFamily} + * Network ID: ${network.networkId || "N/A"} + * Chain ID: ${network.chainId || "N/A"} +- ETH Balance: ${ethBalance.toFixed(6)} ETH +- Native Balance: ${balance.toString()} WEI`; + } catch (error) { + return `Error getting wallet details: ${error}`; + } + } + + /** + * Transfers a specified amount of an asset to a destination onchain. + * + * @param walletProvider - The wallet provider to transfer from. + * @param args - The input arguments for the action. + * @returns A message containing the transfer details. + */ + @CreateAction({ + name: "native_transfer", + description: ` +This tool will transfer native tokens from the wallet to another onchain address. + +It takes the following inputs: +- amount: The amount to transfer in whole units e.g. 1 ETH or 0.00001 ETH +- destination: The address to receive the funds + +Important notes: +- Ensure sufficient balance of the input asset before transferring +- Ensure there is sufficient native token balance for gas fees +`, + schema: NativeTransferSchema, + }) + async nativeTransfer( + walletProvider: WalletProvider, + args: z.infer, + ): Promise { + try { + const result = await walletProvider.nativeTransfer(args.to as `0x${string}`, args.value); + + return `Transferred ${args.value} ETH to ${args.to}.\nTransaction hash: ${result}`; + } catch (error) { + return `Error transferring the asset: ${error}`; + } + } + + /** + * Checks if the wallet action provider supports the given network. + * Since wallet actions are network-agnostic, this always returns true. + * + * @param _ - The network to check. + * @returns True, as wallet actions are supported on all networks. + */ + supportsNetwork = (_: Network): boolean => true; +} + +/** + * Factory function to create a new WalletActionProvider instance. + * + * @returns A new WalletActionProvider instance. + */ +export const walletActionProvider = () => new WalletActionProvider(); diff --git a/typescript/agentkit/src/action-providers/weth/constants.ts b/typescript/agentkit/src/action-providers/weth/constants.ts new file mode 100644 index 000000000..d4d7fcd14 --- /dev/null +++ b/typescript/agentkit/src/action-providers/weth/constants.ts @@ -0,0 +1,27 @@ +export const WETH_ADDRESS = "0x4200000000000000000000000000000000000006"; + +export const WETH_ABI = [ + { + inputs: [], + name: "deposit", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + name: "account", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; diff --git a/typescript/agentkit/src/action-providers/weth/index.ts b/typescript/agentkit/src/action-providers/weth/index.ts new file mode 100644 index 000000000..695a11918 --- /dev/null +++ b/typescript/agentkit/src/action-providers/weth/index.ts @@ -0,0 +1 @@ +export * from "./wethActionProvider"; diff --git a/typescript/agentkit/src/action-providers/weth/schemas.ts b/typescript/agentkit/src/action-providers/weth/schemas.ts new file mode 100644 index 000000000..33a96a3d9 --- /dev/null +++ b/typescript/agentkit/src/action-providers/weth/schemas.ts @@ -0,0 +1,8 @@ +import { z } from "zod"; + +export const WrapEthSchema = z + .object({ + amountToWrap: z.string().describe("Amount of ETH to wrap in wei"), + }) + .strip() + .describe("Instructions for wrapping ETH to WETH"); diff --git a/typescript/agentkit/src/action-providers/weth/wethActionProvider.test.ts b/typescript/agentkit/src/action-providers/weth/wethActionProvider.test.ts new file mode 100644 index 000000000..72961bd7b --- /dev/null +++ b/typescript/agentkit/src/action-providers/weth/wethActionProvider.test.ts @@ -0,0 +1,112 @@ +import { WrapEthSchema } from "./schemas"; +import { EvmWalletProvider } from "../../wallet-providers"; +import { encodeFunctionData } from "viem"; +import { WETH_ABI, WETH_ADDRESS } from "./constants"; +import { wethActionProvider } from "./wethActionProvider"; + +const MOCK_AMOUNT = "15"; +const MOCK_ADDRESS = "0x1234567890123456789012345678901234543210"; + +describe("Wrap Eth Schema", () => { + it("should successfully parse valid input", () => { + const validInput = { + amountToWrap: MOCK_AMOUNT, + }; + + const result = WrapEthSchema.safeParse(validInput); + + expect(result.success).toBe(true); + expect(result.data).toEqual(validInput); + }); + + it("should fail parsing empty input", () => { + const emptyInput = {}; + const result = WrapEthSchema.safeParse(emptyInput); + + expect(result.success).toBe(false); + }); +}); + +describe("Wrap Eth Action", () => { + let mockWallet: jest.Mocked; + const actionProvider = wethActionProvider(); + + beforeEach(async () => { + mockWallet = { + getAddress: jest.fn().mockReturnValue(MOCK_ADDRESS), + sendTransaction: jest.fn(), + waitForTransactionReceipt: jest.fn(), + } as unknown as jest.Mocked; + }); + + it("should successfully respond", async () => { + const args = { + amountToWrap: MOCK_AMOUNT, + }; + + const hash = "0x1234567890123456789012345678901234567890"; + mockWallet.sendTransaction.mockResolvedValue(hash); + + const response = await actionProvider.wrapEth(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: WETH_ADDRESS, + data: encodeFunctionData({ + abi: WETH_ABI, + functionName: "deposit", + }), + value: BigInt(MOCK_AMOUNT), + }); + expect(response).toContain(`Wrapped ETH with transaction hash: ${hash}`); + }); + + it("should fail with an error", async () => { + const args = { + amountToWrap: MOCK_AMOUNT, + }; + + const error = new Error("Failed to wrap ETH"); + mockWallet.sendTransaction.mockRejectedValue(error); + + const response = await actionProvider.wrapEth(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: WETH_ADDRESS, + data: encodeFunctionData({ + abi: WETH_ABI, + functionName: "deposit", + }), + value: BigInt(MOCK_AMOUNT), + }); + + expect(response).toContain(`Error wrapping ETH: ${error}`); + }); +}); + +describe("supportsNetwork", () => { + const actionProvider = wethActionProvider(); + + it("should return true for base-mainnet", () => { + const result = actionProvider.supportsNetwork({ + protocolFamily: "evm", + networkId: "base-mainnet", + }); + expect(result).toBe(true); + }); + + it("should return true for base-sepolia", () => { + const result = actionProvider.supportsNetwork({ + protocolFamily: "evm", + networkId: "base-sepolia", + }); + expect(result).toBe(true); + }); + + it("should return false for non-base networks", () => { + const result = actionProvider.supportsNetwork({ + protocolFamily: "evm", + networkId: "ethereum-mainnet", + }); + expect(result).toBe(false); + }); +}); diff --git a/typescript/agentkit/src/action-providers/weth/wethActionProvider.ts b/typescript/agentkit/src/action-providers/weth/wethActionProvider.ts new file mode 100644 index 000000000..6915d0763 --- /dev/null +++ b/typescript/agentkit/src/action-providers/weth/wethActionProvider.ts @@ -0,0 +1,80 @@ +import { z } from "zod"; +import { ActionProvider } from "../actionProvider"; +import { Network } from "../../network"; +import { CreateAction } from "../actionDecorator"; +import { WrapEthSchema } from "./schemas"; +import { WETH_ABI, WETH_ADDRESS } from "./constants"; +import { encodeFunctionData, Hex } from "viem"; +import { EvmWalletProvider } from "../../wallet-providers"; + +/** + * WethActionProvider is an action provider for WETH. + */ +export class WethActionProvider extends ActionProvider { + /** + * Constructor for the WethActionProvider. + */ + constructor() { + super("weth", []); + } + + /** + * Wraps ETH to WETH. + * + * @param walletProvider - The wallet provider to use for the action. + * @param args - The input arguments for the action. + * @returns A message containing the transaction hash. + */ + @CreateAction({ + name: "wrap_eth", + description: ` + This tool can only be used to wrap ETH to WETH. +Do not use this tool for any other purpose, or trading other assets. + +Inputs: +- Amount of ETH to wrap. + +Important notes: +- The amount is a string and cannot have any decimal points, since the unit of measurement is wei. +- Make sure to use the exact amount provided, and if there's any doubt, check by getting more information before continuing with the action. +- 1 wei = 0.000000000000000001 WETH +- Minimum purchase amount is 100000000000000 wei (0.0000001 WETH) +- Only supported on the following networks: + - Base Sepolia (ie, 'base-sepolia') + - Base Mainnet (ie, 'base', 'base-mainnet') +`, + schema: WrapEthSchema, + }) + async wrapEth( + walletProvider: EvmWalletProvider, + args: z.infer, + ): Promise { + try { + const hash = await walletProvider.sendTransaction({ + to: WETH_ADDRESS as Hex, + data: encodeFunctionData({ + abi: WETH_ABI, + functionName: "deposit", + }), + value: BigInt(args.amountToWrap), + }); + + await walletProvider.waitForTransactionReceipt(hash); + + return `Wrapped ETH with transaction hash: ${hash}`; + } catch (error) { + return `Error wrapping ETH: ${error}`; + } + } + + /** + * Checks if the Weth action provider supports the given network. + * + * @param network - The network to check. + * @returns True if the Weth action provider supports the network, false otherwise. + */ + supportsNetwork = (network: Network) => + network.networkId === "base-mainnet" || network.networkId === "base-sepolia"; +} + +export const wethActionProvider = () => new WethActionProvider(); diff --git a/typescript/agentkit/src/action-providers/wow/README.md b/typescript/agentkit/src/action-providers/wow/README.md new file mode 100644 index 000000000..32b59d4f9 --- /dev/null +++ b/typescript/agentkit/src/action-providers/wow/README.md @@ -0,0 +1 @@ +# WOW Action Provider \ No newline at end of file diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/constants.ts b/typescript/agentkit/src/action-providers/wow/constants.ts similarity index 99% rename from cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/constants.ts rename to typescript/agentkit/src/action-providers/wow/constants.ts index f915ca58b..a623f3af6 100644 --- a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/constants.ts +++ b/typescript/agentkit/src/action-providers/wow/constants.ts @@ -1,5 +1,7 @@ import type { Abi } from "abitype"; +export const SUPPORTED_NETWORKS = ["base-mainnet"]; + export const WOW_FACTORY_ABI: Abi = [ { type: "constructor", @@ -798,7 +800,7 @@ export const WOW_ABI: Abi = [ type: "function", }, { stateMutability: "payable", type: "receive" }, -]; +] as const; export const WOW_FACTORY_CONTRACT_ADDRESSES: Record = { "base-sepolia": "0x04870e22fa217Cb16aa00501D7D5253B8838C1eA", diff --git a/typescript/agentkit/src/action-providers/wow/index.ts b/typescript/agentkit/src/action-providers/wow/index.ts new file mode 100644 index 000000000..796932b35 --- /dev/null +++ b/typescript/agentkit/src/action-providers/wow/index.ts @@ -0,0 +1,2 @@ +export * from "./schemas"; +export * from "./wowActionProvider"; diff --git a/typescript/agentkit/src/action-providers/wow/schemas.ts b/typescript/agentkit/src/action-providers/wow/schemas.ts new file mode 100644 index 000000000..4a0196c07 --- /dev/null +++ b/typescript/agentkit/src/action-providers/wow/schemas.ts @@ -0,0 +1,57 @@ +import { z } from "zod"; +import { isAddress } from "viem"; + +const ethereumAddress = z.custom<`0x${string}`>( + val => typeof val === "string" && isAddress(val), + "Invalid address", +); + +/** + * Input schema for buying WOW tokens. + */ +export const WowBuyTokenInput = z + .object({ + contractAddress: ethereumAddress.describe("The WOW token contract address"), + amountEthInWei: z + .string() + .regex(/^\d+$/, "Must be a valid wei amount") + .describe("Amount of ETH to spend (in wei)"), + }) + .strip() + .describe("Instructions for buying WOW tokens"); + +/** + * Input schema for creating WOW tokens. + */ +export const WowCreateTokenInput = z + .object({ + name: z.string().min(1).describe("The name of the token to create, e.g. WowCoin"), + symbol: z.string().min(1).describe("The symbol of the token to create, e.g. WOW"), + tokenUri: z + .string() + .url() + .optional() + .describe( + "The URI of the token metadata to store on IPFS, e.g. ipfs://QmY1GqprFYvojCcUEKgqHeDj9uhZD9jmYGrQTfA9vAE78J", + ), + }) + .strip() + .describe("Instructions for creating a WOW token"); + +/** + * Input schema for selling WOW tokens. + */ +export const WowSellTokenInput = z + .object({ + contractAddress: ethereumAddress.describe( + "The WOW token contract address, such as `0x036CbD53842c5426634e7929541eC2318f3dCF7e`", + ), + amountTokensInWei: z + .string() + .regex(/^\d+$/, "Must be a valid wei amount") + .describe( + "Amount of tokens to sell (in wei), meaning 1 is 1 wei or 0.000000000000000001 of the token", + ), + }) + .strip() + .describe("Instructions for selling WOW tokens"); diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/uniswap/constants.ts b/typescript/agentkit/src/action-providers/wow/uniswap/constants.ts similarity index 99% rename from cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/uniswap/constants.ts rename to typescript/agentkit/src/action-providers/wow/uniswap/constants.ts index 7e63ff175..9c9eb0ff9 100644 --- a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/uniswap/constants.ts +++ b/typescript/agentkit/src/action-providers/wow/uniswap/constants.ts @@ -51,7 +51,7 @@ export const UNISWAP_QUOTER_ABI: Abi = [ stateMutability: "nonpayable", type: "function", }, -]; +] as const; export const UNISWAP_V3_ABI: Abi = [ { @@ -97,4 +97,4 @@ export const UNISWAP_V3_ABI: Abi = [ stateMutability: "view", type: "function", }, -]; +] as const; diff --git a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/uniswap/utils.ts b/typescript/agentkit/src/action-providers/wow/uniswap/utils.ts similarity index 67% rename from cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/uniswap/utils.ts rename to typescript/agentkit/src/action-providers/wow/uniswap/utils.ts index aa45136c9..c725d0e18 100644 --- a/cdp-agentkit-core/typescript/src/actions/cdp/defi/wow/uniswap/utils.ts +++ b/typescript/agentkit/src/action-providers/wow/uniswap/utils.ts @@ -1,5 +1,5 @@ -import { readContract } from "@coinbase/coinbase-sdk"; import { formatEther, getAddress } from "viem"; +import { EvmWalletProvider } from "../../../wallet-providers"; import { ADDRESSES, WOW_ABI } from "../constants"; import { UNISWAP_QUOTER_ABI, UNISWAP_V3_ABI } from "./constants"; @@ -55,46 +55,44 @@ export function createPriceInfo(weiAmount: string, ethPriceInUsd: number): Price /** * Gets pool info for a given uniswap v3 pool address. * - * @param networkId - Network ID, either base-sepolia or base-mainnet + * @param wallet - The wallet provider to use for contract calls * @param poolAddress - Uniswap v3 pool address * @returns A PoolInfo object containing pool details */ -export async function getPoolInfo(networkId: string, poolAddress: string): Promise { +export async function getPoolInfo( + wallet: EvmWalletProvider, + poolAddress: string, +): Promise { try { const results = await Promise.all([ - readContract({ - networkId: networkId, - contractAddress: poolAddress as `0x${string}`, - method: "token0", - args: {}, + wallet.readContract({ + address: poolAddress as `0x${string}`, + functionName: "token0", + args: [], abi: UNISWAP_V3_ABI, }), - readContract({ - networkId: networkId, - contractAddress: poolAddress as `0x${string}`, - method: "token1", - args: {}, + wallet.readContract({ + address: poolAddress as `0x${string}`, + functionName: "token1", + args: [], abi: UNISWAP_V3_ABI, }), - readContract({ - networkId: networkId, - contractAddress: poolAddress as `0x${string}`, - method: "fee", - args: {}, + wallet.readContract({ + address: poolAddress as `0x${string}`, + functionName: "fee", + args: [], abi: UNISWAP_V3_ABI, }), - readContract({ - networkId: networkId, - contractAddress: poolAddress as `0x${string}`, - method: "liquidity", - args: {}, + wallet.readContract({ + address: poolAddress as `0x${string}`, + functionName: "liquidity", + args: [], abi: UNISWAP_V3_ABI, }), - readContract({ - networkId: networkId, - contractAddress: poolAddress as `0x${string}`, - method: "slot0", - args: {}, + wallet.readContract({ + address: poolAddress as `0x${string}`, + functionName: "slot0", + args: [], abi: UNISWAP_V3_ABI, }), ]); @@ -102,18 +100,16 @@ export async function getPoolInfo(networkId: string, poolAddress: string): Promi const [token0Result, token1Result, fee, liquidity, slot0] = results; const [balance0, balance1] = await Promise.all([ - readContract({ - networkId: networkId, - contractAddress: token0Result as `0x${string}`, - method: "balanceOf", - args: { account: poolAddress }, + wallet.readContract({ + address: token0Result as `0x${string}`, + functionName: "balanceOf", + args: [poolAddress], abi: WOW_ABI, }), - readContract({ - networkId: networkId, - contractAddress: token1Result as `0x${string}`, - method: "balanceOf", - args: { account: poolAddress }, + wallet.readContract({ + address: token1Result as `0x${string}`, + functionName: "balanceOf", + args: [poolAddress], abi: WOW_ABI, }), ]); @@ -135,7 +131,7 @@ export async function getPoolInfo(networkId: string, poolAddress: string): Promi /** * Gets exact input quote from Uniswap. * - * @param networkId - Network ID, either base-sepolia or base-mainnet + * @param wallet - The wallet provider to use for contract calls * @param tokenIn - Token address to swap from * @param tokenOut - Token address to swap to * @param amountIn - Amount of tokens to swap (in Wei) @@ -143,24 +139,26 @@ export async function getPoolInfo(networkId: string, poolAddress: string): Promi * @returns Amount of tokens to receive (in Wei) */ export async function exactInputSingle( - networkId: string, + wallet: EvmWalletProvider, tokenIn: string, tokenOut: string, amountIn: string, fee: string, ): Promise { try { - const amount = await readContract({ - networkId: networkId, - contractAddress: ADDRESSES[networkId].UniswapQuoter as `0x${string}`, - method: "quoteExactInputSingle", - args: { - tokenIn: getAddress(tokenIn), - tokenOut: getAddress(tokenOut), - fee, - amountIn, - sqrtPriceLimitX96: 0, - }, + const networkId = wallet.getNetwork().networkId!; + const amount = await wallet.readContract({ + address: ADDRESSES[networkId].UniswapQuoter as `0x${string}`, + functionName: "quoteExactInputSingle", + args: [ + { + tokenIn: getAddress(tokenIn), + tokenOut: getAddress(tokenOut), + fee, + amountIn, + sqrtPriceLimitX96: 0, + }, + ], abi: UNISWAP_QUOTER_ABI, }); @@ -174,14 +172,14 @@ export async function exactInputSingle( /** * Gets Uniswap quote for buying or selling tokens. * - * @param networkId - Network ID, either base-sepolia or base-mainnet + * @param wallet - The wallet provider to use for contract calls * @param tokenAddress - Token address * @param amount - Amount of tokens (in Wei) * @param quoteType - 'buy' or 'sell' * @returns A Quote object containing quote details */ export async function getUniswapQuote( - networkId: string, + wallet: EvmWalletProvider, tokenAddress: string, amount: number, quoteType: "buy" | "sell", @@ -191,12 +189,13 @@ export async function getUniswapQuote( let balances: [number, number] | null = null; let quoteResult: number | null = null; const utilization = 0; + const networkId = wallet.getNetwork().networkId!; - const poolAddress = await getPoolAddress(tokenAddress); + const poolAddress = await getPoolAddress(wallet, tokenAddress); const invalidPoolError = !poolAddress ? "Invalid pool address" : null; try { - pool = await getPoolInfo(networkId, poolAddress); + pool = await getPoolInfo(wallet, poolAddress); const { token0, token1, balance0, balance1, fee } = pool; tokens = [token0, token1]; balances = [balance0, balance1]; @@ -211,13 +210,7 @@ export async function getUniswapQuote( const isInsufficientLiquidity = quoteType === "buy" && amount > balanceOut; if (!isInsufficientLiquidity) { - quoteResult = await exactInputSingle( - networkId, - tokenIn, - tokenOut, - String(amount), - String(fee), - ); + quoteResult = await exactInputSingle(wallet, tokenIn, tokenOut, String(amount), String(fee)); } } catch (error) { console.error("Error fetching quote:", error); @@ -260,16 +253,18 @@ export async function getUniswapQuote( /** * Checks if a token has graduated from the Zora Wow protocol. * - * @param networkId - Network ID, either base-sepolia or base-mainnet + * @param wallet - The wallet provider to use for contract calls * @param tokenAddress - Token address * @returns True if the token has graduated, false otherwise */ -export async function getHasGraduated(networkId: string, tokenAddress: string): Promise { - const marketType = await readContract({ - networkId: networkId, - contractAddress: tokenAddress as `0x${string}`, - method: "marketType", - args: {}, +export async function getHasGraduated( + wallet: EvmWalletProvider, + tokenAddress: string, +): Promise { + const marketType = await wallet.readContract({ + address: tokenAddress as `0x${string}`, + functionName: "marketType", + args: [], abi: WOW_ABI, }); return marketType === 1; @@ -278,15 +273,18 @@ export async function getHasGraduated(networkId: string, tokenAddress: string): /** * Fetches the uniswap v3 pool address for a given token. * + * @param wallet - The wallet provider to use for contract calls * @param tokenAddress - The address of the token contract * @returns The uniswap v3 pool address associated with the token */ -export async function getPoolAddress(tokenAddress: string): Promise { - const poolAddress = await readContract({ - networkId: "base-sepolia", - contractAddress: tokenAddress as `0x${string}`, - method: "poolAddress", - args: {}, +export async function getPoolAddress( + wallet: EvmWalletProvider, + tokenAddress: string, +): Promise { + const poolAddress = await wallet.readContract({ + address: tokenAddress as `0x${string}`, + functionName: "poolAddress", + args: [], abi: WOW_ABI, }); return poolAddress as string; diff --git a/typescript/agentkit/src/action-providers/wow/utils.ts b/typescript/agentkit/src/action-providers/wow/utils.ts new file mode 100644 index 000000000..811d25731 --- /dev/null +++ b/typescript/agentkit/src/action-providers/wow/utils.ts @@ -0,0 +1,82 @@ +import { EvmWalletProvider } from "../../wallet-providers"; +import { WOW_ABI } from "./constants"; +import { getHasGraduated, getUniswapQuote } from "./uniswap/utils"; + +/** + * Gets the current supply of a token. + * + * @param wallet - The wallet provider to use for contract calls + * @param tokenAddress - Address of the token contract + * @returns The current token supply + */ +export async function getCurrentSupply( + wallet: EvmWalletProvider, + tokenAddress: string, +): Promise { + const supply = await wallet.readContract({ + address: tokenAddress as `0x${string}`, + abi: WOW_ABI, + functionName: "totalSupply", + args: [], + }); + + return supply as string; +} + +/** + * Gets quote for buying tokens. + * + * @param wallet - The wallet provider to use for contract calls + * @param tokenAddress - Address of the token contract + * @param amountEthInWei - Amount of ETH to buy (in wei) + * @returns The buy quote amount + */ +export async function getBuyQuote( + wallet: EvmWalletProvider, + tokenAddress: string, + amountEthInWei: string, +): Promise { + const hasGraduated = await getHasGraduated(wallet, tokenAddress); + + const tokenQuote = ( + hasGraduated + ? (await getUniswapQuote(wallet, tokenAddress, Number(amountEthInWei), "buy")).amountOut + : await wallet.readContract({ + address: tokenAddress as `0x${string}`, + abi: WOW_ABI, + functionName: "getEthBuyQuote", + args: [amountEthInWei], + }) + ) as string | number; + + return tokenQuote.toString(); +} + +/** + * Gets quote for selling tokens. + * + * @param wallet - The wallet provider to use for contract calls + * @param tokenAddress - Address of the token contract + * @param amountTokensInWei - Amount of tokens to sell (in wei) + * @returns The sell quote amount + */ +export async function getSellQuote( + wallet: EvmWalletProvider, + tokenAddress: string, + amountTokensInWei: string, +): Promise { + const hasGraduated = await getHasGraduated(wallet, tokenAddress); + + const tokenQuote = ( + hasGraduated + ? (await getUniswapQuote(wallet, tokenAddress, Number(amountTokensInWei), "sell")).amountOut + : await wallet.readContract({ + address: tokenAddress as `0x${string}`, + abi: WOW_ABI, + functionName: "getTokenSellQuote", + args: [amountTokensInWei], + }) + ) as string | number; + + return tokenQuote.toString(); +} diff --git a/typescript/agentkit/src/action-providers/wow/wowActionProvider.test.ts b/typescript/agentkit/src/action-providers/wow/wowActionProvider.test.ts new file mode 100644 index 000000000..08948f632 --- /dev/null +++ b/typescript/agentkit/src/action-providers/wow/wowActionProvider.test.ts @@ -0,0 +1,337 @@ +import { encodeFunctionData } from "viem"; +import { EvmWalletProvider } from "../../wallet-providers"; +import { WowActionProvider } from "./wowActionProvider"; +import { WOW_ABI, WOW_FACTORY_ABI, GENERIC_TOKEN_METADATA_URI } from "./constants"; +import { getBuyQuote, getSellQuote } from "./utils"; +import { getHasGraduated } from "./uniswap/utils"; +import { WowBuyTokenInput, WowCreateTokenInput, WowSellTokenInput } from "./schemas"; + +jest.mock("./utils", () => ({ + getBuyQuote: jest.fn(), + getSellQuote: jest.fn(), +})); + +jest.mock("./uniswap/utils", () => ({ + getHasGraduated: jest.fn(), +})); + +describe("WowActionProvider", () => { + const MOCK_CONTRACT_ADDRESS = "0x1234567890123456789012345678901234567890" as `0x${string}`; + const INVALID_ADDRESS = "0xinvalid" as `0x${string}`; + const MOCK_AMOUNT_ETH_IN_WEI = BigInt("100000000000000000"); + const INVALID_WEI = "1.5"; // Wei amounts can't have decimals + const MOCK_AMOUNT_TOKENS_IN_WEI = BigInt("1000000000000000000"); + const MOCK_NAME = "Test Token"; + const MOCK_SYMBOL = "TEST"; + const MOCK_URI = "ipfs://QmY1GqprFYvojCcUEKgqHeDj9uhZD9jmYGrQTfA9vAE78J"; + const INVALID_URI = "not-a-url"; + const MOCK_TX_HASH = "0xabcdef1234567890"; + const MOCK_ADDRESS = "0x9876543210987654321098765432109876543210" as `0x${string}`; + + let provider: WowActionProvider; + let mockWallet: jest.Mocked; + + beforeEach(() => { + mockWallet = { + getAddress: jest.fn().mockReturnValue(MOCK_ADDRESS), + getNetwork: jest.fn().mockReturnValue({ protocolFamily: "evm", networkId: "base-sepolia" }), + sendTransaction: jest.fn().mockResolvedValue(MOCK_TX_HASH as `0x${string}`), + waitForTransactionReceipt: jest.fn().mockResolvedValue({}), + readContract: jest.fn(), + } as unknown as jest.Mocked; + + provider = new WowActionProvider(); + + (getBuyQuote as jest.Mock).mockResolvedValue("1000000000000000000"); + (getSellQuote as jest.Mock).mockResolvedValue("1000000000000000000"); + (getHasGraduated as jest.Mock).mockResolvedValue(true); + }); + + describe("Input Validation", () => { + describe("buyToken", () => { + it("should validate Ethereum addresses", () => { + const result = WowBuyTokenInput.safeParse({ + contractAddress: INVALID_ADDRESS, + amountEthInWei: MOCK_AMOUNT_ETH_IN_WEI.toString(), + }); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error.issues[0].message).toContain("Invalid address"); + } + }); + + it("should validate wei amount format", () => { + const result = WowBuyTokenInput.safeParse({ + contractAddress: MOCK_CONTRACT_ADDRESS, + amountEthInWei: INVALID_WEI, + }); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error.issues[0].message).toBe("Must be a valid wei amount"); + } + }); + + it("should accept valid input", () => { + const result = WowBuyTokenInput.safeParse({ + contractAddress: MOCK_CONTRACT_ADDRESS, + amountEthInWei: MOCK_AMOUNT_ETH_IN_WEI.toString(), + }); + expect(result.success).toBe(true); + }); + }); + + describe("createToken", () => { + it("should require non-empty name", () => { + const result = WowCreateTokenInput.safeParse({ + name: "", + symbol: MOCK_SYMBOL, + }); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error.issues[0].code).toBe("too_small"); + } + }); + + it("should require non-empty symbol", () => { + const result = WowCreateTokenInput.safeParse({ + name: MOCK_NAME, + symbol: "", + }); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error.issues[0].code).toBe("too_small"); + } + }); + + it("should validate tokenUri format if provided", () => { + const result = WowCreateTokenInput.safeParse({ + name: MOCK_NAME, + symbol: MOCK_SYMBOL, + tokenUri: INVALID_URI, + }); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error.issues[0].code).toBe("invalid_string"); + } + }); + + it("should accept valid input with proper URL", () => { + const result = WowCreateTokenInput.safeParse({ + name: MOCK_NAME, + symbol: MOCK_SYMBOL, + tokenUri: MOCK_URI, + }); + expect(result.success).toBe(true); + }); + }); + + describe("sellToken", () => { + it("should validate Ethereum addresses", () => { + const result = WowSellTokenInput.safeParse({ + contractAddress: INVALID_ADDRESS, + amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI.toString(), + }); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error.issues[0].message).toContain("Invalid address"); + } + }); + + it("should validate wei amount format", () => { + const result = WowSellTokenInput.safeParse({ + contractAddress: MOCK_CONTRACT_ADDRESS, + amountTokensInWei: INVALID_WEI, + }); + expect(result.success).toBe(false); + if (!result.success) { + expect(result.error.issues[0].message).toBe("Must be a valid wei amount"); + } + }); + + it("should accept valid input", () => { + const result = WowSellTokenInput.safeParse({ + contractAddress: MOCK_CONTRACT_ADDRESS, + amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI.toString(), + }); + expect(result.success).toBe(true); + }); + }); + }); + + describe("supportsNetwork", () => { + it("should return true for supported networks", () => { + expect(provider.supportsNetwork({ protocolFamily: "evm", networkId: "base-mainnet" })).toBe( + true, + ); + }); + + it("should return false for unsupported networks", () => { + expect(provider.supportsNetwork({ protocolFamily: "evm", networkId: "base-sepolia" })).toBe( + false, + ); + expect(provider.supportsNetwork({ protocolFamily: "evm", networkId: "ethereum" })).toBe( + false, + ); + expect( + provider.supportsNetwork({ protocolFamily: "bitcoin", networkId: "base-mainnet" }), + ).toBe(false); + }); + }); + + describe("buyToken", () => { + it("should successfully buy tokens", async () => { + const args = { + contractAddress: MOCK_CONTRACT_ADDRESS, + amountEthInWei: MOCK_AMOUNT_ETH_IN_WEI.toString(), + }; + + const response = await provider.buyToken(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: MOCK_CONTRACT_ADDRESS, + data: encodeFunctionData({ + abi: WOW_ABI, + functionName: "buy", + args: [ + MOCK_ADDRESS, + MOCK_ADDRESS, + "0x0000000000000000000000000000000000000000", + "", + 1n, + BigInt(Math.floor(Number("1000000000000000000") * 99)) / BigInt(100), + 0n, + ], + }), + value: MOCK_AMOUNT_ETH_IN_WEI, + }); + + expect(response).toContain("Purchased WoW ERC20 memecoin"); + expect(response).toContain(MOCK_TX_HASH); + }); + + it("should handle buy errors", async () => { + const args = { + contractAddress: MOCK_CONTRACT_ADDRESS, + amountEthInWei: MOCK_AMOUNT_ETH_IN_WEI.toString(), + }; + + const error = new Error("Buy failed"); + mockWallet.sendTransaction.mockRejectedValue(error); + + const response = await provider.buyToken(mockWallet, args); + expect(response).toContain(`Error buying Zora Wow ERC20 memecoin: ${error}`); + }); + }); + + describe("createToken", () => { + it("should successfully create a token", async () => { + const args = { + name: MOCK_NAME, + symbol: MOCK_SYMBOL, + tokenUri: MOCK_URI, + }; + + const response = await provider.createToken(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: expect.any(String), + data: encodeFunctionData({ + abi: WOW_FACTORY_ABI, + functionName: "deploy", + args: [ + MOCK_ADDRESS, + "0x0000000000000000000000000000000000000000", + MOCK_URI, + MOCK_NAME, + MOCK_SYMBOL, + ], + }), + }); + + expect(response).toContain(`Created WoW ERC20 memecoin ${MOCK_NAME}`); + expect(response).toContain(`with symbol ${MOCK_SYMBOL}`); + expect(response).toContain(MOCK_TX_HASH); + }); + + it("should use default token URI if not provided", async () => { + const args = { + name: MOCK_NAME, + symbol: MOCK_SYMBOL, + }; + + await provider.createToken(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: expect.any(String), + data: encodeFunctionData({ + abi: WOW_FACTORY_ABI, + functionName: "deploy", + args: [ + MOCK_ADDRESS, + "0x0000000000000000000000000000000000000000", + GENERIC_TOKEN_METADATA_URI, + MOCK_NAME, + MOCK_SYMBOL, + ], + }), + }); + }); + + it("should handle create errors", async () => { + const args = { + name: MOCK_NAME, + symbol: MOCK_SYMBOL, + }; + + const error = new Error("Create failed"); + mockWallet.sendTransaction.mockRejectedValue(error); + + const response = await provider.createToken(mockWallet, args); + expect(response).toContain(`Error creating Zora Wow ERC20 memecoin: ${error}`); + }); + }); + + describe("sellToken", () => { + it("should successfully sell tokens", async () => { + const args = { + contractAddress: MOCK_CONTRACT_ADDRESS, + amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI.toString(), + }; + + const response = await provider.sellToken(mockWallet, args); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: MOCK_CONTRACT_ADDRESS, + data: encodeFunctionData({ + abi: WOW_ABI, + functionName: "sell", + args: [ + MOCK_AMOUNT_TOKENS_IN_WEI, + MOCK_ADDRESS, + "0x0000000000000000000000000000000000000000", + "", + 1n, + BigInt(Math.floor(Number("1000000000000000000") * 98)) / BigInt(100), + 0n, + ], + }), + }); + + expect(response).toContain("Sold WoW ERC20 memecoin"); + expect(response).toContain(MOCK_TX_HASH); + }); + + it("should handle sell errors", async () => { + const args = { + contractAddress: MOCK_CONTRACT_ADDRESS, + amountTokensInWei: MOCK_AMOUNT_TOKENS_IN_WEI.toString(), + }; + + const error = new Error("Sell failed"); + mockWallet.sendTransaction.mockRejectedValue(error); + + const response = await provider.sellToken(mockWallet, args); + expect(response).toContain(`Error selling Zora Wow ERC20 memecoin: ${error}`); + }); + }); +}); diff --git a/typescript/agentkit/src/action-providers/wow/wowActionProvider.ts b/typescript/agentkit/src/action-providers/wow/wowActionProvider.ts new file mode 100644 index 000000000..98b983a8c --- /dev/null +++ b/typescript/agentkit/src/action-providers/wow/wowActionProvider.ts @@ -0,0 +1,231 @@ +import { z } from "zod"; +import { ActionProvider } from "../actionProvider"; +import { EvmWalletProvider } from "../../wallet-providers"; +import { CreateAction } from "../actionDecorator"; +import { Network } from "../../network"; +import { + SUPPORTED_NETWORKS, + WOW_ABI, + WOW_FACTORY_ABI, + GENERIC_TOKEN_METADATA_URI, + getFactoryAddress, +} from "./constants"; +import { getBuyQuote, getSellQuote } from "./utils"; +import { getHasGraduated } from "./uniswap/utils"; +import { encodeFunctionData } from "viem"; +import { WowBuyTokenInput, WowCreateTokenInput, WowSellTokenInput } from "./schemas"; + +/** + * WowActionProvider is an action provider for Wow protocol interactions. + */ +export class WowActionProvider extends ActionProvider { + /** + * Constructor for the WowActionProvider class. + */ + constructor() { + super("wow", []); + } + + /** + * Buys a Zora Wow ERC20 memecoin with ETH. + * + * @param wallet - The wallet to create the token from. + * @param args - The input arguments for the action. + * @returns A message containing the token purchase details. + */ + @CreateAction({ + name: "buy_token", + description: ` +This tool can only be used to buy a Zora Wow ERC20 memecoin (also can be referred to as a bonding curve token) with ETH. +Do not use this tool for any other purpose, or trading other assets. + +Inputs: +- WOW token contract address +- Address to receive the tokens +- Amount of ETH to spend (in wei) + +Important notes: +- The amount is a string and cannot have any decimal points, since the unit of measurement is wei. +- Make sure to use the exact amount provided, and if there's any doubt, check by getting more information before continuing with the action. +- 1 wei = 0.000000000000000001 ETH +- Minimum purchase amount is 100000000000000 wei (0.0000001 ETH) +- Only supported on the following networks: + - Base Sepolia (ie, 'base-sepolia') + - Base Mainnet (ie, 'base', 'base-mainnet')`, + schema: WowBuyTokenInput, + }) + async buyToken( + wallet: EvmWalletProvider, + args: z.infer, + ): Promise { + try { + const tokenQuote = await getBuyQuote(wallet, args.contractAddress, args.amountEthInWei); + + // Multiply by 99/100 and floor to get 99% of quote as minimum + const minTokens = BigInt(Math.floor(Number(tokenQuote) * 99)) / BigInt(100); + + const hasGraduated = await getHasGraduated(wallet, args.contractAddress); + + const data = encodeFunctionData({ + abi: WOW_ABI, + functionName: "buy", + args: [ + wallet.getAddress(), + wallet.getAddress(), + "0x0000000000000000000000000000000000000000", + "", + hasGraduated ? 1n : 0n, + minTokens, + 0n, + ], + }); + + const txHash = await wallet.sendTransaction({ + to: args.contractAddress as `0x${string}`, + data, + value: BigInt(args.amountEthInWei), + }); + + const receipt = await wallet.waitForTransactionReceipt(txHash); + + return `Purchased WoW ERC20 memecoin with transaction hash: ${txHash}, and receipt:\n${JSON.stringify(receipt)}`; + } catch (error) { + return `Error buying Zora Wow ERC20 memecoin: ${error}`; + } + } + + /** + * Creates a Zora Wow ERC20 memecoin. + * + * @param wallet - The wallet to create the token from. + * @param args - The input arguments for the action. + * @returns A message containing the token creation details. + */ + @CreateAction({ + name: "create_token", + description: ` +This tool can only be used to create a Zora Wow ERC20 memecoin (also can be referred to as a bonding curve token) using the WoW factory. +Do not use this tool for any other purpose, or for creating other types of tokens. + +Inputs: +- Token name (e.g. WowCoin) +- Token symbol (e.g. WOW) +- Token URI (optional) - Contains metadata about the token + +Important notes: +- Uses a bonding curve - no upfront liquidity needed +- Only supported on the following networks: + - Base Sepolia (ie, 'base-sepolia') + - Base Mainnet (ie, 'base', 'base-mainnet')`, + schema: WowCreateTokenInput, + }) + async createToken( + wallet: EvmWalletProvider, + args: z.infer, + ): Promise { + const factoryAddress = getFactoryAddress(wallet.getNetwork().networkId!); + + try { + const data = encodeFunctionData({ + abi: WOW_FACTORY_ABI, + functionName: "deploy", + args: [ + wallet.getAddress(), + "0x0000000000000000000000000000000000000000", + args.tokenUri || GENERIC_TOKEN_METADATA_URI, + args.name, + args.symbol, + ], + }); + + const txHash = await wallet.sendTransaction({ + to: factoryAddress as `0x${string}`, + data, + }); + + const receipt = await wallet.waitForTransactionReceipt(txHash); + + return `Created WoW ERC20 memecoin ${args.name} with symbol ${ + args.symbol + } on network ${wallet.getNetwork().networkId}.\nTransaction hash for the token creation: ${txHash}, and receipt:\n${JSON.stringify(receipt)}`; + } catch (error) { + return `Error creating Zora Wow ERC20 memecoin: ${error}`; + } + } + + /** + * Sells WOW tokens for ETH. + * + * @param wallet - The wallet to sell the tokens from. + * @param args - The input arguments for the action. + * @returns A message confirming the sale with the transaction hash. + */ + @CreateAction({ + name: "sell_token", + description: ` +This tool can only be used to sell a Zora Wow ERC20 memecoin (also can be referred to as a bonding curve token) for ETH. +Do not use this tool for any other purpose, or trading other assets. + +Inputs: +- WOW token contract address +- Amount of tokens to sell (in wei) + +Important notes: +- The amount is a string and cannot have any decimal points, since the unit of measurement is wei. +- Make sure to use the exact amount provided, and if there's any doubt, check by getting more information before continuing with the action. +- 1 wei = 0.000000000000000001 ETH +- Minimum purchase amount is 100000000000000 wei (0.0000001 ETH) +- Only supported on the following networks: + - Base Sepolia (ie, 'base-sepolia') + - Base Mainnet (ie, 'base', 'base-mainnet')`, + schema: WowSellTokenInput, + }) + async sellToken( + wallet: EvmWalletProvider, + args: z.infer, + ): Promise { + try { + const ethQuote = await getSellQuote(wallet, args.contractAddress, args.amountTokensInWei); + const hasGraduated = await getHasGraduated(wallet, args.contractAddress); + + // Multiply by 98/100 and floor to get 98% of quote as minimum + const minEth = BigInt(Math.floor(Number(ethQuote) * 98)) / BigInt(100); + + const data = encodeFunctionData({ + abi: WOW_ABI, + functionName: "sell", + args: [ + BigInt(args.amountTokensInWei), + wallet.getAddress(), + "0x0000000000000000000000000000000000000000", + "", + hasGraduated ? 1n : 0n, + minEth, + 0n, + ], + }); + + const txHash = await wallet.sendTransaction({ + to: args.contractAddress as `0x${string}`, + data, + }); + + const receipt = await wallet.waitForTransactionReceipt(txHash); + + return `Sold WoW ERC20 memecoin with transaction hash: ${txHash}, and receipt:\n${JSON.stringify(receipt)}`; + } catch (error) { + return `Error selling Zora Wow ERC20 memecoin: ${error}`; + } + } + + /** + * Checks if the Wow action provider supports the given network. + * + * @param network - The network to check. + * @returns True if the Wow action provider supports the network, false otherwise. + */ + supportsNetwork = (network: Network) => + network.protocolFamily === "evm" && SUPPORTED_NETWORKS.includes(network.networkId!); +} + +export const wowActionProvider = () => new WowActionProvider(); diff --git a/typescript/agentkit/src/agentkit.ts b/typescript/agentkit/src/agentkit.ts new file mode 100644 index 000000000..b81d82857 --- /dev/null +++ b/typescript/agentkit/src/agentkit.ts @@ -0,0 +1,81 @@ +import { WalletProvider, CdpWalletProvider } from "./wallet-providers"; +import { Action, ActionProvider, walletActionProvider } from "./action-providers"; + +/** + * Configuration options for AgentKit + */ +type AgentKitOptions = { + cdpApiKeyName?: string; + cdpApiKeyPrivateKey?: string; + walletProvider?: WalletProvider; + actionProviders?: ActionProvider[]; +}; + +/** + * AgentKit + */ +export class AgentKit { + private walletProvider: WalletProvider; + private actionProviders: ActionProvider[]; + + /** + * Initializes a new AgentKit instance + * + * @param config - Configuration options for the AgentKit + * @param config.walletProvider - The wallet provider to use + * @param config.actionProviders - The action providers to use + * @param config.actions - The actions to use + */ + private constructor(config: AgentKitOptions & { walletProvider: WalletProvider }) { + this.walletProvider = config.walletProvider; + this.actionProviders = config.actionProviders || [walletActionProvider()]; + } + + /** + * Initializes a new AgentKit instance + * + * @param config - Configuration options for the AgentKit + * @param config.walletProvider - The wallet provider to use + * @param config.actionProviders - The action providers to use + * @param config.actions - The actions to use + * + * @returns A new AgentKit instance + */ + public static async from( + config: AgentKitOptions = { actionProviders: [walletActionProvider()] }, + ): Promise { + let walletProvider: WalletProvider | undefined = config.walletProvider; + + if (!config.walletProvider) { + if (!config.cdpApiKeyName || !config.cdpApiKeyPrivateKey) { + throw new Error( + "cdpApiKeyName and cdpApiKeyPrivateKey are required if not providing a walletProvider", + ); + } + + walletProvider = await CdpWalletProvider.configureWithWallet({ + apiKeyName: config.cdpApiKeyName, + apiKeyPrivateKey: config.cdpApiKeyPrivateKey, + }); + } + + return new AgentKit({ ...config, walletProvider: walletProvider! }); + } + + /** + * Returns the actions available to the AgentKit. + * + * @returns An array of actions + */ + public getActions(): Action[] { + const actions: Action[] = []; + + for (const actionProvider of this.actionProviders) { + if (actionProvider.supportsNetwork(this.walletProvider.getNetwork())) { + actions.push(...actionProvider.getActions(this.walletProvider)); + } + } + + return actions; + } +} diff --git a/typescript/agentkit/src/analytics/index.ts b/typescript/agentkit/src/analytics/index.ts new file mode 100644 index 000000000..7633a79cb --- /dev/null +++ b/typescript/agentkit/src/analytics/index.ts @@ -0,0 +1 @@ +export * from "./sendAnalyticsEvent"; diff --git a/typescript/agentkit/src/analytics/sendAnalyticsEvent.ts b/typescript/agentkit/src/analytics/sendAnalyticsEvent.ts new file mode 100644 index 000000000..b0322092b --- /dev/null +++ b/typescript/agentkit/src/analytics/sendAnalyticsEvent.ts @@ -0,0 +1,77 @@ +import md5 from "md5"; + +/** + * The required data for an analytics event + * + * Accepts arbitrary additional fields + */ +type RequiredEventData = { + /** + * The event that took place, e.g. initialize_wallet_provider, agent_action_invocation + */ + action: string; + /** + * The component that the event took place in, e.g. wallet_provider, agent_action + */ + component: string; + /** + * The name of the event. This should match the name in AEC + */ + name: string; + /** + * The timestamp of the event. If not provided, the current time will be used. + */ + timestamp?: number; +} & Record; + +/** + * Sends an analytics event to the default endpoint + * + * @param event - The event data containing required action, component and name fields + * @returns Promise that resolves when the event is sent + */ +export async function sendAnalyticsEvent(event: RequiredEventData): Promise { + const timestamp = event.timestamp || Date.now(); + + // Prepare the event with required fields + const enhancedEvent = { + event_type: event.name, + platform: "server", + event_properties: { + component_type: event.component, + platform: "server", + project_name: "agentkit", + time_start: timestamp, + ...event, + }, + }; + + const events = [enhancedEvent]; + const stringifiedEventData = JSON.stringify(events); + const uploadTime = timestamp.toString(); + + // Calculate checksum inline + const checksum = md5(stringifiedEventData + uploadTime); + + const analyticsServiceData = { + e: stringifiedEventData, + checksum, + }; + + const apiEndpoint = "https://cca-lite.coinbase.com"; + const eventPath = "/amp"; + const eventEndPoint = `${apiEndpoint}${eventPath}`; + + const response = await fetch(eventEndPoint, { + method: "POST", + mode: "no-cors", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(analyticsServiceData), + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } +} diff --git a/typescript/agentkit/src/index.ts b/typescript/agentkit/src/index.ts new file mode 100644 index 000000000..b02942ff0 --- /dev/null +++ b/typescript/agentkit/src/index.ts @@ -0,0 +1,5 @@ +// Export CDP AgentKit +export { AgentKit } from "./agentkit"; + +export * from "./wallet-providers"; +export * from "./action-providers"; diff --git a/typescript/agentkit/src/network/index.ts b/typescript/agentkit/src/network/index.ts new file mode 100644 index 000000000..eea524d65 --- /dev/null +++ b/typescript/agentkit/src/network/index.ts @@ -0,0 +1 @@ +export * from "./types"; diff --git a/typescript/agentkit/src/network/network.ts b/typescript/agentkit/src/network/network.ts new file mode 100644 index 000000000..a26d9aa4f --- /dev/null +++ b/typescript/agentkit/src/network/network.ts @@ -0,0 +1,58 @@ +import { + Chain, + mainnet, + sepolia, + baseSepolia, + arbitrumSepolia, + optimismSepolia, + base, + arbitrum, + optimism, + polygonMumbai, + polygon, +} from "viem/chains"; + +/** + * Maps EVM chain IDs to Coinbase network IDs + */ +export const CHAIN_ID_TO_NETWORK_ID: Record = { + 1: "ethereum-mainnet", + 11155111: "ethereum-sepolia", + 137: "polygon-mainnet", + 80001: "polygon-mumbai", + 8453: "base-mainnet", + 84532: "base-sepolia", + 42161: "arbitrum-mainnet", + 421614: "arbitrum-sepolia", + 10: "optimism-mainnet", + 11155420: "optimism-sepolia", +}; + +/** + * Maps Coinbase network IDs to EVM chain IDs + */ +export const NETWORK_ID_TO_CHAIN_ID: Record = Object.entries( + CHAIN_ID_TO_NETWORK_ID, +).reduce( + (acc, [chainId, networkId]) => { + acc[networkId] = String(chainId); + return acc; + }, + {} as Record, +); + +/** + * Maps Coinbase network IDs to Viem chain objects + */ +export const NETWORK_ID_TO_VIEM_CHAIN: Record = { + "ethereum-mainnet": mainnet, + "ethereum-sepolia": sepolia, + "polygon-mainnet": polygon, + "polygon-mumbai": polygonMumbai, + "base-mainnet": base, + "base-sepolia": baseSepolia, + "arbitrum-mainnet": arbitrum, + "arbitrum-sepolia": arbitrumSepolia, + "optimism-mainnet": optimism, + "optimism-sepolia": optimismSepolia, +}; diff --git a/typescript/agentkit/src/network/types.ts b/typescript/agentkit/src/network/types.ts new file mode 100644 index 000000000..b39cb1244 --- /dev/null +++ b/typescript/agentkit/src/network/types.ts @@ -0,0 +1,19 @@ +/** + * Network is the network that the wallet provider is connected to. + */ +export interface Network { + /** + * The protocol family of the network. + */ + protocolFamily: string; + + /** + * The network ID of the network. + */ + networkId?: string; + + /** + * The chain ID of the network. + */ + chainId?: string; +} diff --git a/typescript/agentkit/src/utils.test.ts b/typescript/agentkit/src/utils.test.ts new file mode 100644 index 000000000..5475830e1 --- /dev/null +++ b/typescript/agentkit/src/utils.test.ts @@ -0,0 +1,70 @@ +import { encodeFunctionData } from "viem"; +import { EvmWalletProvider } from "./wallet-providers"; +import { approve } from "./utils"; + +const MOCK_TOKEN_ADDRESS = "0x1234567890123456789012345678901234567890"; +const MOCK_SPENDER_ADDRESS = "0x9876543210987654321098765432109876543210"; +const MOCK_AMOUNT = BigInt("1000000000000000000"); +const MOCK_TX_HASH = "0xabcdef1234567890"; +const MOCK_RECEIPT = { status: 1, blockNumber: 1234567 }; + +describe("utils", () => { + describe("approve", () => { + let mockWallet: jest.Mocked; + + beforeEach(() => { + mockWallet = { + sendTransaction: jest.fn().mockResolvedValue(MOCK_TX_HASH as `0x${string}`), + waitForTransactionReceipt: jest.fn().mockResolvedValue(MOCK_RECEIPT), + } as unknown as jest.Mocked; + }); + + it("should successfully approve tokens", async () => { + const response = await approve( + mockWallet, + MOCK_TOKEN_ADDRESS, + MOCK_SPENDER_ADDRESS, + MOCK_AMOUNT, + ); + + expect(mockWallet.sendTransaction).toHaveBeenCalledWith({ + to: MOCK_TOKEN_ADDRESS as `0x${string}`, + data: encodeFunctionData({ + abi: [ + { + inputs: [ + { name: "spender", type: "address" }, + { name: "amount", type: "uint256" }, + ], + name: "approve", + outputs: [{ name: "", type: "bool" }], + stateMutability: "nonpayable", + type: "function", + }, + ], + functionName: "approve", + args: [MOCK_SPENDER_ADDRESS as `0x${string}`, MOCK_AMOUNT], + }), + }); + + expect(mockWallet.waitForTransactionReceipt).toHaveBeenCalledWith(MOCK_TX_HASH); + expect(response).toBe( + `Successfully approved ${MOCK_SPENDER_ADDRESS} to spend ${MOCK_AMOUNT} tokens`, + ); + }); + + it("should handle approval errors", async () => { + const error = new Error("Failed to approve"); + mockWallet.sendTransaction.mockRejectedValue(error); + + const response = await approve( + mockWallet, + MOCK_TOKEN_ADDRESS, + MOCK_SPENDER_ADDRESS, + MOCK_AMOUNT, + ); + + expect(response).toBe(`Error approving tokens: ${error}`); + }); + }); +}); diff --git a/typescript/agentkit/src/utils.ts b/typescript/agentkit/src/utils.ts new file mode 100644 index 000000000..a7e07141c --- /dev/null +++ b/typescript/agentkit/src/utils.ts @@ -0,0 +1,50 @@ +import { encodeFunctionData } from "viem"; +import { EvmWalletProvider } from "./wallet-providers"; + +const ERC20_ABI = [ + { + inputs: [ + { name: "spender", type: "address" }, + { name: "amount", type: "uint256" }, + ], + name: "approve", + outputs: [{ name: "", type: "bool" }], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +/** + * Approves a spender to spend tokens on behalf of the owner + * + * @param wallet - The wallet provider + * @param tokenAddress - The address of the token contract + * @param spenderAddress - The address of the spender + * @param amount - The amount to approve in atomic units (wei) + * @returns A success message or error message + */ +export async function approve( + wallet: EvmWalletProvider, + tokenAddress: string, + spenderAddress: string, + amount: bigint, +): Promise { + try { + const data = encodeFunctionData({ + abi: ERC20_ABI, + functionName: "approve", + args: [spenderAddress as `0x${string}`, amount], + }); + + const txHash = await wallet.sendTransaction({ + to: tokenAddress as `0x${string}`, + data, + }); + + await wallet.waitForTransactionReceipt(txHash); + + return `Successfully approved ${spenderAddress} to spend ${amount} tokens`; + } catch (error) { + return `Error approving tokens: ${error}`; + } +} diff --git a/typescript/agentkit/src/wallet-providers/cdpWalletProvider.ts b/typescript/agentkit/src/wallet-providers/cdpWalletProvider.ts new file mode 100644 index 000000000..b0516afc8 --- /dev/null +++ b/typescript/agentkit/src/wallet-providers/cdpWalletProvider.ts @@ -0,0 +1,505 @@ +import { Decimal } from "decimal.js"; +import { + createPublicClient, + ReadContractParameters, + ReadContractReturnType, + serializeTransaction, + TransactionRequest, + TransactionSerializable, + http, + keccak256, + Signature, + PublicClient, +} from "viem"; +import { EvmWalletProvider } from "./evmWalletProvider"; +import { Network } from "../network"; +import { + Coinbase, + CreateERC20Options, + CreateTradeOptions, + ExternalAddress, + SmartContract, + Trade, + Wallet, + WalletData, + hashTypedDataMessage, + hashMessage, +} from "@coinbase/coinbase-sdk"; +import { NETWORK_ID_TO_CHAIN_ID, NETWORK_ID_TO_VIEM_CHAIN } from "../network/network"; + +/** + * Configuration options for the CDP Providers. + */ +export interface CdpProviderConfig { + /** + * The CDP API Key Name. + */ + apiKeyName?: string; + + /** + * The CDP API Key Private Key. + */ + apiKeyPrivateKey?: string; +} + +/** + * Configuration options for the CdpActionProvider. + */ +export interface CdpWalletProviderConfig extends CdpProviderConfig { + /** + * The CDP Wallet. + */ + wallet?: Wallet; + + /** + * The address of the wallet. + */ + address?: string; + + /** + * The network of the wallet. + */ + network?: Network; + + /** + * The network ID of the wallet. + */ + networkId?: string; +} + +/** + * Configuration options for the CDP Agentkit with a Wallet. + */ +interface ConfigureCdpAgentkitWithWalletOptions extends CdpWalletProviderConfig { + /** + * The data of the CDP Wallet as a JSON string. + */ + cdpWalletData?: string; + + /** + * The mnemonic phrase of the wallet. + */ + mnemonicPhrase?: string; +} + +/** + * A wallet provider that uses the Coinbase SDK. + */ +export class CdpWalletProvider extends EvmWalletProvider { + #cdpWallet?: Wallet; + #address?: string; + #network?: Network; + #publicClient: PublicClient; + + /** + * Constructs a new CdpWalletProvider. + * + * @param config - The configuration options for the CdpWalletProvider. + */ + private constructor(config: CdpWalletProviderConfig) { + super(); + + this.#cdpWallet = config.wallet; + this.#address = config.address; + this.#network = config.network; + this.#publicClient = createPublicClient({ + chain: NETWORK_ID_TO_VIEM_CHAIN[config.network!.networkId!], + transport: http(), + }); + } + + /** + * Configures a new CdpWalletProvider with a wallet. + * + * @param config - Optional configuration parameters + * @returns A Promise that resolves to a new CdpWalletProvider instance + * @throws Error if required environment variables are missing or wallet initialization fails + */ + public static async configureWithWallet( + config: ConfigureCdpAgentkitWithWalletOptions = {}, + ): Promise { + if (config.apiKeyName && config.apiKeyPrivateKey) { + Coinbase.configure({ apiKeyName: config.apiKeyName, privateKey: config.apiKeyPrivateKey }); + } else { + Coinbase.configureFromJson(); + } + + let wallet: Wallet; + + const mnemonicPhrase = config.mnemonicPhrase || process.env.MNEMONIC_PHRASE; + const networkId = config.networkId || process.env.NETWORK_ID || Coinbase.networks.BaseSepolia; + + try { + if (config.wallet) { + wallet = config.wallet; + } else if (config.cdpWalletData) { + const walletData = JSON.parse(config.cdpWalletData) as WalletData; + wallet = await Wallet.import(walletData); + } else if (mnemonicPhrase) { + wallet = await Wallet.import({ mnemonicPhrase: mnemonicPhrase }, networkId); + } else { + wallet = await Wallet.create({ networkId: networkId }); + } + } catch (error) { + throw new Error(`Failed to initialize wallet: ${error}`); + } + + const address = (await wallet.getDefaultAddress())?.getId(); + + const network = { + protocolFamily: "evm" as const, + chainId: NETWORK_ID_TO_CHAIN_ID[networkId], + networkId: networkId, + }; + + const cdpWalletProvider = new CdpWalletProvider({ + wallet, + address, + network, + }); + + return cdpWalletProvider; + } + + /** + * Signs a message. + * + * @param message - The message to sign. + * @returns The signed message. + */ + async signMessage(message: string): Promise<`0x${string}`> { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + const messageHash = hashMessage(message); + const payload = await this.#cdpWallet.createPayloadSignature(messageHash); + + return payload.getSignature() as `0x${string}`; + } + + /** + * Signs a typed data object. + * + * @param typedData - The typed data object to sign. + * @returns The signed typed data object. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async signTypedData(typedData: any): Promise<`0x${string}`> { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + const messageHash = hashTypedDataMessage( + typedData.domain!, + typedData.types!, + typedData.message!, + ); + + const payload = await this.#cdpWallet.createPayloadSignature(messageHash); + + return payload.getSignature() as `0x${string}`; + } + + /** + * Signs a transaction. + * + * @param transaction - The transaction to sign. + * @returns The signed transaction. + */ + async signTransaction(transaction: TransactionRequest): Promise<`0x${string}`> { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + const serializedTx = serializeTransaction(transaction as TransactionSerializable); + const transactionHash = keccak256(serializedTx); + + const payload = await this.#cdpWallet.createPayloadSignature(transactionHash); + + return payload.getSignature() as `0x${string}`; + } + + /** + * Sends a transaction. + * + * @param transaction - The transaction to send. + * @returns The hash of the transaction. + */ + async sendTransaction(transaction: TransactionRequest): Promise<`0x${string}`> { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + const preparedTransaction = await this.prepareTransaction( + transaction.to!, + transaction.value!, + transaction.data!, + ); + + const signature = await this.signTransaction({ + ...preparedTransaction, + } as TransactionRequest); + + const signedPayload = await this.addSignatureAndSerialize(preparedTransaction, signature); + + const externalAddress = new ExternalAddress(this.#cdpWallet.getNetworkId(), this.#address!); + + const tx = await externalAddress.broadcastExternalTransaction(signedPayload.slice(2)); + + return tx.transactionHash as `0x${string}`; + } + + /** + * Prepares a transaction. + * + * @param to - The address to send the transaction to. + * @param value - The value of the transaction. + * @param data - The data of the transaction. + * @returns The prepared transaction. + */ + async prepareTransaction( + to: `0x${string}`, + value: bigint, + data: `0x${string}`, + ): Promise { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + const nonce = await this.#publicClient!.getTransactionCount({ + address: this.#address! as `0x${string}`, + }); + + const feeData = await this.#publicClient!.estimateFeesPerGas(); + + const gas = await this.#publicClient!.estimateGas({ + to, + value, + data, + maxFeePerGas: feeData.maxFeePerGas, + maxPriorityFeePerGas: feeData.maxPriorityFeePerGas, + }); + + const chainId = parseInt(this.#network!.chainId!, 10); + + return { + to, + value, + data, + nonce, + maxFeePerGas: feeData.maxFeePerGas, + maxPriorityFeePerGas: feeData.maxPriorityFeePerGas, + gas, + chainId, + type: "eip1559", + }; + } + + /** + * Adds signature to a transaction and serializes it for broadcast. + * + * @param transaction - The transaction to sign. + * @param signature - The signature to add to the transaction. + * @returns A serialized transaction. + */ + async addSignatureAndSerialize( + transaction: TransactionSerializable, + signature: `0x${string}`, + ): Promise { + // Decode the signature into its components + const r = `0x${signature.slice(2, 66)}`; // First 32 bytes + const s = `0x${signature.slice(66, 130)}`; // Next 32 bytes + const v = BigInt(parseInt(signature.slice(130, 132), 16)); // Last byte + + return serializeTransaction(transaction, { r, s, v } as Signature); + } + + /** + * Gets the address of the wallet. + * + * @returns The address of the wallet. + */ + getAddress(): string { + if (!this.#address) { + throw new Error("Address not initialized"); + } + + return this.#address; + } + + /** + * Gets the network of the wallet. + * + * @returns The network of the wallet. + */ + getNetwork(): Network { + if (!this.#network) { + throw new Error("Network not initialized"); + } + + return this.#network; + } + + /** + * Gets the name of the wallet provider. + * + * @returns The name of the wallet provider. + */ + getName(): string { + return "cdp_wallet_provider"; + } + + /** + * Gets the balance of the wallet. + * + * @returns The balance of the wallet in wei + */ + async getBalance(): Promise { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + const balance = await this.#cdpWallet.getBalance("eth"); + return BigInt(balance.mul(10 ** 18).toString()); + } + + /** + * Waits for a transaction receipt. + * + * @param txHash - The hash of the transaction to wait for. + * @returns The transaction receipt. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async waitForTransactionReceipt(txHash: `0x${string}`): Promise { + return await this.#publicClient!.waitForTransactionReceipt({ hash: txHash }); + } + + /** + * Reads a contract. + * + * @param params - The parameters to read the contract. + * @returns The response from the contract. + */ + async readContract(params: ReadContractParameters): Promise { + return this.#publicClient!.readContract(params); + } + + /** + * Creates a trade. + * + * @param options - The options for the trade. + * @returns The trade. + */ + async createTrade(options: CreateTradeOptions): Promise { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + return this.#cdpWallet.createTrade(options); + } + + /** + * Deploys a token. + * + * @param options - The options for the token deployment. + * @returns The deployed token. + */ + async deployToken(options: CreateERC20Options): Promise { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + return this.#cdpWallet.deployToken(options); + } + + /** + * Deploys a contract. + * + * @param options - The options for contract deployment + * @param options.solidityVersion - The version of the Solidity compiler to use (e.g. "0.8.0+commit.c7dfd78e") + * @param options.solidityInputJson - The JSON input for the Solidity compiler containing contract source and settings + * @param options.contractName - The name of the contract to deploy + * @param options.constructorArgs - Key-value map of constructor args + * + * @returns A Promise that resolves to the deployed contract instance + * @throws Error if wallet is not initialized + */ + async deployContract(options: { + solidityVersion: string; + solidityInputJson: string; + contractName: string; + constructorArgs: Record; + }): Promise { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + return this.#cdpWallet.deployContract(options); + } + + /** + * Deploys a new NFT (ERC-721) smart contract. + * + * @param options - Configuration options for the NFT contract deployment + * @param options.name - The name of the collection + * @param options.symbol - The token symbol for the collection + * @param options.baseURI - The base URI for token metadata. + * + * @returns A Promise that resolves to the deployed SmartContract instance + * @throws Error if the wallet is not properly initialized + * @throws Error if the deployment fails for any reason (network issues, insufficient funds, etc.) + */ + async deployNFT(options: { + name: string; + symbol: string; + baseURI: string; + }): Promise { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + return this.#cdpWallet.deployNFT(options); + } + + /** + * Transfer the native asset of the network. + * + * @param to - The destination address. + * @param value - The amount to transfer in Wei. + * @returns The transaction hash. + */ + async nativeTransfer(to: `0x${string}`, value: string): Promise<`0x${string}`> { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + const transferResult = await this.#cdpWallet.createTransfer({ + amount: new Decimal(value), + assetId: Coinbase.assets.Eth, + destination: to, + gasless: false, + }); + + const result = await transferResult.wait(); + + if (!result.getTransactionHash()) { + throw new Error("Transaction hash not found"); + } + + return result.getTransactionHash() as `0x${string}`; + } + + /** + * Exports the wallet. + * + * @returns The wallet's data. + */ + async exportWallet(): Promise { + if (!this.#cdpWallet) { + throw new Error("Wallet not initialized"); + } + + return this.#cdpWallet.export(); + } +} diff --git a/typescript/agentkit/src/wallet-providers/evmWalletProvider.ts b/typescript/agentkit/src/wallet-providers/evmWalletProvider.ts new file mode 100644 index 000000000..f21744a49 --- /dev/null +++ b/typescript/agentkit/src/wallet-providers/evmWalletProvider.ts @@ -0,0 +1,60 @@ +// TODO: Improve type safety +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { WalletProvider } from "./walletProvider"; +import { TransactionRequest, ReadContractParameters, ReadContractReturnType } from "viem"; + +/** + * EvmWalletProvider is the abstract base class for all EVM wallet providers. + * + * @abstract + */ +export abstract class EvmWalletProvider extends WalletProvider { + /** + * Sign a message. + * + * @param message - The message to sign. + * @returns The signed message. + */ + abstract signMessage(message: string | Uint8Array): Promise<`0x${string}`>; + + /** + * Sign a typed data. + * + * @param typedData - The typed data to sign. + * @returns The signed typed data. + */ + abstract signTypedData(typedData: any): Promise<`0x${string}`>; + + /** + * Sign a transaction. + * + * @param transaction - The transaction to sign. + * @returns The signed transaction. + */ + abstract signTransaction(transaction: TransactionRequest): Promise<`0x${string}`>; + + /** + * Send a transaction. + * + * @param transaction - The transaction to send. + * @returns The transaction hash. + */ + abstract sendTransaction(transaction: TransactionRequest): Promise<`0x${string}`>; + + /** + * Wait for a transaction receipt. + * + * @param txHash - The transaction hash. + * @returns The transaction receipt. + */ + abstract waitForTransactionReceipt(txHash: `0x${string}`): Promise; + + /** + * Read a contract. + * + * @param params - The parameters to read the contract. + * @returns The response from the contract. + */ + abstract readContract(params: ReadContractParameters): Promise; +} diff --git a/typescript/agentkit/src/wallet-providers/index.ts b/typescript/agentkit/src/wallet-providers/index.ts new file mode 100644 index 000000000..df20f978e --- /dev/null +++ b/typescript/agentkit/src/wallet-providers/index.ts @@ -0,0 +1,4 @@ +export * from "./walletProvider"; +export * from "./evmWalletProvider"; +export * from "./viemWalletProvider"; +export * from "./cdpWalletProvider"; diff --git a/typescript/agentkit/src/wallet-providers/viemWalletProvider.ts b/typescript/agentkit/src/wallet-providers/viemWalletProvider.ts new file mode 100644 index 000000000..b2291cb77 --- /dev/null +++ b/typescript/agentkit/src/wallet-providers/viemWalletProvider.ts @@ -0,0 +1,204 @@ +// TODO: Improve type safety +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import { + WalletClient as ViemWalletClient, + createPublicClient, + http, + TransactionRequest, + PublicClient as ViemPublicClient, + ReadContractParameters, + ReadContractReturnType, + parseEther, +} from "viem"; +import { EvmWalletProvider } from "./evmWalletProvider"; +import { Network } from "../network"; +import { CHAIN_ID_TO_NETWORK_ID } from "../network/network"; + +/** + * A wallet provider that uses the Viem library. + */ +export class ViemWalletProvider extends EvmWalletProvider { + #walletClient: ViemWalletClient; + #publicClient: ViemPublicClient; + + /** + * Constructs a new ViemWalletProvider. + * + * @param walletClient - The wallet client. + */ + constructor(walletClient: ViemWalletClient) { + super(); + this.#walletClient = walletClient; + this.#publicClient = createPublicClient({ + chain: walletClient.chain, + transport: http(), + }); + } + + /** + * Signs a message. + * + * @param message - The message to sign. + * @returns The signed message. + */ + async signMessage(message: string): Promise<`0x${string}`> { + const account = this.#walletClient.account; + if (!account) { + throw new Error("Account not found"); + } + + return this.#walletClient.signMessage({ account, message }); + } + + /** + * Signs a typed data object. + * + * @param typedData - The typed data object to sign. + * @returns The signed typed data object. + */ + async signTypedData(typedData: any): Promise<`0x${string}`> { + return this.#walletClient.signTypedData({ + account: this.#walletClient.account!, + domain: typedData.domain!, + types: typedData.types!, + primaryType: typedData.primaryType!, + message: typedData.message!, + }); + } + + /** + * Signs a transaction. + * + * @param transaction - The transaction to sign. + * @returns The signed transaction. + */ + async signTransaction(transaction: TransactionRequest): Promise<`0x${string}`> { + const txParams = { + account: this.#walletClient.account!, + to: transaction.to, + value: transaction.value, + data: transaction.data, + chain: this.#walletClient.chain, + }; + + return this.#walletClient.signTransaction(txParams); + } + + /** + * Sends a transaction. + * + * @param transaction - The transaction to send. + * @returns The hash of the transaction. + */ + async sendTransaction(transaction: TransactionRequest): Promise<`0x${string}`> { + const account = this.#walletClient.account; + if (!account) { + throw new Error("Account not found"); + } + + const chain = this.#walletClient.chain; + if (!chain) { + throw new Error("Chain not found"); + } + + const txParams = { + account: account, + chain: chain, + data: transaction.data, + to: transaction.to, + value: transaction.value, + }; + + return this.#walletClient.sendTransaction(txParams); + } + + /** + * Gets the address of the wallet. + * + * @returns The address of the wallet. + */ + getAddress(): string { + return this.#walletClient.account?.address ?? ""; + } + + /** + * Gets the network of the wallet. + * + * @returns The network of the wallet. + */ + getNetwork(): Network { + return { + protocolFamily: "evm" as const, + chainId: this.#walletClient.chain!.id! as any as string, + networkId: CHAIN_ID_TO_NETWORK_ID[this.#walletClient.chain!.id!], + }; + } + + /** + * Gets the name of the wallet provider. + * + * @returns The name of the wallet provider. + */ + getName(): string { + return "viem_wallet_provider"; + } + + /** + * Gets the balance of the wallet. + * + * @returns The balance of the wallet. + */ + async getBalance(): Promise { + const account = this.#walletClient.account; + if (!account) { + throw new Error("Account not found"); + } + + return this.#publicClient.getBalance({ address: account.address }); + } + + /** + * Waits for a transaction receipt. + * + * @param txHash - The hash of the transaction to wait for. + * @returns The transaction receipt. + */ + async waitForTransactionReceipt(txHash: `0x${string}`): Promise { + return await this.#publicClient.waitForTransactionReceipt({ hash: txHash }); + } + + /** + * Reads a contract. + * + * @param params - The parameters to read the contract. + * @returns The response from the contract. + */ + async readContract(params: ReadContractParameters): Promise { + return this.#publicClient.readContract(params); + } + + /** + * Transfer the native asset of the network. + * + * @param to - The destination address. + * @param value - The amount to transfer in whole units (e.g. ETH) + * @returns The transaction hash. + */ + async nativeTransfer(to: `0x${string}`, value: string): Promise<`0x${string}`> { + const atomicAmount = parseEther(value); + + const tx = await this.sendTransaction({ + to: to, + value: atomicAmount, + }); + + const receipt = await this.waitForTransactionReceipt(tx); + + if (!receipt) { + throw new Error("Transaction failed"); + } + + return receipt.transactionHash; + } +} diff --git a/typescript/agentkit/src/wallet-providers/walletProvider.ts b/typescript/agentkit/src/wallet-providers/walletProvider.ts new file mode 100644 index 000000000..f0e6a4688 --- /dev/null +++ b/typescript/agentkit/src/wallet-providers/walletProvider.ts @@ -0,0 +1,76 @@ +import { Network } from "../network"; +import { sendAnalyticsEvent } from "../analytics"; + +/** + * WalletProvider is the abstract base class for all wallet providers. + * + * @abstract + */ +export abstract class WalletProvider { + /** + * Initializes the wallet provider. + */ + constructor() { + // Wait for the next tick to ensure child class is initialized + Promise.resolve().then(() => { + this.trackInitialization(); + }); + } + + /** + * Tracks the initialization of the wallet provider. + */ + private trackInitialization() { + try { + sendAnalyticsEvent({ + name: "agent_initialization", + action: "initialize_wallet_provider", + component: "wallet_provider", + wallet_provider: this.getName(), + wallet_address: this.getAddress(), + network_id: this.getNetwork().networkId, + chain_id: this.getNetwork().chainId, + protocol_family: this.getNetwork().protocolFamily, + }); + } catch (error) { + console.warn("Failed to track wallet provider initialization:", error); + } + } + + /** + * Get the address of the wallet provider. + * + * @returns The address of the wallet provider. + */ + abstract getAddress(): string; + + /** + * Get the network of the wallet provider. + * + * @returns The network of the wallet provider. + */ + abstract getNetwork(): Network; + + /** + * Get the name of the wallet provider. + * + * @returns The name of the wallet provider. + */ + abstract getName(): string; + + /** + * Get the balance of the native asset of the network. + * + * @returns The balance of the native asset of the network. + */ + abstract getBalance(): Promise; + + /** + * Transfer the native asset of the network. + * + * @param to - The destination address. + * @param value - The amount to transfer in whole units (e.g. ETH) + * @returns The transaction hash. + */ + abstract nativeTransfer(to: `0x${string}`, value: string): Promise<`0x${string}`>; +} diff --git a/cdp-agentkit-core/typescript/tsconfig.json b/typescript/agentkit/tsconfig.json similarity index 100% rename from cdp-agentkit-core/typescript/tsconfig.json rename to typescript/agentkit/tsconfig.json diff --git a/typescript/examples/langchain-cdp-chatbot/.env-local b/typescript/examples/langchain-cdp-chatbot/.env-local new file mode 100644 index 000000000..2e36cd9d9 --- /dev/null +++ b/typescript/examples/langchain-cdp-chatbot/.env-local @@ -0,0 +1,3 @@ +OPENAI_API_KEY= +CDP_API_KEY_NAME= +CDP_API_KEY_PRIVATE_KEY= diff --git a/farcaster-langchain/examples/chatbot-typescript/.eslintrc.json b/typescript/examples/langchain-cdp-chatbot/.eslintrc.json similarity index 100% rename from farcaster-langchain/examples/chatbot-typescript/.eslintrc.json rename to typescript/examples/langchain-cdp-chatbot/.eslintrc.json diff --git a/cdp-langchain/examples/chatbot-typescript/README.md b/typescript/examples/langchain-cdp-chatbot/README.md similarity index 80% rename from cdp-langchain/examples/chatbot-typescript/README.md rename to typescript/examples/langchain-cdp-chatbot/README.md index e99a9c331..b3eabbc24 100644 --- a/cdp-langchain/examples/chatbot-typescript/README.md +++ b/typescript/examples/langchain-cdp-chatbot/README.md @@ -1,12 +1,12 @@ -# CDP AgentKit Langchain Extension Examples - Chatbot Typescript +# CDP AgentKit LangChain Extension Examples - Chatbot Typescript This example demonstrates an agent setup as a terminal style chatbot with access to the full set of CDP AgentKit actions. ## Ask the chatbot to engage in the Web3 ecosystem! -- "Transfer a portion of your ETH to john2879.base.eth" +- "Transfer a portion of your ETH to a random address" +- "What is the price of BTC?" - "Deploy an NFT that will go super viral!" -- "Choose a name for yourself and register a Basename for your wallet" - "Deploy an ERC-20 token with total supply 1 billion" ## Requirements @@ -34,7 +34,7 @@ npm install ### Set ENV Vars -- Ensure the following ENV Vars are set: +- Ensure the following ENV Vars are set in `.env`: - "CDP_API_KEY_NAME" - "CDP_API_KEY_PRIVATE_KEY" - "OPENAI_API_KEY" diff --git a/cdp-langchain/examples/chatbot-typescript/chatbot.ts b/typescript/examples/langchain-cdp-chatbot/chatbot.ts similarity index 85% rename from cdp-langchain/examples/chatbot-typescript/chatbot.ts rename to typescript/examples/langchain-cdp-chatbot/chatbot.ts index eba3e0e78..bd961e9b8 100644 --- a/cdp-langchain/examples/chatbot-typescript/chatbot.ts +++ b/typescript/examples/langchain-cdp-chatbot/chatbot.ts @@ -1,5 +1,14 @@ -import { CdpAgentkit } from "@coinbase/cdp-agentkit-core"; -import { CdpToolkit } from "@coinbase/cdp-langchain"; +import { + AgentKit, + CdpWalletProvider, + wethActionProvider, + walletActionProvider, + erc20ActionProvider, + cdpApiActionProvider, + cdpWalletActionProvider, + pythActionProvider, +} from "@coinbase/agentkit"; +import { getLangChainTools } from "@coinbase/agentkit-langchain"; import { HumanMessage } from "@langchain/core/messages"; import { MemorySaver } from "@langchain/langgraph"; import { createReactAgent } from "@langchain/langgraph/prebuilt"; @@ -72,18 +81,36 @@ async function initializeAgent() { } } - // Configure CDP AgentKit + // Configure CDP Wallet Provider const config = { + apiKeyName: process.env.CDP_API_KEY_NAME, + apiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"), cdpWalletData: walletDataStr || undefined, networkId: process.env.NETWORK_ID || "base-sepolia", }; - // Initialize CDP AgentKit - const agentkit = await CdpAgentkit.configureWithWallet(config); + const walletProvider = await CdpWalletProvider.configureWithWallet(config); + + // Initialize AgentKit + const agentkit = await AgentKit.from({ + walletProvider, + actionProviders: [ + wethActionProvider(), + pythActionProvider(), + walletActionProvider(), + erc20ActionProvider(), + cdpApiActionProvider({ + apiKeyName: process.env.CDP_API_KEY_NAME, + apiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"), + }), + cdpWalletActionProvider({ + apiKeyName: process.env.CDP_API_KEY_NAME, + apiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"), + }), + ], + }); - // Initialize CDP AgentKit Toolkit and get tools - const cdpToolkit = new CdpToolkit(agentkit); - const tools = cdpToolkit.getTools(); + const tools = await getLangChainTools(agentkit); // Store buffered conversation history in memory const memory = new MemorySaver(); @@ -108,8 +135,8 @@ async function initializeAgent() { }); // Save wallet data - const exportedWallet = await agentkit.exportWallet(); - fs.writeFileSync(WALLET_DATA_FILE, exportedWallet); + const exportedWallet = await walletProvider.exportWallet(); + fs.writeFileSync(WALLET_DATA_FILE, JSON.stringify(exportedWallet)); return { agent, config: agentConfig }; } catch (error) { diff --git a/cdp-langchain/examples/chatbot-typescript/package.json b/typescript/examples/langchain-cdp-chatbot/package.json similarity index 90% rename from cdp-langchain/examples/chatbot-typescript/package.json rename to typescript/examples/langchain-cdp-chatbot/package.json index 83d776a44..1f2d88b91 100644 --- a/cdp-langchain/examples/chatbot-typescript/package.json +++ b/typescript/examples/langchain-cdp-chatbot/package.json @@ -13,8 +13,8 @@ "format-check": "prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"" }, "dependencies": { - "@coinbase/cdp-agentkit-core": "^0.0.14", - "@coinbase/cdp-langchain": "^0.0.15", + "@coinbase/agentkit": "^0.1.0", + "@coinbase/agentkit-langchain": "^0.1.0", "@langchain/langgraph": "^0.2.21", "@langchain/openai": "^0.3.14", "@langchain/core": "^0.3.19", diff --git a/cdp-langchain/examples/chatbot-typescript/tsconfig.json b/typescript/examples/langchain-cdp-chatbot/tsconfig.json similarity index 100% rename from cdp-langchain/examples/chatbot-typescript/tsconfig.json rename to typescript/examples/langchain-cdp-chatbot/tsconfig.json diff --git a/farcaster-langchain/examples/chatbot-typescript/.env-local b/typescript/examples/langchain-farcaster-chatbot/.env-local similarity index 56% rename from farcaster-langchain/examples/chatbot-typescript/.env-local rename to typescript/examples/langchain-farcaster-chatbot/.env-local index ee9e1e7e7..9260b6b5a 100644 --- a/farcaster-langchain/examples/chatbot-typescript/.env-local +++ b/typescript/examples/langchain-farcaster-chatbot/.env-local @@ -1,3 +1,5 @@ OPENAI_API_KEY= NEYNAR_API_KEY= NEYNAR_MANAGED_SIGNER= +CDP_API_KEY_NAME= +CDP_API_KEY_PRIVATE_KEY= \ No newline at end of file diff --git a/twitter-langchain/examples/chatbot-typescript/.eslintrc.json b/typescript/examples/langchain-farcaster-chatbot/.eslintrc.json similarity index 100% rename from twitter-langchain/examples/chatbot-typescript/.eslintrc.json rename to typescript/examples/langchain-farcaster-chatbot/.eslintrc.json diff --git a/farcaster-langchain/examples/chatbot-typescript/README.md b/typescript/examples/langchain-farcaster-chatbot/README.md similarity index 88% rename from farcaster-langchain/examples/chatbot-typescript/README.md rename to typescript/examples/langchain-farcaster-chatbot/README.md index 94f06ba42..fc7167ae2 100644 --- a/farcaster-langchain/examples/chatbot-typescript/README.md +++ b/typescript/examples/langchain-farcaster-chatbot/README.md @@ -1,4 +1,4 @@ -# CDP Agentkit Farcaster Langchain Extension Examples - Chatbot Typescript +# CDP Agentkit Farcaster LangChain Extension Examples - Chatbot Typescript This example demonstrates an agent setup as a terminal style chatbot with access to Farcaster API actions. @@ -10,6 +10,7 @@ This example demonstrates an agent setup as a terminal style chatbot with access - Node.js 18+ - [OpenAI API Key](https://platform.openai.com/docs/quickstart#create-and-export-an-api-key) - [Farcaster API Keys via Neynar](https://dev.neynar.com/) +- [CDP API Key](https://portal.cdp.coinbase.com/access/api) ### Farcaster Application Setup 1. Visit the Neynar [Developer Portal](https://dev.neynar.com/) @@ -43,6 +44,8 @@ Ensure the following vars are set in .env: - "OPENAI_API_KEY" - "NEYNAR_API_KEY" - "NEYNAR_MANAGED_SIGNER" +- "CDP_API_KEY_NAME" +- "CDP_API_KEY_PRIVATE_KEY" ```bash npm start diff --git a/farcaster-langchain/examples/chatbot-typescript/chatbot.ts b/typescript/examples/langchain-farcaster-chatbot/chatbot.ts similarity index 93% rename from farcaster-langchain/examples/chatbot-typescript/chatbot.ts rename to typescript/examples/langchain-farcaster-chatbot/chatbot.ts index b826702ed..96e79717d 100644 --- a/farcaster-langchain/examples/chatbot-typescript/chatbot.ts +++ b/typescript/examples/langchain-farcaster-chatbot/chatbot.ts @@ -1,5 +1,5 @@ -import { FarcasterToolkit } from "@coinbase/farcaster-langchain"; -import { FarcasterAgentkit } from "@coinbase/cdp-agentkit-core"; +import { AgentKit, farcasterActionProvider } from "@coinbase/agentkit"; +import { getLangChainTools } from "@coinbase/agentkit-langchain"; import { HumanMessage } from "@langchain/core/messages"; import { MemorySaver } from "@langchain/langgraph"; import { createReactAgent } from "@langchain/langgraph/prebuilt"; @@ -29,14 +29,13 @@ async function initialize() { // Initialize LLM const llm = new ChatOpenAI({ model: "gpt-4o-mini" }); - // Farcaster Agentkit - const farcasterAgentkit = new FarcasterAgentkit(); - - // Farcaster Toolkit - const farcasterToolkit = new FarcasterToolkit(farcasterAgentkit); + const agentkit = await AgentKit.from({ + cdpApiKeyName: process.env.CDP_API_KEY_NAME, + cdpApiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"), + actionProviders: [farcasterActionProvider()], + }); - // Farcaster tools - const tools = farcasterToolkit.getTools(); + const tools = await getLangChainTools(agentkit); // Store buffered conversation history in memory const memory = new MemorySaver(); diff --git a/farcaster-langchain/examples/chatbot-typescript/package.json b/typescript/examples/langchain-farcaster-chatbot/package.json similarity index 89% rename from farcaster-langchain/examples/chatbot-typescript/package.json rename to typescript/examples/langchain-farcaster-chatbot/package.json index 39197c733..ecd04c217 100644 --- a/farcaster-langchain/examples/chatbot-typescript/package.json +++ b/typescript/examples/langchain-farcaster-chatbot/package.json @@ -12,8 +12,8 @@ "format-check": "prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"" }, "dependencies": { - "@coinbase/cdp-agentkit-core": "^0.0.13", - "@coinbase/farcaster-langchain": "^0.0.1", + "@coinbase/agentkit": "^0.1.0", + "@coinbase/agentkit-langchain": "^0.1.0", "@langchain/core": "0.3.30", "@langchain/langgraph": "^0.2.39", "@langchain/openai": "^0.3.16", diff --git a/farcaster-langchain/examples/chatbot-typescript/tsconfig.json b/typescript/examples/langchain-farcaster-chatbot/tsconfig.json similarity index 100% rename from farcaster-langchain/examples/chatbot-typescript/tsconfig.json rename to typescript/examples/langchain-farcaster-chatbot/tsconfig.json diff --git a/twitter-langchain/examples/chatbot-typescript/.env-local b/typescript/examples/langchain-twitter-chatbot/.env-local similarity index 70% rename from twitter-langchain/examples/chatbot-typescript/.env-local rename to typescript/examples/langchain-twitter-chatbot/.env-local index fca391b57..397a7a610 100644 --- a/twitter-langchain/examples/chatbot-typescript/.env-local +++ b/typescript/examples/langchain-twitter-chatbot/.env-local @@ -3,3 +3,5 @@ TWITTER_ACCESS_TOKEN= TWITTER_ACCESS_TOKEN_SECRET= TWITTER_API_KEY= TWITTER_API_SECRET= +CDP_API_KEY_NAME= +CDP_API_KEY_PRIVATE_KEY= diff --git a/typescript/examples/langchain-twitter-chatbot/.eslintrc.json b/typescript/examples/langchain-twitter-chatbot/.eslintrc.json new file mode 100644 index 000000000..fc9385e78 --- /dev/null +++ b/typescript/examples/langchain-twitter-chatbot/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "parser": "@typescript-eslint/parser", + "extends": ["../../../.eslintrc.base.json"] +} diff --git a/twitter-langchain/examples/chatbot-typescript/README.md b/typescript/examples/langchain-twitter-chatbot/README.md similarity index 89% rename from twitter-langchain/examples/chatbot-typescript/README.md rename to typescript/examples/langchain-twitter-chatbot/README.md index 122a44fe2..6adfe1457 100644 --- a/twitter-langchain/examples/chatbot-typescript/README.md +++ b/typescript/examples/langchain-twitter-chatbot/README.md @@ -1,4 +1,4 @@ -# CDP Agentkit Twitter Langchain Extension Examples - Chatbot Typescript +# CDP Agentkit Twitter LangChain Extension Examples - Chatbot Typescript This example demonstrates an agent setup as a terminal style chatbot with access to Twitter (X) API actions. @@ -13,6 +13,7 @@ This example demonstrates an agent setup as a terminal style chatbot with access - Node.js 18+ - [OpenAI API Key](https://platform.openai.com/docs/quickstart#create-and-export-an-api-key) - [Twitter (X) API Keys](https://developer.x.com/en/portal/dashboard) +- [CDP API Key](https://portal.cdp.coinbase.com/access/api) ### Twitter Application Setup 1. Visit the Twitter (X) [Developer Portal](https://developer.x.com/en/portal/dashboard) @@ -49,6 +50,8 @@ Ensure the following vars are set in .env: - "TWITTER_ACCESS_TOKEN_SECRET" - "TWITTER_API_KEY" - "TWITTER_API_SECRET" +- "CDP_API_KEY_NAME" +- "CDP_API_KEY_PRIVATE_KEY" ```bash npm start diff --git a/twitter-langchain/examples/chatbot-typescript/chatbot.ts b/typescript/examples/langchain-twitter-chatbot/chatbot.ts similarity index 93% rename from twitter-langchain/examples/chatbot-typescript/chatbot.ts rename to typescript/examples/langchain-twitter-chatbot/chatbot.ts index 85728cc85..54dd77d65 100644 --- a/twitter-langchain/examples/chatbot-typescript/chatbot.ts +++ b/typescript/examples/langchain-twitter-chatbot/chatbot.ts @@ -1,5 +1,5 @@ -import { TwitterToolkit } from "@coinbase/twitter-langchain"; -import { TwitterAgentkit } from "@coinbase/cdp-agentkit-core"; +import { AgentKit, twitterActionProvider } from "@coinbase/agentkit"; +import { getLangChainTools } from "@coinbase/agentkit-langchain"; import { HumanMessage } from "@langchain/core/messages"; import { MemorySaver } from "@langchain/langgraph"; import { createReactAgent } from "@langchain/langgraph/prebuilt"; @@ -29,14 +29,13 @@ async function initialize() { // Initialize LLM const llm = new ChatOpenAI({ model: "gpt-4o-mini" }); - // Twitter (X) Agentkit - const twitterAgentkit = new TwitterAgentkit(); - - // Twitter (X) Toolkit - const twitterToolkit = new TwitterToolkit(twitterAgentkit); + const agentkit = await AgentKit.from({ + cdpApiKeyName: process.env.CDP_API_KEY_NAME, + cdpApiKeyPrivateKey: process.env.CDP_API_KEY_PRIVATE_KEY?.replace(/\\n/g, "\n"), + actionProviders: [twitterActionProvider()], + }); - // Twitter (X) tools - const tools = twitterToolkit.getTools(); + const tools = await getLangChainTools(agentkit); // Store buffered conversation history in memory const memory = new MemorySaver(); diff --git a/twitter-langchain/examples/chatbot-typescript/package.json b/typescript/examples/langchain-twitter-chatbot/package.json similarity index 90% rename from twitter-langchain/examples/chatbot-typescript/package.json rename to typescript/examples/langchain-twitter-chatbot/package.json index 1e7f7d6d2..b98620976 100644 --- a/twitter-langchain/examples/chatbot-typescript/package.json +++ b/typescript/examples/langchain-twitter-chatbot/package.json @@ -13,8 +13,8 @@ "format-check": "prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"" }, "dependencies": { - "@coinbase/cdp-agentkit-core": "^0.0.14", - "@coinbase/twitter-langchain": "^0.0.12", + "@coinbase/agentkit": "^0.1.0", + "@coinbase/agentkit-langchain": "^0.1.0", "@langchain/langgraph": "^0.2.21", "@langchain/openai": "^0.3.14", "@langchain/core": "^0.3.19", diff --git a/twitter-langchain/examples/chatbot-typescript/tsconfig.json b/typescript/examples/langchain-twitter-chatbot/tsconfig.json similarity index 100% rename from twitter-langchain/examples/chatbot-typescript/tsconfig.json rename to typescript/examples/langchain-twitter-chatbot/tsconfig.json diff --git a/typescript/framework-extensions/langchain/.eslintrc.json b/typescript/framework-extensions/langchain/.eslintrc.json new file mode 100644 index 000000000..fc9385e78 --- /dev/null +++ b/typescript/framework-extensions/langchain/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "parser": "@typescript-eslint/parser", + "extends": ["../../../.eslintrc.base.json"] +} diff --git a/cdp-langchain/typescript/.prettierignore b/typescript/framework-extensions/langchain/.prettierignore similarity index 100% rename from cdp-langchain/typescript/.prettierignore rename to typescript/framework-extensions/langchain/.prettierignore diff --git a/cdp-langchain/typescript/.prettierrc b/typescript/framework-extensions/langchain/.prettierrc similarity index 100% rename from cdp-langchain/typescript/.prettierrc rename to typescript/framework-extensions/langchain/.prettierrc diff --git a/cdp-langchain/typescript/CHANGELOG.md b/typescript/framework-extensions/langchain/CHANGELOG.md similarity index 83% rename from cdp-langchain/typescript/CHANGELOG.md rename to typescript/framework-extensions/langchain/CHANGELOG.md index d7be61460..3462d23fb 100644 --- a/cdp-langchain/typescript/CHANGELOG.md +++ b/typescript/framework-extensions/langchain/CHANGELOG.md @@ -6,6 +6,18 @@ ### Added +- Added `getLangChainTools` helper +- Refactored directory structure +- Changed package name to `@coinbase/agentkit-langchain` + +### Removed + +- CDP Tool and Toolkit concepts + +## [0.0.15] - 2025-01-24 + +### Added + - Bump dependency `@coinbase/cdp-agentkit-core` to `0.0.14`. - Bump `@coinbase/coinbase-sdk` dependency to `0.15.0` diff --git a/typescript/framework-extensions/langchain/README.md b/typescript/framework-extensions/langchain/README.md new file mode 100644 index 000000000..23a8cdded --- /dev/null +++ b/typescript/framework-extensions/langchain/README.md @@ -0,0 +1,56 @@ +# Agentkit Extension - LangChain + +LangChain extension of AgentKit. Enables agentic workflows to interact with onchain actions. + +## Setup + +### Prerequisites + +- [CDP API Key](https://portal.cdp.coinbase.com/access/api) +- [OpenAI API Key](https://platform.openai.com/docs/quickstart#create-and-export-an-api-key) +- Node.js 18 or higher + +### Installation + +```bash +npm install @coinbase/agentkit-langchain @coinbase/agentkit@langchain @langchain/langgraph @langchain/openai +``` + +### Environment Setup + +Set the following environment variables: + +```bash +export OPENAI_API_KEY= +``` + +## Usage + +### Basic Setup + +```typescript +import { getLangChainTools } from "@coinbase/agentkit-langchain"; +import { createReactAgent } from "@langchain/langgraph/prebuilt"; +import { ChatOpenAI } from "@langchain/openai"; +import { AgentKit } from "@coinbase/agentkit"; + +const agentKit = await AgentKit.from({ + cdpApiKeyName: "CDP API KEY NAME", + cdpApiKeyPrivate: "CDP API KEY PRIVATE KEY", +}); + +const tools = await getLangChainTools(agentKit); + +const llm = new ChatOpenAI({ + model: "gpt-4o-mini", +}); + +const agent = createReactAgent({ + llm, + tools, +}); +``` + +## Contributing + +See [CONTRIBUTING.md](../../../CONTRIBUTING.md) for detailed setup instructions and contribution guidelines. diff --git a/typescript/framework-extensions/langchain/jest.config.cjs b/typescript/framework-extensions/langchain/jest.config.cjs new file mode 100644 index 000000000..43f0b108c --- /dev/null +++ b/typescript/framework-extensions/langchain/jest.config.cjs @@ -0,0 +1,7 @@ +const baseConfig = require("../../../jest.config.base.cjs"); + +module.exports = { + ...baseConfig, + coveragePathIgnorePatterns: ["node_modules", "dist", "docs", "index.ts"], + coverageThreshold: {}, +}; diff --git a/cdp-langchain/typescript/package.json b/typescript/framework-extensions/langchain/package.json similarity index 62% rename from cdp-langchain/typescript/package.json rename to typescript/framework-extensions/langchain/package.json index 6428673b5..3560272f6 100644 --- a/cdp-langchain/typescript/package.json +++ b/typescript/framework-extensions/langchain/package.json @@ -1,6 +1,6 @@ { - "name": "@coinbase/cdp-langchain", - "version": "0.0.15", + "name": "@coinbase/agentkit-langchain", + "version": "0.1.0", "description": "Langchain Toolkit extension of CDP Agentkit", "repository": "https://github.com/coinbase/agentkit", "author": "Coinbase Inc.", @@ -10,18 +10,18 @@ "files": ["dist"], "scripts": { "build": "tsc", - "lint": "npx --yes eslint -c .eslintrc.json src/**/*.ts", - "lint:fix": "npx --yes eslint -c .eslintrc.json src/**/*.ts --fix", - "format": "npx --yes prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"", - "format-check": "npx --yes prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"", + "lint": "eslint -c .eslintrc.json \"src/**/*.ts\"", + "lint:fix": "eslint -c .eslintrc.json \"src/**/*.ts\" --fix", + "format": "prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"", + "format:check": "prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"", "check": "tsc --noEmit", - "test": "npx jest --no-cache --testMatch='**/*_test.ts'", + "test": "npx jest --no-cache --testMatch='**/*.test.ts'", "test:dry-run": "npm install && npm ci && npm publish --dry-run", "test:e2e": "npx jest --no-cache --testMatch=**/e2e.ts --coverageThreshold '{}'", "test:types": "tsd --files src/tests/types.test-d.ts", "clean": "rm -rf dist/*", "prepack": "tsc", - "docs": "npx --yes typedoc --entryPoints ./src --entryPointStrategy expand --exclude ./src/tests/**/*.ts", + "docs": "typedoc --entryPoints ./src --entryPointStrategy expand --exclude ./src/tests/**/*.ts", "docs:serve": "http-server ./docs", "dev": "tsc --watch" }, @@ -38,7 +38,7 @@ "langchain" ], "dependencies": { - "@coinbase/cdp-agentkit-core": "^0.0.14", + "@coinbase/agentkit": "^0.1.0", "@coinbase/coinbase-sdk": "^0.15.0", "@langchain/core": "^0.3.19", "zod": "^3.22.4" diff --git a/typescript/framework-extensions/langchain/src/index.test.ts b/typescript/framework-extensions/langchain/src/index.test.ts new file mode 100644 index 000000000..d69121ff7 --- /dev/null +++ b/typescript/framework-extensions/langchain/src/index.test.ts @@ -0,0 +1,41 @@ +import { z } from "zod"; +import { getLangChainTools } from "./index"; +import { AgentKit, Action } from "@coinbase/agentkit"; + +// Mocking the Action class +const mockAction: Action = { + name: "testAction", + description: "A test action", + schema: z.object({ test: z.string() }), + invoke: jest.fn(async arg => `Invoked with ${arg.test}`), +}; + +// Creating a mock for AgentKit +jest.mock("@coinbase/agentkit", () => { + const originalModule = jest.requireActual("@coinbase/agentkit"); + return { + ...originalModule, + AgentKit: { + from: jest.fn().mockImplementation(() => ({ + getActions: jest.fn(() => [mockAction]), + })), + }, + }; +}); + +describe("getLangChainTools", () => { + it("should return an array of tools with correct properties", async () => { + const mockAgentKit = await AgentKit.from({}); + const tools = await getLangChainTools(mockAgentKit); + + expect(tools).toHaveLength(1); + const tool = tools[0]; + + expect(tool.name).toBe(mockAction.name); + expect(tool.description).toBe(mockAction.description); + expect(tool.schema).toBe(mockAction.schema); + + const result = await tool.invoke({ test: "data" }); + expect(result).toBe("Invoked with data"); + }); +}); diff --git a/typescript/framework-extensions/langchain/src/index.ts b/typescript/framework-extensions/langchain/src/index.ts new file mode 100644 index 000000000..4763ad36b --- /dev/null +++ b/typescript/framework-extensions/langchain/src/index.ts @@ -0,0 +1,30 @@ +/** + * Main exports for the CDP Langchain package + */ + +import { z } from "zod"; +import { StructuredTool, tool } from "@langchain/core/tools"; +import { AgentKit, Action } from "@coinbase/agentkit"; + +/** + * Get Langchain tools from an AgentKit instance + * + * @param agentKit - The AgentKit instance + * @returns An array of Langchain tools + */ +export async function getLangChainTools(agentKit: AgentKit): Promise { + const actions: Action[] = agentKit.getActions(); + return actions.map(action => + tool( + async (arg: z.output) => { + const result = await action.invoke(arg); + return result; + }, + { + name: action.name, + description: action.description, + schema: action.schema, + }, + ), + ); +} diff --git a/farcaster-langchain/typescript/tsconfig.json b/typescript/framework-extensions/langchain/tsconfig.json similarity index 75% rename from farcaster-langchain/typescript/tsconfig.json rename to typescript/framework-extensions/langchain/tsconfig.json index 2e2cc2c33..68cc79109 100644 --- a/farcaster-langchain/typescript/tsconfig.json +++ b/typescript/framework-extensions/langchain/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "rootDir": "./src"