diff --git a/README.md b/README.md
index 1682e7a82..320cdc754 100644
--- a/README.md
+++ b/README.md
@@ -1,91 +1,54 @@
-Go out and eat some grass.
-[Docs](https://ohmygoat.dev) | [Examples](https://github.com/goat-sdk/goat/tree/main/typescript/examples) | [Chains](https://ohmygoat.dev/chains-wallets-plugins) | [Plugins](https://ohmygoat.dev/chains-wallets-plugins#plugins) | [Discord](https://discord.gg/goat-sdk)
+[Website](https://ohmygoat.dev) | [X](https://x.com/goat_sdk) | [Discord](https://discord.gg/goat-sdk)
GOAT is free software, MIT licensed, sponsored by [Crossmint](https://www.crossmint.com)
-
-
-## Goat π
-GOAT π (Great Onchain Agent Toolkit) is an open-source framework for adding blockchain tools such as wallets, being able to hold or trade tokens, or interacting with blockchain smart contracts, to your AI agent.
-
-**Problem**:
-
-Making agents perform onchain actions is tedious. The ecosystem is heavily fragmented, spanning 5+ popular agent development frameworks, multiple programming languages, and dozens of different blockchains and wallet architectures.
-For developers without blockchain expertise, finding clear instructions to perform simple actions - like sending USDC payments or placing Polymarket bets - is nearly impossible.
-
-**Solution**:
-
-GOAT solves this by providing an open-source, provider-agnostic framework that abstracts away all these combinations.
-
-- **For agent developers**: GOAT offers an always-growing catalog of ready made blockchain actions (sending tokens, using a DeFi protocol, ...) that can be imported as tools into your existing agent. It works with the most popular agent frameworks (Langchain, Vercel's AI SDK, Eliza, etc), Typescript and Python, 30+ blockchains (Solana, Base, Polygon, Mode, ...), and many wallet providers.
-
-- **For dApp / smart contract developers**: develop a plug-in in GOAT, and allow agents built with any of the most popular agent development frameworks to access your service.
-### Key features
-1. **Works Everywhere**: Compatible with Langchain, Vercelβs AI SDK, Eliza, and more.
-2. **Wallet Agnostic**: Supports all wallets, from your own key pairs to [Crossmint Smart Wallets](https://docs.crossmint.com/wallets/smart-wallets/overview) and Coinbase.
-3. **Multi-Chain**: Supports EVM chains and Solana (more coming π).
-4. **Customizable**: Use or build plugins for any onchain functionality (sending tokens, checking wallet balance, etc) and protocol (Polymarket, Uniswap, etc).
+
+
-
+
+
-### How it works
-GOAT plugs into your agents tool calling capabilities adding all the functions your agent needs to interact with the blockchain.
-High-level, here's how it works:
-
-#### Configure the wallet you want to use
-```typescript
-// ... Code to connect your wallet (e.g createWalletClient from viem)
-const wallet = ...
-
-const tools = getOnChainTools({
- wallet: viem(wallet),
-})
-```
-
-#### Add the plugins you need to interact with the protocols you want
-```typescript
-const wallet = ...
-
-const tools = getOnChainTools({
- wallet: viem(wallet),
- plugins: [
- sendETH(),
- erc20({ tokens: [USDC, PEPE] }),
- faucet(),
- polymarket(),
- // ...
- ],
-})
-```
-
-#### Connect it to your agent framework of choice
-```typescript
-// ... Code to connect your wallet (e.g createWalletClient from viem)
-const wallet = ...
-
-const tools = getOnChainTools({
- wallet: viem(wallet),
- plugins: [
- sendETH(),
- erc20({ tokens: [USDC, PEPE] }),
- faucet(),
- polymarket(),
- // ...
- ],
-})
-
-// Vercel's AI SDK
-const result = await generateText({
- model: openai("gpt-4o-mini"),
- tools: tools,
- maxSteps: 5,
- prompt: "Send 420 ETH to ohmygoat.eth",
-});
-```
+
-See [here](https://github.com/goat-sdk/goat/tree/main/typescript/examples) for more examples.
+# GOAT π
+
+
+
+GOAT (Great Onchain Agent Toolkit) is a library that adds more than +200 onchain tools to your AI agent.
+
+* **+200 tools**: DeFi (Uniswap, Jupiter, KIM, Orca, etc.), minting (OpenSea, MagicEden, etc.), betting (Polymarket, etc.), analytics (CoinGecko, BirdEye, Allora, etc.) and more
+* **Chains**: EVM (Base, Polygon, Mode, Sei, etc.), Solana, Aptos, Chromia, Fuel, Sui, Starknet, Zilliqa, etc.
+* **Wallets**: keypair, smart wallets (Crossmint, etc.), LIT, MPC (Coinbase, etc.)
+* **Agent Frameworks**: AI SDK, Langchain, Eliza, ZerePy, GAME, ElevenLabs, etc.
+
+
+## Table of Contens
+- [π Typescript](https://github.com/goat-sdk/goat/tree/main/typescript)
+ - [See all plugins](https://github.com/goat-sdk/goat/tree/main/typescript#plugins)
+ - [Installation](https://github.com/goat-sdk/goat/tree/main/typescript#installation)
+ - [Usage](https://github.com/goat-sdk/goat/tree/main/typescript#usage)
+ - [Examples](https://github.com/goat-sdk/goat/tree/main/typescript/examples)
+ - [How to create a plugin](https://github.com/goat-sdk/goat/tree/main/typescript#how-to-create-a-plugin)
+ - [How to add a chain](https://github.com/goat-sdk/goat/tree/main/typescript#how-to-add-a-chain)
+ - [How to add a wallet provider](https://github.com/goat-sdk/goat/tree/main/typescript#how-to-add-a-wallet-provider)
+ - [Packages](https://github.com/goat-sdk/goat/tree/main/typescript#packages)
+ - [Plugins](https://github.com/goat-sdk/goat/tree/main/typescript#plugins)
+ - [Wallets](https://github.com/goat-sdk/goat/tree/main/typescript#wallets)
+ - [Adapters](https://github.com/goat-sdk/goat/tree/main/typescript#agent-framework-adapters)
+- [π Python](https://github.com/goat-sdk/goat/tree/main/python)
+ - [See all plugins](https://github.com/goat-sdk/goat/tree/main/python#plugins)
+ - [Installation](https://github.com/goat-sdk/goat/tree/main/python#installation)
+ - [Usage](https://github.com/goat-sdk/goat/tree/main/python#usage)
+ - [Examples](https://github.com/goat-sdk/goat/tree/main/python/examples)
+ - [How to create a plugin](https://github.com/goat-sdk/goat/tree/main/python#how-to-create-a-plugin)
+ - [How to add a chain](https://github.com/goat-sdk/goat/tree/main/python#how-to-add-a-chain)
+ - [How to add a wallet provider](https://github.com/goat-sdk/goat/tree/main/python#how-to-add-a-wallet-provider)
+ - [Packages](https://github.com/goat-sdk/goat/tree/main/python#packages)
+ - [Plugins](https://github.com/goat-sdk/goat/tree/main/python#plugins)
+ - [Wallets](https://github.com/goat-sdk/goat/tree/main/python#wallets)
+ - [Adapters](https://github.com/goat-sdk/goat/tree/main/python#agent-framework-adapters)
diff --git a/docs/chains-wallets-plugins.mdx b/docs/chains-wallets-plugins.mdx
deleted file mode 100644
index a33f43de8..000000000
--- a/docs/chains-wallets-plugins.mdx
+++ /dev/null
@@ -1,94 +0,0 @@
----
-title: 'Chains and frameworks'
----
-
-GOAT aims to support as many chains, wallet providers, protocols and agent frameworks as possible.
-
-We offer **bounties** to developers who contribute creating plugins and wallet integrations that GOAT is missing and the community has requested.
-
-## Agent frameworks
-
-### TypeScript
-| Framework | Supported |
-| -------- | ------------------------------------- |
-| [Langchain](https://github.com/goat-sdk/goat/tree/main/typescript/packages/adapters/langchain) | β
|
-| [Vercel AI SDK](https://github.com/goat-sdk/goat/tree/main/typescript/examples/vercel-ai) | β
|
-| [Eliza](https://github.com/ai16z/eliza/tree/main/packages/plugin-goat) | β
|
-| [Eleven Labs](https://github.com/goat-sdk/goat/tree/main/typescript/examples/eleven-labs/conversational-agent) | β
|
-| [LlamaIndex](https://github.com/goat-sdk/goat/tree/main/typescript/packages/adapters/llamaindex) | β
|
-| [Model Context Protocol](https://github.com/goat-sdk/goat/tree/main/typescript/packages/adapters/model-context-protocol) | β
|
-
-### Python
-| Framework | Supported |
-| -------- | ------------------------------------- |
-| [Langchain](https://github.com/goat-sdk/goat/tree/main/python/src/adapters/langchain) | β
|
-| Autogen | Coming soon |
-| CrewAI | Coming soon |
-
-## Chains
-| Chain | Supported |
-| -------- | ------------------------------------- |
-| **All** EVM chains (Base, Polygon, Mode, Sei, etc.) | β
|
-| Solana | β
|
-| Chromia | β
|
-| Fuel | β
|
-| Aptos | β
|
-| Sui | β
|
-| Zilliqa | β
|
-
-
-## Wallets
-| Wallet | Supported |
-| -------- | ------------------------------------- |
-| [Viem](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets/viem) | β
|
-| [Solana](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets/solana) | β
|
-| [Crossmint Smart Wallets](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets/crossmint) | β
|
-| [Crossmint Custodial Wallets](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets/crossmint) | β
|
-| [Lit](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets/lit-protocol) | β
|
-| [Chromia](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets/chromia) | β
|
-| [Fuel](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets/fuel) | β
|
-| [Aptos](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets/aptos) | β
|
-
-## Plugins
-| Plugin | TypeScript | Python |
-| -------- | ------------------------------------- | ------------------------------------- |
-| [1inch](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/1inch) | β
| β
|
-| [Allora](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/allora) | β
| β
|
-| [Birdeye](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/birdeye) | β
| |
-| [Coingecko](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/coingecko) | β
| β
|
-| [Coinmarketcap](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/coinmarketcap) | β
| |
-| [Crossmint Headless Checkout](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/crossmint-headless-checkout) | β
| |
-| [Crossmint Mint API](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets/crossmint) | β
| |
-| [DexScreener](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/dexscreener) | β
| β
|
-| [ERC20](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/erc20) | β
| β
|
-| [ERC721](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/erc721) | β
| |
-| [Etherscan](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/etherscan) | β
| |
-| [Farcaster](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/farcaster) | β
| β
|
-| [Ironclad](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/ironclad) | β
| |
-| [JSON-RPC](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/jsonrpc) | β
| β
|
-| [Jupiter](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/jupiter) | β
| |
-| [Kim](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/kim) | β
| |
-| [MagicEden](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/solana-magiceden) | β
| |
-| [Meteora](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/meteora) | β
| |
-| [Mode Governance](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/mode-governance) | β
| |
-| [Mode Spray](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/modespray) | β
| |
-| [Mode Voting](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/mode-voting) | β
| |
-| [Nansen](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/nansen) | β
| β
|
-| [OpenSea](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/opensea) | β
| β
|
-| [Orca](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/orca) | β
| |
-| [Polymarket](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/polymarket) | β
| |
-| [Pumpfun](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/pumpfun) | β
| |
-| [Renzo](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/renzo) | β
| |
-| [RugCheck](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/rugcheck) | β
| β
|
-| [SNS](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/sns) | β
| |
-| [Solana NFTs](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/solana-nfts) | β
| |
-| [Solana SPL](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/spl-token) | β
| |
-| [Superfluid](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/superfluid) | β
| β
|
-| [Tensor](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/tensor) | β
| |
-| [Uniswap](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/uniswap) | β
| |
-| [USDC Faucet](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets/crossmint) | β
| |
-| [Zerodev Global Address](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/zerodev-global-address) | β
| |
-| [Zilliqa](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins/zilliqa) | β
| |
-
-
-And **many** more!
diff --git a/docs/chains.mdx b/docs/chains.mdx
deleted file mode 100644
index 09e65902e..000000000
--- a/docs/chains.mdx
+++ /dev/null
@@ -1,93 +0,0 @@
----
-title: Chains
----
-
-GOAT aims to support as many chains as possible. If your chain is not supported you can open a PR to add it.
-
-## PR to support a new chain
-Here are the changes you need to make to support a new chain:
-
-
-
-Add your chain to the `Chain.ts` file in the [core package](https://github.com/goat-sdk/goat/tree/main/typescript/packages/core/src/types/Chain.ts).
-
-```typescript
-/**
- * @param type - "evm" or "solana", extend this union as needed (e.g., "sui")
- * @param id - Chain ID, optional for EVM
- */
-export type Chain = EvmChain | SolanaChain | AptosChain | ChromiaChain | FuelChain | MyAwesomeChain;
-
-export type MyAwesomeChain = {
- type: "my-awesome-chain";
-};
-```
-
-
-
-Create a new package in the [wallets directory](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets) with the name of your chain (e.g. `my-awesome-chain`) or copy an existing one (e.g. `evm`).
-In this package you will define the abstract class for your chain's wallet client which will extend the `WalletClientBase` class defined in the [core package](https://github.com/goat-sdk/goat/tree/main/typescript/packages/core/src/classes/WalletClientBase.ts).
-
-WalletClientBase only includes the methods that are supported by all chains such as:
-1. `getAddress`
-2. `getChain`
-3. `signMessage`
-4. `balanceOf`
-
-As well as includes the `getCoreTools` method which returns the core tools for the chain.
-
-```typescript
-export abstract class MyAwesomeChainWalletClient extends WalletClientBase {
- // Add your chain's methods here
- abstract getChain(): MyAwesomeChain;
- sendTransaction: (transaction: AwesomeChainTransaction) => Promise;
- read: (query: AwesomeChainQuery) => Promise;
-}
-```
-
-
-
-Create a plugin to allow sending your native token to a wallet. Create a file in the same package as your wallet client and create a new file like `send.plugin.ts`.
-
-Implement the core plugin.
-
-
-```typescript
-export class SendAWESOMETOKENPlugin extends PluginBase {
- constructor() {
- super("sendAWESOMETOKEN", []);
- }
-
- supportsChain = (chain: Chain) => chain.type === "my-awesome-chain";
-
- getTools(walletClient: MyAwesomeChainWalletClient) {
- const sendTool = createTool(
- {
- name: `send_myawesometoken`,
- description: `Send MYAWESOMETOKEN to an address.`,
- parameters: sendAWESOMETOKENParametersSchema, // Define the parameters schema
- },
- // Implement the method
- (parameters: z.infer) => sendAWESOMETOKENMethod(walletClient, parameters),
- );
- return [sendTool];
- }
-}
-```
-
-
-Extend your abstract class with the methods you need to implement and create your first wallet client! (e.g `MyAwesomeChainKeyPairWalletClient`)
-
-```typescript
-export class MyAwesomeChainKeyPairWalletClient extends MyAwesomeChainWalletClient {
- // Implement the methods here
-}
-
-// Export the wallet client with a factory function
-export const myAwesomeChain = () => new MyAwesomeChainKeyPairWalletClient();
-```
-
-
-And you're done! Now you can go and implement other [wallet clients](/wallets) and [plugins](/plugins) for your chain!
-
-
diff --git a/docs/examples.mdx b/docs/examples.mdx
deleted file mode 100644
index efa095bad..000000000
--- a/docs/examples.mdx
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: Examples
----
-
-Check out our examples on GitHub to see how to use GOAT with your favorite agent framework.
-
-
-
- Get started in 2 minutes by using our examples
-
-
diff --git a/docs/introduction.mdx b/docs/introduction.mdx
index e7b863155..e454a2867 100644
--- a/docs/introduction.mdx
+++ b/docs/introduction.mdx
@@ -2,118 +2,32 @@
title: Introduction
---
-_GOAT is free software, MIT licensed, sponsored by [Crossmint](https://www.crossmint.com)_
+GOAT (Great Onchain Agent Toolkit) is a library that adds more than +200 onchain tools to your AI agent.
-## What is GOAT π?
-GOAT π (Great Onchain Agent Toolkit) is an open-source framework for adding blockchain tools such as wallets, being able to hold or trade tokens, or interacting with blockchain smart contracts, to your AI agent.
+* **+200 tools**: DeFi (Uniswap, Jupiter, KIM, Orca, etc.), minting (OpenSea, MagicEden, etc.), betting (Polymarket, etc.), analytics (CoinGecko, BirdEye, Allora, etc.) and more
+* **Chains**: EVM (Base, Polygon, Mode, Sei, etc.), Solana, Aptos, Chromia, Fuel, Sui, Starknet, Zilliqa, etc.
+* **Wallets**: keypair, smart wallets (Crossmint, etc.), LIT, MPC (Coinbase, etc.)
+* **Agent Frameworks**: AI SDK, Langchain, Eliza, ZerePy, GAME, ElevenLabs, etc.
-**Problem**:
+GOAT is free software, MIT licensed, sponsored by [Crossmint](https://www.crossmint.com)
-Making agents perform onchain actions is tedious. The ecosystem is heavily fragmented, spanning 5+ popular agent development frameworks, multiple programming languages, and dozens of different blockchains and wallet architectures.
-
-For developers without blockchain expertise, finding clear instructions to perform simple actions - like sending USDC payments or placing Polymarket bets - is nearly impossible.
-
-**Solution**:
-
-GOAT solves this by providing an open-source, provider-agnostic framework that abstracts away all these combinations.
-
-- **For agent developers**: GOAT offers an always-growing catalog of ready made blockchain actions (sending tokens, using a DeFi protocol, ...) that can be imported as tools into your existing agent. It works with the most popular agent frameworks (Langchain, Vercel's AI SDK, Eliza, etc), Typescript and Python, 30+ blockchains (Solana, Base, Polygon, Mode, ...), and many wallet providers.
-- **For dApp / smart contract developers**: develop a plug-in in GOAT, and allow agents built with any of the most popular agent development frameworks to access your service.
-
-### Key features
-1. **Works Everywhere**: Compatible with Langchain, Vercelβs AI SDK, Eliza, and more.
-2. **Wallet Agnostic**: Supports all wallets, from your own key pairs to [Crossmint Smart Wallets](https://docs.crossmint.com/wallets/smart-wallets/overview) and Coinbase.
-3. **Multi-Chain**: Supports EVM chains and Solana (more coming π).
-4. **Customizable**: Use or build plugins for any onchain functionality (sending tokens, checking wallet balance, etc) and protocol (Polymarket, Uniswap, etc).
-
-### How it works
-GOAT plugs into your agents tool calling capabilities adding all the functions your agent needs to interact with blockchain protocols.
-
-High-level, here's how it works:
-
-
-
- Each wallet will have their specific client, e.g `viem(wallet)` for EVM key pairs or `smartwallet(wallet)` for Crossmint smart wallets.
-```typescript
-const wallet = ...
-
-const tools = getOnChainTools({
- wallet: viem(wallet),
-})
-```
-
-
-```typescript
-const wallet = ...
-
-const tools = getOnChainTools({
- wallet: viem(wallet),
- plugins: [
- sendETH(),
- erc20({ tokens: [USDC, PEPE] }),
- faucet(),
- polymarket(),
- // ...
- ],
-})
-```
-
-
-```typescript
-const wallet = ...
-
-const tools = getOnChainTools({
- wallet: viem(wallet),
- plugins: [
- sendETH(),
- erc20({ tokens: [USDC, PEPE] }),
- faucet(),
- polymarket(),
- // ...
- ],
-})
-
-// Vercel's AI SDK
-const result = await generateText({
- model: openai("gpt-4o-mini"),
- tools,
- maxSteps: 5,
- prompt: "Send 420 ETH to ohmygoat.eth",
-});
-```
-
-
-
-Ready to get started?
-
-### GOAT to start somewhere
+## Get started
-
- Get started in 2 minutes using our examples
+
+ Get started with the Typescript SDK
-
- Leverage existing plugins or create your own
+
+ Get started with the Python SDK
-
- Use any wallet you want, from key pairs to smart wallets from Crossmint
+
+
+
+## Follow us
+
+
+ Check out the Github repository
-
- Earn rewards by building plugins and wallet integrations for the community
+
+ Join the Discord community
diff --git a/docs/mint.json b/docs/mint.json
index 8abaf2d36..27fa467bc 100644
--- a/docs/mint.json
+++ b/docs/mint.json
@@ -55,15 +55,14 @@
{
"group": "Overview",
"pages": [
- "introduction",
- "chains-wallets-plugins",
- "examples",
- "plugins",
- "wallets",
- "chains"
+ "introduction"
]
}
],
+ "topbarCtaButton": {
+ "type": "github",
+ "url": "https://github.com/goat-sdk/goat"
+ },
"footerSocials": {
"github": "https://github.com/goat-sdk"
}
diff --git a/docs/plugins.mdx b/docs/plugins.mdx
deleted file mode 100644
index c862b2364..000000000
--- a/docs/plugins.mdx
+++ /dev/null
@@ -1,223 +0,0 @@
----
-title: Plugins
----
-
-GOAT plugins are extensions that enable your agent to interact with various blockchain protocols.
-
-Instead of having a generic function to execute arbitrary transactions, plugins provide specific tools for common protocols to **reduce the risk of hallucinations**.
-
-## Key Benefits
-- **Modularity**: Easily add or remove functionalities.
-- **Reusability**: Leverage community-built plugins.
-- **Customization**: Design plugins to meet the unique needs.
-
-----
-
-## Chain Compatibility
-Plugins can be EVM/Solana specific or chain-agnostic. If a plugin is chain-specific it will fail to compile when being used with a wallet of a different chain.
-
-See all available plugins [here](/chains-wallets-plugins#plugins).
-
-----
-
-## Plugin Architecture
-Plugins extend the `PluginBase` class defined in the [core package](https://github.com/goat-sdk/goat/tree/main/typescript/packages/core/src/classes/PluginBase.ts):
-
-```typescript
-import { PluginBase } from "@goat-sdk/core";
-
-export class YourPlugin extends PluginBase {
- constructor(params: YourPluginParams) {
- super("yourPlugin", []);
- }
-
- supportsChain = (chain: Chain) => chain.type === "evm";
-}
-
-export const yourPlugin = (params: YourPluginParams) => new YourPlugin(params);
-```
-
-Plugins get passed a [WalletClient](https://github.com/goat-sdk/goat/tree/main/typescript/packages/core/src/classes/WalletClientBase.ts) that can be chain-specific or chain-agnostic.
-
-The WalletClient abstracts the underlying wallet implementation and provides a common interface to:
-1. Get wallet information
-2. Sign messages
-3. Send transactions
-
-This allows plugins to:
-1. Work with any wallet implementation that implements the WalletClient interface, from key pairs to smart wallets.
-2. Focus on the specific communication with the protocol without worrying about handling transactions, message signing, etc. for each wallet implementation.
-
-----
-
-## Creating your own GOAT plugin
-
-### Using the Plugin Generator
-
-The easiest way to create a new plugin is using the `create-plugin` command. This command generates all the necessary files and configuration for a new plugin.
-
-```bash
-# Create a plugin with default type (any)
-pnpm create-plugin -n your-plugin-name
-
-# Create a plugin for a specific chain type
-pnpm create-plugin -n your-plugin-name -t evm # For EVM chains
-pnpm create-plugin -n your-plugin-name -t solana # For Solana
-```
-
-The command will generate:
-- A package.json with standard metadata and dependencies
-- TypeScript configuration files (tsconfig.json, tsup.config.ts)
-- A basic plugin structure in the src directory:
- - parameters.ts - Example parameters using Zod schema
- - your-plugin-name.service.ts - Service class with an example tool
- - your-plugin-name.plugin.ts - Plugin class extending PluginBase
- - index.ts - Exports for your plugin
-
-After generating the plugin, you can customize the generated code according to your needs following the guide below.
-
-### Manual Creation (Example)
-
-For a detailed understanding of plugin structure, let's walk through creating a plugin that signs messages with "BAAAA" π prefixed to them.
-
-
-
- Start by defining your plugin extending the [PluginBase](https://github.com/goat-sdk/goat/tree/main/typescript/packages/core/src/classes/PluginBase.ts) class.
-
- Since we are just signing messages, we will create a chain-agnostic plugin that works both on EVM and Solana chains.
-
-```typescript
-import { PluginBase, WalletClientBase } from "@goat-sdk/core";
-
-// Since we are creating a chain-agnostic plugin, we can use the WalletClientBase interface
-export class BAAAASigner extends PluginBase {
- constructor() {
- // We define the name of the plugin
- super("baaaSigner", []);
- }
-
- // We define the chain support for the plugin, in this case we support all chains
- supportsChain = (chain: Chain) => true;
-}
-
-// We export a factory function to create a new instance of the plugin
-export const baaaSigner = () => new BAAAASigner();
-```
-
-
- There are two ways to add tools to the plugin:
- 1. Using the `@Tool` decorator on our own class
- 2. Using the `getTools` and `createTool` functions to create tools dynamically
-
- #### Option 1: Using the `@Tool` decorator
- The `@Tool` decorator is a way to create tools in a more declarative way.
- You can create a class and decorate its methods with the `@Tool` decorator to create tools.
- The tool methods will receive the wallet client as the first argument and the parameters as the second argument.
-
- ```typescript
- import { Tool } from "@goat-sdk/core";
-
- class MyTools {
- @Tool({
- name: "sign_message_baaaa",
- description: "Sign a message with 'BAAAA' prefix",
- parameters: z.object({
- message: z.string(),
- }),
- })
- async signMessage(walletClient: WalletClientBase, parameters: z.infer) {
- const originalMessage: string = parameters.message;
- const prefixedMessage = `BAAAA${originalMessage}`;
- const signed = await walletClient.signMessage(prefixedMessage);
- return signed.signedMessage;
- }
- }
- ```
-
- Once we have our class we now need to import it in our plugin class.
-
- ```typescript
- import { PluginBase, WalletClientBase } from "@goat-sdk/core";
- import { MyTools } from "./my-tools.service.ts";
-
-export class BAAAASigner extends PluginBase {
- constructor() {
- // Import the tools we created in the previous step here
- super("baaaSigner", [new MyTools()]);
- }
-
- supportsChain = (chain: Chain) => true;
-}
-
-export const baaaSigner = () => new BAAAASigner();
- ```
-
- #### Option 2: Using the `getTools` and `createTool` functions
- We will start by implementing the `getTools` method in our plugin class.
-
- Inside the method, we will return an array of tools created using the `createTool` function.
- ```typescript
- import { PluginBase, WalletClientBase, createTool } from "@goat-sdk/core";
-
-// Since we are creating a chain-agnostic plugin, we can use the WalletClientBase interface
-export class BAAAASigner extends PluginBase {
- constructor() {
- // We define the name of the plugin
- super("baaaSigner", []);
- }
-
- // We define the chain support for the plugin, in this case we support all chains
- supportsChain = (chain: Chain) => true;
-
- getTools(walletClient: WalletClientBase) {
- return [
- // Create tool requires two arguments:
- // 1. The tool metadata (name, description, parameters)
- // 2. The tool method (the function that will be executed when the tool is used)
- createTool(
- {
- name: "sign_message_baaaa",
- description: "Sign a message with 'BAAAA' prefix",
- parameters: z.object({
- message: z.string(),
- }),
- },
- async (parameters) => {
- const originalMessage: string = parameters.message;
- const prefixedMessage = `BAAAA${originalMessage}`;
- const signed = await walletClient.signMessage(prefixedMessage);
- return signed.signedMessage;
- },
- ),
- ];
- }
-}
-
-// We export a factory function to create a new instance of the plugin
-export const baaaSigner = () => new BAAAASigner();
- ```
-
-
-
- ```typescript
-import { getOnChainTools } from '@goat-sdk/adapter-vercel-ai';
-import { baaaSigner } from './your-plugin-path/signMessagePlugin'; // Path to your plugin
-
-const wallet = /* Initialize your wallet client */;
-
-const tools = getOnChainTools({
- wallet: viem(wallet), // or smartwallet(wallet), solana(wallet), etc.
- plugins: [
- baaaSigner(),
- // ...other plugins
- ],
-});
-
-// Prompt: Sign the message "Go out and eat grass π"
- ```
-
-
-
-### Next steps
-- Share your plugin with others!
-- Open a PR to add it to the [plugins registry](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins) in the [GOAT SDK](https://github.com/goat-sdk/goat).
diff --git a/docs/wallets.mdx b/docs/wallets.mdx
deleted file mode 100644
index 6c7dfa7db..000000000
--- a/docs/wallets.mdx
+++ /dev/null
@@ -1,160 +0,0 @@
----
-title: Wallets
----
-Goat π is designed to work seamlessly with any wallet provider you use.
-
-Use basic key pair wallets or advanced smart wallets, such as those provided by companies like Crossmint or Coinbase.
-
-
-```typescript viem
-import { createWalletClient } from "viem";
-import { privateKeyToAccount } from "viem/accounts";
-import { sepolia } from "viem/chains";
-import { http } from "viem";
-
-import { getOnChainTools } from "@goat-sdk/adapter-vercel-ai";
-import { viem } from "@goat-sdk/wallet-viem";
-
-const account = privateKeyToAccount(
- process.env.WALLET_PRIVATE_KEY as `0x${string}`
-);
-
-const walletClient = createWalletClient({
- account: account,
- transport: http(process.env.ALCHEMY_API_KEY),
- chain: sepolia,
-});
-
-const tools = await getOnChainTools({
- wallet: viem(walletClient),
-});
-```
-
-```typescript Crossmint Smart Wallets
-import { getOnChainTools } from "@goat-sdk/adapter-vercel-ai";
-import { crossmint } from "@goat-sdk/crossmint";
-
-const apiKey = process.env.CROSSMINT_STAGING_API_KEY;
-const walletSignerSecretKey = process.env.SIGNER_WALLET_SECRET_KEY;
-const alchemyApiKey = process.env.ALCHEMY_API_KEY_BASE_SEPOLIA;
-const smartWalletAddress = process.env.SMART_WALLET_ADDRESS;
-
-const { smartwallet } = crossmint(apiKey);
-
-const tools = await getOnChainTools({
- wallet: await smartwallet({
- address: smartWalletAddress,
- signer: {
- secretKey: walletSignerSecretKey as `0x${string}`,
- },
- chain: "base-sepolia",
- provider: alchemyApiKey,
- }),
-});
-```
-
-```typescript Crossmint Custodial Wallets
-import { getOnChainTools } from "@goat-sdk/adapter-vercel-ai";
-import { crossmint } from "@goat-sdk/crossmint";
-import { Connection } from "@solana/web3.js";
-
-const apiKey = process.env.CROSSMINT_STAGING_API_KEY;
-const email = process.env.EMAIL;
-
-if (!apiKey || !email) {
- throw new Error("Missing environment variables");
-}
-
-const { custodial } = crossmint(apiKey);
-
-const tools = await getOnChainTools({
- wallet: await custodial({
- chain: "solana",
- email: email,
- env: "staging",
- connection: new Connection(
- "https://api.devnet.solana.com",
- "confirmed"
- ),
- }),
-});
-
-```
-
-```typescript Dynamic
-import { getOnChainTools } from "@goat-sdk/adapter-vercel-ai";
-import { viem } from "@goat-sdk/wallet-viem";
-import { useDynamicContext, useIsLoggedIn } from "@dynamic-labs/sdk-react-core";
-import { isEthereumWallet } from "@dynamic-labs/ethereum";
-
-const isLoggedIn = useIsLoggedIn();
-const { primaryWallet } = useDynamicContext();
-
-if (!isLoggedIn) {
- throw new Error("User is not logged in");
-}
-
-if (!isEthereumWallet(primaryWallet)) {
- throw new Error("Primary wallet is not an Ethereum wallet");
-}
-
-const walletClient = await primaryWallet.getWalletClient();
-
-const tools = await getOnChainTools({
- wallet: viem(walletClient),
-});
-```
-
-
-```typescript Solana
-import { getOnChainTools } from "@goat-sdk/adapter-vercel-ai";
-import { solana } from "@goat-sdk/wallet-solana";
-
-import { Connection, Keypair } from "@solana/web3.js";
-import * as bip39 from "bip39";
-
-const connection = new Connection(
- "https://api.mainnet-beta.solana.com",
- "confirmed"
-);
-
-const mnemonic = process.env.WALLET_MNEMONIC;
-
-const seed = bip39.mnemonicToSeedSync(mnemonic);
-const keypair = Keypair.fromSeed(Uint8Array.from(seed).subarray(0, 32));
-
-const tools = await getOnChainTools({
- wallet: solana({
- keypair,
- connection,
- }),
-});
-```
-
-```typescript Fuel
-import { getOnChainTools } from "@goat-sdk/adapter-vercel-ai";
-import { fuel } from "@goat-sdk/wallet-fuel";
-import { Provider } from "fuels";
-
-const provider = await Provider.create('https://mainnet.fuel.network/v1/graphql');
-
-const tools = await getOnChainTools({
- wallet: fuel({
- privateKey: process.env.FUEL_WALLET_PRIVATE_KEY,
- provider,
- }),
-});
-```
-
-
-
-## Creating your own wallet client
-If you don't see your wallet provider supported, you can easily integrate it by implementing the specific [WalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/core.ts) interface for the chain and type of wallet you want to support:
-
-1. [EVMWalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/evm.ts) for all EVM chains
-2. [EVMSmartWalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/evm-smart-wallet.ts) for EVM smart wallets
-2. [SolanaWalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/solana.ts) for Solana
-
-Checkout [here how the viem client implementation](https://github.com/goat-sdk/goat/blob/main/typescript/packages/wallets/viem/src/index.ts).
-
-If you would like to see your wallet provider supported, please open an issue or submit a PR.
\ No newline at end of file
diff --git a/python/README.md b/python/README.md
index c647fe79f..9c80ec466 100644
--- a/python/README.md
+++ b/python/README.md
@@ -1,14 +1,114 @@
-# Goat π - Python
-[Docs](https://ohmygoat.dev) | [Examples](https://github.com/goat-sdk/goat/tree/main/typescript/examples) | [Discord](https://discord.gg/goat-sdk)
+
-## Plugin Development
+[Website](https://ohmygoat.dev) | [X](https://x.com/goat_sdk) | [Discord](https://discord.gg/goat-sdk)
-GOAT SDK supports easy plugin development through our plugin generator script. This tool helps you quickly scaffold new plugins with the correct structure and boilerplate code.
+GOAT is free software, MIT licensed, sponsored by [Crossmint](https://www.crossmint.com)
-### Creating a New Plugin
+
+
-To create a new plugin, use the plugin generator script from the Python directory:
+
+
+
+
+
+# GOAT π (Python)
+
+
+GOAT (Great Onchain Agent Toolkit) is a library that adds more than +200 onchain tools to your AI agent.
+
+* **[+200 tools](#plugins)**: DeFi (Uniswap, Jupiter, KIM, Orca, etc.), minting (OpenSea, MagicEden, etc.), betting (Polymarket, etc.), analytics (CoinGecko, BirdEye, Allora, etc.) and more
+* **Chains**: EVM (Base, Polygon, Mode, Sei, etc.), Solana, Aptos, Chromia, Fuel, Sui, Starknet and Zilliqa
+* **[Wallets](#wallets)**: keypair, smart wallets (Crossmint, etc.), LIT, MPC (Coinbase, etc.)
+* **[Agent Frameworks](#agent-frameworks-adapters)**: AI SDK, Langchain, Eliza, ZerePy, GAME, ElevenLabs, etc.
+
+
+## Table of Contens
+- [See all plugins](#plugins)
+- [Installation](#installation)
+- [Usage](#usage)
+- [Examples](https://github.com/goat-sdk/goat/tree/main/python/examples)
+- [How to create a plugin](#how-to-create-a-plugin)
+ - [Using the plugin generator](#using-the-plugin-generator)
+ - [Manual creation](#manual-creation)
+- [How to add a chain](#how-to-add-a-chain)
+- [How to add a wallet provider](#how-to-add-a-wallet-provider)
+- [Packages](#packages)
+ - [Plugins](#plugins)
+ - [Wallets](#wallets)
+ - [Adapters](#agent-framework-adapters)
+
+## Installation
+1. Install the core package
+```bash
+pip install goat-sdk
+```
+2. Depending on the type of wallet you want to use, install the corresponding wallet (see all wallets [here](#wallets)):
+```bash
+pip install goat-sdk-wallet-solana
+```
+3. Install the plugins for the protocols you need (see all available plugins [here](#plugins))
+
+```bash
+pip install goat-sdk-plugin-spl-tokens
+```
+4. Install the adapter for the agent framework you want to use (see all available adapters [here](#adapters))
+```bash
+pip install goat-sdk-adapter-langchain
+```
+
+## Usage
+1. Configure your wallet
+```python
+from goat_wallets.solana import solana
+
+# Initialize Solana client and wallet
+client = SolanaClient(os.getenv("SOLANA_RPC_ENDPOINT"))
+keypair = Keypair.from_base58_string(os.getenv("SOLANA_WALLET_SEED") or "")
+wallet = solana(client, keypair)
+```
+
+2. Configure your tools for the framework you want to use
+```python
+# Initialize SPL Token plugin
+spl_token_plugin = spl_token(SplTokenPluginOptions(
+ network="devnet", # Using devnet as specified in .env
+ tokens=SPL_TOKENS
+))
+
+# Initialize tools with Solana wallet
+tools = get_on_chain_tools(
+ wallet=wallet,
+ plugins=[spl_token_plugin]
+)
+```
+
+3. Plug into your agent framework
+```python
+agent = create_tool_calling_agent(llm, tools, prompt)
+agent_executor = AgentExecutor(
+ agent=agent, tools=tools, handle_parsing_errors=True, verbose=True
+)
+
+response = agent_executor.invoke(
+ {
+ "input": "Send 10 USDC to ohmygoat.sol",
+ }
+)
+
+print(response)
+```
+
+## How to create a plugin
+GOAT plugins enable your agent to interact with various blockchain protocols.
+
+Plugins can be chain-specific (EVM, Solana, etc.) or chain-agnostic. If a plugin is chain-specific it will fail to compile when being used with a wallet of a different chain.
+
+You can see all available plugins [here](#plugins).
+
+### Using the Plugin Generator
+Run the plugin generator script from the `python` directory:
```bash
cd python
@@ -30,8 +130,6 @@ python scripts/create_plugin.py my-token --evm
python scripts/create_plugin.py my-service
```
-### Generated Structure
-
The script generates a complete plugin package with the following structure:
```
@@ -43,6 +141,255 @@ src/plugins//
βββ parameters.py # Pydantic parameter models
βββ service.py # Service implementation with Tool decorators
```
-For more information about plugin development, check out our [documentation](https://ohmygoat.dev).
+### Manual Creation
+#### 1. Define your plugin extending the [PluginBase](https://github.com/goat-sdk/goat/tree/main/python/src/goat_sdk/goat/classes/plugin_base.py) class.
+
+```python
+from goat.classes.plugin_base import PluginBase
+
+# For a chain-agnostic plugin we use the WalletClientBase interface, for a chain-specific plugin we use the EVMWalletClient, SolanaWalletClient, or corresponding interfaces
+class MyPlugin(PluginBase[WalletClientBase]):
+ def __init__(self):
+ # We define the name of the plugin
+ super("myPlugin", []);
+
+ # We define the chain support for the plugin, in this case we support all chains
+ def supports_chain(self, chain: Chain) -> bool:
+ return True
+
+# We export a factory function to create a new instance of the plugin
+my_plugin = () => MyPlugin()
+```
+
+#### 2. Add tools to the plugin
+You can create a class and decorate its methods with the `@Tool` decorator to create tools.
+
+The tool methods will receive the wallet client as the first argument and the parameters as the second argument.
+
+```python
+from pydantic import BaseModel, Field
+
+class SignMessageParameters(BaseModel):
+ message: str = Field(..., description="The message to sign")
+
+class MyTools {
+ @Tool({
+ "name": "sign_message",
+ "description": "Sign a message",
+ "parameters_schema": SignMessageParameters
+ })
+ async def sign_message(self, walletClient: WalletClientBase, parameters: dict):
+ signed = await walletClient.sign_message(parameters.message);
+ return signed.signed_message;
+ }
+```
+
+Once we have our class we now need to import it in our plugin class.
+
+```python
+class MyPlugin(PluginBase[WalletClientBase]):
+ def __init__(self):
+ # We define the name of the plugin
+ super("myPlugin", [MyTools()]);
+
+ # We define the chain support for the plugin, in this case we support all chains
+ def supports_chain(self, chain: Chain) -> bool:
+ return True
+}
+
+# We export a factory function to create a new instance of the plugin
+my_plugin = () => MyPlugin()
+```
+
+Inside the method, we will return an array of tools created using the `createTool` function.
+
+```typescript
+import { PluginBase, WalletClientBase, createTool } from "@goat-sdk/core";
+
+// Since we are creating a chain-agnostic plugin, we can use the WalletClientBase interface
+export class MyPlugin extends PluginBase {
+ constructor() {
+ // We define the name of the plugin
+ super("myPlugin", []);
+ }
+
+ // We define the chain support for the plugin, in this case we support all chains
+ supportsChain = (chain: Chain) => true;
+
+ getTools(walletClient: WalletClientBase) {
+ return [
+ // Create tool requires two arguments:
+ // 1. The tool metadata (name, description, parameters)
+ // 2. The tool method (the function that will be executed when the tool is used)
+ createTool(
+ {
+ name: "sign_message",
+ description: "Sign a message",
+ parameters: z.object({
+ message: z.string(),
+ }),
+ },
+ async (parameters) => {
+ const signed = await walletClient.signMessage(parameters.message);
+ return signed.signedMessage;
+ },
+ ),
+ ];
+ }
+}
+
+// We export a factory function to create a new instance of the plugin
+export const myPlugin = () => new MyPlugin();
+```
+
+#### 3. Add the plugin to the agent
+
+```python
+tools = get_on_chain_tools(
+ wallet=wallet,
+ plugins=[my_plugin]
+)
+```
+
+#### Next steps
+- Share your plugin with others!
+- Open a PR to add it to the [plugins registry](https://github.com/goat-sdk/goat/tree/main/python/src/plugins) in the [GOAT SDK](https://github.com/goat-sdk/goat).
+
+
+## How to add a chain
+
+### 1. Add the chain to the `chain.py` file
+Add your chain to the `chain.py` file in the [core package](https://github.com/goat-sdk/goat/tree/main/python/src/goat_sdk/goat/types/chain.py).
+
+```python
+class MyAwesomeChain(TypedDict):
+ """MyAwesomeChain chain type definition
+
+ Args:
+ type: Literal "my-awesome-chain" chain type identifier
+ """
+ type: Literal["my-awesome-chain"]
+
+# ...
+Chain = Union[EvmChain, SolanaChain, MyAwesomeChain]
+```
+
+### 2. Create a new wallet provider package
+Create a new package in the [wallets directory](https://github.com/goat-sdk/goat/tree/main/python/src/wallets) with the name of your chain (e.g. `my-awesome-chain`) or copy an existing one (e.g. `evm`).
+In this package you will define the abstract class for your chain's wallet client which will extend the `WalletClientBase` class defined in the [core package](https://github.com/goat-sdk/goat/tree/main/python/src/goat-sdk/goat/wallets/core.py).
+
+WalletClientBase only includes the methods that are supported by all chains such as:
+1. `get_address`
+2. `get_chain`
+3. `sign_message`
+4. `balance_of`
+
+As well as includes the `get_core_tools` method which returns the core tools for the chain.
+
+```python
+class MyAwesomeChainWalletClient(WalletClientBase):
+ @abstractmethod
+ def get_chain(self) -> MyAwesomeChain:
+ """Get the EVM chain this wallet is connected to."""
+ pass
+
+ @abstractmethod
+ def send_transaction(self, transaction: MyAwesomeChainTransaction) -> Dict[str, str]:
+ """Send a transaction on the EVM chain."""
+ pass
+
+ @abstractmethod
+ def read(self, request: MyAwesomeChainReadRequest) -> MyAwesomeChainReadResult:
+ """Read data from a smart contract."""
+ pass
+}
+```
+
+### 3. Create a plugin to allow sending your native token to a wallet
+Create a plugin to allow sending your native token to a wallet. Create a file in the same package as your wallet client and create a new file like `send.py`.
+
+Implement the core plugin.
+
+
+```python
+class SendMYAWESOMETOKENPlugin(PluginBase[MyAwesomeChainWalletClient]):
+ def __init__(self):
+ super().__init__("sendMYAWESOMETOKEN", [])
+
+ def supports_chain(self, chain: Chain) -> bool:
+ return chain["type"] == "my-awesome-chain"
+
+ def get_tools(self, wallet_client: MyAwesomeChainWalletClient) -> List[ToolBase]:
+ send_tool = create_tool(
+ config={
+ "name": f"send_myawesometoken",
+ "description": f"Send MYAWESOMETOKEN to an address.",
+ "parameters": SendMYAWESOMETOKENParameters,
+ },
+ execute_fn=lambda params: send_myawesometoken_method(
+ wallet_client, cast(Dict[str, str], params)
+ ),
+ )
+ return [send_tool]
+```
+
+### 4. Implement the wallet client
+Extend your abstract class with the methods you need to implement and create your first wallet client! (e.g `MyAwesomeChainKeyPairWalletClient`)
+
+```python
+class MyAwesomeChainKeyPairWalletClient(MyAwesomeChainWalletClient):
+ # Implement the methods here
+ pass
+
+# Export the wallet client with a factory function
+my_awesome_chain_wallet_client = () => MyAwesomeChainKeyPairWalletClient()
+```
+
+### 5. Submit a PR
+Submit a PR to add your wallet provider to the [wallets directory](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets).
+
+## How to add a wallet provider
+If you don't see your wallet provider supported, you can easily integrate it by implementing the specific [WalletClient](https://github.com/goat-sdk/goat/blob/main/python/src/wallets) interface for the chain and type of wallet you want to support:
+
+Checkout [here how the web3 client implementation](https://github.com/goat-sdk/goat/tree/main/python/src/wallets/web3).
+
+If you would like to see your wallet provider supported, please open an issue or submit a PR.
+
+## Packages
+### Core
+| | PyPI package |
+| --- | --- |
+| Core | [goat-sdk](https://pypi.org/project/goat-sdk/) |
+
+### Wallets
+| Wallet | PyPI package |
+| --- | --- |
+|EVM | [goat-sdk-wallet-evm](https://pypi.org/project/goat-sdk-wallet-evm/) |
+| Web3 | [goat-sdk-wallet-web3](https://pypi.org/project/goat-sdk-wallet-web3/) |
+| Solana | [goat-sdk-wallet-solana](https://pypi.org/project/goat-sdk-wallet-solana/) |
+
+### Agent Framework Adapters
+| Adapter | PyPI package |
+| --- | --- |
+| Langchain | [goat-sdk-adapter-langchain](https://pypi.org/project/goat-sdk-adapter-langchain/) |
+
+**ZerePy and GAME have direct integrations on their respective repos.*
+### Plugins
+| Plugin | Tools | PyPI package |
+| --- | --- | --- |
+| 1inch | Get wallet balances using 1inch API | [goat-sdk-plugin-1inch](https://pypi.org/project/goat-sdk-plugin-1inch/) |
+| Allora | Get price predictions using Allora API | [goat-sdk-plugin-allora](https://pypi.org/project/goat-sdk-plugin-allora/) |
+| CoinGecko | Get coin information using CoinGecko API | [goat-sdk-plugin-coingecko](https://pypi.org/project/goat-sdk-plugin-coingecko/) |
+| Dexscreener | Get token information using Dexscreener API | [goat-sdk-plugin-dexscreener](https://pypi.org/project/goat-sdk-plugin-dexscreener/) |
+| ERC20 | Interact with any ERC20 token | [goat-sdk-plugin-erc20](https://pypi.org/project/goat-sdk-plugin-erc20/) |
+| Farcaster | Read and post casts on Farcaster | [goat-sdk-plugin-farcaster](https://pypi.org/project/goat-sdk-plugin-farcaster/) |
+| JSON RPC | Call any JSON RPC endpoint |[goat-sdk-plugin-json-rpc](https://pypi.org/project/goat-sdk-plugin-json-rpc/) | |
+| Jupiter | Get price predictions using Jupiter API | [goat-sdk-plugin-jupiter](https://pypi.org/project/goat-sdk-plugin-jupiter/) | |
+| Nansen | Get wallet insights using Nansen API | [goat-sdk-plugin-nansen](https://pypi.org/project/goat-sdk-plugin-nansen/) | |
+| OpenSea | Get NFT and sales data from OpenSea | [goat-sdk-plugin-opensea](https://pypi.org/project/goat-sdk-plugin-opensea/) | |
+| Rugcheck | Check if tokens are legit with Rugcheck | [goat-sdk-plugin-rugcheck](https://pypi.org/project/goat-sdk-plugin-rugcheck/) | |
+| SPL Tokens | Interact with SPL tokens | [goat-sdk-plugin-spl-tokens](https://pypi.org/project/goat-sdk-plugin-spl-tokens/) | |
+| Superfluid | Create streams with Superfluid | [goat-sdk-plugin-superfluid](https://pypi.org/project/goat-sdk-plugin-superfluid/) | |
+| Uniswap | Get quotes and swap on Uniswap | [goat-sdk-plugin-uniswap](https://pypi.org/project/goat-sdk-plugin-uniswap/) | |
diff --git a/python/TODO b/python/TODO
new file mode 100644
index 000000000..eaf8abdde
--- /dev/null
+++ b/python/TODO
@@ -0,0 +1,37 @@
+- Jupiter TX decompilation and address lookup tables
+- Uniswap plugin
+- Crossmint wallet plugin?
+- Pippin PR and README against their repo
+
+
+- Basic example
+ - examples/langchain/viem
+- Publish packages
+- ZerePy (register action) PR
+ - every action installed
+- Devin example to translate an existing plugin
+ - Playbooks
+ - ERC 721
+ - Kim plugin
+
+
+Next up:
+- Solata plugin
+
+- (PRIO) Python packaging & release
+- viem wallet (web3 [https://web3py.readthedocs.io/en/stable/web3.eth.html])
+- erc20 plugin: abi parsing with web3? or use static kim/abi/erc20.ts
+- langchain adapter
+- "Get my balance in USDC" example
+- "Prompt REPL" console
+
+
+- Devin porting of simple plugins
+- Automated testing workflow with actions
+- ZerePy integration
+-
+
+Wallet:
+- USDC/ETH in Sepolia
+- ETH in base
+- USDC/ moa
diff --git a/python/examples/langchain/solana/example.py b/python/examples/langchain/solana/example.py
index e23c353a5..3bc913e68 100644
--- a/python/examples/langchain/solana/example.py
+++ b/python/examples/langchain/solana/example.py
@@ -12,6 +12,7 @@
from goat_adapters.langchain import get_on_chain_tools
from goat_wallets.solana import solana
+from goat_plugins.jupiter import jupiter, JupiterPluginOptions
from goat_plugins.spl_token import spl_token, SplTokenPluginOptions
from goat_plugins.spl_token.tokens import SPL_TOKENS
@@ -35,16 +36,16 @@ def main():
]
)
- # Initialize SPL Token plugin
- spl_token_plugin = spl_token(SplTokenPluginOptions(
- network="devnet", # Using devnet as specified in .env
- tokens=SPL_TOKENS
- ))
-
# Initialize tools with Solana wallet
tools = get_on_chain_tools(
wallet=wallet,
- plugins=[spl_token_plugin]
+ plugins=[
+ jupiter(JupiterPluginOptions()), # No options needed for Jupiter v6
+ spl_token(SplTokenPluginOptions(
+ network="mainnet", # Using devnet as specified in .env
+ tokens=SPL_TOKENS
+ )),
+ ],
)
agent = create_tool_calling_agent(llm, tools, prompt)
diff --git a/python/examples/langchain/solana/poetry.lock b/python/examples/langchain/solana/poetry.lock
index a5d0acfd8..20b651593 100644
--- a/python/examples/langchain/solana/poetry.lock
+++ b/python/examples/langchain/solana/poetry.lock
@@ -636,7 +636,7 @@ files = [
[[package]]
name = "goat-sdk"
-version = "0.1.1"
+version = "0.1.2"
description = "Goat π (Great Onchain Agent Toolkit) is an open-source framework for connecting AI agents to any onchain app"
optional = false
python-versions = "^3.10"
@@ -668,6 +668,23 @@ langchain = "^0.3.14"
type = "directory"
url = "../../../src/adapters/langchain"
+[[package]]
+name = "goat-sdk-plugin-jupiter"
+version = "0.1.0"
+description = "Goat plugin for jupiter"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+goat-sdk = "^0.1.0"
+goat-sdk-wallet-solana = "^0.1.1"
+
+[package.source]
+type = "directory"
+url = "../../../src/plugins/jupiter"
+
[[package]]
name = "goat-sdk-plugin-spl-token"
version = "0.1.0"
@@ -690,7 +707,7 @@ url = "../../../src/plugins/spl_token"
[[package]]
name = "goat-sdk-wallet-solana"
-version = "0.1.0"
+version = "0.1.1"
description = "Goat SDK Solana wallet implementation"
optional = false
python-versions = "^3.10"
@@ -1009,20 +1026,20 @@ qa = ["pytest", "pytest-cov", "tox"]
[[package]]
name = "langchain"
-version = "0.3.14"
+version = "0.3.15"
description = "Building applications with LLMs through composability"
optional = false
python-versions = "<4.0,>=3.9"
files = [
- {file = "langchain-0.3.14-py3-none-any.whl", hash = "sha256:5df9031702f7fe6c956e84256b4639a46d5d03a75be1ca4c1bc9479b358061a2"},
- {file = "langchain-0.3.14.tar.gz", hash = "sha256:4a5ae817b5832fa0e1fcadc5353fbf74bebd2f8e550294d4dc039f651ddcd3d1"},
+ {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"
-langchain-core = ">=0.3.29,<0.4.0"
+langchain-core = ">=0.3.31,<0.4.0"
langchain-text-splitters = ">=0.3.3,<0.4.0"
-langsmith = ">=0.1.17,<0.3"
+langsmith = ">=0.1.17,<0.4"
numpy = {version = ">=1.26.2,<3", markers = "python_version >= \"3.12\""}
pydantic = ">=2.7.4,<3.0.0"
PyYAML = ">=5.3"
@@ -1032,18 +1049,18 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10"
[[package]]
name = "langchain-core"
-version = "0.3.30"
+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.30-py3-none-any.whl", hash = "sha256:0a4c4e02fac5968b67fbb0142c00c2b976c97e45fce62c7ac9eb1636a6926493"},
- {file = "langchain_core-0.3.30.tar.gz", hash = "sha256:0f1281b4416977df43baf366633ad18e96c5dcaaeae6fcb8a799f9889c853243"},
+ {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.3"
+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\""},
@@ -1055,17 +1072,17 @@ typing-extensions = ">=4.7"
[[package]]
name = "langchain-openai"
-version = "0.3.0"
+version = "0.3.1"
description = "An integration package connecting OpenAI and LangChain"
optional = false
python-versions = "<4.0,>=3.9"
files = [
- {file = "langchain_openai-0.3.0-py3-none-any.whl", hash = "sha256:49c921a22d272b04749a61e78bffa83aecdb8840b24b69f2909e115a357a9a5b"},
- {file = "langchain_openai-0.3.0.tar.gz", hash = "sha256:88d623eeb2aaa1fff65c2b419a4a1cfd37d3a1d504e598b87cf0bc822a3b70d0"},
+ {file = "langchain_openai-0.3.1-py3-none-any.whl", hash = "sha256:5cf2a1e115b12570158d89c22832fa381803c3e1e11d1eb781195c8d9e454bd5"},
+ {file = "langchain_openai-0.3.1.tar.gz", hash = "sha256:cce314f1437b2cad73e0ed2b55e74dc399bc1bbc43594c4448912fb51c5e4447"},
]
[package.dependencies]
-langchain-core = ">=0.3.29,<0.4.0"
+langchain-core = ">=0.3.30,<0.4.0"
openai = ">=1.58.1,<2.0.0"
tiktoken = ">=0.7,<1"
@@ -1222,77 +1239,77 @@ files = [
[[package]]
name = "numpy"
-version = "2.2.1"
+version = "2.2.2"
description = "Fundamental package for array computing in Python"
optional = false
python-versions = ">=3.10"
files = [
- {file = "numpy-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5edb4e4caf751c1518e6a26a83501fda79bff41cc59dac48d70e6d65d4ec4440"},
- {file = "numpy-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa3017c40d513ccac9621a2364f939d39e550c542eb2a894b4c8da92b38896ab"},
- {file = "numpy-2.2.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:61048b4a49b1c93fe13426e04e04fdf5a03f456616f6e98c7576144677598675"},
- {file = "numpy-2.2.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:7671dc19c7019103ca44e8d94917eba8534c76133523ca8406822efdd19c9308"},
- {file = "numpy-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4250888bcb96617e00bfa28ac24850a83c9f3a16db471eca2ee1f1714df0f957"},
- {file = "numpy-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7746f235c47abc72b102d3bce9977714c2444bdfaea7888d241b4c4bb6a78bf"},
- {file = "numpy-2.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:059e6a747ae84fce488c3ee397cee7e5f905fd1bda5fb18c66bc41807ff119b2"},
- {file = "numpy-2.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f62aa6ee4eb43b024b0e5a01cf65a0bb078ef8c395e8713c6e8a12a697144528"},
- {file = "numpy-2.2.1-cp310-cp310-win32.whl", hash = "sha256:48fd472630715e1c1c89bf1feab55c29098cb403cc184b4859f9c86d4fcb6a95"},
- {file = "numpy-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:b541032178a718c165a49638d28272b771053f628382d5e9d1c93df23ff58dbf"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5"},
- {file = "numpy-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73"},
- {file = "numpy-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591"},
- {file = "numpy-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8"},
- {file = "numpy-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0"},
- {file = "numpy-2.2.1-cp311-cp311-win32.whl", hash = "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd"},
- {file = "numpy-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355"},
- {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7"},
- {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d"},
- {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51"},
- {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046"},
- {file = "numpy-2.2.1-cp312-cp312-win32.whl", hash = "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2"},
- {file = "numpy-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348"},
- {file = "numpy-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59"},
- {file = "numpy-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af"},
- {file = "numpy-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51"},
- {file = "numpy-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716"},
- {file = "numpy-2.2.1-cp313-cp313-win32.whl", hash = "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e"},
- {file = "numpy-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84"},
- {file = "numpy-2.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631"},
- {file = "numpy-2.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d"},
- {file = "numpy-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5"},
- {file = "numpy-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71"},
- {file = "numpy-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2"},
- {file = "numpy-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ba9cc93a91d86365a5d270dee221fdc04fb68d7478e6bf6af650de78a8339e3"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:3d03883435a19794e41f147612a77a8f56d4e52822337844fff3d4040a142964"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4511d9e6071452b944207c8ce46ad2f897307910b402ea5fa975da32e0102800"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5c5cc0cbabe9452038ed984d05ac87910f89370b9242371bd9079cb4af61811e"},
- {file = "numpy-2.2.1.tar.gz", hash = "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918"},
+ {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 = "openai"
-version = "1.59.7"
+version = "1.59.9"
description = "The official Python library for the openai API"
optional = false
python-versions = ">=3.8"
files = [
- {file = "openai-1.59.7-py3-none-any.whl", hash = "sha256:cfa806556226fa96df7380ab2e29814181d56fea44738c2b0e581b462c268692"},
- {file = "openai-1.59.7.tar.gz", hash = "sha256:043603def78c00befb857df9f0a16ee76a3af5984ba40cb7ee5e2f40db4646bf"},
+ {file = "openai-1.59.9-py3-none-any.whl", hash = "sha256:61a0608a1313c08ddf92fe793b6dbd1630675a1fe3866b2f96447ce30050c448"},
+ {file = "openai-1.59.9.tar.gz", hash = "sha256:ec1a20b0351b4c3e65c6292db71d8233515437c6065efd4fd50edeb55df5f5d2"},
]
[package.dependencies]
@@ -1311,86 +1328,90 @@ realtime = ["websockets (>=13,<15)"]
[[package]]
name = "orjson"
-version = "3.10.14"
+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.14-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:849ea7845a55f09965826e816cdc7689d6cf74fe9223d79d758c714af955bcb6"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5947b139dfa33f72eecc63f17e45230a97e741942955a6c9e650069305eb73d"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cde6d76910d3179dae70f164466692f4ea36da124d6fb1a61399ca589e81d69a"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6dfbaeb7afa77ca608a50e2770a0461177b63a99520d4928e27591b142c74b1"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa45e489ef80f28ff0e5ba0a72812b8cfc7c1ef8b46a694723807d1b07c89ebb"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5007abfdbb1d866e2aa8990bd1c465f0f6da71d19e695fc278282be12cffa5"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1b49e2af011c84c3f2d541bb5cd1e3c7c2df672223e7e3ea608f09cf295e5f8a"},
- {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:164ac155109226b3a2606ee6dda899ccfbe6e7e18b5bdc3fbc00f79cc074157d"},
- {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6b1225024cf0ef5d15934b5ffe9baf860fe8bc68a796513f5ea4f5056de30bca"},
- {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d6546e8073dc382e60fcae4a001a5a1bc46da5eab4a4878acc2d12072d6166d5"},
- {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9f1d2942605c894162252d6259b0121bf1cb493071a1ea8cb35d79cb3e6ac5bc"},
- {file = "orjson-3.10.14-cp310-cp310-win32.whl", hash = "sha256:397083806abd51cf2b3bbbf6c347575374d160331a2d33c5823e22249ad3118b"},
- {file = "orjson-3.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:fa18f949d3183a8d468367056be989666ac2bef3a72eece0bade9cdb733b3c28"},
- {file = "orjson-3.10.14-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f506fd666dd1ecd15a832bebc66c4df45c1902fd47526292836c339f7ba665a9"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efe5fd254cfb0eeee13b8ef7ecb20f5d5a56ddda8a587f3852ab2cedfefdb5f6"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ddc8c866d7467f5ee2991397d2ea94bcf60d0048bdd8ca555740b56f9042725"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af8e42ae4363773658b8d578d56dedffb4f05ceeb4d1d4dd3fb504950b45526"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84dd83110503bc10e94322bf3ffab8bc49150176b49b4984dc1cce4c0a993bf9"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36f5bfc0399cd4811bf10ec7a759c7ab0cd18080956af8ee138097d5b5296a95"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868943660fb2a1e6b6b965b74430c16a79320b665b28dd4511d15ad5038d37d5"},
- {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33449c67195969b1a677533dee9d76e006001213a24501333624623e13c7cc8e"},
- {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e4c9f60f9fb0b5be66e416dcd8c9d94c3eabff3801d875bdb1f8ffc12cf86905"},
- {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0de4d6315cfdbd9ec803b945c23b3a68207fd47cbe43626036d97e8e9561a436"},
- {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83adda3db595cb1a7e2237029b3249c85afbe5c747d26b41b802e7482cb3933e"},
- {file = "orjson-3.10.14-cp311-cp311-win32.whl", hash = "sha256:998019ef74a4997a9d741b1473533cdb8faa31373afc9849b35129b4b8ec048d"},
- {file = "orjson-3.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:9d034abdd36f0f0f2240f91492684e5043d46f290525d1117712d5b8137784eb"},
- {file = "orjson-3.10.14-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2ad4b7e367efba6dc3f119c9a0fcd41908b7ec0399a696f3cdea7ec477441b09"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f496286fc85e93ce0f71cc84fc1c42de2decf1bf494094e188e27a53694777a7"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7f189bbfcded40e41a6969c1068ba305850ba016665be71a217918931416fbf"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cc8204f0b75606869c707da331058ddf085de29558b516fc43c73ee5ee2aadb"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deaa2899dff7f03ab667e2ec25842d233e2a6a9e333efa484dfe666403f3501c"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1c3ea52642c9714dc6e56de8a451a066f6d2707d273e07fe8a9cc1ba073813d"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d3f9ed72e7458ded9a1fb1b4d4ed4c4fdbaf82030ce3f9274b4dc1bff7ace2b"},
- {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:07520685d408a2aba514c17ccc16199ff2934f9f9e28501e676c557f454a37fe"},
- {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:76344269b550ea01488d19a2a369ab572c1ac4449a72e9f6ac0d70eb1cbfb953"},
- {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e2979d0f2959990620f7e62da6cd954e4620ee815539bc57a8ae46e2dacf90e3"},
- {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03f61ca3674555adcb1aa717b9fc87ae936aa7a63f6aba90a474a88701278780"},
- {file = "orjson-3.10.14-cp312-cp312-win32.whl", hash = "sha256:d5075c54edf1d6ad81d4c6523ce54a748ba1208b542e54b97d8a882ecd810fd1"},
- {file = "orjson-3.10.14-cp312-cp312-win_amd64.whl", hash = "sha256:175cafd322e458603e8ce73510a068d16b6e6f389c13f69bf16de0e843d7d406"},
- {file = "orjson-3.10.14-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:0905ca08a10f7e0e0c97d11359609300eb1437490a7f32bbaa349de757e2e0c7"},
- {file = "orjson-3.10.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92d13292249f9f2a3e418cbc307a9fbbef043c65f4bd8ba1eb620bc2aaba3d15"},
- {file = "orjson-3.10.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90937664e776ad316d64251e2fa2ad69265e4443067668e4727074fe39676414"},
- {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9ed3d26c4cb4f6babaf791aa46a029265850e80ec2a566581f5c2ee1a14df4f1"},
- {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:56ee546c2bbe9599aba78169f99d1dc33301853e897dbaf642d654248280dc6e"},
- {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:901e826cb2f1bdc1fcef3ef59adf0c451e8f7c0b5deb26c1a933fb66fb505eae"},
- {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:26336c0d4b2d44636e1e1e6ed1002f03c6aae4a8a9329561c8883f135e9ff010"},
- {file = "orjson-3.10.14-cp313-cp313-win32.whl", hash = "sha256:e2bc525e335a8545c4e48f84dd0328bc46158c9aaeb8a1c2276546e94540ea3d"},
- {file = "orjson-3.10.14-cp313-cp313-win_amd64.whl", hash = "sha256:eca04dfd792cedad53dc9a917da1a522486255360cb4e77619343a20d9f35364"},
- {file = "orjson-3.10.14-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9a0fba3b8a587a54c18585f077dcab6dd251c170d85cfa4d063d5746cd595a0f"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:175abf3d20e737fec47261d278f95031736a49d7832a09ab684026528c4d96db"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29ca1a93e035d570e8b791b6c0feddd403c6a5388bfe870bf2aa6bba1b9d9b8e"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f77202c80e8ab5a1d1e9faf642343bee5aaf332061e1ada4e9147dbd9eb00c46"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e2ec73b7099b6a29b40a62e08a23b936423bd35529f8f55c42e27acccde7954"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d1679df9f9cd9504f8dff24555c1eaabba8aad7f5914f28dab99e3c2552c9d"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:691ab9a13834310a263664313e4f747ceb93662d14a8bdf20eb97d27ed488f16"},
- {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b11ed82054fce82fb74cea33247d825d05ad6a4015ecfc02af5fbce442fbf361"},
- {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:e70a1d62b8288677d48f3bea66c21586a5f999c64ecd3878edb7393e8d1b548d"},
- {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:16642f10c1ca5611251bd835de9914a4b03095e28a34c8ba6a5500b5074338bd"},
- {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3871bad546aa66c155e3f36f99c459780c2a392d502a64e23fb96d9abf338511"},
- {file = "orjson-3.10.14-cp38-cp38-win32.whl", hash = "sha256:0293a88815e9bb5c90af4045f81ed364d982f955d12052d989d844d6c4e50945"},
- {file = "orjson-3.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:6169d3868b190d6b21adc8e61f64e3db30f50559dfbdef34a1cd6c738d409dfc"},
- {file = "orjson-3.10.14-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:06d4ec218b1ec1467d8d64da4e123b4794c781b536203c309ca0f52819a16c03"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:962c2ec0dcaf22b76dee9831fdf0c4a33d4bf9a257a2bc5d4adc00d5c8ad9034"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:21d3be4132f71ef1360385770474f29ea1538a242eef72ac4934fe142800e37f"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28ed60597c149a9e3f5ad6dd9cebaee6fb2f0e3f2d159a4a2b9b862d4748860"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e947f70167fe18469f2023644e91ab3d24f9aed69a5e1c78e2c81b9cea553fb"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64410696c97a35af2432dea7bdc4ce32416458159430ef1b4beb79fd30093ad6"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8050a5d81c022561ee29cd2739de5b4445f3c72f39423fde80a63299c1892c52"},
- {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b49a28e30d3eca86db3fe6f9b7f4152fcacbb4a467953cd1b42b94b479b77956"},
- {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ca041ad20291a65d853a9523744eebc3f5a4b2f7634e99f8fe88320695ddf766"},
- {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d313a2998b74bb26e9e371851a173a9b9474764916f1fc7971095699b3c6e964"},
- {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7796692136a67b3e301ef9052bde6fe8e7bd5200da766811a3a608ffa62aaff0"},
- {file = "orjson-3.10.14-cp39-cp39-win32.whl", hash = "sha256:eee4bc767f348fba485ed9dc576ca58b0a9eac237f0e160f7a59bce628ed06b3"},
- {file = "orjson-3.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:96a1c0ee30fb113b3ae3c748fd75ca74a157ff4c58476c47db4d61518962a011"},
- {file = "orjson-3.10.14.tar.gz", hash = "sha256:cf31f6f071a6b8e7aa1ead1fa27b935b48d00fbfa6a28ce856cfff2d5dd68eed"},
+ {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]]
@@ -2598,4 +2619,4 @@ cffi = ["cffi (>=1.11)"]
[metadata]
lock-version = "2.0"
python-versions = "^3.12"
-content-hash = "ec8ed4bac234a235849cc08c4cc45749796657c448974a1f28d208f380cb7988"
+content-hash = "24a3f5515af065f2be32ee6d1ea57b2f2b34cfd004bc596d0ca98c0d0412ada8"
diff --git a/python/examples/langchain/solana/pyproject.toml b/python/examples/langchain/solana/pyproject.toml
index a4e3a9bb5..04797b5b4 100644
--- a/python/examples/langchain/solana/pyproject.toml
+++ b/python/examples/langchain/solana/pyproject.toml
@@ -22,7 +22,8 @@ anchorpy = "^0.18.0"
goat-sdk = "*"
goat-sdk-wallet-solana = "*"
goat-sdk-adapter-langchain = "*"
-goat-sdk-plugin-spl-token = { path = "../../../src/plugins/spl_token", develop = true }
+goat-sdk-plugin-spl-token = "^0.1.0"
+goat-sdk-plugin-jupiter = "^0.1.0"
[tool.poetry.group.test.dependencies]
pytest = "*"
@@ -47,6 +48,7 @@ ruff = "^0.8.6"
goat-sdk = { path = "../../../src/goat-sdk", develop = true }
goat-sdk-wallet-solana = { path = "../../../src/wallets/solana", develop = true }
goat-sdk-adapter-langchain = { path = "../../../src/adapters/langchain", develop = true }
+goat-sdk-plugin-jupiter = { path = "../../../src/plugins/jupiter", develop = true }
[tool.ruff]
line-length = 120
diff --git a/python/examples/langchain/uniswap/.env.template b/python/examples/langchain/uniswap/.env.template
new file mode 100644
index 000000000..7537248e8
--- /dev/null
+++ b/python/examples/langchain/uniswap/.env.template
@@ -0,0 +1,5 @@
+OPENAI_API_KEY=
+WALLET_PRIVATE_KEY=
+RPC_PROVIDER_URL=https://mainnet.base.org
+UNISWAP_API_KEY=
+
diff --git a/python/examples/langchain/uniswap/README.md b/python/examples/langchain/uniswap/README.md
new file mode 100644
index 000000000..2930ff0dc
--- /dev/null
+++ b/python/examples/langchain/uniswap/README.md
@@ -0,0 +1,21 @@
+# Langchain web3 Example
+
+## Setup
+
+Copy the `.env.template` and populate with your values.
+
+```
+cp .env.template .env
+```
+
+Install dependencies
+
+```
+poetry install
+```
+
+## Usage
+
+```
+poetry run example.py
+```
diff --git a/python/examples/langchain/uniswap/example.py b/python/examples/langchain/uniswap/example.py
new file mode 100644
index 000000000..cf45c377d
--- /dev/null
+++ b/python/examples/langchain/uniswap/example.py
@@ -0,0 +1,123 @@
+import os
+from dotenv import load_dotenv
+from goat_plugins.erc20.token import PEPE, USDC
+
+# Load environment variables
+load_dotenv()
+
+from goat_plugins.erc20 import ERC20PluginOptions, erc20
+from langchain_openai import ChatOpenAI
+from langchain.agents import AgentExecutor, create_tool_calling_agent
+from langchain_core.prompts import ChatPromptTemplate
+from web3 import Web3
+from web3.middleware.signing import construct_sign_and_send_raw_middleware
+from eth_account.signers.local import LocalAccount
+from eth_account import Account
+
+from goat_adapters.langchain import get_on_chain_tools
+from goat_plugins.uniswap import uniswap, UniswapPluginOptions
+from goat_wallets.web3 import Web3EVMWalletClient
+
+# Initialize Web3 and account
+# Connect to Base (Coinbase L2)
+BASE_RPC_URL = os.getenv("BASE_RPC_URL", "https://mainnet.base.org")
+w3 = Web3(Web3.HTTPProvider(BASE_RPC_URL))
+private_key = os.getenv("WALLET_PRIVATE_KEY")
+assert private_key is not None, "You must set WALLET_PRIVATE_KEY environment variable"
+assert private_key.startswith("0x"), "Private key must start with 0x hex prefix"
+
+# Verify we're on Base
+chain_id = w3.eth.chain_id
+if chain_id != 8453: # Base chain ID
+ raise ValueError(f"Must be connected to Base (chain_id: 8453), got chain_id: {chain_id}")
+
+account: LocalAccount = Account.from_key(private_key)
+w3.eth.default_account = account.address # Set the default account
+w3.middleware_onion.add(
+ construct_sign_and_send_raw_middleware(account)
+) # Add middleware
+
+# Initialize LLM
+llm = ChatOpenAI(model="gpt-4o-mini")
+
+def main():
+ """Main function to demonstrate Uniswap plugin functionality."""
+ # Get the prompt template
+ prompt = ChatPromptTemplate.from_messages(
+ [
+ ("system", """You are the Uniswap plugin tester. You can help users test Uniswap functionality including:
+1. Check token approvals using uniswap_check_approval
+ Example: "Check if I have enough USDC approval for Uniswap"
+2. Get swap quotes using uniswap_get_quote
+ Example: "Get a quote to swap 1 WETH for USDC"
+3. Execute token swaps using uniswap_swap_tokens
+ Example: "Swap 0.1 WETH for USDC"
+
+For testing purposes, use small amounts.
+
+When users ask for token swaps:
+1. First check approval using uniswap_check_approval
+2. Then get a quote using uniswap_get_quote
+3. Finally execute the swap using uniswap_swap_tokens
+
+Always use base units (wei) for amounts. For example:
+- 1 WETH = 1000000000000000000 (18 decimals)
+- 1 USDC = 1000000 (6 decimals)"""),
+ ("placeholder", "{chat_history}"),
+ ("human", "{input}"),
+ ("placeholder", "{agent_scratchpad}"),
+ ]
+ )
+
+ # Initialize tools with web3 wallet and Uniswap plugin
+ uniswap_api_key = os.getenv("UNISWAP_API_KEY")
+ uniswap_base_url = os.getenv("UNISWAP_BASE_URL", "https://trade-api.gateway.uniswap.org/v1")
+ assert uniswap_api_key is not None, "You must set UNISWAP_API_KEY environment variable"
+ assert uniswap_base_url is not None, "You must set UNISWAP_BASE_URL environment variable"
+
+ tools = get_on_chain_tools(
+ wallet=Web3EVMWalletClient(w3),
+ plugins=[
+ erc20(options=ERC20PluginOptions(tokens=[USDC, PEPE])),
+ uniswap(options=UniswapPluginOptions(
+ api_key=uniswap_api_key,
+ base_url=uniswap_base_url
+ )),
+ ],
+ )
+
+ agent = create_tool_calling_agent(llm, tools, prompt)
+ agent_executor = AgentExecutor(agent=agent, tools=tools, handle_parsing_errors=True, verbose=True)
+
+ print("\nUniswap Plugin Test Interface")
+ print("Example commands:")
+ print("1. Check if I have enough USDC approval for Uniswap")
+ print("2. Get a quote to swap 1 WETH for USDC")
+ print("3. Swap 0.1 WETH for USDC")
+ print("\nMainnet token addresses:")
+ print("- WETH: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2")
+ print("- USDC: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48")
+ print("\nTest amounts:")
+ print("- 0.01 WETH = 10000000000000000 wei")
+ print("- 10 USDC = 10000000 units")
+ print("\nType 'quit' to exit\n")
+
+ while True:
+ user_input = input("\nYou: ").strip()
+
+ if user_input.lower() == 'quit':
+ print("Goodbye!")
+ break
+
+ try:
+ response = agent_executor.invoke({
+ "input": user_input,
+ })
+
+ print("\nAssistant:", response["output"])
+ except Exception as e:
+ print("\nError:", str(e))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/python/examples/langchain/uniswap/poetry.lock b/python/examples/langchain/uniswap/poetry.lock
new file mode 100644
index 000000000..e99365e5f
--- /dev/null
+++ b/python/examples/langchain/uniswap/poetry.lock
@@ -0,0 +1,3326 @@
+# 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"
+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]
+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 = "asyncio"
+version = "3.4.3"
+description = "reference implementation of PEP 3156"
+optional = false
+python-versions = "*"
+files = [
+ {file = "asyncio-3.4.3-cp33-none-win32.whl", hash = "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de"},
+ {file = "asyncio-3.4.3-cp33-none-win_amd64.whl", hash = "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c"},
+ {file = "asyncio-3.4.3-py3-none-any.whl", hash = "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d"},
+ {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"},
+]
+
+[[package]]
+name = "attrs"
+version = "25.1.0"
+description = "Classes Without Boilerplate"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"},
+ {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"},
+]
+
+[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 = "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 = "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 = "1.0.2"
+description = "Python bindings for C-KZG-4844"
+optional = false
+python-versions = "*"
+files = [
+ {file = "ckzg-1.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdd082bc0f2a595e3546658ecbe1ff78fe65b0ab7e619a8197a62d94f46b5b46"},
+ {file = "ckzg-1.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50ca4af4e2f1a1e8b0a7e97b3aef39dedbb0d52d90866ece424f13f8df1b5972"},
+ {file = "ckzg-1.0.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e9dc671b0a307ea65d0a216ca496c272dd3c1ed890ddc2a306da49b0d8ffc83"},
+ {file = "ckzg-1.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d95e97a0d0f7758119bb905fb5688222b1556de465035614883c42fe4a047d1f"},
+ {file = "ckzg-1.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27261672154cbd477d84d289845b0022fbdbe2ba45b7a2a2051c345fa04c8334"},
+ {file = "ckzg-1.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c16d5ee1ddbbbad0367ff970b3ec9f6d1879e9f928023beda59ae9e16ad99e4c"},
+ {file = "ckzg-1.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:09043738b029bdf4fdc82041b395cfc6f5b5cf63435e5d4d685d24fd14c834d3"},
+ {file = "ckzg-1.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3c0afa232d2312e3101aaddb6971b486b0038a0f9171500bc23143f5749eff55"},
+ {file = "ckzg-1.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:96e8281b6d58cf91b9559e1bd38132161d63467500838753364c68e825df2e2c"},
+ {file = "ckzg-1.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b874167de1d6de72890a2ad5bd9aa7adbddc41c3409923b59cf4ef27f83f79da"},
+ {file = "ckzg-1.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d2ccd68b0743e20e853e31a08da490a8d38c7f12b9a0c4ee63ef5afa0dc2427"},
+ {file = "ckzg-1.0.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e8d534ddbe785c44cf1cd62ee32d78b4310d66dd70e42851f5468af655b81f5"},
+ {file = "ckzg-1.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c732cda00c76b326f39ae97edfc6773dd231b7c77288b38282584a7aee77c3a7"},
+ {file = "ckzg-1.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc5a27284db479ead4c053ff086d6e222914f1b0aa08b80eabfa116dbed4f7a"},
+ {file = "ckzg-1.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6bd5006cb3e802744309450183087a6594d50554814eee19065f7064dff7b05"},
+ {file = "ckzg-1.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3594470134eda7adf2813ad3f1da55ced98c8a393262f47ce3890c5afa05b23e"},
+ {file = "ckzg-1.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fea56f39e48b60c1ff6f751c47489e353d1bd95cae65c429cf5f87735d794431"},
+ {file = "ckzg-1.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:f769eb2e1056ca396462460079f6849c778f58884bb24b638ff7028dd2120b65"},
+ {file = "ckzg-1.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e3cb2f8c767aee57e88944f90848e8689ce43993b9ff21589cfb97a562208fe7"},
+ {file = "ckzg-1.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b29889f5bc5db530f766871c0ff4133e7270ecf63aaa3ca756d3b2731980802"},
+ {file = "ckzg-1.0.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfcc70fb76b3d36125d646110d5001f2aa89c1c09ff5537a4550cdb7951f44d4"},
+ {file = "ckzg-1.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ca8a256cdd56d06bc5ef24caac64845240dbabca402c5a1966d519b2514b4ec"},
+ {file = "ckzg-1.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ea91b0236384f93ad1df01d530672f09e254bd8c3cf097ebf486aebb97f6c8c"},
+ {file = "ckzg-1.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:65311e72780105f239d1d66512629a9f468b7c9f2609b8567fc68963ac638ef9"},
+ {file = "ckzg-1.0.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0d7600ce7a73ac41d348712d0c1fe5e4cb6caa329377064cfa3a6fd8fbffb410"},
+ {file = "ckzg-1.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:19893ee7bd7da8688382cb134cb9ee7bce5c38e3a9386e3ed99bb010487d2d17"},
+ {file = "ckzg-1.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:c3e1a9a72695e777497e95bb2213316a1138f82d1bb5d67b9c029a522d24908e"},
+ {file = "ckzg-1.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2f59da9cb82b6a4be615f2561a255731eededa7ecd6ba4b2f2dedfc918ef137"},
+ {file = "ckzg-1.0.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c915e1f2ef51657c3255d8b1e2aea6e0b93348ae316b2b79eaadfb17ad8f514e"},
+ {file = "ckzg-1.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcc0d2031fcabc4be37e9e602c926ef9347238d2f58c1b07e0c147f60b9e760b"},
+ {file = "ckzg-1.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cdaad2745425d7708e76e8e56a52fdaf5c5cc1cfefd5129d24ff8dbe06a012d"},
+ {file = "ckzg-1.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1ec775649daade1b93041aac9c1660c2ad9828b57ccd2eeb5a3074d8f05e544a"},
+ {file = "ckzg-1.0.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:02f9cc3e38b3702ec5895a1ebf927fd02b8f5c2f93c7cb9e438581b5b74472c8"},
+ {file = "ckzg-1.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0e816af31951b5e94e6bc069f21fe783427c190526e0437e16c4488a34ddcacc"},
+ {file = "ckzg-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:651ba33ee2d7fefff14ca519a72996b733402f8b043fbfef12d5fe2a442d86d8"},
+ {file = "ckzg-1.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:489763ad92e2175fb6ab455411f03ec104c630470d483e11578bf2e00608f283"},
+ {file = "ckzg-1.0.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69e1376284e9a5094d7c4d3e552202d6b32a67c5acc461b0b35718d8ec5c7363"},
+ {file = "ckzg-1.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb9d0b09ca1bdb5955b626d6645f811424ae0fcab47699a1a938a3ce0438c25f"},
+ {file = "ckzg-1.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d87a121ace8feb6c9386f247e7e36ef55e584fc8a6b1bc2c60757a59c1efe364"},
+ {file = "ckzg-1.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:97c27153fab853f017fed159333b27beeb2e0da834c92c9ecdc26d0e5c3983b3"},
+ {file = "ckzg-1.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b26799907257c39471cb3665f66f7630797140131606085c2c94a7094ab6ddf2"},
+ {file = "ckzg-1.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:283a40c625222560fda3dcb912b666f7d50f9502587b73c4358979f519f1c961"},
+ {file = "ckzg-1.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5f029822d27c52b9c3dbe5706408b099da779f10929be0422a09a34aa026a872"},
+ {file = "ckzg-1.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edaea8fb50b01c6c19768d9305ad365639a8cd804754277d5108dcae4808f00b"},
+ {file = "ckzg-1.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:27be65c88d5d773a30e6f198719cefede7e25cad807384c3d65a09c11616fc9d"},
+ {file = "ckzg-1.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9ac729c5c6f3d2c030c0bc8c9e10edc253e36f002cfe227292035009965d349"},
+ {file = "ckzg-1.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1528bc2b95aac6d184a90b023602c40d7b11b577235848c1b5593c00cf51d37"},
+ {file = "ckzg-1.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:071dc7fc179316ce1bfabaa056156e4e84f312c4560ab7b9529a3b9a84019df3"},
+ {file = "ckzg-1.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:895044069de7010be6c7ee703f03fd7548267a0823cf60b9dd26ec50267dd9e8"},
+ {file = "ckzg-1.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ed8c99cd3d9af596470e0481fd58931007288951719bad026f0dd486dd0ec11"},
+ {file = "ckzg-1.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:74d87eafe561d4bfb544a4f3419d26c56ad7de00f39789ef0fdb09515544d12e"},
+ {file = "ckzg-1.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:54d71e5ca416bd51c543f9f51e426e6792f8a0280b83aef92faad1b826f401ea"},
+ {file = "ckzg-1.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da2d9988781a09a4577ee7ea8f51fe4a94b4422789a523164f5ba3118566ad41"},
+ {file = "ckzg-1.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d9e030af7d6acdcb356fddfb095048bc8e880fe4cd70ff2206c64f33bf384a0d"},
+ {file = "ckzg-1.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:145ae31c3d499d1950567bd636dc5b24292b600296b9deb5523bc20d8f7b51c3"},
+ {file = "ckzg-1.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d81e68e84d80084da298471ad5eaddfcc1cf73545cb24e9453550c8186870982"},
+ {file = "ckzg-1.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c67064bbbeba1a6892c9c80b3d0c2a540ff48a5ca5356fdb2a8d998b264e43e6"},
+ {file = "ckzg-1.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:99694917eb6decefc0d330d9887a89ea770824b2fa76eb830bab5fe57ea5c20c"},
+ {file = "ckzg-1.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fca227ce0ce3427254a113fdb3aed5ecd99c1fc670cb0c60cc8a2154793678e4"},
+ {file = "ckzg-1.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a66a690d3d1801085d11de6825df47a99b465ff32dbe90be4a3c9f43c577da96"},
+ {file = "ckzg-1.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:272adfe471380d10e4a0e1639d877e504555079a60233dd82249c799b15be81e"},
+ {file = "ckzg-1.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f37be0054ebb4b8ac6e6d5267290b239b09e7ddc611776051b4c3c4032d161ba"},
+ {file = "ckzg-1.0.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:611c03a170f0f746180eeb0cc28cdc6f954561b8eb9013605a046de86520ee6b"},
+ {file = "ckzg-1.0.2-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75b2f0ab341f3c33702ce64e1c101116c7462a25686d0b1a0193ca654ad4f96e"},
+ {file = "ckzg-1.0.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab29fc61fbd32096b82b02e6b18ae0d7423048d3540b7b90805b16ae10bdb769"},
+ {file = "ckzg-1.0.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e43741e7453262aa3ba1754623d7864250b33751bd850dd548e3ed6bd1911093"},
+ {file = "ckzg-1.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:155eacc237cb28c9eafda1c47a89e6e4550f1c2e711f2eee21e0bb2f4df75546"},
+ {file = "ckzg-1.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31d7fbe396a51f43375e38c31bc3a96c7996882582f95f3fcfd54acfa7b3ce6"},
+ {file = "ckzg-1.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d3d049186c9966e9140de39a9979d7adcfe22f8b02d2852c94d3c363235cc18"},
+ {file = "ckzg-1.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88728fbd410d61bd5d655ac50b842714c38bc34ff717f73592132d28911fc88e"},
+ {file = "ckzg-1.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:052d302058d72431acc9dd4a9c76854c8dfce10c698deef5252884e32a1ac7bf"},
+ {file = "ckzg-1.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:633110a9431231664be2ad32baf10971547f18289d33967654581b9ae9c94a7e"},
+ {file = "ckzg-1.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f439c9e5297ae29a700f6d55de1525e2e295dbbb7366f0974c8702fca9e536b9"},
+ {file = "ckzg-1.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:94f7eb080c00c0ccbd4fafad69f0b35b624a6a229a28e11d365b60b58a072832"},
+ {file = "ckzg-1.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f876783ec654b7b9525503c2a0a1b086e5d4f52ff65cac7e8747769b0c2e5468"},
+ {file = "ckzg-1.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e039800e50592580171830e788ef4a1d6bb54300d074ae9f9119e92aefc568"},
+ {file = "ckzg-1.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a8cccf0070a29bc01493179db2e61220ee1a6cb17f8ea41c68a2f043ace87f"},
+ {file = "ckzg-1.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f86cef801d7b0838e17b6ee2f2c9e747447d91ad1220a701baccdf7ef11a3c8"},
+ {file = "ckzg-1.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2433a89af4158beddebbdd66fae95b34d40f2467bee8dc40df0333de5e616b5f"},
+ {file = "ckzg-1.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c49d5dc0918ad912777720035f9820bdbb6c7e7d1898e12506d44ab3c938d525"},
+ {file = "ckzg-1.0.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:331d49bc72430a3f85ea6ecb55a0d0d65f66a21d61af5783b465906a741366d5"},
+ {file = "ckzg-1.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86627bc33bc63b8de869d7d5bfa9868619a4f3e4e7082103935c52f56c66b5"},
+ {file = "ckzg-1.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab6a2ba2706b5eaa1ce6bc7c4e72970bf9587e2e0e482e5fb4df1996bccb7a40"},
+ {file = "ckzg-1.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8bca5e7c38d913fabc24ad09545f78ba23cfc13e1ac8250644231729ca908549"},
+ {file = "ckzg-1.0.2.tar.gz", hash = "sha256:4295acc380f8d42ebea4a4a0a68c424a322bb335a33bad05c72ead8cbb28d118"},
+]
+
+[[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 = "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 = "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.11.3"
+description = "eth-account: Sign Ethereum transactions and messages with local private keys"
+optional = false
+python-versions = "<4,>=3.8"
+files = [
+ {file = "eth_account-0.11.3-py3-none-any.whl", hash = "sha256:16cf58aabc65171fc206489899b7e5546e3215e1a4debc12dbd55345c979081e"},
+ {file = "eth_account-0.11.3.tar.gz", hash = "sha256:a712a9534638a7cfaa4cc069f1b9d5cefeee70362cfc3a7b0a2534ee61ce76c9"},
+]
+
+[package.dependencies]
+bitarray = ">=2.4.0"
+ckzg = ">=0.4.3,<2"
+eth-abi = ">=4.0.0-b.2"
+eth-keyfile = ">=0.6.0"
+eth-keys = ">=0.4.0"
+eth-rlp = ">=0.3.0"
+eth-utils = ">=2.0.0"
+hexbytes = ">=0.1.0,<0.4.0"
+rlp = ">=1.0.0"
+
+[package.extras]
+dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "coverage", "hypothesis (>=4.18.0,<5)", "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 = ["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 = "1.0.1"
+description = "eth-rlp: RLP definitions for common Ethereum objects in Python"
+optional = false
+python-versions = ">=3.8, <4"
+files = [
+ {file = "eth-rlp-1.0.1.tar.gz", hash = "sha256:d61dbda892ee1220f28fb3663c08f6383c305db9f1f5624dc585c9cd05115027"},
+ {file = "eth_rlp-1.0.1-py3-none-any.whl", hash = "sha256:dd76515d71654277377d48876b88e839d61553aaf56952e580bb7cebef2b1517"},
+]
+
+[package.dependencies]
+eth-utils = ">=2.0.0"
+hexbytes = ">=0.1.0,<1"
+rlp = ">=0.6.0"
+
+[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 = "4.4.0"
+description = "eth-typing: Common type annotations for ethereum python packages"
+optional = false
+python-versions = "<4,>=3.8"
+files = [
+ {file = "eth_typing-4.4.0-py3-none-any.whl", hash = "sha256:a5e30a6e69edda7b1d1e96e9d71bab48b9bb988a77909d8d1666242c5562f841"},
+ {file = "eth_typing-4.4.0.tar.gz", hash = "sha256:93848083ac6bb4c20cc209ea9153a08b0a528be23337c889f89e1e5ffbe9807d"},
+]
+
+[package.dependencies]
+typing-extensions = ">=4.5.0"
+
+[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)", "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 = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"]
+
+[[package]]
+name = "eth-utils"
+version = "4.1.1"
+description = "eth-utils: Common utility functions for python code that interacts with Ethereum"
+optional = false
+python-versions = "<4,>=3.8"
+files = [
+ {file = "eth_utils-4.1.1-py3-none-any.whl", hash = "sha256:ccbbac68a6d65cb6e294c5bcb6c6a5cec79a241c56dc5d9c345ed788c30f8534"},
+ {file = "eth_utils-4.1.1.tar.gz", hash = "sha256:71c8d10dec7494aeed20fa7a4d52ec2ce4a2e52fdce80aab4f5c3c19f3648b25"},
+]
+
+[package.dependencies]
+cytoolz = {version = ">=0.10.1", markers = "implementation_name == \"cpython\""}
+eth-hash = ">=0.3.1"
+eth-typing = ">=3.0.0"
+toolz = {version = ">0.8.2", markers = "implementation_name == \"pypy\""}
+
+[package.extras]
+dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "hypothesis (>=4.43.0)", "ipython", "mypy (==1.5.1)", "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 = ["hypothesis (>=4.43.0)", "mypy (==1.5.1)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"]
+
+[[package]]
+name = "evmchains"
+version = "0.1.3"
+description = "Packaged metadata on Ethereum Virtual Machine (EVM) chains"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "evmchains-0.1.3-py3-none-any.whl", hash = "sha256:6dc608a24af2bc2d05fd186ce8ccdba69af606ab46df3cb22cc30754889871b5"},
+ {file = "evmchains-0.1.3.tar.gz", hash = "sha256:1a3225a34a18fe35d67a8c344a9ee5c7453c73b5e637a7cdc919046632707675"},
+]
+
+[package.dependencies]
+pydantic = ">=2.5.3,<3"
+
+[package.extras]
+dev = ["black (>=23.12.1,<23.13.0)", "build (>=1.0.3,<1.1.0)", "mypy (>=1.8.0,<1.9.0)", "pytest (>=7.4.4,<7.5.0)", "requests (>=2.31.0,<2.32.0)", "ruff (>=0.6.8,<0.7.0)", "setuptools-scm (>=8.0.4,<8.1.0)", "types-requests (>=2.31.0.20240106)"]
+
+[[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 = "goat-sdk"
+version = "0.1.2"
+description = "Goat π (Great Onchain Agent Toolkit) is an open-source framework for connecting AI agents to any onchain app"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+asyncio = "^3.4.1"
+pydantic = "^2.10.0"
+
+[package.source]
+type = "directory"
+url = "../../../src/goat-sdk"
+
+[[package]]
+name = "goat-sdk-adapter-langchain"
+version = "0.1.0"
+description = "Goat adapter for LangChain"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+goat-sdk = "^0.1.0"
+langchain = "^0.3.14"
+
+[package.source]
+type = "directory"
+url = "../../../src/adapters/langchain"
+
+[[package]]
+name = "goat-sdk-plugin-coingecko"
+version = "0.1.1"
+description = "Goat plugin for Coingecko"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+aiohttp = "^3.8.6"
+goat-sdk = "^0.1.1"
+
+[package.source]
+type = "directory"
+url = "../../../src/plugins/coingecko"
+
+[[package]]
+name = "goat-sdk-plugin-erc20"
+version = "0.1.0"
+description = "Goat plugin for ERC20"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+goat-sdk = "^0.1.0"
+goat-sdk-wallet-evm = "^0.1.0"
+
+[package.source]
+type = "directory"
+url = "../../../src/plugins/erc20"
+
+[[package]]
+name = "goat-sdk-plugin-uniswap"
+version = "0.1.0"
+description = "Goat plugin for uniswap"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+aiohttp = "^3.0"
+goat-sdk = "^0.1.0"
+goat-sdk-plugin-erc20 = "^0.1.0"
+goat-sdk-wallet-evm = "^0.1.1"
+
+[package.source]
+type = "directory"
+url = "../../../src/plugins/uniswap"
+
+[[package]]
+name = "goat-sdk-wallet-evm"
+version = "0.1.1"
+description = "Goat SDK EVM wallet implementation"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+evmchains = "^0.1.3"
+goat-sdk = "^0.1.0"
+
+[package.source]
+type = "directory"
+url = "../../../src/wallets/evm"
+
+[[package]]
+name = "goat-sdk-wallet-web3"
+version = "0.1.1"
+description = "Goat SDK Web3 wallet implementation"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+goat-sdk = "^0.1.0"
+goat-sdk-wallet-evm = "^0.1.0"
+web3 = "^6.20.3"
+
+[package.source]
+type = "directory"
+url = "../../../src/wallets/web3"
+
+[[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 = "0.3.1"
+description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output"
+optional = false
+python-versions = ">=3.7, <4"
+files = [
+ {file = "hexbytes-0.3.1-py3-none-any.whl", hash = "sha256:383595ad75026cf00abd570f44b368c6cdac0c6becfae5c39ff88829877f8a59"},
+ {file = "hexbytes-0.3.1.tar.gz", hash = "sha256:a3fe35c6831ee8fafd048c4c086b986075fc14fd46258fa24ecb8d65745f9a9d"},
+]
+
+[package.extras]
+dev = ["black (>=22)", "bumpversion (>=0.5.3)", "eth-utils (>=1.0.1,<3)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "hypothesis (>=3.44.24,<=6.31.6)", "ipython", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=5.0.0)", "pytest (>=7.0.0)", "pytest-watch (>=4.1.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"]
+doc = ["sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"]
+lint = ["black (>=22)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=5.0.0)"]
+test = ["eth-utils (>=1.0.1,<3)", "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 = "iniconfig"
+version = "2.0.0"
+description = "brain-dead simple config-ini parsing"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
+ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
+]
+
+[[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 = "jsonschema"
+version = "4.23.0"
+description = "An implementation of JSON Schema validation for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"},
+ {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"},
+]
+
+[package.dependencies]
+attrs = ">=22.2.0"
+jsonschema-specifications = ">=2023.03.6"
+referencing = ">=0.28.4"
+rpds-py = ">=0.7.1"
+
+[package.extras]
+format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"]
+format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"]
+
+[[package]]
+name = "jsonschema-specifications"
+version = "2024.10.1"
+description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"},
+ {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"},
+]
+
+[package.dependencies]
+referencing = ">=0.31.0"
+
+[[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"
+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.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.2.14"
+description = "An integration package connecting OpenAI and LangChain"
+optional = false
+python-versions = "<4.0,>=3.9"
+files = [
+ {file = "langchain_openai-0.2.14-py3-none-any.whl", hash = "sha256:d232496662f79ece9a11caf7d798ba863e559c771bc366814f7688e0fe664fe8"},
+ {file = "langchain_openai-0.2.14.tar.gz", hash = "sha256:7a514f309e356b182a337c0ed36ab3fbe34d9834a235a3b85cb7f91ae775d978"},
+]
+
+[package.dependencies]
+langchain-core = ">=0.3.27,<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 = "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 = "lru-dict"
+version = "1.2.0"
+description = "An Dict like LRU container."
+optional = false
+python-versions = "*"
+files = [
+ {file = "lru-dict-1.2.0.tar.gz", hash = "sha256:13c56782f19d68ddf4d8db0170041192859616514c706b126d0df2ec72a11bd7"},
+ {file = "lru_dict-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:de906e5486b5c053d15b7731583c25e3c9147c288ac8152a6d1f9bccdec72641"},
+ {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604d07c7604b20b3130405d137cae61579578b0e8377daae4125098feebcb970"},
+ {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:203b3e78d03d88f491fa134f85a42919020686b6e6f2d09759b2f5517260c651"},
+ {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:020b93870f8c7195774cbd94f033b96c14f51c57537969965c3af300331724fe"},
+ {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1184d91cfebd5d1e659d47f17a60185bbf621635ca56dcdc46c6a1745d25df5c"},
+ {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fc42882b554a86e564e0b662da47b8a4b32fa966920bd165e27bb8079a323bc1"},
+ {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:18ee88ada65bd2ffd483023be0fa1c0a6a051ef666d1cd89e921dcce134149f2"},
+ {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:756230c22257597b7557eaef7f90484c489e9ba78e5bb6ab5a5bcfb6b03cb075"},
+ {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4da599af36618881748b5db457d937955bb2b4800db891647d46767d636c408"},
+ {file = "lru_dict-1.2.0-cp310-cp310-win32.whl", hash = "sha256:35a142a7d1a4fd5d5799cc4f8ab2fff50a598d8cee1d1c611f50722b3e27874f"},
+ {file = "lru_dict-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:6da5b8099766c4da3bf1ed6e7d7f5eff1681aff6b5987d1258a13bd2ed54f0c9"},
+ {file = "lru_dict-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b20b7c9beb481e92e07368ebfaa363ed7ef61e65ffe6e0edbdbaceb33e134124"},
+ {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22147367b296be31cc858bf167c448af02435cac44806b228c9be8117f1bfce4"},
+ {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34a3091abeb95e707f381a8b5b7dc8e4ee016316c659c49b726857b0d6d1bd7a"},
+ {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:877801a20f05c467126b55338a4e9fa30e2a141eb7b0b740794571b7d619ee11"},
+ {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d3336e901acec897bcd318c42c2b93d5f1d038e67688f497045fc6bad2c0be7"},
+ {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8dafc481d2defb381f19b22cc51837e8a42631e98e34b9e0892245cc96593deb"},
+ {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:87bbad3f5c3de8897b8c1263a9af73bbb6469fb90e7b57225dad89b8ef62cd8d"},
+ {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:25f9e0bc2fe8f41c2711ccefd2871f8a5f50a39e6293b68c3dec576112937aad"},
+ {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ae301c282a499dc1968dd633cfef8771dd84228ae9d40002a3ea990e4ff0c469"},
+ {file = "lru_dict-1.2.0-cp311-cp311-win32.whl", hash = "sha256:c9617583173a29048e11397f165501edc5ae223504a404b2532a212a71ecc9ed"},
+ {file = "lru_dict-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6b7a031e47421d4b7aa626b8c91c180a9f037f89e5d0a71c4bb7afcf4036c774"},
+ {file = "lru_dict-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ea2ac3f7a7a2f32f194c84d82a034e66780057fd908b421becd2f173504d040e"},
+ {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd46c94966f631a81ffe33eee928db58e9fbee15baba5923d284aeadc0e0fa76"},
+ {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:086ce993414f0b28530ded7e004c77dc57c5748fa6da488602aa6e7f79e6210e"},
+ {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df25a426446197488a6702954dcc1de511deee20c9db730499a2aa83fddf0df1"},
+ {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c53b12b89bd7a6c79f0536ff0d0a84fdf4ab5f6252d94b24b9b753bd9ada2ddf"},
+ {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f9484016e6765bd295708cccc9def49f708ce07ac003808f69efa386633affb9"},
+ {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d0f7ec902a0097ac39f1922c89be9eaccf00eb87751e28915320b4f72912d057"},
+ {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:981ef3edc82da38d39eb60eae225b88a538d47b90cce2e5808846fd2cf64384b"},
+ {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e25b2e90a032dc248213af7f3f3e975e1934b204f3b16aeeaeaff27a3b65e128"},
+ {file = "lru_dict-1.2.0-cp36-cp36m-win32.whl", hash = "sha256:59f3df78e94e07959f17764e7fa7ca6b54e9296953d2626a112eab08e1beb2db"},
+ {file = "lru_dict-1.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:de24b47159e07833aeab517d9cb1c3c5c2d6445cc378b1c2f1d8d15fb4841d63"},
+ {file = "lru_dict-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d0dd4cd58220351233002f910e35cc01d30337696b55c6578f71318b137770f9"},
+ {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a87bdc291718bbdf9ea4be12ae7af26cbf0706fa62c2ac332748e3116c5510a7"},
+ {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05fb8744f91f58479cbe07ed80ada6696ec7df21ea1740891d4107a8dd99a970"},
+ {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00f6e8a3fc91481b40395316a14c94daa0f0a5de62e7e01a7d589f8d29224052"},
+ {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b172fce0a0ffc0fa6d282c14256d5a68b5db1e64719c2915e69084c4b6bf555"},
+ {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e707d93bae8f0a14e6df1ae8b0f076532b35f00e691995f33132d806a88e5c18"},
+ {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b9ec7a4a0d6b8297102aa56758434fb1fca276a82ed7362e37817407185c3abb"},
+ {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f404dcc8172da1f28da9b1f0087009578e608a4899b96d244925c4f463201f2a"},
+ {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1171ad3bff32aa8086778be4a3bdff595cc2692e78685bcce9cb06b96b22dcc2"},
+ {file = "lru_dict-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:0c316dfa3897fabaa1fe08aae89352a3b109e5f88b25529bc01e98ac029bf878"},
+ {file = "lru_dict-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5919dd04446bc1ee8d6ecda2187deeebfff5903538ae71083e069bc678599446"},
+ {file = "lru_dict-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbf36c5a220a85187cacc1fcb7dd87070e04b5fc28df7a43f6842f7c8224a388"},
+ {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:712e71b64da181e1c0a2eaa76cd860265980cd15cb0e0498602b8aa35d5db9f8"},
+ {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f54908bf91280a9b8fa6a8c8f3c2f65850ce6acae2852bbe292391628ebca42f"},
+ {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3838e33710935da2ade1dd404a8b936d571e29268a70ff4ca5ba758abb3850df"},
+ {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5d5a5f976b39af73324f2b793862859902ccb9542621856d51a5993064f25e4"},
+ {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8bda3a9afd241ee0181661decaae25e5336ce513ac268ab57da737eacaa7871f"},
+ {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd2cd1b998ea4c8c1dad829fc4fa88aeed4dee555b5e03c132fc618e6123f168"},
+ {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b55753ee23028ba8644fd22e50de7b8f85fa60b562a0fafaad788701d6131ff8"},
+ {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e51fa6a203fa91d415f3b2900e5748ec8e06ad75777c98cc3aeb3983ca416d7"},
+ {file = "lru_dict-1.2.0-cp38-cp38-win32.whl", hash = "sha256:cd6806313606559e6c7adfa0dbeb30fc5ab625f00958c3d93f84831e7a32b71e"},
+ {file = "lru_dict-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d90a70c53b0566084447c3ef9374cc5a9be886e867b36f89495f211baabd322"},
+ {file = "lru_dict-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3ea7571b6bf2090a85ff037e6593bbafe1a8598d5c3b4560eb56187bcccb4dc"},
+ {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:287c2115a59c1c9ed0d5d8ae7671e594b1206c36ea9df2fca6b17b86c468ff99"},
+ {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5ccfd2291c93746a286c87c3f895165b697399969d24c54804ec3ec559d4e43"},
+ {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b710f0f4d7ec4f9fa89dfde7002f80bcd77de8024017e70706b0911ea086e2ef"},
+ {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5345bf50e127bd2767e9fd42393635bbc0146eac01f6baf6ef12c332d1a6a329"},
+ {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:291d13f85224551913a78fe695cde04cbca9dcb1d84c540167c443eb913603c9"},
+ {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d5bb41bc74b321789803d45b124fc2145c1b3353b4ad43296d9d1d242574969b"},
+ {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0facf49b053bf4926d92d8d5a46fe07eecd2af0441add0182c7432d53d6da667"},
+ {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:987b73a06bcf5a95d7dc296241c6b1f9bc6cda42586948c9dabf386dc2bef1cd"},
+ {file = "lru_dict-1.2.0-cp39-cp39-win32.whl", hash = "sha256:231d7608f029dda42f9610e5723614a35b1fff035a8060cf7d2be19f1711ace8"},
+ {file = "lru_dict-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:71da89e134747e20ed5b8ad5b4ee93fc5b31022c2b71e8176e73c5a44699061b"},
+ {file = "lru_dict-1.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:21b3090928c7b6cec509e755cc3ab742154b33660a9b433923bd12c37c448e3e"},
+ {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaecd7085212d0aa4cd855f38b9d61803d6509731138bf798a9594745953245b"},
+ {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead83ac59a29d6439ddff46e205ce32f8b7f71a6bd8062347f77e232825e3d0a"},
+ {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:312b6b2a30188586fe71358f0f33e4bac882d33f5e5019b26f084363f42f986f"},
+ {file = "lru_dict-1.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b30122e098c80e36d0117810d46459a46313421ce3298709170b687dc1240b02"},
+ {file = "lru_dict-1.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f010cfad3ab10676e44dc72a813c968cd586f37b466d27cde73d1f7f1ba158c2"},
+ {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20f5f411f7751ad9a2c02e80287cedf69ae032edd321fe696e310d32dd30a1f8"},
+ {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afdadd73304c9befaed02eb42f5f09fdc16288de0a08b32b8080f0f0f6350aa6"},
+ {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7ab0c10c4fa99dc9e26b04e6b62ac32d2bcaea3aad9b81ec8ce9a7aa32b7b1b"},
+ {file = "lru_dict-1.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:edad398d5d402c43d2adada390dd83c74e46e020945ff4df801166047013617e"},
+ {file = "lru_dict-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:91d577a11b84387013815b1ad0bb6e604558d646003b44c92b3ddf886ad0f879"},
+ {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb12f19cdf9c4f2d9aa259562e19b188ff34afab28dd9509ff32a3f1c2c29326"},
+ {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e4c85aa8844bdca3c8abac3b7f78da1531c74e9f8b3e4890c6e6d86a5a3f6c0"},
+ {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c6acbd097b15bead4de8e83e8a1030bb4d8257723669097eac643a301a952f0"},
+ {file = "lru_dict-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b6613daa851745dd22b860651de930275be9d3e9373283a2164992abacb75b62"},
+]
+
+[package.extras]
+test = ["pytest"]
+
+[[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]]
+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 = "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 = "pluggy"
+version = "1.5.0"
+description = "plugin and hook calling mechanisms for python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
+ {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
+]
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
+
+[[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 = "protobuf"
+version = "5.29.3"
+description = ""
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"},
+ {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"},
+ {file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"},
+ {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"},
+ {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"},
+ {file = "protobuf-5.29.3-cp38-cp38-win32.whl", hash = "sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252"},
+ {file = "protobuf-5.29.3-cp38-cp38-win_amd64.whl", hash = "sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107"},
+ {file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"},
+ {file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"},
+ {file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"},
+ {file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"},
+]
+
+[[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 = "pytest"
+version = "8.3.4"
+description = "pytest: simple powerful testing with Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"},
+ {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+iniconfig = "*"
+packaging = "*"
+pluggy = ">=1.5,<2"
+
+[package.extras]
+dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+
+[[package]]
+name = "pytest-asyncio"
+version = "0.25.2"
+description = "Pytest support for asyncio"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"},
+ {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"},
+]
+
+[package.dependencies]
+pytest = ">=8.2,<9"
+
+[package.extras]
+docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"]
+testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"]
+
+[[package]]
+name = "python-dotenv"
+version = "1.0.1"
+description = "Read key-value pairs from a .env file and set them as environment variables"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
+ {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
+]
+
+[package.extras]
+cli = ["click (>=5.0)"]
+
+[[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 = "referencing"
+version = "0.36.2"
+description = "JSON Referencing + Python"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"},
+ {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"},
+]
+
+[package.dependencies]
+attrs = ">=22.2.0"
+rpds-py = ">=0.7.0"
+typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""}
+
+[[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-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 = "rpds-py"
+version = "0.22.3"
+description = "Python bindings to Rust's persistent data structures (rpds)"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"},
+ {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"},
+ {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"},
+ {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"},
+ {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"},
+ {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"},
+ {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"},
+ {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"},
+ {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"},
+ {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"},
+ {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"},
+ {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"},
+ {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"},
+ {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"},
+ {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"},
+ {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"},
+ {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"},
+ {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"},
+ {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"},
+ {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"},
+ {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"},
+ {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"},
+ {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"},
+ {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"},
+ {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"},
+ {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"},
+ {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"},
+ {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"},
+ {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"},
+ {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"},
+ {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"},
+ {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"},
+ {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"},
+ {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"},
+ {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"},
+ {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"},
+ {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"},
+ {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"},
+ {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"},
+ {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"},
+ {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"},
+ {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"},
+ {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"},
+ {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"},
+ {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"},
+ {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"},
+ {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"},
+ {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"},
+ {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"},
+ {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"},
+ {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"},
+ {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"},
+ {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"},
+ {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"},
+ {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"},
+ {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"},
+ {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"},
+ {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"},
+ {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"},
+ {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"},
+ {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"},
+ {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"},
+ {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"},
+ {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"},
+ {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"},
+ {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"},
+ {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"},
+ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"},
+ {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"},
+]
+
+[[package]]
+name = "ruff"
+version = "0.8.6"
+description = "An extremely fast Python linter and code formatter, written in Rust."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "ruff-0.8.6-py3-none-linux_armv6l.whl", hash = "sha256:defed167955d42c68b407e8f2e6f56ba52520e790aba4ca707a9c88619e580e3"},
+ {file = "ruff-0.8.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:54799ca3d67ae5e0b7a7ac234baa657a9c1784b48ec954a094da7c206e0365b1"},
+ {file = "ruff-0.8.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e88b8f6d901477c41559ba540beeb5a671e14cd29ebd5683903572f4b40a9807"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0509e8da430228236a18a677fcdb0c1f102dd26d5520f71f79b094963322ed25"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a7ddb221779871cf226100e677b5ea38c2d54e9e2c8ed847450ebbdf99b32d"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248b1fb3f739d01d528cc50b35ee9c4812aa58cc5935998e776bf8ed5b251e75"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bc3c083c50390cf69e7e1b5a5a7303898966be973664ec0c4a4acea82c1d4315"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52d587092ab8df308635762386f45f4638badb0866355b2b86760f6d3c076188"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61323159cf21bc3897674e5adb27cd9e7700bab6b84de40d7be28c3d46dc67cf"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ae4478b1471fc0c44ed52a6fb787e641a2ac58b1c1f91763bafbc2faddc5117"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0c000a471d519b3e6cfc9c6680025d923b4ca140ce3e4612d1a2ef58e11f11fe"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9257aa841e9e8d9b727423086f0fa9a86b6b420fbf4bf9e1465d1250ce8e4d8d"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45a56f61b24682f6f6709636949ae8cc82ae229d8d773b4c76c09ec83964a95a"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:496dd38a53aa173481a7d8866bcd6451bd934d06976a2505028a50583e001b76"},
+ {file = "ruff-0.8.6-py3-none-win32.whl", hash = "sha256:e169ea1b9eae61c99b257dc83b9ee6c76f89042752cb2d83486a7d6e48e8f764"},
+ {file = "ruff-0.8.6-py3-none-win_amd64.whl", hash = "sha256:f1d70bef3d16fdc897ee290d7d20da3cbe4e26349f62e8a0274e7a3f4ce7a905"},
+ {file = "ruff-0.8.6-py3-none-win_arm64.whl", hash = "sha256:7d7fc2377a04b6e04ffe588caad613d0c460eb2ecba4c0ccbbfe2bc973cbc162"},
+ {file = "ruff-0.8.6.tar.gz", hash = "sha256:dcad24b81b62650b0eb8814f576fc65cfee8674772a6e24c9b747911801eeaa5"},
+]
+
+[[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 = "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 = "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 = "6.20.3"
+description = "web3.py"
+optional = false
+python-versions = ">=3.7.2"
+files = [
+ {file = "web3-6.20.3-py3-none-any.whl", hash = "sha256:529fbb33f2476ce8185f7a2ed7e2e07c4c28621b0e89b845fbfdcaea9571286d"},
+ {file = "web3-6.20.3.tar.gz", hash = "sha256:c69dbf1a61ace172741d06990e60afc7f55f303eac087e7235f382df3047d017"},
+]
+
+[package.dependencies]
+aiohttp = ">=3.7.4.post0"
+ckzg = "<2"
+eth-abi = ">=4.0.0"
+eth-account = ">=0.8.0,<0.13"
+eth-hash = {version = ">=0.5.1", extras = ["pycryptodome"]}
+eth-typing = ">=3.0.0,<4.2.0 || >4.2.0,<5.0.0"
+eth-utils = ">=2.1.0,<5"
+hexbytes = ">=0.1.0,<0.4.0"
+jsonschema = ">=4.0.0"
+lru-dict = ">=1.1.6,<1.3.0"
+protobuf = ">=4.21.6"
+pyunormalize = ">=15.0.0"
+pywin32 = {version = ">=223", markers = "platform_system == \"Windows\""}
+requests = ">=2.16.0"
+typing-extensions = ">=4.0.1"
+websockets = ">=10.0.0"
+
+[package.extras]
+dev = ["build (>=0.9.0)", "bumpversion", "eth-tester[py-evm] (>=0.11.0b1,<0.12.0b1)", "eth-tester[py-evm] (>=0.9.0b1,<0.10.0b1)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "importlib-metadata (<5.0)", "ipfshttpclient (==0.8.0a2)", "pre-commit (>=2.21.0)", "py-geth (>=3.14.0,<4)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.21.2,<0.23)", "pytest-mock (>=1.10)", "pytest-watch (>=4.2)", "pytest-xdist (>=1.29)", "setuptools (>=38.6.0)", "sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=3.18.0)", "tqdm (>4.32)", "twine (>=1.13)", "when-changed (>=0.3.0)"]
+docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"]
+ipfs = ["ipfshttpclient (==0.8.0a2)"]
+tester = ["eth-tester[py-evm] (>=0.11.0b1,<0.12.0b1)", "eth-tester[py-evm] (>=0.9.0b1,<0.10.0b1)", "py-geth (>=3.14.0,<4)"]
+
+[[package]]
+name = "websockets"
+version = "14.2"
+description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "websockets-14.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e8179f95323b9ab1c11723e5d91a89403903f7b001828161b480a7810b334885"},
+ {file = "websockets-14.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0d8c3e2cdb38f31d8bd7d9d28908005f6fa9def3324edb9bf336d7e4266fd397"},
+ {file = "websockets-14.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:714a9b682deb4339d39ffa674f7b674230227d981a37d5d174a4a83e3978a610"},
+ {file = "websockets-14.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2e53c72052f2596fb792a7acd9704cbc549bf70fcde8a99e899311455974ca3"},
+ {file = "websockets-14.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3fbd68850c837e57373d95c8fe352203a512b6e49eaae4c2f4088ef8cf21980"},
+ {file = "websockets-14.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b27ece32f63150c268593d5fdb82819584831a83a3f5809b7521df0685cd5d8"},
+ {file = "websockets-14.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4daa0faea5424d8713142b33825fff03c736f781690d90652d2c8b053345b0e7"},
+ {file = "websockets-14.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:bc63cee8596a6ec84d9753fd0fcfa0452ee12f317afe4beae6b157f0070c6c7f"},
+ {file = "websockets-14.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a570862c325af2111343cc9b0257b7119b904823c675b22d4ac547163088d0d"},
+ {file = "websockets-14.2-cp310-cp310-win32.whl", hash = "sha256:75862126b3d2d505e895893e3deac0a9339ce750bd27b4ba515f008b5acf832d"},
+ {file = "websockets-14.2-cp310-cp310-win_amd64.whl", hash = "sha256:cc45afb9c9b2dc0852d5c8b5321759cf825f82a31bfaf506b65bf4668c96f8b2"},
+ {file = "websockets-14.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3bdc8c692c866ce5fefcaf07d2b55c91d6922ac397e031ef9b774e5b9ea42166"},
+ {file = "websockets-14.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c93215fac5dadc63e51bcc6dceca72e72267c11def401d6668622b47675b097f"},
+ {file = "websockets-14.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c9b6535c0e2cf8a6bf938064fb754aaceb1e6a4a51a80d884cd5db569886910"},
+ {file = "websockets-14.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a52a6d7cf6938e04e9dceb949d35fbdf58ac14deea26e685ab6368e73744e4c"},
+ {file = "websockets-14.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f05702e93203a6ff5226e21d9b40c037761b2cfb637187c9802c10f58e40473"},
+ {file = "websockets-14.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22441c81a6748a53bfcb98951d58d1af0661ab47a536af08920d129b4d1c3473"},
+ {file = "websockets-14.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd9b868d78b194790e6236d9cbc46d68aba4b75b22497eb4ab64fa640c3af56"},
+ {file = "websockets-14.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1a5a20d5843886d34ff8c57424cc65a1deda4375729cbca4cb6b3353f3ce4142"},
+ {file = "websockets-14.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:34277a29f5303d54ec6468fb525d99c99938607bc96b8d72d675dee2b9f5bf1d"},
+ {file = "websockets-14.2-cp311-cp311-win32.whl", hash = "sha256:02687db35dbc7d25fd541a602b5f8e451a238ffa033030b172ff86a93cb5dc2a"},
+ {file = "websockets-14.2-cp311-cp311-win_amd64.whl", hash = "sha256:862e9967b46c07d4dcd2532e9e8e3c2825e004ffbf91a5ef9dde519ee2effb0b"},
+ {file = "websockets-14.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f20522e624d7ffbdbe259c6b6a65d73c895045f76a93719aa10cd93b3de100c"},
+ {file = "websockets-14.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:647b573f7d3ada919fd60e64d533409a79dcf1ea21daeb4542d1d996519ca967"},
+ {file = "websockets-14.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6af99a38e49f66be5a64b1e890208ad026cda49355661549c507152113049990"},
+ {file = "websockets-14.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:091ab63dfc8cea748cc22c1db2814eadb77ccbf82829bac6b2fbe3401d548eda"},
+ {file = "websockets-14.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b374e8953ad477d17e4851cdc66d83fdc2db88d9e73abf755c94510ebddceb95"},
+ {file = "websockets-14.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a39d7eceeea35db85b85e1169011bb4321c32e673920ae9c1b6e0978590012a3"},
+ {file = "websockets-14.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0a6f3efd47ffd0d12080594f434faf1cd2549b31e54870b8470b28cc1d3817d9"},
+ {file = "websockets-14.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:065ce275e7c4ffb42cb738dd6b20726ac26ac9ad0a2a48e33ca632351a737267"},
+ {file = "websockets-14.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e9d0e53530ba7b8b5e389c02282f9d2aa47581514bd6049d3a7cffe1385cf5fe"},
+ {file = "websockets-14.2-cp312-cp312-win32.whl", hash = "sha256:20e6dd0984d7ca3037afcb4494e48c74ffb51e8013cac71cf607fffe11df7205"},
+ {file = "websockets-14.2-cp312-cp312-win_amd64.whl", hash = "sha256:44bba1a956c2c9d268bdcdf234d5e5ff4c9b6dc3e300545cbe99af59dda9dcce"},
+ {file = "websockets-14.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f1372e511c7409a542291bce92d6c83320e02c9cf392223272287ce55bc224e"},
+ {file = "websockets-14.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4da98b72009836179bb596a92297b1a61bb5a830c0e483a7d0766d45070a08ad"},
+ {file = "websockets-14.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8a86a269759026d2bde227652b87be79f8a734e582debf64c9d302faa1e9f03"},
+ {file = "websockets-14.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86cf1aaeca909bf6815ea714d5c5736c8d6dd3a13770e885aafe062ecbd04f1f"},
+ {file = "websockets-14.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b0f6c3ba3b1240f602ebb3971d45b02cc12bd1845466dd783496b3b05783a5"},
+ {file = "websockets-14.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669c3e101c246aa85bc8534e495952e2ca208bd87994650b90a23d745902db9a"},
+ {file = "websockets-14.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eabdb28b972f3729348e632ab08f2a7b616c7e53d5414c12108c29972e655b20"},
+ {file = "websockets-14.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2066dc4cbcc19f32c12a5a0e8cc1b7ac734e5b64ac0a325ff8353451c4b15ef2"},
+ {file = "websockets-14.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ab95d357cd471df61873dadf66dd05dd4709cae001dd6342edafc8dc6382f307"},
+ {file = "websockets-14.2-cp313-cp313-win32.whl", hash = "sha256:a9e72fb63e5f3feacdcf5b4ff53199ec8c18d66e325c34ee4c551ca748623bbc"},
+ {file = "websockets-14.2-cp313-cp313-win_amd64.whl", hash = "sha256:b439ea828c4ba99bb3176dc8d9b933392a2413c0f6b149fdcba48393f573377f"},
+ {file = "websockets-14.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7cd5706caec1686c5d233bc76243ff64b1c0dc445339bd538f30547e787c11fe"},
+ {file = "websockets-14.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec607328ce95a2f12b595f7ae4c5d71bf502212bddcea528290b35c286932b12"},
+ {file = "websockets-14.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da85651270c6bfb630136423037dd4975199e5d4114cae6d3066641adcc9d1c7"},
+ {file = "websockets-14.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ecadc7ce90accf39903815697917643f5b7cfb73c96702318a096c00aa71f5"},
+ {file = "websockets-14.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1979bee04af6a78608024bad6dfcc0cc930ce819f9e10342a29a05b5320355d0"},
+ {file = "websockets-14.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dddacad58e2614a24938a50b85969d56f88e620e3f897b7d80ac0d8a5800258"},
+ {file = "websockets-14.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:89a71173caaf75fa71a09a5f614f450ba3ec84ad9fca47cb2422a860676716f0"},
+ {file = "websockets-14.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6af6a4b26eea4fc06c6818a6b962a952441e0e39548b44773502761ded8cc1d4"},
+ {file = "websockets-14.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:80c8efa38957f20bba0117b48737993643204645e9ec45512579132508477cfc"},
+ {file = "websockets-14.2-cp39-cp39-win32.whl", hash = "sha256:2e20c5f517e2163d76e2729104abc42639c41cf91f7b1839295be43302713661"},
+ {file = "websockets-14.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4c8cef610e8d7c70dea92e62b6814a8cd24fbd01d7103cc89308d2bfe1659ef"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d7d9cafbccba46e768be8a8ad4635fa3eae1ffac4c6e7cb4eb276ba41297ed29"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c76193c1c044bd1e9b3316dcc34b174bbf9664598791e6fb606d8d29000e070c"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd475a974d5352390baf865309fe37dec6831aafc3014ffac1eea99e84e83fc2"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c6c0097a41968b2e2b54ed3424739aab0b762ca92af2379f152c1aef0187e1c"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d7ff794c8b36bc402f2e07c0b2ceb4a2424147ed4785ff03e2a7af03711d60a"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dec254fcabc7bd488dab64846f588fc5b6fe0d78f641180030f8ea27b76d72c3"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:bbe03eb853e17fd5b15448328b4ec7fb2407d45fb0245036d06a3af251f8e48f"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3c4aa3428b904d5404a0ed85f3644d37e2cb25996b7f096d77caeb0e96a3b42"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:577a4cebf1ceaf0b65ffc42c54856214165fb8ceeba3935852fc33f6b0c55e7f"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad1c1d02357b7665e700eca43a31d52814ad9ad9b89b58118bdabc365454b574"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f390024a47d904613577df83ba700bd189eedc09c57af0a904e5c39624621270"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3c1426c021c38cf92b453cdf371228d3430acd775edee6bac5a4d577efc72365"},
+ {file = "websockets-14.2-py3-none-any.whl", hash = "sha256:7a6ceec4ea84469f15cf15807a747e9efe57e369c384fa86e022b3bea679b79b"},
+ {file = "websockets-14.2.tar.gz", hash = "sha256:5059ed9c54945efb321f097084b4c7e52c246f2c869815876a69d1efc4ad6eb5"},
+]
+
+[[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.12"
+content-hash = "3c9cd13e27ee9576427268ced9644be5d53f5187a12f9a092a1078c60a38122d"
diff --git a/python/examples/langchain/uniswap/poetry.toml b/python/examples/langchain/uniswap/poetry.toml
new file mode 100644
index 000000000..ab1033bd3
--- /dev/null
+++ b/python/examples/langchain/uniswap/poetry.toml
@@ -0,0 +1,2 @@
+[virtualenvs]
+in-project = true
diff --git a/python/examples/langchain/uniswap/pyproject.toml b/python/examples/langchain/uniswap/pyproject.toml
new file mode 100644
index 000000000..7f15f7ca7
--- /dev/null
+++ b/python/examples/langchain/uniswap/pyproject.toml
@@ -0,0 +1,57 @@
+[tool.poetry]
+name = "goat-sdk-example-langchain-uniswap"
+version = "0.1.0"
+description = "Goat example for Langchain with uniswap"
+authors = ["Andrea Villa "]
+readme = "README.md"
+keywords = ["goat", "sdk", "web3", "agents", "ai"]
+homepage = "https://ohmygoat.dev/"
+repository = "https://github.com/goat-sdk/goat"
+packages = [
+ { include = "example.py" },
+]
+
+[tool.poetry.dependencies]
+python = "^3.12"
+langchain = "^0.3.2"
+langchain-openai = "^0.2.14"
+python-dotenv = "^1.0.1"
+web3 = "^6.20.3"
+goat-sdk = "^0.1.0"
+goat-sdk-wallet-evm = "^0.1.1"
+goat-sdk-wallet-web3 = "^0.1.0"
+goat-sdk-plugin-erc20 = "^0.1.0"
+goat-sdk-adapter-langchain = "^0.1.0"
+goat-sdk-plugin-uniswap = "^0.1.0"
+
+[tool.poetry.group.test.dependencies]
+pytest = "^8.3.4"
+pytest-asyncio = "^0.25.0"
+
+[tool.poetry.urls]
+"Bug Tracker" = "https://github.com/goat-sdk/goat/issues"
+
+[tool.pytest.ini_options]
+addopts = [
+ "--import-mode=importlib",
+]
+pythonpath = "src"
+asyncio_default_fixture_loop_scope = "function"
+
+[build-system]
+requires = ["poetry-core"]
+build-backend = "poetry.core.masonry.api"
+
+[tool.poetry.group.dev.dependencies]
+ruff = "^0.8.6"
+goat-sdk = { path = "../../../src/goat-sdk", develop = true }
+goat-sdk-wallet-evm = { path = "../../../src/wallets/evm", develop = true }
+goat-sdk-wallet-web3 = { path = "../../../src/wallets/web3", develop = true }
+goat-sdk-plugin-erc20 = { path = "../../../src/plugins/erc20", develop = true }
+goat-sdk-plugin-coingecko = { path = "../../../src/plugins/coingecko", develop = true }
+goat-sdk-adapter-langchain = { path = "../../../src/adapters/langchain", develop = true }
+goat-sdk-plugin-uniswap = { path = "../../../src/plugins/uniswap", develop = true }
+
+[tool.ruff]
+line-length = 120
+target-version = "py312"
diff --git a/python/examples/langchain/web3/example.py b/python/examples/langchain/web3/example.py
index d79e7213f..6a2815edf 100644
--- a/python/examples/langchain/web3/example.py
+++ b/python/examples/langchain/web3/example.py
@@ -18,7 +18,6 @@
from goat_wallets.evm import send_eth
from goat_wallets.web3 import Web3EVMWalletClient
from goat_plugins.coingecko import coingecko, CoinGeckoPluginOptions
-from goat_plugins.rugcheck import rugcheck
# Initialize Web3 and account
w3 = Web3(Web3.HTTPProvider(os.getenv("RPC_PROVIDER_URL")))
diff --git a/python/examples/langchain/web3/poetry.lock b/python/examples/langchain/web3/poetry.lock
index 7361b2121..b1c0e9a5d 100644
--- a/python/examples/langchain/web3/poetry.lock
+++ b/python/examples/langchain/web3/poetry.lock
@@ -677,13 +677,13 @@ files = [
[[package]]
name = "eth-abi"
-version = "5.1.0"
+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.1.0-py3-none-any.whl", hash = "sha256:84cac2626a7db8b7d9ebe62b0fdca676ab1014cc7f777189e3c0cd721a4c16d8"},
- {file = "eth_abi-5.1.0.tar.gz", hash = "sha256:33ddd756206e90f7ddff1330cc8cac4aa411a824fe779314a0a52abea2c8fc14"},
+ {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]
@@ -692,10 +692,10 @@ eth-utils = ">=2.0.0"
parsimonious = ">=0.10.0,<0.11.0"
[package.extras]
-dev = ["build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "hypothesis (>=4.18.2,<5.0.0)", "ipython", "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-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]", "hypothesis (>=4.18.2,<5.0.0)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-timeout (>=2.0.0)", "pytest-xdist (>=2.4.0)"]
-tools = ["hypothesis (>=4.18.2,<5.0.0)"]
+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"
@@ -726,21 +726,21 @@ test = ["coverage", "hypothesis (>=4.18.0,<5)", "pytest (>=7.0.0)", "pytest-xdis
[[package]]
name = "eth-hash"
-version = "0.7.0"
+version = "0.7.1"
description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3"
optional = false
-python-versions = ">=3.8, <4"
+python-versions = "<4,>=3.8"
files = [
- {file = "eth-hash-0.7.0.tar.gz", hash = "sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a"},
- {file = "eth_hash-0.7.0-py3-none-any.whl", hash = "sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f"},
+ {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)", "bumpversion (>=0.5.3)", "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)"]
+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)"]
@@ -768,13 +768,13 @@ test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"]
[[package]]
name = "eth-keys"
-version = "0.6.0"
+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.0-py3-none-any.whl", hash = "sha256:b396fdfe048a5bba3ef3990739aec64901eb99901c03921caa774be668b1db6e"},
- {file = "eth_keys-0.6.0.tar.gz", hash = "sha256:ba33230f851d02c894e83989185b21d76152c49b37e35b61b1d8a6d9f1d20430"},
+ {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]
@@ -783,8 +783,8 @@ eth-utils = ">=2"
[package.extras]
coincurve = ["coincurve (>=12.0.0)"]
-dev = ["asn1tools (>=0.146.2)", "build (>=0.9.0)", "bumpversion (>=0.5.3)", "coincurve (>=12.0.0)", "eth-hash[pysha3]", "factory-boy (>=3.0.1)", "hypothesis (>=5.10.3)", "ipython", "pre-commit (>=3.4.0)", "pyasn1 (>=0.4.5)", "pytest (>=7.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"]
-docs = ["towncrier (>=21,<22)"]
+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]]
@@ -969,7 +969,7 @@ files = [
[[package]]
name = "goat-sdk"
-version = "0.1.1"
+version = "0.1.2"
description = "Goat π (Great Onchain Agent Toolkit) is an open-source framework for connecting AI agents to any onchain app"
optional = false
python-versions = "^3.10"
@@ -1035,6 +1035,24 @@ goat-sdk-wallet-evm = "^0.1.0"
type = "directory"
url = "../../../src/plugins/erc20"
+[[package]]
+name = "goat-sdk-plugin-uniswap"
+version = "0.1.0"
+description = "Goat plugin for uniswap"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+aiohttp = "^3.0"
+goat-sdk = "^0.1.0"
+goat-sdk-wallet-evm = "^0.1.0"
+
+[package.source]
+type = "directory"
+url = "../../../src/plugins/uniswap"
+
[[package]]
name = "goat-sdk-wallet-evm"
version = "0.1.0"
@@ -1401,20 +1419,20 @@ referencing = ">=0.31.0"
[[package]]
name = "langchain"
-version = "0.3.14"
+version = "0.3.15"
description = "Building applications with LLMs through composability"
optional = false
python-versions = "<4.0,>=3.9"
files = [
- {file = "langchain-0.3.14-py3-none-any.whl", hash = "sha256:5df9031702f7fe6c956e84256b4639a46d5d03a75be1ca4c1bc9479b358061a2"},
- {file = "langchain-0.3.14.tar.gz", hash = "sha256:4a5ae817b5832fa0e1fcadc5353fbf74bebd2f8e550294d4dc039f651ddcd3d1"},
+ {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"
-langchain-core = ">=0.3.29,<0.4.0"
+langchain-core = ">=0.3.31,<0.4.0"
langchain-text-splitters = ">=0.3.3,<0.4.0"
-langsmith = ">=0.1.17,<0.3"
+langsmith = ">=0.1.17,<0.4"
numpy = {version = ">=1.26.2,<3", markers = "python_version >= \"3.12\""}
pydantic = ">=2.7.4,<3.0.0"
PyYAML = ">=5.3"
@@ -1424,18 +1442,18 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10"
[[package]]
name = "langchain-core"
-version = "0.3.29"
+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.29-py3-none-any.whl", hash = "sha256:817db1474871611a81105594a3e4d11704949661008e455a10e38ca9ff601a1a"},
- {file = "langchain_core-0.3.29.tar.gz", hash = "sha256:773d6aeeb612e7ce3d996c0be403433d8c6a91e77bbb7a7461c13e15cfbe5b06"},
+ {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.3"
+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\""},
@@ -1477,13 +1495,13 @@ langchain-core = ">=0.3.29,<0.4.0"
[[package]]
name = "langsmith"
-version = "0.2.10"
+version = "0.2.11"
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.2.10-py3-none-any.whl", hash = "sha256:b02f2f174189ff72e54c88b1aa63343defd6f0f676c396a690c63a4b6495dcc2"},
- {file = "langsmith-0.2.10.tar.gz", hash = "sha256:153c7b3ccbd823528ff5bec84801e7e50a164e388919fc583252df5b27dd7830"},
+ {file = "langsmith-0.2.11-py3-none-any.whl", hash = "sha256:084cf66a7f093c25e6b30fb4005008ec5fa9843110e2f0b265ce133c6a0225e6"},
+ {file = "langsmith-0.2.11.tar.gz", hash = "sha256:edf070349dbfc63dc4fc30e22533a11d77768e99ef269399b221c48fee25c737"},
]
[package.dependencies]
@@ -1697,77 +1715,77 @@ files = [
[[package]]
name = "numpy"
-version = "2.2.1"
+version = "2.2.2"
description = "Fundamental package for array computing in Python"
optional = false
python-versions = ">=3.10"
files = [
- {file = "numpy-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5edb4e4caf751c1518e6a26a83501fda79bff41cc59dac48d70e6d65d4ec4440"},
- {file = "numpy-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa3017c40d513ccac9621a2364f939d39e550c542eb2a894b4c8da92b38896ab"},
- {file = "numpy-2.2.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:61048b4a49b1c93fe13426e04e04fdf5a03f456616f6e98c7576144677598675"},
- {file = "numpy-2.2.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:7671dc19c7019103ca44e8d94917eba8534c76133523ca8406822efdd19c9308"},
- {file = "numpy-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4250888bcb96617e00bfa28ac24850a83c9f3a16db471eca2ee1f1714df0f957"},
- {file = "numpy-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7746f235c47abc72b102d3bce9977714c2444bdfaea7888d241b4c4bb6a78bf"},
- {file = "numpy-2.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:059e6a747ae84fce488c3ee397cee7e5f905fd1bda5fb18c66bc41807ff119b2"},
- {file = "numpy-2.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f62aa6ee4eb43b024b0e5a01cf65a0bb078ef8c395e8713c6e8a12a697144528"},
- {file = "numpy-2.2.1-cp310-cp310-win32.whl", hash = "sha256:48fd472630715e1c1c89bf1feab55c29098cb403cc184b4859f9c86d4fcb6a95"},
- {file = "numpy-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:b541032178a718c165a49638d28272b771053f628382d5e9d1c93df23ff58dbf"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb"},
- {file = "numpy-2.2.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5"},
- {file = "numpy-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73"},
- {file = "numpy-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591"},
- {file = "numpy-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8"},
- {file = "numpy-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0"},
- {file = "numpy-2.2.1-cp311-cp311-win32.whl", hash = "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd"},
- {file = "numpy-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315"},
- {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355"},
- {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7"},
- {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d"},
- {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51"},
- {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046"},
- {file = "numpy-2.2.1-cp312-cp312-win32.whl", hash = "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2"},
- {file = "numpy-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e"},
- {file = "numpy-2.2.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348"},
- {file = "numpy-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59"},
- {file = "numpy-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af"},
- {file = "numpy-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51"},
- {file = "numpy-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716"},
- {file = "numpy-2.2.1-cp313-cp313-win32.whl", hash = "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e"},
- {file = "numpy-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008"},
- {file = "numpy-2.2.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84"},
- {file = "numpy-2.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631"},
- {file = "numpy-2.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d"},
- {file = "numpy-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5"},
- {file = "numpy-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71"},
- {file = "numpy-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2"},
- {file = "numpy-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ba9cc93a91d86365a5d270dee221fdc04fb68d7478e6bf6af650de78a8339e3"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:3d03883435a19794e41f147612a77a8f56d4e52822337844fff3d4040a142964"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4511d9e6071452b944207c8ce46ad2f897307910b402ea5fa975da32e0102800"},
- {file = "numpy-2.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5c5cc0cbabe9452038ed984d05ac87910f89370b9242371bd9079cb4af61811e"},
- {file = "numpy-2.2.1.tar.gz", hash = "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918"},
+ {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 = "openai"
-version = "1.59.6"
+version = "1.59.9"
description = "The official Python library for the openai API"
optional = false
python-versions = ">=3.8"
files = [
- {file = "openai-1.59.6-py3-none-any.whl", hash = "sha256:b28ed44eee3d5ebe1a3ea045ee1b4b50fea36ecd50741aaa5ce5a5559c900cb6"},
- {file = "openai-1.59.6.tar.gz", hash = "sha256:c7670727c2f1e4473f62fea6fa51475c8bc098c9ffb47bfb9eef5be23c747934"},
+ {file = "openai-1.59.9-py3-none-any.whl", hash = "sha256:61a0608a1313c08ddf92fe793b6dbd1630675a1fe3866b2f96447ce30050c448"},
+ {file = "openai-1.59.9.tar.gz", hash = "sha256:ec1a20b0351b4c3e65c6292db71d8233515437c6065efd4fd50edeb55df5f5d2"},
]
[package.dependencies]
@@ -1786,86 +1804,90 @@ realtime = ["websockets (>=13,<15)"]
[[package]]
name = "orjson"
-version = "3.10.14"
+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.14-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:849ea7845a55f09965826e816cdc7689d6cf74fe9223d79d758c714af955bcb6"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5947b139dfa33f72eecc63f17e45230a97e741942955a6c9e650069305eb73d"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cde6d76910d3179dae70f164466692f4ea36da124d6fb1a61399ca589e81d69a"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6dfbaeb7afa77ca608a50e2770a0461177b63a99520d4928e27591b142c74b1"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa45e489ef80f28ff0e5ba0a72812b8cfc7c1ef8b46a694723807d1b07c89ebb"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5007abfdbb1d866e2aa8990bd1c465f0f6da71d19e695fc278282be12cffa5"},
- {file = "orjson-3.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1b49e2af011c84c3f2d541bb5cd1e3c7c2df672223e7e3ea608f09cf295e5f8a"},
- {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:164ac155109226b3a2606ee6dda899ccfbe6e7e18b5bdc3fbc00f79cc074157d"},
- {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6b1225024cf0ef5d15934b5ffe9baf860fe8bc68a796513f5ea4f5056de30bca"},
- {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d6546e8073dc382e60fcae4a001a5a1bc46da5eab4a4878acc2d12072d6166d5"},
- {file = "orjson-3.10.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9f1d2942605c894162252d6259b0121bf1cb493071a1ea8cb35d79cb3e6ac5bc"},
- {file = "orjson-3.10.14-cp310-cp310-win32.whl", hash = "sha256:397083806abd51cf2b3bbbf6c347575374d160331a2d33c5823e22249ad3118b"},
- {file = "orjson-3.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:fa18f949d3183a8d468367056be989666ac2bef3a72eece0bade9cdb733b3c28"},
- {file = "orjson-3.10.14-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f506fd666dd1ecd15a832bebc66c4df45c1902fd47526292836c339f7ba665a9"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efe5fd254cfb0eeee13b8ef7ecb20f5d5a56ddda8a587f3852ab2cedfefdb5f6"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ddc8c866d7467f5ee2991397d2ea94bcf60d0048bdd8ca555740b56f9042725"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af8e42ae4363773658b8d578d56dedffb4f05ceeb4d1d4dd3fb504950b45526"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84dd83110503bc10e94322bf3ffab8bc49150176b49b4984dc1cce4c0a993bf9"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36f5bfc0399cd4811bf10ec7a759c7ab0cd18080956af8ee138097d5b5296a95"},
- {file = "orjson-3.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868943660fb2a1e6b6b965b74430c16a79320b665b28dd4511d15ad5038d37d5"},
- {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:33449c67195969b1a677533dee9d76e006001213a24501333624623e13c7cc8e"},
- {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e4c9f60f9fb0b5be66e416dcd8c9d94c3eabff3801d875bdb1f8ffc12cf86905"},
- {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0de4d6315cfdbd9ec803b945c23b3a68207fd47cbe43626036d97e8e9561a436"},
- {file = "orjson-3.10.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83adda3db595cb1a7e2237029b3249c85afbe5c747d26b41b802e7482cb3933e"},
- {file = "orjson-3.10.14-cp311-cp311-win32.whl", hash = "sha256:998019ef74a4997a9d741b1473533cdb8faa31373afc9849b35129b4b8ec048d"},
- {file = "orjson-3.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:9d034abdd36f0f0f2240f91492684e5043d46f290525d1117712d5b8137784eb"},
- {file = "orjson-3.10.14-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2ad4b7e367efba6dc3f119c9a0fcd41908b7ec0399a696f3cdea7ec477441b09"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f496286fc85e93ce0f71cc84fc1c42de2decf1bf494094e188e27a53694777a7"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7f189bbfcded40e41a6969c1068ba305850ba016665be71a217918931416fbf"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cc8204f0b75606869c707da331058ddf085de29558b516fc43c73ee5ee2aadb"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deaa2899dff7f03ab667e2ec25842d233e2a6a9e333efa484dfe666403f3501c"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1c3ea52642c9714dc6e56de8a451a066f6d2707d273e07fe8a9cc1ba073813d"},
- {file = "orjson-3.10.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d3f9ed72e7458ded9a1fb1b4d4ed4c4fdbaf82030ce3f9274b4dc1bff7ace2b"},
- {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:07520685d408a2aba514c17ccc16199ff2934f9f9e28501e676c557f454a37fe"},
- {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:76344269b550ea01488d19a2a369ab572c1ac4449a72e9f6ac0d70eb1cbfb953"},
- {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e2979d0f2959990620f7e62da6cd954e4620ee815539bc57a8ae46e2dacf90e3"},
- {file = "orjson-3.10.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03f61ca3674555adcb1aa717b9fc87ae936aa7a63f6aba90a474a88701278780"},
- {file = "orjson-3.10.14-cp312-cp312-win32.whl", hash = "sha256:d5075c54edf1d6ad81d4c6523ce54a748ba1208b542e54b97d8a882ecd810fd1"},
- {file = "orjson-3.10.14-cp312-cp312-win_amd64.whl", hash = "sha256:175cafd322e458603e8ce73510a068d16b6e6f389c13f69bf16de0e843d7d406"},
- {file = "orjson-3.10.14-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:0905ca08a10f7e0e0c97d11359609300eb1437490a7f32bbaa349de757e2e0c7"},
- {file = "orjson-3.10.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92d13292249f9f2a3e418cbc307a9fbbef043c65f4bd8ba1eb620bc2aaba3d15"},
- {file = "orjson-3.10.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90937664e776ad316d64251e2fa2ad69265e4443067668e4727074fe39676414"},
- {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9ed3d26c4cb4f6babaf791aa46a029265850e80ec2a566581f5c2ee1a14df4f1"},
- {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:56ee546c2bbe9599aba78169f99d1dc33301853e897dbaf642d654248280dc6e"},
- {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:901e826cb2f1bdc1fcef3ef59adf0c451e8f7c0b5deb26c1a933fb66fb505eae"},
- {file = "orjson-3.10.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:26336c0d4b2d44636e1e1e6ed1002f03c6aae4a8a9329561c8883f135e9ff010"},
- {file = "orjson-3.10.14-cp313-cp313-win32.whl", hash = "sha256:e2bc525e335a8545c4e48f84dd0328bc46158c9aaeb8a1c2276546e94540ea3d"},
- {file = "orjson-3.10.14-cp313-cp313-win_amd64.whl", hash = "sha256:eca04dfd792cedad53dc9a917da1a522486255360cb4e77619343a20d9f35364"},
- {file = "orjson-3.10.14-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9a0fba3b8a587a54c18585f077dcab6dd251c170d85cfa4d063d5746cd595a0f"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:175abf3d20e737fec47261d278f95031736a49d7832a09ab684026528c4d96db"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29ca1a93e035d570e8b791b6c0feddd403c6a5388bfe870bf2aa6bba1b9d9b8e"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f77202c80e8ab5a1d1e9faf642343bee5aaf332061e1ada4e9147dbd9eb00c46"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e2ec73b7099b6a29b40a62e08a23b936423bd35529f8f55c42e27acccde7954"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d1679df9f9cd9504f8dff24555c1eaabba8aad7f5914f28dab99e3c2552c9d"},
- {file = "orjson-3.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:691ab9a13834310a263664313e4f747ceb93662d14a8bdf20eb97d27ed488f16"},
- {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b11ed82054fce82fb74cea33247d825d05ad6a4015ecfc02af5fbce442fbf361"},
- {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:e70a1d62b8288677d48f3bea66c21586a5f999c64ecd3878edb7393e8d1b548d"},
- {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:16642f10c1ca5611251bd835de9914a4b03095e28a34c8ba6a5500b5074338bd"},
- {file = "orjson-3.10.14-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3871bad546aa66c155e3f36f99c459780c2a392d502a64e23fb96d9abf338511"},
- {file = "orjson-3.10.14-cp38-cp38-win32.whl", hash = "sha256:0293a88815e9bb5c90af4045f81ed364d982f955d12052d989d844d6c4e50945"},
- {file = "orjson-3.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:6169d3868b190d6b21adc8e61f64e3db30f50559dfbdef34a1cd6c738d409dfc"},
- {file = "orjson-3.10.14-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:06d4ec218b1ec1467d8d64da4e123b4794c781b536203c309ca0f52819a16c03"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:962c2ec0dcaf22b76dee9831fdf0c4a33d4bf9a257a2bc5d4adc00d5c8ad9034"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:21d3be4132f71ef1360385770474f29ea1538a242eef72ac4934fe142800e37f"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c28ed60597c149a9e3f5ad6dd9cebaee6fb2f0e3f2d159a4a2b9b862d4748860"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e947f70167fe18469f2023644e91ab3d24f9aed69a5e1c78e2c81b9cea553fb"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64410696c97a35af2432dea7bdc4ce32416458159430ef1b4beb79fd30093ad6"},
- {file = "orjson-3.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8050a5d81c022561ee29cd2739de5b4445f3c72f39423fde80a63299c1892c52"},
- {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b49a28e30d3eca86db3fe6f9b7f4152fcacbb4a467953cd1b42b94b479b77956"},
- {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ca041ad20291a65d853a9523744eebc3f5a4b2f7634e99f8fe88320695ddf766"},
- {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d313a2998b74bb26e9e371851a173a9b9474764916f1fc7971095699b3c6e964"},
- {file = "orjson-3.10.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7796692136a67b3e301ef9052bde6fe8e7bd5200da766811a3a608ffa62aaff0"},
- {file = "orjson-3.10.14-cp39-cp39-win32.whl", hash = "sha256:eee4bc767f348fba485ed9dc576ca58b0a9eac237f0e160f7a59bce628ed06b3"},
- {file = "orjson-3.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:96a1c0ee30fb113b3ae3c748fd75ca74a157ff4c58476c47db4d61518962a011"},
- {file = "orjson-3.10.14.tar.gz", hash = "sha256:cf31f6f071a6b8e7aa1ead1fa27b935b48d00fbfa6a28ce856cfff2d5dd68eed"},
+ {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]]
@@ -2346,18 +2368,19 @@ files = [
[[package]]
name = "referencing"
-version = "0.35.1"
+version = "0.36.1"
description = "JSON Referencing + Python"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"},
- {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"},
+ {file = "referencing-0.36.1-py3-none-any.whl", hash = "sha256:363d9c65f080d0d70bc41c721dce3c7f3e77fc09f269cd5c8813da18069a6794"},
+ {file = "referencing-0.36.1.tar.gz", hash = "sha256:ca2e6492769e3602957e9b831b94211599d2aade9477f5d44110d2530cf9aade"},
]
[package.dependencies]
attrs = ">=22.2.0"
rpds-py = ">=0.7.0"
+typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""}
[[package]]
name = "regex"
@@ -2921,80 +2944,80 @@ tester = ["eth-tester[py-evm] (>=0.11.0b1,<0.12.0b1)", "eth-tester[py-evm] (>=0.
[[package]]
name = "websockets"
-version = "14.1"
+version = "14.2"
description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
optional = false
python-versions = ">=3.9"
files = [
- {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"},
- {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"},
- {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"},
- {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"},
- {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"},
- {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"},
- {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"},
- {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"},
- {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"},
- {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"},
- {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"},
- {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"},
- {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"},
- {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"},
- {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"},
- {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"},
- {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"},
- {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"},
- {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"},
- {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"},
- {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"},
- {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"},
- {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"},
- {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"},
- {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"},
- {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"},
- {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"},
- {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"},
- {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"},
- {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"},
- {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"},
- {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"},
- {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"},
- {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"},
- {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"},
- {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"},
- {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"},
- {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"},
- {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"},
- {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"},
- {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"},
- {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"},
- {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"},
- {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"},
- {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"},
- {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"},
- {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"},
- {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"},
- {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"},
- {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"},
- {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"},
- {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"},
- {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"},
- {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"},
- {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"},
- {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"},
- {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"},
- {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"},
- {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"},
- {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"},
- {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"},
- {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"},
- {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"},
- {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"},
- {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"},
- {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"},
- {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"},
- {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"},
- {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"},
+ {file = "websockets-14.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e8179f95323b9ab1c11723e5d91a89403903f7b001828161b480a7810b334885"},
+ {file = "websockets-14.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0d8c3e2cdb38f31d8bd7d9d28908005f6fa9def3324edb9bf336d7e4266fd397"},
+ {file = "websockets-14.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:714a9b682deb4339d39ffa674f7b674230227d981a37d5d174a4a83e3978a610"},
+ {file = "websockets-14.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2e53c72052f2596fb792a7acd9704cbc549bf70fcde8a99e899311455974ca3"},
+ {file = "websockets-14.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3fbd68850c837e57373d95c8fe352203a512b6e49eaae4c2f4088ef8cf21980"},
+ {file = "websockets-14.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b27ece32f63150c268593d5fdb82819584831a83a3f5809b7521df0685cd5d8"},
+ {file = "websockets-14.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4daa0faea5424d8713142b33825fff03c736f781690d90652d2c8b053345b0e7"},
+ {file = "websockets-14.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:bc63cee8596a6ec84d9753fd0fcfa0452ee12f317afe4beae6b157f0070c6c7f"},
+ {file = "websockets-14.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a570862c325af2111343cc9b0257b7119b904823c675b22d4ac547163088d0d"},
+ {file = "websockets-14.2-cp310-cp310-win32.whl", hash = "sha256:75862126b3d2d505e895893e3deac0a9339ce750bd27b4ba515f008b5acf832d"},
+ {file = "websockets-14.2-cp310-cp310-win_amd64.whl", hash = "sha256:cc45afb9c9b2dc0852d5c8b5321759cf825f82a31bfaf506b65bf4668c96f8b2"},
+ {file = "websockets-14.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3bdc8c692c866ce5fefcaf07d2b55c91d6922ac397e031ef9b774e5b9ea42166"},
+ {file = "websockets-14.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c93215fac5dadc63e51bcc6dceca72e72267c11def401d6668622b47675b097f"},
+ {file = "websockets-14.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c9b6535c0e2cf8a6bf938064fb754aaceb1e6a4a51a80d884cd5db569886910"},
+ {file = "websockets-14.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a52a6d7cf6938e04e9dceb949d35fbdf58ac14deea26e685ab6368e73744e4c"},
+ {file = "websockets-14.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f05702e93203a6ff5226e21d9b40c037761b2cfb637187c9802c10f58e40473"},
+ {file = "websockets-14.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22441c81a6748a53bfcb98951d58d1af0661ab47a536af08920d129b4d1c3473"},
+ {file = "websockets-14.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd9b868d78b194790e6236d9cbc46d68aba4b75b22497eb4ab64fa640c3af56"},
+ {file = "websockets-14.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1a5a20d5843886d34ff8c57424cc65a1deda4375729cbca4cb6b3353f3ce4142"},
+ {file = "websockets-14.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:34277a29f5303d54ec6468fb525d99c99938607bc96b8d72d675dee2b9f5bf1d"},
+ {file = "websockets-14.2-cp311-cp311-win32.whl", hash = "sha256:02687db35dbc7d25fd541a602b5f8e451a238ffa033030b172ff86a93cb5dc2a"},
+ {file = "websockets-14.2-cp311-cp311-win_amd64.whl", hash = "sha256:862e9967b46c07d4dcd2532e9e8e3c2825e004ffbf91a5ef9dde519ee2effb0b"},
+ {file = "websockets-14.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f20522e624d7ffbdbe259c6b6a65d73c895045f76a93719aa10cd93b3de100c"},
+ {file = "websockets-14.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:647b573f7d3ada919fd60e64d533409a79dcf1ea21daeb4542d1d996519ca967"},
+ {file = "websockets-14.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6af99a38e49f66be5a64b1e890208ad026cda49355661549c507152113049990"},
+ {file = "websockets-14.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:091ab63dfc8cea748cc22c1db2814eadb77ccbf82829bac6b2fbe3401d548eda"},
+ {file = "websockets-14.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b374e8953ad477d17e4851cdc66d83fdc2db88d9e73abf755c94510ebddceb95"},
+ {file = "websockets-14.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a39d7eceeea35db85b85e1169011bb4321c32e673920ae9c1b6e0978590012a3"},
+ {file = "websockets-14.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0a6f3efd47ffd0d12080594f434faf1cd2549b31e54870b8470b28cc1d3817d9"},
+ {file = "websockets-14.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:065ce275e7c4ffb42cb738dd6b20726ac26ac9ad0a2a48e33ca632351a737267"},
+ {file = "websockets-14.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e9d0e53530ba7b8b5e389c02282f9d2aa47581514bd6049d3a7cffe1385cf5fe"},
+ {file = "websockets-14.2-cp312-cp312-win32.whl", hash = "sha256:20e6dd0984d7ca3037afcb4494e48c74ffb51e8013cac71cf607fffe11df7205"},
+ {file = "websockets-14.2-cp312-cp312-win_amd64.whl", hash = "sha256:44bba1a956c2c9d268bdcdf234d5e5ff4c9b6dc3e300545cbe99af59dda9dcce"},
+ {file = "websockets-14.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f1372e511c7409a542291bce92d6c83320e02c9cf392223272287ce55bc224e"},
+ {file = "websockets-14.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4da98b72009836179bb596a92297b1a61bb5a830c0e483a7d0766d45070a08ad"},
+ {file = "websockets-14.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8a86a269759026d2bde227652b87be79f8a734e582debf64c9d302faa1e9f03"},
+ {file = "websockets-14.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86cf1aaeca909bf6815ea714d5c5736c8d6dd3a13770e885aafe062ecbd04f1f"},
+ {file = "websockets-14.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b0f6c3ba3b1240f602ebb3971d45b02cc12bd1845466dd783496b3b05783a5"},
+ {file = "websockets-14.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669c3e101c246aa85bc8534e495952e2ca208bd87994650b90a23d745902db9a"},
+ {file = "websockets-14.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eabdb28b972f3729348e632ab08f2a7b616c7e53d5414c12108c29972e655b20"},
+ {file = "websockets-14.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2066dc4cbcc19f32c12a5a0e8cc1b7ac734e5b64ac0a325ff8353451c4b15ef2"},
+ {file = "websockets-14.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ab95d357cd471df61873dadf66dd05dd4709cae001dd6342edafc8dc6382f307"},
+ {file = "websockets-14.2-cp313-cp313-win32.whl", hash = "sha256:a9e72fb63e5f3feacdcf5b4ff53199ec8c18d66e325c34ee4c551ca748623bbc"},
+ {file = "websockets-14.2-cp313-cp313-win_amd64.whl", hash = "sha256:b439ea828c4ba99bb3176dc8d9b933392a2413c0f6b149fdcba48393f573377f"},
+ {file = "websockets-14.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7cd5706caec1686c5d233bc76243ff64b1c0dc445339bd538f30547e787c11fe"},
+ {file = "websockets-14.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec607328ce95a2f12b595f7ae4c5d71bf502212bddcea528290b35c286932b12"},
+ {file = "websockets-14.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da85651270c6bfb630136423037dd4975199e5d4114cae6d3066641adcc9d1c7"},
+ {file = "websockets-14.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ecadc7ce90accf39903815697917643f5b7cfb73c96702318a096c00aa71f5"},
+ {file = "websockets-14.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1979bee04af6a78608024bad6dfcc0cc930ce819f9e10342a29a05b5320355d0"},
+ {file = "websockets-14.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dddacad58e2614a24938a50b85969d56f88e620e3f897b7d80ac0d8a5800258"},
+ {file = "websockets-14.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:89a71173caaf75fa71a09a5f614f450ba3ec84ad9fca47cb2422a860676716f0"},
+ {file = "websockets-14.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6af6a4b26eea4fc06c6818a6b962a952441e0e39548b44773502761ded8cc1d4"},
+ {file = "websockets-14.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:80c8efa38957f20bba0117b48737993643204645e9ec45512579132508477cfc"},
+ {file = "websockets-14.2-cp39-cp39-win32.whl", hash = "sha256:2e20c5f517e2163d76e2729104abc42639c41cf91f7b1839295be43302713661"},
+ {file = "websockets-14.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4c8cef610e8d7c70dea92e62b6814a8cd24fbd01d7103cc89308d2bfe1659ef"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d7d9cafbccba46e768be8a8ad4635fa3eae1ffac4c6e7cb4eb276ba41297ed29"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c76193c1c044bd1e9b3316dcc34b174bbf9664598791e6fb606d8d29000e070c"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd475a974d5352390baf865309fe37dec6831aafc3014ffac1eea99e84e83fc2"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c6c0097a41968b2e2b54ed3424739aab0b762ca92af2379f152c1aef0187e1c"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d7ff794c8b36bc402f2e07c0b2ceb4a2424147ed4785ff03e2a7af03711d60a"},
+ {file = "websockets-14.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dec254fcabc7bd488dab64846f588fc5b6fe0d78f641180030f8ea27b76d72c3"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:bbe03eb853e17fd5b15448328b4ec7fb2407d45fb0245036d06a3af251f8e48f"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3c4aa3428b904d5404a0ed85f3644d37e2cb25996b7f096d77caeb0e96a3b42"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:577a4cebf1ceaf0b65ffc42c54856214165fb8ceeba3935852fc33f6b0c55e7f"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad1c1d02357b7665e700eca43a31d52814ad9ad9b89b58118bdabc365454b574"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f390024a47d904613577df83ba700bd189eedc09c57af0a904e5c39624621270"},
+ {file = "websockets-14.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3c1426c021c38cf92b453cdf371228d3430acd775edee6bac5a4d577efc72365"},
+ {file = "websockets-14.2-py3-none-any.whl", hash = "sha256:7a6ceec4ea84469f15cf15807a747e9efe57e369c384fa86e022b3bea679b79b"},
+ {file = "websockets-14.2.tar.gz", hash = "sha256:5059ed9c54945efb321f097084b4c7e52c246f2c869815876a69d1efc4ad6eb5"},
]
[[package]]
@@ -3096,4 +3119,4 @@ propcache = ">=0.2.0"
[metadata]
lock-version = "2.0"
python-versions = "^3.12"
-content-hash = "b37a40d8bc929d908a7c8746829013eb3572fdbe10a20c8da3397f82fd22b650"
+content-hash = "50c9c7c9a95894ae9bc738133faa23e93424aa694ad5950c121263387ead6999"
diff --git a/python/examples/langchain/web3/pyproject.toml b/python/examples/langchain/web3/pyproject.toml
index 0308a5ed5..d94eb5598 100644
--- a/python/examples/langchain/web3/pyproject.toml
+++ b/python/examples/langchain/web3/pyproject.toml
@@ -9,6 +9,7 @@ homepage = "https://ohmygoat.dev/"
repository = "https://github.com/goat-sdk/goat"
packages = [
{ include = "example.py" },
+ { include = "uniswap_example.py" },
]
[tool.poetry.dependencies]
diff --git a/python/examples/solana/wallet/pyproject.toml b/python/examples/solana/wallet/pyproject.toml
index 191622482..8da9397a4 100644
--- a/python/examples/solana/wallet/pyproject.toml
+++ b/python/examples/solana/wallet/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "goat-sdk-example-solana-wallet"
-version = "0.1.0"
+version = "0.1.1"
description = "Goat example for Solana wallet"
authors = ["Andrea Villa "]
readme = "README.md"
diff --git a/python/src/goat-sdk/README.md b/python/src/goat-sdk/README.md
index 506761914..9c80ec466 100644
--- a/python/src/goat-sdk/README.md
+++ b/python/src/goat-sdk/README.md
@@ -1,103 +1,395 @@
-# Goat π - Python SDK
-Goat (Great Onchain Agent Toolkit) is an open-source framework for connecting AI agents to any onchain app.
+
-[](https://discord.gg/goat-sdk)
-[](https://ohmygoat.dev)
+[Website](https://ohmygoat.dev) | [X](https://x.com/goat_sdk) | [Discord](https://discord.gg/goat-sdk)
+
+GOAT is free software, MIT licensed, sponsored by [Crossmint](https://www.crossmint.com)
+
+
+
+
+
+
+
+
+
+# GOAT π (Python)
+
+
+GOAT (Great Onchain Agent Toolkit) is a library that adds more than +200 onchain tools to your AI agent.
+
+* **[+200 tools](#plugins)**: DeFi (Uniswap, Jupiter, KIM, Orca, etc.), minting (OpenSea, MagicEden, etc.), betting (Polymarket, etc.), analytics (CoinGecko, BirdEye, Allora, etc.) and more
+* **Chains**: EVM (Base, Polygon, Mode, Sei, etc.), Solana, Aptos, Chromia, Fuel, Sui, Starknet and Zilliqa
+* **[Wallets](#wallets)**: keypair, smart wallets (Crossmint, etc.), LIT, MPC (Coinbase, etc.)
+* **[Agent Frameworks](#agent-frameworks-adapters)**: AI SDK, Langchain, Eliza, ZerePy, GAME, ElevenLabs, etc.
-## Installation
+## Table of Contens
+- [See all plugins](#plugins)
+- [Installation](#installation)
+- [Usage](#usage)
+- [Examples](https://github.com/goat-sdk/goat/tree/main/python/examples)
+- [How to create a plugin](#how-to-create-a-plugin)
+ - [Using the plugin generator](#using-the-plugin-generator)
+ - [Manual creation](#manual-creation)
+- [How to add a chain](#how-to-add-a-chain)
+- [How to add a wallet provider](#how-to-add-a-wallet-provider)
+- [Packages](#packages)
+ - [Plugins](#plugins)
+ - [Wallets](#wallets)
+ - [Adapters](#agent-framework-adapters)
+
+## Installation
+1. Install the core package
```bash
pip install goat-sdk
```
+2. Depending on the type of wallet you want to use, install the corresponding wallet (see all wallets [here](#wallets)):
+```bash
+pip install goat-sdk-wallet-solana
+```
+3. Install the plugins for the protocols you need (see all available plugins [here](#plugins))
-Or with Poetry:
-
```bash
-poetry add goat-sdk
+pip install goat-sdk-plugin-spl-tokens
+```
+4. Install the adapter for the agent framework you want to use (see all available adapters [here](#adapters))
+```bash
+pip install goat-sdk-adapter-langchain
```
-## Quick Start
+## Usage
+1. Configure your wallet
+```python
+from goat_wallets.solana import solana
+# Initialize Solana client and wallet
+client = SolanaClient(os.getenv("SOLANA_RPC_ENDPOINT"))
+keypair = Keypair.from_base58_string(os.getenv("SOLANA_WALLET_SEED") or "")
+wallet = solana(client, keypair)
+```
+
+2. Configure your tools for the framework you want to use
```python
-from goat import WalletClientBase, create_tool
-from pydantic import BaseModel, Field
+# Initialize SPL Token plugin
+spl_token_plugin = spl_token(SplTokenPluginOptions(
+ network="devnet", # Using devnet as specified in .env
+ tokens=SPL_TOKENS
+))
+
+# Initialize tools with Solana wallet
+tools = get_on_chain_tools(
+ wallet=wallet,
+ plugins=[spl_token_plugin]
+)
+```
+
+3. Plug into your agent framework
+```python
+agent = create_tool_calling_agent(llm, tools, prompt)
+agent_executor = AgentExecutor(
+ agent=agent, tools=tools, handle_parsing_errors=True, verbose=True
+)
+
+response = agent_executor.invoke(
+ {
+ "input": "Send 10 USDC to ohmygoat.sol",
+ }
+)
+
+print(response)
+```
+
+## How to create a plugin
+GOAT plugins enable your agent to interact with various blockchain protocols.
-# Create a wallet client
-wallet = MyWalletClient()
+Plugins can be chain-specific (EVM, Solana, etc.) or chain-agnostic. If a plugin is chain-specific it will fail to compile when being used with a wallet of a different chain.
+
+You can see all available plugins [here](#plugins).
+
+### Using the Plugin Generator
+Run the plugin generator script from the `python` directory:
+
+```bash
+cd python
+python scripts/create_plugin.py [--evm]
+```
+
+Options:
+- ``: Name of your plugin (e.g., 'my-token', 'my-service')
+- `--evm`: Optional flag to indicate if the plugin is EVM-compatible
+
+Examples:
+1. Create an EVM-compatible plugin:
+```bash
+python scripts/create_plugin.py my-token --evm
+```
-# Create a tool with parameters
-class GetBalanceParameters(BaseModel):
- address: str = Field(description="The address to get the balance of")
+2. Create a chain-agnostic plugin:
+```bash
+python scripts/create_plugin.py my-service
+```
-@Tool({
- "description": "Get the balance of an address",
- "parameters": GetBalanceParameters
-})
-def get_balance(params: dict) -> str:
- balance = await wallet.balance_of(params["address"])
- return f"{balance.value} {balance.symbol}"
+The script generates a complete plugin package with the following structure:
-# Get all available tools
-tools = get_tools(wallet, plugins=[
- CoinGeckoPlugin(),
- ERC20Plugin()
-])
+```
+src/plugins//
+βββ pyproject.toml # Project configuration and dependencies
+βββ README.md # Plugin documentation
+βββ goat_plugins//
+ βββ __init__.py # Plugin initialization and configuration
+ βββ parameters.py # Pydantic parameter models
+ βββ service.py # Service implementation with Tool decorators
```
-## Features
+### Manual Creation
+#### 1. Define your plugin extending the [PluginBase](https://github.com/goat-sdk/goat/tree/main/python/src/goat_sdk/goat/classes/plugin_base.py) class.
-- π Plugin System - Extend functionality with plugins
-- π Multi-Chain Support - EVM, Solana, Aptos, and more
-- π οΈ Tool Framework - Create custom tools for AI agents
-- π¦ Type Safety - Full type support with Python type hints
-- β‘ Async Support - Built for high performance
+```python
+from goat.classes.plugin_base import PluginBase
-## Documentation
+# For a chain-agnostic plugin we use the WalletClientBase interface, for a chain-specific plugin we use the EVMWalletClient, SolanaWalletClient, or corresponding interfaces
+class MyPlugin(PluginBase[WalletClientBase]):
+ def __init__(self):
+ # We define the name of the plugin
+ super("myPlugin", []);
-Visit our [documentation](https://ohmygoat.dev) for:
+ # We define the chain support for the plugin, in this case we support all chains
+ def supports_chain(self, chain: Chain) -> bool:
+ return True
-- Detailed guides
-- API reference
-- Examples
-- Plugin development
-- Best practices
+# We export a factory function to create a new instance of the plugin
+my_plugin = () => MyPlugin()
+```
-## Examples
+#### 2. Add tools to the plugin
+You can create a class and decorate its methods with the `@Tool` decorator to create tools.
-Check out our [examples directory](https://github.com/goat-sdk/goat/tree/main/python/examples) for complete working examples.
+The tool methods will receive the wallet client as the first argument and the parameters as the second argument.
-## Development
+```python
+from pydantic import BaseModel, Field
-1. Clone the repository:
+class SignMessageParameters(BaseModel):
+ message: str = Field(..., description="The message to sign")
+
+class MyTools {
+ @Tool({
+ "name": "sign_message",
+ "description": "Sign a message",
+ "parameters_schema": SignMessageParameters
+ })
+ async def sign_message(self, walletClient: WalletClientBase, parameters: dict):
+ signed = await walletClient.sign_message(parameters.message);
+ return signed.signed_message;
+ }
+```
-```bash
-git clone https://github.com/goat-sdk/goat.git
-cd goat/python
+Once we have our class we now need to import it in our plugin class.
+
+```python
+class MyPlugin(PluginBase[WalletClientBase]):
+ def __init__(self):
+ # We define the name of the plugin
+ super("myPlugin", [MyTools()]);
+
+ # We define the chain support for the plugin, in this case we support all chains
+ def supports_chain(self, chain: Chain) -> bool:
+ return True
+}
+
+# We export a factory function to create a new instance of the plugin
+my_plugin = () => MyPlugin()
+```
+
+Inside the method, we will return an array of tools created using the `createTool` function.
+
+```typescript
+import { PluginBase, WalletClientBase, createTool } from "@goat-sdk/core";
+
+// Since we are creating a chain-agnostic plugin, we can use the WalletClientBase interface
+export class MyPlugin extends PluginBase {
+ constructor() {
+ // We define the name of the plugin
+ super("myPlugin", []);
+ }
+
+ // We define the chain support for the plugin, in this case we support all chains
+ supportsChain = (chain: Chain) => true;
+
+ getTools(walletClient: WalletClientBase) {
+ return [
+ // Create tool requires two arguments:
+ // 1. The tool metadata (name, description, parameters)
+ // 2. The tool method (the function that will be executed when the tool is used)
+ createTool(
+ {
+ name: "sign_message",
+ description: "Sign a message",
+ parameters: z.object({
+ message: z.string(),
+ }),
+ },
+ async (parameters) => {
+ const signed = await walletClient.signMessage(parameters.message);
+ return signed.signedMessage;
+ },
+ ),
+ ];
+ }
+}
+
+// We export a factory function to create a new instance of the plugin
+export const myPlugin = () => new MyPlugin();
```
-2. Install dependencies:
+#### 3. Add the plugin to the agent
-```bash
-poetry install
+```python
+tools = get_on_chain_tools(
+ wallet=wallet,
+ plugins=[my_plugin]
+)
```
-3. Run tests:
+#### Next steps
+- Share your plugin with others!
+- Open a PR to add it to the [plugins registry](https://github.com/goat-sdk/goat/tree/main/python/src/plugins) in the [GOAT SDK](https://github.com/goat-sdk/goat).
-```bash
-poetry run pytest
+
+## How to add a chain
+
+### 1. Add the chain to the `chain.py` file
+Add your chain to the `chain.py` file in the [core package](https://github.com/goat-sdk/goat/tree/main/python/src/goat_sdk/goat/types/chain.py).
+
+```python
+class MyAwesomeChain(TypedDict):
+ """MyAwesomeChain chain type definition
+
+ Args:
+ type: Literal "my-awesome-chain" chain type identifier
+ """
+ type: Literal["my-awesome-chain"]
+
+# ...
+Chain = Union[EvmChain, SolanaChain, MyAwesomeChain]
+```
+
+### 2. Create a new wallet provider package
+Create a new package in the [wallets directory](https://github.com/goat-sdk/goat/tree/main/python/src/wallets) with the name of your chain (e.g. `my-awesome-chain`) or copy an existing one (e.g. `evm`).
+In this package you will define the abstract class for your chain's wallet client which will extend the `WalletClientBase` class defined in the [core package](https://github.com/goat-sdk/goat/tree/main/python/src/goat-sdk/goat/wallets/core.py).
+
+WalletClientBase only includes the methods that are supported by all chains such as:
+1. `get_address`
+2. `get_chain`
+3. `sign_message`
+4. `balance_of`
+
+As well as includes the `get_core_tools` method which returns the core tools for the chain.
+
+```python
+class MyAwesomeChainWalletClient(WalletClientBase):
+ @abstractmethod
+ def get_chain(self) -> MyAwesomeChain:
+ """Get the EVM chain this wallet is connected to."""
+ pass
+
+ @abstractmethod
+ def send_transaction(self, transaction: MyAwesomeChainTransaction) -> Dict[str, str]:
+ """Send a transaction on the EVM chain."""
+ pass
+
+ @abstractmethod
+ def read(self, request: MyAwesomeChainReadRequest) -> MyAwesomeChainReadResult:
+ """Read data from a smart contract."""
+ pass
+}
```
-## Contributing
+### 3. Create a plugin to allow sending your native token to a wallet
+Create a plugin to allow sending your native token to a wallet. Create a file in the same package as your wallet client and create a new file like `send.py`.
+
+Implement the core plugin.
+
-We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
+```python
+class SendMYAWESOMETOKENPlugin(PluginBase[MyAwesomeChainWalletClient]):
+ def __init__(self):
+ super().__init__("sendMYAWESOMETOKEN", [])
+
+ def supports_chain(self, chain: Chain) -> bool:
+ return chain["type"] == "my-awesome-chain"
+
+ def get_tools(self, wallet_client: MyAwesomeChainWalletClient) -> List[ToolBase]:
+ send_tool = create_tool(
+ config={
+ "name": f"send_myawesometoken",
+ "description": f"Send MYAWESOMETOKEN to an address.",
+ "parameters": SendMYAWESOMETOKENParameters,
+ },
+ execute_fn=lambda params: send_myawesometoken_method(
+ wallet_client, cast(Dict[str, str], params)
+ ),
+ )
+ return [send_tool]
+```
-## License
+### 4. Implement the wallet client
+Extend your abstract class with the methods you need to implement and create your first wallet client! (e.g `MyAwesomeChainKeyPairWalletClient`)
-This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
+```python
+class MyAwesomeChainKeyPairWalletClient(MyAwesomeChainWalletClient):
+ # Implement the methods here
+ pass
-## Community
+# Export the wallet client with a factory function
+my_awesome_chain_wallet_client = () => MyAwesomeChainKeyPairWalletClient()
+```
-- [Discord](https://discord.gg/goat-sdk)
-- [Twitter](https://twitter.com/goat_sdk)
-- [GitHub Discussions](https://github.com/goat-sdk/goat/discussions)
+### 5. Submit a PR
+Submit a PR to add your wallet provider to the [wallets directory](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets).
+
+## How to add a wallet provider
+If you don't see your wallet provider supported, you can easily integrate it by implementing the specific [WalletClient](https://github.com/goat-sdk/goat/blob/main/python/src/wallets) interface for the chain and type of wallet you want to support:
+
+Checkout [here how the web3 client implementation](https://github.com/goat-sdk/goat/tree/main/python/src/wallets/web3).
+
+If you would like to see your wallet provider supported, please open an issue or submit a PR.
+
+## Packages
+### Core
+| | PyPI package |
+| --- | --- |
+| Core | [goat-sdk](https://pypi.org/project/goat-sdk/) |
+
+### Wallets
+| Wallet | PyPI package |
+| --- | --- |
+|EVM | [goat-sdk-wallet-evm](https://pypi.org/project/goat-sdk-wallet-evm/) |
+| Web3 | [goat-sdk-wallet-web3](https://pypi.org/project/goat-sdk-wallet-web3/) |
+| Solana | [goat-sdk-wallet-solana](https://pypi.org/project/goat-sdk-wallet-solana/) |
+
+### Agent Framework Adapters
+| Adapter | PyPI package |
+| --- | --- |
+| Langchain | [goat-sdk-adapter-langchain](https://pypi.org/project/goat-sdk-adapter-langchain/) |
+
+**ZerePy and GAME have direct integrations on their respective repos.*
+
+### Plugins
+| Plugin | Tools | PyPI package |
+| --- | --- | --- |
+| 1inch | Get wallet balances using 1inch API | [goat-sdk-plugin-1inch](https://pypi.org/project/goat-sdk-plugin-1inch/) |
+| Allora | Get price predictions using Allora API | [goat-sdk-plugin-allora](https://pypi.org/project/goat-sdk-plugin-allora/) |
+| CoinGecko | Get coin information using CoinGecko API | [goat-sdk-plugin-coingecko](https://pypi.org/project/goat-sdk-plugin-coingecko/) |
+| Dexscreener | Get token information using Dexscreener API | [goat-sdk-plugin-dexscreener](https://pypi.org/project/goat-sdk-plugin-dexscreener/) |
+| ERC20 | Interact with any ERC20 token | [goat-sdk-plugin-erc20](https://pypi.org/project/goat-sdk-plugin-erc20/) |
+| Farcaster | Read and post casts on Farcaster | [goat-sdk-plugin-farcaster](https://pypi.org/project/goat-sdk-plugin-farcaster/) |
+| JSON RPC | Call any JSON RPC endpoint |[goat-sdk-plugin-json-rpc](https://pypi.org/project/goat-sdk-plugin-json-rpc/) | |
+| Jupiter | Get price predictions using Jupiter API | [goat-sdk-plugin-jupiter](https://pypi.org/project/goat-sdk-plugin-jupiter/) | |
+| Nansen | Get wallet insights using Nansen API | [goat-sdk-plugin-nansen](https://pypi.org/project/goat-sdk-plugin-nansen/) | |
+| OpenSea | Get NFT and sales data from OpenSea | [goat-sdk-plugin-opensea](https://pypi.org/project/goat-sdk-plugin-opensea/) | |
+| Rugcheck | Check if tokens are legit with Rugcheck | [goat-sdk-plugin-rugcheck](https://pypi.org/project/goat-sdk-plugin-rugcheck/) | |
+| SPL Tokens | Interact with SPL tokens | [goat-sdk-plugin-spl-tokens](https://pypi.org/project/goat-sdk-plugin-spl-tokens/) | |
+| Superfluid | Create streams with Superfluid | [goat-sdk-plugin-superfluid](https://pypi.org/project/goat-sdk-plugin-superfluid/) | |
+| Uniswap | Get quotes and swap on Uniswap | [goat-sdk-plugin-uniswap](https://pypi.org/project/goat-sdk-plugin-uniswap/) | |
diff --git a/python/src/goat-sdk/goat/decorators/tool.py b/python/src/goat-sdk/goat/decorators/tool.py
index f0f79d439..e64d41e2e 100644
--- a/python/src/goat-sdk/goat/decorators/tool.py
+++ b/python/src/goat-sdk/goat/decorators/tool.py
@@ -1,5 +1,6 @@
from dataclasses import dataclass
-from typing import Any, Callable, NotRequired, Type, TypedDict
+from typing import Any, Callable, Type, TypedDict
+from typing_extensions import NotRequired
import inspect
from pydantic import BaseModel
diff --git a/python/src/goat-sdk/poetry.lock b/python/src/goat-sdk/poetry.lock
index 10c419724..c5c04e1f8 100644
--- a/python/src/goat-sdk/poetry.lock
+++ b/python/src/goat-sdk/poetry.lock
@@ -11,6 +11,19 @@ files = [
{file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
]
+[[package]]
+name = "asyncio"
+version = "3.4.3"
+description = "reference implementation of PEP 3156"
+optional = false
+python-versions = "*"
+files = [
+ {file = "asyncio-3.4.3-cp33-none-win32.whl", hash = "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de"},
+ {file = "asyncio-3.4.3-cp33-none-win_amd64.whl", hash = "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c"},
+ {file = "asyncio-3.4.3-py3-none-any.whl", hash = "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d"},
+ {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"},
+]
+
[[package]]
name = "colorama"
version = "0.4.6"
@@ -22,6 +35,20 @@ files = [
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
+[[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 = "iniconfig"
version = "2.0.0"
@@ -204,9 +231,11 @@ files = [
[package.dependencies]
colorama = {version = "*", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
iniconfig = "*"
packaging = "*"
pluggy = ">=1.5,<2"
+tomli = {version = ">=1", markers = "python_version < \"3.11\""}
[package.extras]
dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
@@ -257,60 +286,58 @@ files = [
]
[[package]]
-name = "typing-extensions"
-version = "4.12.2"
-description = "Backported and Experimental Type Hints for Python 3.8+"
+name = "tomli"
+version = "2.2.1"
+description = "A lil' TOML parser"
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"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
+ {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
+ {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
+ {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
+ {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
+ {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
+ {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
+ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
+ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
]
[[package]]
-name = "uuid"
-version = "1.30"
-description = "UUID object and generation functions (Python 2.3 or higher)"
-optional = false
-python-versions = "*"
-files = [
- {file = "uuid-1.30.tar.gz", hash = "sha256:1f87cc004ac5120466f36c5beae48b4c48cc411968eed0eaecd3da82aa96193f"},
-]
-
-[[package]]
-name = "validators"
-version = "0.34.0"
-description = "Python Data Validation for Humansβ’"
+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 = "validators-0.34.0-py3-none-any.whl", hash = "sha256:c804b476e3e6d3786fa07a30073a4ef694e617805eb1946ceee3fe5a9b8b1321"},
- {file = "validators-0.34.0.tar.gz", hash = "sha256:647fe407b45af9a74d245b943b18e6a816acf4926974278f6dd617778e1e781f"},
-]
-
-[package.extras]
-crypto-eth-addresses = ["eth-hash[pycryptodome] (>=0.7.0)"]
-
-[[package]]
-name = "zon"
-version = "2.0.1"
-description = "A Zod-like validation library for Python"
-optional = false
-python-versions = ">=3.11"
-files = [
- {file = "zon-2.0.1-py3-none-any.whl", hash = "sha256:a65be8a581c66e8a42c4df179a456698707da3cf1f262a3a2f7973db113e0ac7"},
- {file = "zon-2.0.1.tar.gz", hash = "sha256:7b24050de71603101b169ca8a99064c1aba8f7bdcf47abf4fa43e4c63b010ea7"},
+ {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.dependencies]
-typing-extensions = ">4.12"
-uuid = "1.30"
-validators = ">0.28"
-
-[package.extras]
-dev = ["black", "build", "pylint", "pylint-pytest", "pytest", "pytest-cov"]
-
[metadata]
lock-version = "2.0"
-python-versions = "^3.12"
-content-hash = "ae2416f7c91f74d90ba57bb91ec242fa898c50b24c5213929fc5ffd2494c7961"
+python-versions = "^3.10"
+content-hash = "c598a29909b44e9f21b2d8464aaa15567d11f8ce9a05b2d4a028c9e588aca074"
diff --git a/python/src/goat-sdk/pyproject.toml b/python/src/goat-sdk/pyproject.toml
index 65a33193d..a5ba916e2 100644
--- a/python/src/goat-sdk/pyproject.toml
+++ b/python/src/goat-sdk/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "goat-sdk"
-version = "0.1.2"
+version = "0.1.3"
description = "Goat π (Great Onchain Agent Toolkit) is an open-source framework for connecting AI agents to any onchain app"
authors = ["Andrea Villa "]
readme = "README.md"
@@ -15,6 +15,7 @@ packages = [
python = "^3.10"
pydantic = "^2.10.0"
asyncio = "^3.4.1"
+typing-extensions = "^4.12.2"
[tool.poetry.group.test.dependencies]
pytest = "^8.3.4"
diff --git a/python/src/plugins/jupiter/README.md b/python/src/plugins/jupiter/README.md
new file mode 100644
index 000000000..f190eed74
--- /dev/null
+++ b/python/src/plugins/jupiter/README.md
@@ -0,0 +1,35 @@
+# jupiter Plugin for GOAT SDK
+
+A plugin for the GOAT SDK that provides jupiter functionality.
+
+## Installation
+
+```bash
+# Install the plugin
+poetry add goat-sdk-plugin-jupiter
+
+# Install required wallet dependency
+poetry add goat-sdk-wallet-solana
+```
+
+## Usage
+
+```python
+from goat_plugins.jupiter import jupiter, JupiterPluginOptions
+
+# Initialize the plugin
+options = JupiterPluginOptions(
+ api_key="your-api-key"
+)
+plugin = jupiter(options)
+```
+
+## Features
+
+- Example query functionality
+- Example action functionality
+- Solana chain support
+
+## License
+
+This project is licensed under the terms of the MIT license.
diff --git a/python/src/plugins/jupiter/goat_plugins/jupiter/__init__.py b/python/src/plugins/jupiter/goat_plugins/jupiter/__init__.py
new file mode 100644
index 000000000..1300e9c9a
--- /dev/null
+++ b/python/src/plugins/jupiter/goat_plugins/jupiter/__init__.py
@@ -0,0 +1,21 @@
+from dataclasses import dataclass
+from goat.classes.plugin_base import PluginBase
+from .service import JupiterService
+
+
+@dataclass
+class JupiterPluginOptions:
+ """Options for the JupiterPlugin."""
+ pass # No options needed for Jupiter v6
+
+
+class JupiterPlugin(PluginBase):
+ def __init__(self, options: JupiterPluginOptions):
+ super().__init__("jupiter", [JupiterService()])
+
+ def supports_chain(self, chain) -> bool:
+ return chain['type'] == 'solana'
+
+
+def jupiter(options: JupiterPluginOptions) -> JupiterPlugin:
+ return JupiterPlugin(options)
diff --git a/python/src/plugins/jupiter/goat_plugins/jupiter/parameters.py b/python/src/plugins/jupiter/goat_plugins/jupiter/parameters.py
new file mode 100644
index 000000000..3795b3d33
--- /dev/null
+++ b/python/src/plugins/jupiter/goat_plugins/jupiter/parameters.py
@@ -0,0 +1,76 @@
+from enum import Enum
+from pydantic import BaseModel, Field
+from typing import List, Optional
+
+
+class QuoteGetSwapMode(str, Enum):
+ EXACT_IN = "ExactIn"
+ EXACT_OUT = "ExactOut"
+
+
+class GetQuoteParameters(BaseModel):
+ inputMint: str = Field(description="The token address of the token to swap from")
+ outputMint: str = Field(description="The token address of the token to swap to")
+ amount: int = Field(description="The amount of tokens to swap in the tokens base unit")
+ slippageBps: Optional[int] = Field(None, description="The slippage in bps")
+ autoSlippage: Optional[bool] = Field(None, description="Whether to use auto slippage")
+ autoSlippageCollisionUsdValue: Optional[float] = Field(None, description="The collision USD value for auto slippage")
+ computeAutoSlippage: Optional[bool] = Field(None, description="Whether to compute auto slippage")
+ maxAutoSlippageBps: Optional[int] = Field(None, description="The maximum auto slippage in bps")
+ swapMode: QuoteGetSwapMode = Field(default=QuoteGetSwapMode.EXACT_IN, description="The swap mode")
+ dexes: Optional[List[str]] = Field(None, description="The dexes to use")
+ excludeDexes: Optional[List[str]] = Field(None, description="The dexes to exclude")
+ restrictIntermediateTokens: Optional[bool] = Field(None, description="Whether to restrict intermediate tokens")
+ onlyDirectRoutes: Optional[bool] = Field(None, description="Whether to only use direct routes")
+ asLegacyTransaction: Optional[bool] = Field(None, description="Whether to return the transaction as a legacy transaction")
+ platformFeeBps: Optional[int] = Field(None, description="The platform fee in bps")
+ maxAccounts: Optional[int] = Field(None, description="The maximum number of accounts")
+ minimizeSlippage: Optional[bool] = Field(None, description="Whether to minimize slippage")
+ preferLiquidDexes: Optional[bool] = Field(None, description="Whether to prefer liquid dexes")
+ tokenCategoryBasedIntermediateTokens: Optional[bool] = Field(None, description="Whether to use token category based intermediate tokens")
+
+
+class SwapInfo(BaseModel):
+ ammKey: str = Field(description="The AMM key")
+ label: Optional[str] = Field(None, description="The label")
+ inputMint: str = Field(description="The token to swap from")
+ outputMint: str = Field(description="The token to swap to")
+ inAmount: str = Field(description="The amount of tokens to swap")
+ outAmount: str = Field(description="The amount of tokens to swap")
+ feeAmount: str = Field(description="The fee amount")
+ feeMint: str = Field(description="The fee mint")
+
+
+class PlatformFee(BaseModel):
+ amount: str = Field(description="The amount of tokens to swap")
+ feeBps: int = Field(description="The platform fee in bps")
+
+
+class RoutePlanStep(BaseModel):
+ swapInfo: SwapInfo = Field(description="The swap info")
+ percent: int = Field(description="The percent of the route plan step")
+
+
+class QuoteResponse(BaseModel):
+ inputMint: str = Field(description="The token address of the token to swap from")
+ inAmount: str = Field(description="The amount of tokens to swap in the tokens base unit")
+ outputMint: str = Field(description="The token address of the token to swap to")
+ outAmount: str = Field(description="The amount of tokens to swap in the tokens base unit")
+ otherAmountThreshold: str = Field(description="The amount of tokens to swap in the tokens base unit")
+ swapMode: QuoteGetSwapMode = Field(description="The swap mode")
+ slippageBps: int = Field(description="The slippage in bps")
+ computedAutoSlippage: Optional[int] = Field(None, description="The computed auto slippage")
+ platformFee: Optional[PlatformFee] = Field(None, description="The platform fee")
+ priceImpactPct: float = Field(description="The price impact in percentage")
+ routePlan: List[RoutePlanStep] = Field(description="The route plan")
+ contextSlot: Optional[int] = Field(None, description="The context slot")
+ timeTaken: Optional[float] = Field(None, description="The time taken")
+
+
+class SwapRequest(BaseModel):
+ userPublicKey: str = Field(description="The user public key")
+ quoteResponse: QuoteResponse = Field(description="The quote response")
+
+
+class SwapParameters(BaseModel):
+ swapRequest: SwapRequest = Field(description="The swap request")
diff --git a/python/src/plugins/jupiter/goat_plugins/jupiter/service.py b/python/src/plugins/jupiter/goat_plugins/jupiter/service.py
new file mode 100644
index 000000000..12ab881be
--- /dev/null
+++ b/python/src/plugins/jupiter/goat_plugins/jupiter/service.py
@@ -0,0 +1,154 @@
+import base64
+import aiohttp
+from goat.decorators.tool import Tool
+from goat_wallets.solana.wallet import SolanaTransaction
+from solders.message import MessageV0
+from solders.transaction import VersionedTransaction
+from .parameters import GetQuoteParameters, QuoteResponse
+from goat_wallets.solana import SolanaWalletClient
+
+
+class JupiterService:
+ def __init__(self):
+ self.base_url = "https://quote-api.jup.ag/v6"
+ self._timeout = aiohttp.ClientTimeout(total=10) # 10 second timeout
+
+ @Tool({
+ "description": "Get a quote for a swap on the Jupiter DEX",
+ "parameters_schema": GetQuoteParameters
+ })
+ async def get_quote(self, parameters: dict) -> dict:
+ """Get a quote for swapping tokens using Jupiter."""
+ try:
+ params = GetQuoteParameters.model_validate(parameters)
+ # Convert parameters to dict and ensure required fields are properly formatted
+ request_params = {
+ 'inputMint': params.inputMint,
+ 'outputMint': params.outputMint,
+ 'amount': str(params.amount),
+ 'swapMode': params.swapMode.value
+ }
+ # Add optional parameters if they are set
+ if params.slippageBps is not None:
+ request_params['slippageBps'] = str(params.slippageBps)
+ print(f"Requesting quote with parameters: {request_params}")
+ async with aiohttp.ClientSession(timeout=self._timeout) as session:
+ async with session.get(f"{self.base_url}/quote", params=request_params) as response:
+ response_text = await response.text()
+ print(f"Got response: {response_text}")
+
+ if response.status != 200:
+ try:
+ error_data = await response.json()
+ raise Exception(f"Failed to get quote: {error_data.get('error', 'Unknown error')}")
+ except:
+ raise Exception(f"Failed to get quote: {response_text}")
+
+ response_data = await response.json()
+ QuoteResponse.model_validate(response_data)
+
+ return response_data
+ except aiohttp.ClientResponseError as error:
+ error_message = f"Failed to get quote: {str(error)}"
+ if error.status != 404: # Only try to parse response for non-404 errors
+ try:
+ error_message = f"Failed to get quote: HTTP {error.status} - {error.message}"
+ except:
+ pass
+ raise Exception(error_message)
+ except Exception as error:
+ raise Exception(f"Failed to get quote: {str(error)}")
+
+ @Tool({
+ "description": "Swap an SPL token for another token on the Jupiter DEX",
+ "parameters_schema": GetQuoteParameters
+ })
+ async def swap_tokens(self, wallet_client: SolanaWalletClient, parameters: dict):
+ """Swap tokens using Jupiter DEX."""
+ try:
+ # First get the quote
+ quote_response = await self.get_quote(parameters)
+
+ # Transform quote response following the same structure as in TypeScript
+ transformed_quote_response = {
+ "inputMint": quote_response.get("inputMint"),
+ "inAmount": quote_response.get("inAmount"),
+ "outputMint": quote_response.get("outputMint"),
+ "outAmount": quote_response.get("outAmount"),
+ "otherAmountThreshold": quote_response.get("otherAmountThreshold"),
+ "swapMode": quote_response.get("swapMode"),
+ "slippageBps": quote_response.get("slippageBps"),
+ "priceImpactPct": quote_response.get("priceImpactPct"),
+ "routePlan": [
+ {
+ "swapInfo": {
+ "ammKey": step.get("swapInfo", {}).get("ammKey"),
+ "label": step.get("swapInfo", {}).get("label"),
+ "inputMint": step.get("swapInfo", {}).get("inputMint"),
+ "outputMint": step.get("swapInfo", {}).get("outputMint"),
+ "inAmount": step.get("swapInfo", {}).get("inAmount"),
+ "outAmount": step.get("swapInfo", {}).get("outAmount"),
+ "feeAmount": step.get("swapInfo", {}).get("feeAmount"),
+ "feeMint": step.get("swapInfo", {}).get("feeMint")
+ },
+ "percent": step.get("percent")
+ }
+ for step in quote_response.get("routePlan", [])
+ ]
+ }
+
+ # Remove None values from the transformed response
+ transformed_quote_response = {k: v for k, v in transformed_quote_response.items() if v is not None}
+
+ # Add optional fields if they exist
+ for field in ["computedAutoSlippage", "contextSlot", "timeTaken"]:
+ if field in quote_response and quote_response[field] is not None:
+ transformed_quote_response[field] = quote_response[field]
+
+ if "platformFee" in quote_response and quote_response["platformFee"]:
+ platform_fee = quote_response["platformFee"]
+ fee_data = {}
+ if "amount" in platform_fee:
+ fee_data["amount"] = platform_fee["amount"]
+ if "feeBps" in platform_fee:
+ fee_data["feeBps"] = platform_fee["feeBps"]
+ if fee_data:
+ transformed_quote_response["platformFee"] = fee_data
+
+ # Prepare the full swap request
+ swap_request = {
+ "quoteResponse": transformed_quote_response,
+ "userPublicKey": wallet_client.get_address(),
+ "dynamicComputeUnitLimit": True,
+ "prioritizationFeeLamports": "auto",
+ "wrapAndUnwrapSol": True,
+ "useSharedAccounts": True,
+ "dynamicSlippage": None, # Can be added if needed
+ "asLegacyTransaction": False,
+ "skipUserAccountsRpcCalls": False,
+ "useTokenLedger": False,
+ "destinationTokenAccount": None # Can be specified if needed
+ }
+
+ # Get swap transaction
+ async with aiohttp.ClientSession(timeout=self._timeout) as session:
+ async with session.post(f"{self.base_url}/swap", json=swap_request) as response:
+ if response.status != 200:
+ error_data = await response.json()
+ raise Exception(f"Failed to create swap transaction: {error_data.get('error', 'Unknown error')}")
+
+ swap_response = await response.json()
+ swap_transaction = swap_response.get("swapTransaction")
+
+ if not swap_transaction:
+ raise Exception("No swap transaction returned")
+
+ # Send the raw transaction directly
+ result = wallet_client.send_raw_transaction(swap_transaction)
+
+ return {
+ "hash": result["hash"]
+ }
+
+ except Exception as error:
+ raise Exception(f"Failed to swap tokens: {error}")
diff --git a/python/src/plugins/jupiter/poetry.lock b/python/src/plugins/jupiter/poetry.lock
new file mode 100644
index 000000000..10aacc006
--- /dev/null
+++ b/python/src/plugins/jupiter/poetry.lock
@@ -0,0 +1,806 @@
+# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand.
+
+[[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 = "asyncio"
+version = "3.4.3"
+description = "reference implementation of PEP 3156"
+optional = false
+python-versions = "*"
+files = [
+ {file = "asyncio-3.4.3-cp33-none-win32.whl", hash = "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de"},
+ {file = "asyncio-3.4.3-cp33-none-win_amd64.whl", hash = "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c"},
+ {file = "asyncio-3.4.3-py3-none-any.whl", hash = "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d"},
+ {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"},
+]
+
+[[package]]
+name = "cachetools"
+version = "4.2.4"
+description = "Extensible memoizing collections and decorators"
+optional = false
+python-versions = "~=3.5"
+files = [
+ {file = "cachetools-4.2.4-py3-none-any.whl", hash = "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1"},
+ {file = "cachetools-4.2.4.tar.gz", hash = "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693"},
+]
+
+[[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 = "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 = "construct"
+version = "2.10.68"
+description = "A powerful declarative symmetric parser/builder for binary data"
+optional = false
+python-versions = ">=3.6"
+files = [
+ {file = "construct-2.10.68.tar.gz", hash = "sha256:7b2a3fd8e5f597a5aa1d614c3bd516fa065db01704c72a1efaaeec6ef23d8b45"},
+]
+
+[package.extras]
+extras = ["arrow", "cloudpickle", "enum34", "lz4", "numpy", "ruamel.yaml"]
+
+[[package]]
+name = "construct-typing"
+version = "0.5.6"
+description = "Extension for the python package 'construct' that adds typing features"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "construct-typing-0.5.6.tar.gz", hash = "sha256:0dc501351cd6b308f15ec54e5fe7c0fbc07cc1530a1b77b4303062a0a93c1297"},
+ {file = "construct_typing-0.5.6-py3-none-any.whl", hash = "sha256:39c948329e880564e33521cba497b21b07967c465b9c9037d6334e2cffa1ced9"},
+]
+
+[package.dependencies]
+construct = "2.10.68"
+
+[[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 = "goat-sdk"
+version = "0.1.1"
+description = "Goat π (Great Onchain Agent Toolkit) is an open-source framework for connecting AI agents to any onchain app"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+asyncio = "^3.4.1"
+pydantic = "^2.10.0"
+
+[package.source]
+type = "directory"
+url = "../../goat-sdk"
+
+[[package]]
+name = "goat-sdk-wallet-solana"
+version = "0.1.0"
+description = "Goat SDK Solana wallet implementation"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+goat-sdk = "^0.1.0"
+PyNaCl = "^1.5.0"
+solana = "^0.30.2"
+solders = "^0.18.0"
+
+[package.source]
+type = "directory"
+url = "../../wallets/solana"
+
+[[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 = "httpcore"
+version = "0.16.3"
+description = "A minimal low-level HTTP client."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"},
+ {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"},
+]
+
+[package.dependencies]
+anyio = ">=3.0,<5.0"
+certifi = "*"
+h11 = ">=0.13,<0.15"
+sniffio = "==1.*"
+
+[package.extras]
+http2 = ["h2 (>=3,<5)"]
+socks = ["socksio (==1.*)"]
+
+[[package]]
+name = "httpx"
+version = "0.23.3"
+description = "The next generation HTTP client."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"},
+ {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"},
+]
+
+[package.dependencies]
+certifi = "*"
+httpcore = ">=0.15.0,<0.17.0"
+rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]}
+sniffio = "*"
+
+[package.extras]
+brotli = ["brotli", "brotlicffi"]
+cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<13)"]
+http2 = ["h2 (>=3,<5)"]
+socks = ["socksio (==1.*)"]
+
+[[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 = "iniconfig"
+version = "2.0.0"
+description = "brain-dead simple config-ini parsing"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
+ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
+]
+
+[[package]]
+name = "jsonalias"
+version = "0.1.1"
+description = "A microlibrary that defines a Json type alias for Python."
+optional = false
+python-versions = ">=3.7,<4.0"
+files = [
+ {file = "jsonalias-0.1.1-py3-none-any.whl", hash = "sha256:a56d2888e6397812c606156504e861e8ec00e188005af149f003c787db3d3f18"},
+ {file = "jsonalias-0.1.1.tar.gz", hash = "sha256:64f04d935397d579fc94509e1fcb6212f2d081235d9d6395bd10baedf760a769"},
+]
+
+[[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 = "pluggy"
+version = "1.5.0"
+description = "plugin and hook calling mechanisms for python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
+ {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
+]
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
+
+[[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 = "pydantic"
+version = "2.10.5"
+description = "Data validation using Python type hints"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"},
+ {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"},
+]
+
+[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 = "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 = "pytest"
+version = "8.3.4"
+description = "pytest: simple powerful testing with Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"},
+ {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
+iniconfig = "*"
+packaging = "*"
+pluggy = ">=1.5,<2"
+tomli = {version = ">=1", markers = "python_version < \"3.11\""}
+
+[package.extras]
+dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+
+[[package]]
+name = "pytest-asyncio"
+version = "0.25.2"
+description = "Pytest support for asyncio"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"},
+ {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"},
+]
+
+[package.dependencies]
+pytest = ">=8.2,<9"
+
+[package.extras]
+docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"]
+testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"]
+
+[[package]]
+name = "rfc3986"
+version = "1.5.0"
+description = "Validating URI References per RFC 3986"
+optional = false
+python-versions = "*"
+files = [
+ {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"},
+ {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"},
+]
+
+[package.dependencies]
+idna = {version = "*", optional = true, markers = "extra == \"idna2008\""}
+
+[package.extras]
+idna2008 = ["idna"]
+
+[[package]]
+name = "ruff"
+version = "0.8.6"
+description = "An extremely fast Python linter and code formatter, written in Rust."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "ruff-0.8.6-py3-none-linux_armv6l.whl", hash = "sha256:defed167955d42c68b407e8f2e6f56ba52520e790aba4ca707a9c88619e580e3"},
+ {file = "ruff-0.8.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:54799ca3d67ae5e0b7a7ac234baa657a9c1784b48ec954a094da7c206e0365b1"},
+ {file = "ruff-0.8.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e88b8f6d901477c41559ba540beeb5a671e14cd29ebd5683903572f4b40a9807"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0509e8da430228236a18a677fcdb0c1f102dd26d5520f71f79b094963322ed25"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a7ddb221779871cf226100e677b5ea38c2d54e9e2c8ed847450ebbdf99b32d"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248b1fb3f739d01d528cc50b35ee9c4812aa58cc5935998e776bf8ed5b251e75"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bc3c083c50390cf69e7e1b5a5a7303898966be973664ec0c4a4acea82c1d4315"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52d587092ab8df308635762386f45f4638badb0866355b2b86760f6d3c076188"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61323159cf21bc3897674e5adb27cd9e7700bab6b84de40d7be28c3d46dc67cf"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ae4478b1471fc0c44ed52a6fb787e641a2ac58b1c1f91763bafbc2faddc5117"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0c000a471d519b3e6cfc9c6680025d923b4ca140ce3e4612d1a2ef58e11f11fe"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9257aa841e9e8d9b727423086f0fa9a86b6b420fbf4bf9e1465d1250ce8e4d8d"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45a56f61b24682f6f6709636949ae8cc82ae229d8d773b4c76c09ec83964a95a"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:496dd38a53aa173481a7d8866bcd6451bd934d06976a2505028a50583e001b76"},
+ {file = "ruff-0.8.6-py3-none-win32.whl", hash = "sha256:e169ea1b9eae61c99b257dc83b9ee6c76f89042752cb2d83486a7d6e48e8f764"},
+ {file = "ruff-0.8.6-py3-none-win_amd64.whl", hash = "sha256:f1d70bef3d16fdc897ee290d7d20da3cbe4e26349f62e8a0274e7a3f4ce7a905"},
+ {file = "ruff-0.8.6-py3-none-win_arm64.whl", hash = "sha256:7d7fc2377a04b6e04ffe588caad613d0c460eb2ecba4c0ccbbfe2bc973cbc162"},
+ {file = "ruff-0.8.6.tar.gz", hash = "sha256:dcad24b81b62650b0eb8814f576fc65cfee8674772a6e24c9b747911801eeaa5"},
+]
+
+[[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 = "solana"
+version = "0.30.2"
+description = "Solana Python API"
+optional = false
+python-versions = ">=3.7,<4.0"
+files = [
+ {file = "solana-0.30.2-py3-none-any.whl", hash = "sha256:d7e8295a1f86982ba51e78a65c16ce55f4a9e9caa8938564922a209ddfb2a01f"},
+ {file = "solana-0.30.2.tar.gz", hash = "sha256:7b16e76cdd1d3024219679cdb73c20324d6d79e3c9766fe0ca52be79ef5ff691"},
+]
+
+[package.dependencies]
+cachetools = ">=4.2.2,<5.0.0"
+construct-typing = ">=0.5.2,<0.6.0"
+httpx = ">=0.23.0,<0.24.0"
+solders = ">=0.18.0,<0.19.0"
+types-cachetools = ">=4.2.4,<5.0.0"
+typing-extensions = ">=4.2.0"
+websockets = ">=9.0,<12.0"
+
+[[package]]
+name = "solders"
+version = "0.18.1"
+description = "Python bindings for Solana Rust tools"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "solders-0.18.1-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:1b20230838626fad26d5bdaf8ebe3db3b660ef9f56cc271feca8970d464ea11f"},
+ {file = "solders-0.18.1-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3d2503693d0fb0efd37e3f921277327ff664bd04fff551346fad565dd8b9185a"},
+ {file = "solders-0.18.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ee08cd1de84463b83551810981c25dcca4aa42ab57b8ba823d62dbab9d202"},
+ {file = "solders-0.18.1-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b78482deeed583b473e70314336d26562b5f2f14fa777a83b9406835eb3e988"},
+ {file = "solders-0.18.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3da01fcfcfd2154ff41328a3b7a32db655f8aace4ca146a7bf779c6088866daf"},
+ {file = "solders-0.18.1-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:0b6bd026bdfce27daacefa405f0e46f44f9e8dd7e60fd36d23278b08a0f40482"},
+ {file = "solders-0.18.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:02788caa3b82e846944a37f86dc673b6c9d80108679f44109f6c7acfd98808ec"},
+ {file = "solders-0.18.1-cp37-abi3-win_amd64.whl", hash = "sha256:1587231b57a94e29df3945fa2582817cdb1c935c7cc3b446140ae4154912d1e6"},
+ {file = "solders-0.18.1.tar.gz", hash = "sha256:1b41c36e331e2323ed4be1253fda2221391956b4a528270acfbf921e2a3f0329"},
+]
+
+[package.dependencies]
+jsonalias = "0.1.1"
+typing-extensions = ">=4.2.0"
+
+[[package]]
+name = "tomli"
+version = "2.2.1"
+description = "A lil' TOML parser"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
+ {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
+ {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
+ {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
+ {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
+ {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
+ {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
+ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
+ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
+]
+
+[[package]]
+name = "types-cachetools"
+version = "4.2.10"
+description = "Typing stubs for cachetools"
+optional = false
+python-versions = "*"
+files = [
+ {file = "types-cachetools-4.2.10.tar.gz", hash = "sha256:b1cb18aaff25d2ad47a060413c660c39fadddb01f72012dd1134584b1fdaada5"},
+ {file = "types_cachetools-4.2.10-py3-none-any.whl", hash = "sha256:48301115189d4879d0960baac5a8a2b2d31ce6129b2ce3b915000ed337284898"},
+]
+
+[[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 = "websockets"
+version = "11.0.3"
+description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"},
+ {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"},
+ {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"},
+ {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"},
+ {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"},
+ {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"},
+ {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"},
+ {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"},
+ {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"},
+ {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"},
+ {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"},
+ {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"},
+ {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"},
+ {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"},
+ {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"},
+ {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"},
+ {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"},
+ {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"},
+ {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"},
+ {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"},
+ {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"},
+ {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"},
+ {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"},
+ {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"},
+ {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"},
+ {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"},
+ {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"},
+ {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"},
+ {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"},
+ {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"},
+ {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"},
+ {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"},
+ {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"},
+ {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"},
+ {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"},
+ {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"},
+ {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"},
+ {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"},
+ {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"},
+ {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"},
+ {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"},
+ {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"},
+ {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"},
+ {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"},
+ {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"},
+ {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"},
+ {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"},
+ {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"},
+ {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"},
+ {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"},
+ {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"},
+ {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"},
+ {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"},
+ {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"},
+ {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"},
+ {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"},
+ {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"},
+ {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"},
+ {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"},
+ {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"},
+ {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"},
+ {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"},
+ {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"},
+ {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"},
+ {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"},
+ {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"},
+ {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"},
+ {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"},
+ {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"},
+ {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"},
+]
+
+[metadata]
+lock-version = "2.0"
+python-versions = "^3.10"
+content-hash = "6d29da17e0ca34c65a002af2a10e718f7ad7385bc05f4528cd136f419402028b"
diff --git a/python/src/plugins/jupiter/pyproject.toml b/python/src/plugins/jupiter/pyproject.toml
new file mode 100644
index 000000000..793852b4a
--- /dev/null
+++ b/python/src/plugins/jupiter/pyproject.toml
@@ -0,0 +1,44 @@
+[tool.poetry]
+name = "goat-sdk-plugin-jupiter"
+version = "0.1.0"
+description = "Goat plugin for jupiter"
+authors = ["Your Name "]
+readme = "README.md"
+keywords = ["goat", "sdk", "agents", "ai", "jupiter"]
+homepage = "https://ohmygoat.dev/"
+repository = "https://github.com/goat-sdk/goat"
+packages = [
+ { include = "goat_plugins/jupiter" },
+]
+
+[tool.poetry.dependencies]
+python = "^3.10"
+goat-sdk = "^0.1.0"
+goat-sdk-wallet-solana = "^0.1.1"
+
+[tool.poetry.group.test.dependencies]
+pytest = "^8.3.4"
+pytest-asyncio = "^0.25.0"
+
+[tool.poetry.urls]
+"Bug Tracker" = "https://github.com/goat-sdk/goat/issues"
+
+[tool.pytest.ini_options]
+addopts = [
+ "--import-mode=importlib",
+]
+pythonpath = "src"
+asyncio_default_fixture_loop_scope = "function"
+
+[build-system]
+requires = ["poetry-core"]
+build-backend = "poetry.core.masonry.api"
+
+[tool.poetry.group.dev.dependencies]
+ruff = "^0.8.6"
+goat-sdk = { path = "../../goat-sdk", develop = true }
+goat-sdk-wallet-solana = { path = "../../wallets/solana", develop = true }
+
+[tool.ruff]
+line-length = 120
+target-version = "py312"
diff --git a/python/src/plugins/uniswap/README.md b/python/src/plugins/uniswap/README.md
new file mode 100644
index 000000000..6fc9ad1e4
--- /dev/null
+++ b/python/src/plugins/uniswap/README.md
@@ -0,0 +1,35 @@
+# uniswap Plugin for GOAT SDK
+
+A plugin for the GOAT SDK that provides uniswap functionality.
+
+## Installation
+
+```bash
+# Install the plugin
+poetry add goat-sdk-plugin-uniswap
+
+# Install required wallet dependency
+poetry add goat-sdk-wallet-evm
+```
+
+## Usage
+
+```python
+from goat_plugins.uniswap import uniswap, UniswapPluginOptions
+
+# Initialize the plugin
+options = UniswapPluginOptions(
+ api_key="your-api-key"
+)
+plugin = uniswap(options)
+```
+
+## Features
+
+- Example query functionality
+- Example action functionality
+- EVM chain support
+
+## License
+
+This project is licensed under the terms of the MIT license.
diff --git a/python/src/plugins/uniswap/goat_plugins/uniswap/__init__.py b/python/src/plugins/uniswap/goat_plugins/uniswap/__init__.py
new file mode 100644
index 000000000..a0d3136f1
--- /dev/null
+++ b/python/src/plugins/uniswap/goat_plugins/uniswap/__init__.py
@@ -0,0 +1,57 @@
+from dataclasses import dataclass
+from goat.classes.plugin_base import PluginBase
+from .service import UniswapService
+
+
+@dataclass
+class UniswapPluginOptions:
+ """Options for the UniswapPlugin."""
+ api_key: str # API key for external service integration
+ base_url: str # Base URL for Uniswap API
+
+
+class UniswapPlugin(PluginBase):
+ """Uniswap plugin for token swaps on supported EVM chains."""
+ def __init__(self, options: UniswapPluginOptions):
+ super().__init__("uniswap", [UniswapService(options.api_key, options.base_url)])
+
+ def supports_chain(self, chain) -> bool:
+ """Check if the chain is supported by Uniswap.
+
+ Currently supports:
+ - Mainnet (1)
+ - Polygon (137)
+ - Avalanche (43114)
+ - Base (8453)
+ - Optimism (10)
+ - Zora (7777777)
+ - Arbitrum (42161)
+ - Celo (42220)
+ """
+ if chain['type'] != 'evm':
+ return False
+
+ # List of supported chain IDs from uniswap.plugin.ts
+ SUPPORTED_CHAIN_IDS = [
+ 1, # Mainnet
+ 137, # Polygon
+ 43114, # Avalanche
+ 8453, # Base
+ 10, # Optimism
+ 7777777, # Zora
+ 42161, # Arbitrum
+ 42220 # Celo
+ ]
+ return chain['id'] in SUPPORTED_CHAIN_IDS
+
+
+def uniswap(options: UniswapPluginOptions) -> UniswapPlugin:
+ """Create a new instance of the Uniswap plugin.
+
+ Args:
+ options: Configuration options for the plugin
+
+ Returns:
+ A configured UniswapPlugin instance
+ """
+ return UniswapPlugin(options)
diff --git a/python/src/plugins/uniswap/goat_plugins/uniswap/parameters.py b/python/src/plugins/uniswap/goat_plugins/uniswap/parameters.py
new file mode 100644
index 000000000..e716cce69
--- /dev/null
+++ b/python/src/plugins/uniswap/goat_plugins/uniswap/parameters.py
@@ -0,0 +1,51 @@
+from enum import Enum
+from typing import List, Optional
+from pydantic import BaseModel, Field
+
+
+class SwapType(str, Enum):
+ EXACT_INPUT = "EXACT_INPUT"
+ EXACT_OUTPUT = "EXACT_OUTPUT"
+
+
+class Protocol(str, Enum):
+ V2 = "V2"
+ V3 = "V3"
+
+
+class Routing(str, Enum):
+ CLASSIC = "CLASSIC"
+ UNISWAPX = "UNISWAPX"
+ UNISWAPX_V2 = "UNISWAPX_V2"
+ V3_ONLY = "V3_ONLY"
+ V2_ONLY = "V2_ONLY"
+ BEST_PRICE = "BEST_PRICE"
+ BEST_PRICE_V2 = "BEST_PRICE_V2"
+ FASTEST = "FASTEST"
+
+
+class CheckApprovalParameters(BaseModel):
+ token: str = Field(description="The token address to check approval for")
+ amount: str = Field(description="The amount of tokens to approve in base units")
+ walletAddress: str = Field(description="The wallet address to check approval for")
+
+
+class GetQuoteParameters(BaseModel):
+ tokenIn: str = Field(description="The address of the input token")
+ tokenOut: str = Field(description="The address of the output token")
+ tokenOutChainId: Optional[int] = Field(
+ None,
+ description="The chain ID of the output token. Defaults to the same chain as the input token"
+ )
+ amount: str = Field(description="The amount of tokens to swap in base units")
+ type: SwapType = Field(
+ default=SwapType.EXACT_INPUT,
+ description="The type of swap to perform"
+ )
+ protocols: List[Protocol] = Field(
+ description="The protocols to use for the swap"
+ )
+ routingPreference: Routing = Field(
+ default=Routing.CLASSIC,
+ description="The routing preference determines which protocol to use for the swap"
+ )
diff --git a/python/src/plugins/uniswap/goat_plugins/uniswap/service.py b/python/src/plugins/uniswap/goat_plugins/uniswap/service.py
new file mode 100644
index 000000000..3160ca248
--- /dev/null
+++ b/python/src/plugins/uniswap/goat_plugins/uniswap/service.py
@@ -0,0 +1,177 @@
+import aiohttp
+import json
+from typing import Any, Dict
+from goat.decorators.tool import Tool
+from .parameters import CheckApprovalParameters, GetQuoteParameters
+from goat_wallets.evm import EVMWalletClient
+from goat_wallets.evm.types import EVMTransaction
+from goat_plugins.erc20.abi import ERC20_ABI
+
+
+class UniswapService:
+ def __init__(self, api_key: str, base_url: str = "https://trade-api.gateway.uniswap.org/v1"):
+ self.api_key = api_key
+ self.base_url = base_url.rstrip("/") # Remove trailing slash if present
+
+ # Map chain IDs to their string names
+ self.chain_id_map = {
+ 1: "MAINNET",
+ 10: "OPTIMISM",
+ 137: "POLYGON",
+ 42161: "ARBITRUM",
+ 8453: "BASE",
+ 43114: "AVAX",
+ 7777777: "ZORA",
+ 42220: "CELO"
+ }
+
+ async def make_request(self, endpoint: str, parameters: Dict[str, Any]) -> Dict[str, Any]:
+ """Make a request to the Uniswap API."""
+ url = f"{self.base_url}/{endpoint}"
+
+ headers = {
+ "x-api-key": self.api_key
+ }
+
+ async with aiohttp.ClientSession() as session:
+ try:
+ async with session.post(url, json=parameters, headers=headers) as response:
+ response_text = await response.text()
+ try:
+ response_json = json.loads(response_text)
+ except json.JSONDecodeError:
+ raise Exception(f"Invalid JSON response from {endpoint}: {response_text}")
+
+ print(f"\nAPI Response for {endpoint}:")
+ print(f"Status: {response.status}")
+ print(f"Headers: {dict(response.headers)}")
+ print(f"Body: {response_text}")
+
+ if not response.ok:
+ error_code = response_json.get("errorCode", "Unknown error")
+ if error_code == "VALIDATION_ERROR":
+ raise Exception("Invalid parameters provided to the API")
+ elif error_code == "INSUFFICIENT_BALANCE":
+ raise Exception("Insufficient balance for the requested operation")
+ elif error_code == "RATE_LIMIT":
+ raise Exception("API rate limit exceeded")
+ else:
+ raise Exception(f"API error: {error_code}")
+
+ return response_json
+ except aiohttp.ClientError as e:
+ raise Exception(f"Network error while accessing {endpoint}: {str(e)}")
+
+ @Tool({
+ "name": "uniswap_check_approval",
+ "description": "Check if the wallet has enough approval for a token and return the transaction to approve the token. The approval must takes place before the swap transaction",
+ "parameters_schema": CheckApprovalParameters
+ })
+ async def check_approval(self, wallet_client: EVMWalletClient, parameters: dict):
+ """Check token approval and approve if needed."""
+ try:
+ data = await self.make_request("check_approval", {
+ "token": parameters["token"],
+ "amount": parameters["amount"],
+ "walletAddress": parameters["walletAddress"],
+ "chainId": wallet_client.get_chain()["id"]
+ })
+
+ # If no approval data is returned, the token is already approved
+ if not data or "approval" not in data or not data["approval"]:
+ return {"status": "approved"}
+
+ approval = data["approval"]
+ # Extract spender address from approval data
+ data = approval["data"]
+ # The spender address starts at position 34 (after function selector) and is 40 characters long
+ raw_spender = "0x" + data[34:74]
+ # Use wallet_client's resolve_address to get checksum address
+ spender = wallet_client.resolve_address(raw_spender)
+ # Convert max approval amount to integer
+ max_approval = int("0x" + "f" * 64, 16) # Max uint256 value
+
+ transaction_params: EVMTransaction = {
+ "to": wallet_client.resolve_address(approval["to"]),
+ "abi": ERC20_ABI,
+ "functionName": "approve",
+ "args": [spender, max_approval],
+ "value": 0
+ }
+
+ # Send the transaction
+ transaction = wallet_client.send_transaction(transaction_params)
+ return {
+ "status": "approved",
+ "txHash": transaction["hash"]
+ }
+ except Exception as error:
+ raise Exception(f"Failed to check/approve token: {error}")
+
+ @Tool({
+ "name": "uniswap_get_quote",
+ "description": "Get the quote for a swap",
+ "parameters_schema": GetQuoteParameters
+ })
+ async def get_quote(self, wallet_client: EVMWalletClient, parameters: dict):
+ """Get a quote for token swap."""
+ try:
+ chain_id = wallet_client.get_chain()["id"]
+
+ request_params = {
+ "tokenIn": parameters["tokenIn"],
+ "tokenOut": parameters["tokenOut"],
+ "amount": parameters["amount"],
+ "type": "EXACT_INPUT", # Default type
+ "tokenInChainId": chain_id,
+ "tokenOutChainId": chain_id, # Same chain for now
+ "swapper": wallet_client.get_address()
+ }
+
+ # Debug log the request parameters
+ print(f"\nRequest parameters for quote:")
+ print(json.dumps(request_params, indent=2))
+
+ return await self.make_request("quote", request_params)
+ except Exception as error:
+ raise Exception(f"Failed to get quote: {error}")
+
+ @Tool({
+ "name": "uniswap_swap_tokens",
+ "description": "Swap tokens on Uniswap",
+ "parameters_schema": GetQuoteParameters
+ })
+ async def swap_tokens(self, wallet_client: EVMWalletClient, parameters: dict):
+ """Execute a token swap on Uniswap."""
+ try:
+ quote = await self.get_quote(wallet_client, parameters)
+
+ response = await self.make_request("swap", {
+ "quote": quote["quote"]
+ })
+
+ swap = response["swap"]
+ # Create properly typed transaction object using raw API response
+ value = swap.get("value", "0x0")
+ # Convert hex value to integer for EVMTransaction
+ if isinstance(value, str) and value.startswith("0x"):
+ value = int(value, 16)
+ elif isinstance(value, str):
+ value = int(value)
+ else:
+ value = int(value) if value else 0
+
+ transaction_params: EVMTransaction = {
+ "to": swap["to"],
+ "data": swap["data"],
+ "value": value
+ }
+
+ # Send the transaction
+ transaction = wallet_client.send_transaction(transaction_params)
+
+ return {
+ "txHash": transaction["hash"]
+ }
+ except Exception as error:
+ raise Exception(f"Failed to execute swap: {error}")
diff --git a/python/src/plugins/uniswap/poetry.lock b/python/src/plugins/uniswap/poetry.lock
new file mode 100644
index 000000000..e08c4d650
--- /dev/null
+++ b/python/src/plugins/uniswap/poetry.lock
@@ -0,0 +1,953 @@
+# 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 = "async-timeout"
+version = "5.0.1"
+description = "Timeout context manager for asyncio programs"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"},
+ {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"},
+]
+
+[[package]]
+name = "asyncio"
+version = "3.4.3"
+description = "reference implementation of PEP 3156"
+optional = false
+python-versions = "*"
+files = [
+ {file = "asyncio-3.4.3-cp33-none-win32.whl", hash = "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de"},
+ {file = "asyncio-3.4.3-cp33-none-win_amd64.whl", hash = "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c"},
+ {file = "asyncio-3.4.3-py3-none-any.whl", hash = "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d"},
+ {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"},
+]
+
+[[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 = "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 = "evmchains"
+version = "0.1.3"
+description = "Packaged metadata on Ethereum Virtual Machine (EVM) chains"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "evmchains-0.1.3-py3-none-any.whl", hash = "sha256:6dc608a24af2bc2d05fd186ce8ccdba69af606ab46df3cb22cc30754889871b5"},
+ {file = "evmchains-0.1.3.tar.gz", hash = "sha256:1a3225a34a18fe35d67a8c344a9ee5c7453c73b5e637a7cdc919046632707675"},
+]
+
+[package.dependencies]
+pydantic = ">=2.5.3,<3"
+
+[package.extras]
+dev = ["black (>=23.12.1,<23.13.0)", "build (>=1.0.3,<1.1.0)", "mypy (>=1.8.0,<1.9.0)", "pytest (>=7.4.4,<7.5.0)", "requests (>=2.31.0,<2.32.0)", "ruff (>=0.6.8,<0.7.0)", "setuptools-scm (>=8.0.4,<8.1.0)", "types-requests (>=2.31.0.20240106)"]
+
+[[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 = "goat-sdk"
+version = "0.1.2"
+description = "Goat π (Great Onchain Agent Toolkit) is an open-source framework for connecting AI agents to any onchain app"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+asyncio = "^3.4.1"
+pydantic = "^2.10.0"
+
+[package.source]
+type = "directory"
+url = "../../goat-sdk"
+
+[[package]]
+name = "goat-sdk-wallet-evm"
+version = "0.1.0"
+description = "Goat SDK EVM wallet implementation"
+optional = false
+python-versions = "^3.10"
+files = []
+develop = true
+
+[package.dependencies]
+evmchains = "^0.1.3"
+goat-sdk = "^0.1.0"
+
+[package.source]
+type = "directory"
+url = "../../wallets/evm"
+
+[[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 = "iniconfig"
+version = "2.0.0"
+description = "brain-dead simple config-ini parsing"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
+ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
+]
+
+[[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 = "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 = "pluggy"
+version = "1.5.0"
+description = "plugin and hook calling mechanisms for python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
+ {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
+]
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
+
+[[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 = "pydantic"
+version = "2.10.5"
+description = "Data validation using Python type hints"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"},
+ {file = "pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff"},
+]
+
+[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 = "pytest"
+version = "8.3.4"
+description = "pytest: simple powerful testing with Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"},
+ {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
+iniconfig = "*"
+packaging = "*"
+pluggy = ">=1.5,<2"
+tomli = {version = ">=1", markers = "python_version < \"3.11\""}
+
+[package.extras]
+dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+
+[[package]]
+name = "pytest-asyncio"
+version = "0.25.2"
+description = "Pytest support for asyncio"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"},
+ {file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"},
+]
+
+[package.dependencies]
+pytest = ">=8.2,<9"
+
+[package.extras]
+docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"]
+testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"]
+
+[[package]]
+name = "ruff"
+version = "0.8.6"
+description = "An extremely fast Python linter and code formatter, written in Rust."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "ruff-0.8.6-py3-none-linux_armv6l.whl", hash = "sha256:defed167955d42c68b407e8f2e6f56ba52520e790aba4ca707a9c88619e580e3"},
+ {file = "ruff-0.8.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:54799ca3d67ae5e0b7a7ac234baa657a9c1784b48ec954a094da7c206e0365b1"},
+ {file = "ruff-0.8.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e88b8f6d901477c41559ba540beeb5a671e14cd29ebd5683903572f4b40a9807"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0509e8da430228236a18a677fcdb0c1f102dd26d5520f71f79b094963322ed25"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a7ddb221779871cf226100e677b5ea38c2d54e9e2c8ed847450ebbdf99b32d"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248b1fb3f739d01d528cc50b35ee9c4812aa58cc5935998e776bf8ed5b251e75"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bc3c083c50390cf69e7e1b5a5a7303898966be973664ec0c4a4acea82c1d4315"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52d587092ab8df308635762386f45f4638badb0866355b2b86760f6d3c076188"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61323159cf21bc3897674e5adb27cd9e7700bab6b84de40d7be28c3d46dc67cf"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ae4478b1471fc0c44ed52a6fb787e641a2ac58b1c1f91763bafbc2faddc5117"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0c000a471d519b3e6cfc9c6680025d923b4ca140ce3e4612d1a2ef58e11f11fe"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9257aa841e9e8d9b727423086f0fa9a86b6b420fbf4bf9e1465d1250ce8e4d8d"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45a56f61b24682f6f6709636949ae8cc82ae229d8d773b4c76c09ec83964a95a"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:496dd38a53aa173481a7d8866bcd6451bd934d06976a2505028a50583e001b76"},
+ {file = "ruff-0.8.6-py3-none-win32.whl", hash = "sha256:e169ea1b9eae61c99b257dc83b9ee6c76f89042752cb2d83486a7d6e48e8f764"},
+ {file = "ruff-0.8.6-py3-none-win_amd64.whl", hash = "sha256:f1d70bef3d16fdc897ee290d7d20da3cbe4e26349f62e8a0274e7a3f4ce7a905"},
+ {file = "ruff-0.8.6-py3-none-win_arm64.whl", hash = "sha256:7d7fc2377a04b6e04ffe588caad613d0c460eb2ecba4c0ccbbfe2bc973cbc162"},
+ {file = "ruff-0.8.6.tar.gz", hash = "sha256:dcad24b81b62650b0eb8814f576fc65cfee8674772a6e24c9b747911801eeaa5"},
+]
+
+[[package]]
+name = "tomli"
+version = "2.2.1"
+description = "A lil' TOML parser"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
+ {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
+ {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
+ {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
+ {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
+ {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
+ {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
+ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
+ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
+]
+
+[[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 = "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"
+
+[metadata]
+lock-version = "2.0"
+python-versions = "^3.10"
+content-hash = "f35530aec10b0b374e0ecebd24d3f285b9e4a991c0aea2753dc5b9e73b1ad320"
diff --git a/python/src/plugins/uniswap/pyproject.toml b/python/src/plugins/uniswap/pyproject.toml
new file mode 100644
index 000000000..a91a596f3
--- /dev/null
+++ b/python/src/plugins/uniswap/pyproject.toml
@@ -0,0 +1,46 @@
+[tool.poetry]
+name = "goat-sdk-plugin-uniswap"
+version = "0.1.0"
+description = "Goat plugin for uniswap"
+authors = ["Your Name "]
+readme = "README.md"
+keywords = ["goat", "sdk", "agents", "ai", "uniswap"]
+homepage = "https://ohmygoat.dev/"
+repository = "https://github.com/goat-sdk/goat"
+packages = [
+ { include = "goat_plugins/uniswap" },
+]
+
+[tool.poetry.dependencies]
+python = "^3.10"
+goat-sdk = "^0.1.0"
+goat-sdk-wallet-evm = "^0.1.1"
+goat-sdk-plugin-erc20 = "^0.1.0"
+aiohttp = "^3.0" # For async HTTP requests
+
+[tool.poetry.group.test.dependencies]
+pytest = "^8.3.4"
+pytest-asyncio = "^0.25.0"
+
+[tool.poetry.urls]
+"Bug Tracker" = "https://github.com/goat-sdk/goat/issues"
+
+[tool.pytest.ini_options]
+addopts = [
+ "--import-mode=importlib",
+]
+pythonpath = "src"
+asyncio_default_fixture_loop_scope = "function"
+
+[build-system]
+requires = ["poetry-core"]
+build-backend = "poetry.core.masonry.api"
+
+[tool.poetry.group.dev.dependencies]
+ruff = "^0.8.6"
+goat-sdk = { path = "../../goat-sdk", develop = true }
+goat-sdk-wallet-evm = { path = "../../wallets/evm", develop = true }
+
+[tool.ruff]
+line-length = 120
+target-version = "py312"
diff --git a/python/src/plugins/uniswap/tests/test_uniswap_plugin.py b/python/src/plugins/uniswap/tests/test_uniswap_plugin.py
new file mode 100644
index 000000000..15e49bd7a
--- /dev/null
+++ b/python/src/plugins/uniswap/tests/test_uniswap_plugin.py
@@ -0,0 +1,25 @@
+import os
+from goat.types.chain import EvmChain, SolanaChain
+from goat_plugins.uniswap import uniswap, UniswapPluginOptions
+
+def test_plugin_instantiation():
+ """Test that the plugin can be instantiated without errors."""
+ api_key = os.environ.get("UNISWAP_API_KEY")
+ assert api_key is not None, "UNISWAP_API_KEY environment variable is required"
+
+ options = UniswapPluginOptions(api_key=api_key)
+ plugin = uniswap(options)
+
+ assert plugin is not None
+ assert plugin.name == "uniswap"
+
+ # Test chain support
+ ethereum_chain: EvmChain = {"type": "evm", "id": 1} # Ethereum mainnet
+ polygon_chain: EvmChain = {"type": "evm", "id": 137} # Polygon
+ solana_chain: SolanaChain = {"type": "solana"} # Solana chain
+ unknown_chain: EvmChain = {"type": "evm", "id": 999} # Unknown EVM chain
+
+ assert plugin.supports_chain(ethereum_chain)
+ assert plugin.supports_chain(polygon_chain)
+ assert not plugin.supports_chain(solana_chain)
+ assert not plugin.supports_chain(unknown_chain)
diff --git a/python/src/wallets/evm/goat_wallets/evm/types.py b/python/src/wallets/evm/goat_wallets/evm/types.py
index d639a7864..ac5709236 100644
--- a/python/src/wallets/evm/goat_wallets/evm/types.py
+++ b/python/src/wallets/evm/goat_wallets/evm/types.py
@@ -1,4 +1,7 @@
-from typing import Any, Dict, List, NotRequired, TypedDict
+from typing import Any, Dict, List, TypedDict
+from typing_extensions import NotRequired
+
+from eth_typing import HexStr
class PaymasterOptions(TypedDict):
address: str # hex address
@@ -16,6 +19,7 @@ class EVMTransaction(TypedDict):
value: NotRequired[int] # Using int for bigint
abi: NotRequired[List[Dict[str, Any]]] # ABI type
options: NotRequired[EVMTransactionOptions]
+ data: NotRequired[HexStr]
class EVMReadRequest(TypedDict):
@@ -42,4 +46,3 @@ class EVMTypedData(TypedDict):
types: Dict[str, Any]
primaryType: str
message: Dict[str, Any]
-
diff --git a/python/src/wallets/evm/poetry.lock b/python/src/wallets/evm/poetry.lock
index 6b31b9e93..f29a8c2ce 100644
--- a/python/src/wallets/evm/poetry.lock
+++ b/python/src/wallets/evm/poetry.lock
@@ -11,6 +11,19 @@ files = [
{file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
]
+[[package]]
+name = "asyncio"
+version = "3.4.3"
+description = "reference implementation of PEP 3156"
+optional = false
+python-versions = "*"
+files = [
+ {file = "asyncio-3.4.3-cp33-none-win32.whl", hash = "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de"},
+ {file = "asyncio-3.4.3-cp33-none-win_amd64.whl", hash = "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c"},
+ {file = "asyncio-3.4.3-py3-none-any.whl", hash = "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d"},
+ {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"},
+]
+
[[package]]
name = "colorama"
version = "0.4.6"
@@ -39,18 +52,33 @@ pydantic = ">=2.5.3,<3"
[package.extras]
dev = ["black (>=23.12.1,<23.13.0)", "build (>=1.0.3,<1.1.0)", "mypy (>=1.8.0,<1.9.0)", "pytest (>=7.4.4,<7.5.0)", "requests (>=2.31.0,<2.32.0)", "ruff (>=0.6.8,<0.7.0)", "setuptools-scm (>=8.0.4,<8.1.0)", "types-requests (>=2.31.0.20240106)"]
+[[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 = "goat-sdk"
-version = "0.1.0"
+version = "0.1.2"
description = "Goat π (Great Onchain Agent Toolkit) is an open-source framework for connecting AI agents to any onchain app"
optional = false
-python-versions = "^3.12"
+python-versions = "^3.10"
files = []
develop = true
[package.dependencies]
+asyncio = "^3.4.1"
pydantic = "^2.10.0"
-zon = "^2.0.1"
+typing-extensions = "^4.12.2"
[package.source]
type = "directory"
@@ -238,9 +266,11 @@ files = [
[package.dependencies]
colorama = {version = "*", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
iniconfig = "*"
packaging = "*"
pluggy = ">=1.5,<2"
+tomli = {version = ">=1", markers = "python_version < \"3.11\""}
[package.extras]
dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
@@ -291,60 +321,58 @@ files = [
]
[[package]]
-name = "typing-extensions"
-version = "4.12.2"
-description = "Backported and Experimental Type Hints for Python 3.8+"
+name = "tomli"
+version = "2.2.1"
+description = "A lil' TOML parser"
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"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
+ {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
+ {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
+ {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
+ {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
+ {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
+ {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
+ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
+ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
]
[[package]]
-name = "uuid"
-version = "1.30"
-description = "UUID object and generation functions (Python 2.3 or higher)"
-optional = false
-python-versions = "*"
-files = [
- {file = "uuid-1.30.tar.gz", hash = "sha256:1f87cc004ac5120466f36c5beae48b4c48cc411968eed0eaecd3da82aa96193f"},
-]
-
-[[package]]
-name = "validators"
-version = "0.34.0"
-description = "Python Data Validation for Humansβ’"
+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 = "validators-0.34.0-py3-none-any.whl", hash = "sha256:c804b476e3e6d3786fa07a30073a4ef694e617805eb1946ceee3fe5a9b8b1321"},
- {file = "validators-0.34.0.tar.gz", hash = "sha256:647fe407b45af9a74d245b943b18e6a816acf4926974278f6dd617778e1e781f"},
-]
-
-[package.extras]
-crypto-eth-addresses = ["eth-hash[pycryptodome] (>=0.7.0)"]
-
-[[package]]
-name = "zon"
-version = "2.0.1"
-description = "A Zod-like validation library for Python"
-optional = false
-python-versions = ">=3.11"
-files = [
- {file = "zon-2.0.1-py3-none-any.whl", hash = "sha256:a65be8a581c66e8a42c4df179a456698707da3cf1f262a3a2f7973db113e0ac7"},
- {file = "zon-2.0.1.tar.gz", hash = "sha256:7b24050de71603101b169ca8a99064c1aba8f7bdcf47abf4fa43e4c63b010ea7"},
+ {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.dependencies]
-typing-extensions = ">4.12"
-uuid = "1.30"
-validators = ">0.28"
-
-[package.extras]
-dev = ["black", "build", "pylint", "pylint-pytest", "pytest", "pytest-cov"]
-
[metadata]
lock-version = "2.0"
-python-versions = "^3.12"
-content-hash = "dfe469b01f953a2fae566c5b6e41040fba3c79304b9f939fa6565f1fe6d4fd4c"
+python-versions = "^3.10"
+content-hash = "adddb323f946ea7d85804563145146246145361857476d390e07ed6297ec4536"
diff --git a/python/src/wallets/evm/pyproject.toml b/python/src/wallets/evm/pyproject.toml
index 085bc0c46..6ca6b358d 100644
--- a/python/src/wallets/evm/pyproject.toml
+++ b/python/src/wallets/evm/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "goat-sdk-wallet-evm"
-version = "0.1.0"
+version = "0.1.1"
description = "Goat SDK EVM wallet implementation"
authors = ["Andrea Villa "]
readme = "README.md"
@@ -15,6 +15,7 @@ packages = [
python = "^3.10"
goat-sdk = "^0.1.0"
evmchains = "^0.1.3"
+typing-extensions = "^4.12.2"
[tool.poetry.group.test.dependencies]
pytest = "^8.3.4"
diff --git a/python/src/wallets/solana/goat_wallets/solana/wallet.py b/python/src/wallets/solana/goat_wallets/solana/wallet.py
index d53f6e7ef..a48481fae 100644
--- a/python/src/wallets/solana/goat_wallets/solana/wallet.py
+++ b/python/src/wallets/solana/goat_wallets/solana/wallet.py
@@ -1,13 +1,17 @@
from abc import abstractmethod
-from typing import Dict, Optional, TypedDict, List
+from typing import Dict, Optional, TypedDict, List, Any
+import base64
from solana.rpc.api import Client as SolanaClient
from solana.rpc.types import TxOpts
from solana.rpc.commitment import Confirmed
from solana.transaction import Transaction
from solders.pubkey import Pubkey
from solders.keypair import Keypair
-from solders.instruction import Instruction
+from solders.instruction import Instruction, AccountMeta, CompiledInstruction
+from solders.message import Message, MessageV0
+from solders.address_lookup_table_account import AddressLookupTableAccount
+from solders.transaction import VersionedTransaction
import nacl.signing
from goat.classes.wallet_client_base import Balance, Signature, WalletClientBase
@@ -72,6 +76,151 @@ def send_transaction(self, transaction: SolanaTransaction) -> Dict[str, str]:
"""
pass
+ @abstractmethod
+ def send_raw_transaction(self, transaction: str) -> Dict[str, str]:
+ """Send a raw transaction on the Solana chain.
+
+ Args:
+ transaction: Base64 encoded transaction string
+
+ Returns:
+ Dict containing the transaction hash
+ """
+ pass
+
+
+ def _decompile_instruction(self, compiled_ix: CompiledInstruction, account_keys: list[Pubkey], message: Message) -> Optional[Instruction]:
+ try:
+ # Get program id from the account keys
+ program_id = account_keys[compiled_ix.program_id_index]
+
+ # Transform account indexes into AccountMeta objects
+ accounts = []
+ for idx in compiled_ix.accounts:
+ try:
+ pubkey = account_keys[idx]
+ # You might need to check header/message metadata to determine
+ # if the account is writable/signer
+ is_signer = message.is_signer(idx)
+ # Handle both Message and MessageV0 types
+ if isinstance(message, MessageV0):
+ is_writable = message.is_maybe_writable(idx)
+ else:
+ # For legacy messages, check if it's in the writable accounts range
+ header = message.header
+ num_required_signatures = header.num_required_signatures
+ num_readonly_signed = header.num_readonly_signed_accounts
+ num_readonly_unsigned = header.num_readonly_unsigned_accounts
+
+ if idx < (num_required_signatures - num_readonly_signed):
+ is_writable = True
+ elif idx < num_required_signatures:
+ is_writable = False
+ elif idx < (len(account_keys) - num_readonly_unsigned):
+ is_writable = True
+ else:
+ is_writable = False
+
+ accounts.append(AccountMeta(pubkey, is_signer=is_signer, is_writable=is_writable))
+ except IndexError:
+ print(f"Could not find account at index {idx}")
+ return None
+
+ return Instruction(
+ program_id=program_id,
+ accounts=accounts,
+ data=compiled_ix.data
+ )
+ except IndexError:
+ print(f"Could not find program id at index {compiled_ix.program_id_index}")
+ return None
+
+ def decompile_versioned_transaction_to_instructions(self, versioned_transaction: VersionedTransaction) -> Optional[List[Instruction]]:
+ """Decompile a versioned transaction into its constituent instructions.
+
+ Args:
+ versioned_transaction: The versioned transaction to decompile
+
+ Returns:
+ List of instructions from the transaction if successful, None if we can't
+ properly decompile all instructions
+ """
+ # Convert CompiledInstructions back to Instructions
+ message = versioned_transaction.message
+
+ # For MessageV0, we need to get all accounts including those from lookup tables
+ if isinstance(message, MessageV0) and message.address_table_lookups:
+ # Get lookup table accounts
+ lookup_table_keys = [str(lookup.account_key) for lookup in message.address_table_lookups]
+ lookup_tables = self.get_address_lookup_table_accounts(lookup_table_keys)
+
+ # Filter out None lookup tables and their corresponding lookups
+ valid_lookups = []
+ valid_tables = []
+ for i, table in enumerate(lookup_tables):
+ if table is not None:
+ valid_lookups.append(message.address_table_lookups[i])
+ valid_tables.append(table)
+
+ # Build complete account list
+ account_keys = list(message.account_keys) # Static accounts
+
+ # Add writable accounts from valid lookup tables
+ for lookup, table in zip(valid_lookups, valid_tables):
+ for idx in lookup.writable_indexes:
+ account_keys.append(table.addresses[idx])
+
+ # Add readonly accounts from valid lookup tables
+ for lookup, table in zip(valid_lookups, valid_tables):
+ for idx in lookup.readonly_indexes:
+ account_keys.append(table.addresses[idx])
+ else:
+ account_keys = message.account_keys
+
+ instructions = []
+ for compiled_ix in message.instructions:
+ ix = self._decompile_instruction(compiled_ix, account_keys, message)
+ if ix is not None:
+ instructions.append(ix)
+
+ return instructions
+
+ def get_address_lookup_table_accounts(self, keys: List[str]) -> List[AddressLookupTableAccount]:
+ """Get address lookup table accounts for the given addresses.
+
+ Args:
+ addresses: List of lookup table addresses
+
+ Returns:
+ List of address lookup table accounts
+ """
+ lookup_table_accounts = []
+
+ for key in keys:
+ # Convert address to Pubkey
+ pubkey = Pubkey.from_string(key)
+
+ # Get account info
+ try:
+ account_info = self.client.get_account_info(pubkey).value
+ except Exception as e:
+ print(f"Error getting account info for {key}: {e}")
+ account_info = None
+
+ if account_info is not None:
+ try:
+ # The account data comes as base64, need to decode it first
+ decoded_data = base64.b64decode(account_info.data)
+ lookup_table_account = AddressLookupTableAccount.from_bytes(decoded_data)
+ lookup_table_accounts.append(lookup_table_account)
+ except Exception as e:
+ print(f"Error decoding lookup table for {key}: {e}")
+ lookup_table_accounts.append(None)
+ else:
+ lookup_table_accounts.append(None)
+
+ return lookup_table_accounts
+
class SolanaKeypairWalletClient(SolanaWalletClient):
"""Solana wallet implementation using a keypair."""
@@ -149,6 +298,49 @@ def send_transaction(self, transaction: SolanaTransaction) -> Dict[str, str]:
return {"hash": str(result.value)}
+ def send_raw_transaction(self, transaction: str) -> Dict[str, str]:
+ """Send a raw transaction on the Solana chain.
+
+ Args:
+ transaction: Base64 encoded transaction string
+
+ Returns:
+ Dict containing the transaction hash
+ """
+ # Deserialize the transaction from base64
+ tx = VersionedTransaction.from_bytes(base64.b64decode(transaction))
+
+ # Get latest blockhash
+ recent_blockhash = self.client.get_latest_blockhash().value.blockhash
+
+ # Create new message with updated blockhash
+ new_message = MessageV0(
+ header=tx.message.header,
+ account_keys=tx.message.account_keys,
+ recent_blockhash=recent_blockhash,
+ instructions=tx.message.instructions,
+ address_table_lookups=tx.message.address_table_lookups
+ )
+ tx = VersionedTransaction(new_message, [self.keypair])
+
+ # Send the transaction
+ result = self.client.send_transaction(
+ tx,
+ opts=TxOpts(
+ skip_preflight=False,
+ max_retries=10,
+ preflight_commitment=Confirmed,
+ ),
+ )
+
+ # Wait for confirmation
+ self.client.confirm_transaction(
+ result.value,
+ commitment=Confirmed,
+ )
+
+ return {"hash": str(result.value)}
+
def solana(client: SolanaClient, keypair: Keypair) -> SolanaKeypairWalletClient:
"""Create a new SolanaKeypairWalletClient instance.
diff --git a/python/src/wallets/solana/pyproject.toml b/python/src/wallets/solana/pyproject.toml
index a13c76e13..f9aefcd64 100644
--- a/python/src/wallets/solana/pyproject.toml
+++ b/python/src/wallets/solana/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "goat-sdk-wallet-solana"
-version = "0.1.0"
+version = "0.1.1"
description = "Goat SDK Solana wallet implementation"
authors = ["Andrea Villa "]
readme = "README.md"
diff --git a/python/src/wallets/web3/goat_wallets/web3/wallet.py b/python/src/wallets/web3/goat_wallets/web3/wallet.py
index 9caffba1a..3c728fdbd 100644
--- a/python/src/wallets/web3/goat_wallets/web3/wallet.py
+++ b/python/src/wallets/web3/goat_wallets/web3/wallet.py
@@ -98,15 +98,16 @@ def send_transaction(self, transaction: EVMTransaction) -> Dict[str, str]:
tx_params: TxParams = {
"from": self._web3.eth.default_account,
"to": to_checksum_address(to_address),
+ "chainId": self._web3.eth.chain_id,
"value": Wei(transaction.get("value", 0)),
+ "data": transaction.get("data", HexStr("")),
}
if paymaster_address and paymaster_input:
- tx_params["paymaster"] = to_checksum_address(paymaster_address)
- tx_params["paymasterInput"] = paymaster_input
+ raise NotImplementedError("Paymaster not supported")
tx_hash = self._web3.eth.send_transaction(tx_params)
- return self._wait_for_receipt(HexStr(tx_hash.to_0x_hex()))
+ return self._wait_for_receipt(HexStr(tx_hash.hex()))
# Contract call
function_name = transaction.get("functionName")
@@ -121,20 +122,35 @@ def send_transaction(self, transaction: EVMTransaction) -> Dict[str, str]:
contract_function = getattr(contract.functions, function_name)
args = transaction.get("args", [])
- # Estimate gas and get the transaction parameters
- tx_params = {
+ # First simulate the contract call to catch any potential errors
+ try:
+ contract_function(*args).call({
+ "from": self._web3.eth.default_account,
+ "value": Wei(transaction.get("value", 0)),
+ })
+ except Exception as e:
+ raise ValueError(f"Contract call simulation failed: {str(e)}")
+
+ # Build transaction parameters
+ tx_params: TxParams = {
"from": self._web3.eth.default_account,
+ "chainId": self._web3.eth.chain_id,
"value": Wei(transaction.get("value", 0)),
}
if paymaster_address and paymaster_input:
- tx_params["paymaster"] = to_checksum_address(paymaster_address)
- tx_params["paymasterInput"] = paymaster_input
-
+ raise NotImplementedError("Paymaster not supported")
+
+ # Build and send the transaction
+ tx = contract_function(*args).build_transaction(tx_params)
+
+ # Get the nonce
+ tx["nonce"] = self._web3.eth.get_transaction_count(self._web3.eth.default_account)
+
# Send the transaction
- tx_hash = contract_function(*args).transact(tx_params)
+ tx_hash = self._web3.eth.send_transaction(tx)
- return self._wait_for_receipt(HexStr(tx_hash.to_0x_hex()))
+ return self._wait_for_receipt(HexStr(tx_hash.hex()))
def read(self, request: EVMReadRequest) -> EVMReadResult:
"""Read data from a smart contract."""
diff --git a/typescript/README.md b/typescript/README.md
index 08986536a..c8c067768 100644
--- a/typescript/README.md
+++ b/typescript/README.md
@@ -1,9 +1,479 @@
-# Goat π - TypeScript
-[Docs](https://ohmygoat.dev) | [Examples](https://github.com/goat-sdk/goat/tree/main/typescript/examples) | [Discord](https://discord.gg/goat-sdk)
+
-## Development
+[Website](https://ohmygoat.dev) | [X](https://x.com/goat_sdk) | [Discord](https://discord.gg/goat-sdk)
-1. Clone the repo
-2. Install the dependencies: `pnpm install`
-3. Build the packages: `pnpm build`
+GOAT is free software, MIT licensed, sponsored by [Crossmint](https://www.crossmint.com)
+
+
+
+
+
+
+
+
+
+# GOAT π (Typescript)
+
+
+GOAT (Great Onchain Agent Toolkit) is a library that adds more than +200 onchain tools to your AI agent.
+
+* **[+200 tools](#plugins)**: DeFi (Uniswap, Jupiter, KIM, Orca, etc.), minting (OpenSea, MagicEden, etc.), betting (Polymarket, etc.), analytics (CoinGecko, BirdEye, Allora, etc.) and more
+* **Chains**: EVM (Base, Polygon, Mode, Sei, etc.), Solana, Aptos, Chromia, Fuel, Sui, Starknet and Zilliqa
+* **[Wallets](#wallets)**: keypair, smart wallets (Crossmint, etc.), LIT, MPC (Coinbase, etc.)
+* **[Agent Frameworks](#agent-frameworks-adapters)**: AI SDK, Langchain, Eliza, ZerePy, GAME, ElevenLabs, etc.
+
+
+## Table of Contens
+- [See all plugins](#plugins)
+- [Installation](#installation)
+- [Usage](#usage)
+- [Set up the project locally](#set-up-the-project-locally)
+- [Examples](https://github.com/goat-sdk/goat/tree/main/typescript/examples)
+- [How to create a plugin](#how-to-create-a-plugin)
+ - [Using the plugin generator](#using-the-plugin-generator)
+ - [Manual creation](#manual-creation)
+- [How to add a chain](#how-to-add-a-chain)
+- [How to add a wallet provider](#how-to-add-a-wallet-provider)
+- [Packages](#packages)
+ - [Plugins](#plugins)
+ - [Wallets](#wallets)
+ - [Adapters](#agent-framework-adapters)
+
+## Installation
+1. Install the core package
+```bash
+npm install @goat-sdk/core
+```
+2. Depending on the type of wallet you want to use, install the corresponding wallet (see all wallets [here](#wallets)):
+```bash
+npm install @goat-sdk/wallet-solana
+```
+3. Install the plugins for the protocols you need (see all available plugins [here](#plugins))
+
+```bash
+npm install @goat-sdk/plugin-jupiter @goat-sdk/plugin-spl-token
+```
+4. Install the adapter for the agent framework you want to use (see all available adapters [here](#adapters))
+```bash
+npm install @goat-sdk/adapter-vercel-ai
+```
+
+## Usage
+1. Configure your wallet
+```typescript
+import { Connection, Keypair } from "@solana/web3.js";
+
+const connection = new Connection(process.env.SOLANA_RPC_URL as string);
+const keypair = Keypair.fromSecretKey(base58.decode(process.env.SOLANA_PRIVATE_KEY as string));
+
+
+```
+
+2. Configure your tools for the framework you want to use
+```typescript
+import { getOnChainTools } from "@goat-sdk/adapter-vercel-ai";
+import { solana, sendSOL } from "@goat-sdk/wallet-solana";
+import { jupiter } from "@goat-sdk/plugin-jupiter";
+import { splToken } from "@goat-sdk/plugin-spl-token";
+
+const tools = await getOnChainTools({
+ wallet: solana({
+ keypair,
+ connection,
+ }),
+ plugins: [
+ sendSOL(),
+ jupiter(),
+ splToken(),
+ ],
+ });
+```
+
+3. Plug into your agent framework
+```typescript
+const result = await generateText({
+ model: openai("gpt-4o-mini"),
+ tools: tools,
+ maxSteps: 10,
+ prompt: "Swap 10 USDC for JLP",
+});
+
+console.log(result);
+```
+
+## Set up the project locally
+
+1. Clone the repository
+```bash
+git clone https://github.com/goat-sdk/goat.git
+```
+
+2. Go into the typescript directory
+```bash
+cd goat/typescript
+```
+
+3. Install the dependencies
+```bash
+pnpm install
+```
+
+4. Build the project
+```bash
+pnpm build
+```
+
+Now you can run the examples in the `examples` directory. Follow the README in each example to see how to use the SDK for that specific agent framework.
+
+Every time you make changes to a plugin/wallet/adapter/etc., you will need to run the build command again to use it in the examples.
+
+You can run `pnpm build:libs` to only build the libraries and not the examples.
+
+
+## How to create a plugin
+GOAT plugins enable your agent to interact with various blockchain protocols.
+
+Plugins can be chain-specific (EVM, Solana, etc.) or chain-agnostic. If a plugin is chain-specific it will fail to compile when being used with a wallet of a different chain.
+
+You can see all available plugins [here](#plugins).
+
+### Using the Plugin Generator
+Use the `create-plugin` command to generate all the necessary files and configuration for a new plugin
+
+```bash
+# Create a plugin with default type (any)
+pnpm create-plugin -n your-plugin-name
+
+# Create a plugin for a specific chain type
+pnpm create-plugin -n your-plugin-name -t evm # For EVM chains
+pnpm create-plugin -n your-plugin-name -t solana # For Solana
+```
+The command will generate:
+- A `package.json` with standard metadata and dependencies
+- TypeScript configuration files (`tsconfig.json`, `tsup.config.ts`)
+- A basic plugin structure in the `src` directory:
+ - `parameters.ts` - Example parameters using Zod schema
+ - `your-plugin-name.service.ts` - Service class with an example tool
+ - `your-plugin-name.plugin.ts` - Plugin class extending PluginBase
+ - `index.ts` - Exports for your plugin
+
+
+### Manual Creation
+#### 1. Define your plugin extending the [PluginBase](https://github.com/goat-sdk/goat/tree/main/typescript/packages/core/src/classes/PluginBase.ts) class.
+
+```typescript
+import { PluginBase, WalletClientBase } from "@goat-sdk/core";
+
+// For a chain-agnostic plugin we use the WalletClientBase interface, for a chain-specific plugin we use the EVMWalletClient, SolanaWalletClient, or corresponding interfaces
+export class MyPlugin extends PluginBase {
+ constructor() {
+ // We define the name of the plugin
+ super("myPlugin", []);
+ }
+
+ // We define the chain support for the plugin, in this case we support all chains
+ supportsChain = (chain: Chain) => true;
+}
+
+// We export a factory function to create a new instance of the plugin
+export const myPlugin = () => new MyPlugin();
+```
+
+#### 2. Add tools to the plugin
+
+There are two ways to add tools to the plugin:
+1. Using the `@Tool` decorator on our own class
+2. Using the `getTools` and `createTool` functions to create tools dynamically
+
+##### Option 1: Using the `@Tool` decorator
+The `@Tool` decorator is a way to create tools in a more declarative way.
+
+You can create a class and decorate its methods with the `@Tool` decorator to create tools.
+
+The tool methods will receive the wallet client as the first argument and the parameters as the second argument.
+
+```typescript
+import { Tool } from "@goat-sdk/core";
+import { createToolParameters } from "@goat-sdk/core";
+import { z } from "zod";
+
+export class SignMessageParameters extends createToolParameters(
+ z.object({
+ message: z.string(),
+ }),
+) {}
+
+class MyTools {
+ @Tool({
+ name: "sign_message",
+ description: "Sign a message",
+ })
+ async signMessage(walletClient: WalletClientBase, parameters: SignMessageParameters) {
+ const signed = await walletClient.signMessage(parameters.message);
+ return signed.signedMessage;
+ }
+}
+```
+
+Once we have our class we now need to import it in our plugin class.
+
+```typescript
+export class MyPlugin extends PluginBase {
+ constructor() {
+ // We define the name of the plugin
+ super("myPlugin", [new MyTools()]);
+ }
+
+ // We define the chain support for the plugin, in this case we support all chains
+ supportsChain = (chain: Chain) => true;
+}
+
+// We export a factory function to create a new instance of the plugin
+export const myPlugin = () => new MyPlugin();
+```
+
+##### Option 2: Using the `getTools` and `createTool` functions
+We will implement the `getTools` method in our plugin class.
+
+Inside the method, we will return an array of tools created using the `createTool` function.
+
+```typescript
+import { PluginBase, WalletClientBase, createTool } from "@goat-sdk/core";
+
+// Since we are creating a chain-agnostic plugin, we can use the WalletClientBase interface
+export class MyPlugin extends PluginBase {
+ constructor() {
+ // We define the name of the plugin
+ super("myPlugin", []);
+ }
+
+ // We define the chain support for the plugin, in this case we support all chains
+ supportsChain = (chain: Chain) => true;
+
+ getTools(walletClient: WalletClientBase) {
+ return [
+ // Create tool requires two arguments:
+ // 1. The tool metadata (name, description, parameters)
+ // 2. The tool method (the function that will be executed when the tool is used)
+ createTool(
+ {
+ name: "sign_message",
+ description: "Sign a message",
+ parameters: z.object({
+ message: z.string(),
+ }),
+ },
+ async (parameters) => {
+ const signed = await walletClient.signMessage(parameters.message);
+ return signed.signedMessage;
+ },
+ ),
+ ];
+ }
+}
+
+// We export a factory function to create a new instance of the plugin
+export const myPlugin = () => new MyPlugin();
+```
+
+#### 3. Add the plugin to the agent
+
+```typescript
+import { getOnChainTools } from '@goat-sdk/adapter-vercel-ai';
+import { myPlugin } from './your-plugin-path/signMessagePlugin'; // Path to your plugin
+
+const wallet = /* Initialize your wallet client */;
+
+const tools = getOnChainTools({
+ wallet: viem(wallet), // or smartwallet(wallet), solana(wallet), etc.
+ plugins: [
+ myPlugin(),
+ // ...other plugins
+ ],
+});
+
+// Prompt: Sign the message "Sign the message 'Go out and eat grass π'"
+```
+
+#### Next steps
+- Share your plugin with others!
+- Open a PR to add it to the [plugins registry](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins) in the [GOAT SDK](https://github.com/goat-sdk/goat).
+
+
+
+## How to add a chain
+
+### 1. Add the chain to the `Chain.ts` file
+Add your chain to the `Chain.ts` file in the [core package](https://github.com/goat-sdk/goat/tree/main/typescript/packages/core/src/types/Chain.ts).
+
+```typescript
+/**
+ * @param type - "evm" or "solana", extend this union as needed (e.g., "sui")
+ * @param id - Chain ID, optional for EVM
+ */
+export type Chain = EvmChain | SolanaChain | AptosChain | ChromiaChain | FuelChain | MyAwesomeChain;
+
+export type MyAwesomeChain = {
+ type: "my-awesome-chain";
+};
+```
+
+### 2. Create a new wallet provider package
+Create a new package in the [wallets directory](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets) with the name of your chain (e.g. `my-awesome-chain`) or copy an existing one (e.g. `evm`).
+In this package you will define the abstract class for your chain's wallet client which will extend the `WalletClientBase` class defined in the [core package](https://github.com/goat-sdk/goat/tree/main/typescript/packages/core/src/classes/WalletClientBase.ts).
+
+WalletClientBase only includes the methods that are supported by all chains such as:
+1. `getAddress`
+2. `getChain`
+3. `signMessage`
+4. `balanceOf`
+
+As well as includes the `getCoreTools` method which returns the core tools for the chain.
+
+```typescript
+export abstract class MyAwesomeChainWalletClient extends WalletClientBase {
+ // Add your chain's methods here
+ abstract getChain(): MyAwesomeChain;
+ sendTransaction: (transaction: AwesomeChainTransaction) => Promise;
+ read: (query: AwesomeChainQuery) => Promise;
+}
+```
+
+### 3. Create a plugin to allow sending your native token to a wallet
+Create a plugin to allow sending your native token to a wallet. Create a file in the same package as your wallet client and create a new file like `send.plugin.ts`.
+
+Implement the core plugin.
+
+
+```typescript
+export class SendAWESOMETOKENPlugin extends PluginBase {
+ constructor() {
+ super("sendAWESOMETOKEN", []);
+ }
+
+ supportsChain = (chain: Chain) => chain.type === "my-awesome-chain";
+
+ getTools(walletClient: MyAwesomeChainWalletClient) {
+ const sendTool = createTool(
+ {
+ name: `send_myawesometoken`,
+ description: `Send MYAWESOMETOKEN to an address.`,
+ parameters: sendAWESOMETOKENParametersSchema, // Define the parameters schema
+ },
+ // Implement the method
+ (parameters: z.infer) => sendAWESOMETOKENMethod(walletClient, parameters),
+ );
+ return [sendTool];
+ }
+}
+```
+
+### 4. Implement the wallet client
+Extend your abstract class with the methods you need to implement and create your first wallet client! (e.g `MyAwesomeChainKeyPairWalletClient`)
+
+```typescript
+export class MyAwesomeChainKeyPairWalletClient extends MyAwesomeChainWalletClient {
+ // Implement the methods here
+}
+
+// Export the wallet client with a factory function
+export const myAwesomeChain = () => new MyAwesomeChainKeyPairWalletClient();
+```
+
+### 5. Submit a PR
+Submit a PR to add your wallet provider to the [wallets directory](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets).
+
+## How to add a wallet provider
+If you don't see your wallet provider supported, you can easily integrate it by implementing the specific [WalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/core.ts) interface for the chain and type of wallet you want to support:
+
+1. [EVMWalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/evm.ts) for all EVM chains
+2. [EVMSmartWalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/evm-smart-wallet.ts) for EVM smart wallets
+2. [SolanaWalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/solana.ts) for Solana
+
+Checkout [here how the viem client implementation](https://github.com/goat-sdk/goat/blob/main/typescript/packages/wallets/viem/src/index.ts).
+
+If you would like to see your wallet provider supported, please open an issue or submit a PR.
+
+## Packages
+### Core
+| | NPM package |
+| --- | --- |
+| Core | [@goat-sdk/core](https://www.npmjs.com/package/@goat-sdk/core) |
+
+### Wallets
+| Wallet | NPM package |
+| --- | --- |
+|EVM | [@goat-sdk/wallet-evm](https://www.npmjs.com/package/@goat-sdk/wallet-evm) |
+|Viem | [@goat-sdk/wallet-evm-viem](https://www.npmjs.com/package/@goat-sdk/wallet-evm-viem) | [goat-sdk-wallet-evm](https://pypi.org/project/goat-sdk-wallet-evm/) |
+| Solana | [@goat-sdk/wallet-solana](https://www.npmjs.com/package/@goat-sdk/wallet-solana) | [@goat-sdk-wallet-solana](https://pypi.org/project/goat-sdk-wallet-solana/) |
+| Crossmint (smart and custodial wallets) | [@goat-sdk/wallet-crossmint](https://www.npmjs.com/package/@goat-sdk/wallet-crossmint) | [@goat-sdk-wallet-crossmint](https://pypi.org/project/goat-sdk-wallet-crossmint/) |
+| Aptos | [@goat-sdk/wallet-aptos](https://www.npmjs.com/package/@goat-sdk/wallet-aptos) |
+| Chromia | [@goat-sdk/wallet-chromia](https://www.npmjs.com/package/@goat-sdk/wallet-chromia) |
+| Cosmos | [@goat-sdk/wallet-cosmos](https://www.npmjs.com/package/@goat-sdk/wallet-cosmos) |
+| Fuel | [@goat-sdk/wallet-fuel](https://www.npmjs.com/package/@goat-sdk/wallet-fuel) |
+| Sui | [@goat-sdk/wallet-sui](https://www.npmjs.com/package/@goat-sdk/wallet-sui) |
+| Starknet | [@goat-sdk/wallet-starknet](https://www.npmjs.com/package/@goat-sdk/wallet-starknet) |
+| Zilliqa | [@goat-sdk/wallet-zilliqa](https://www.npmjs.com/package/@goat-sdk/wallet-zilliqa) |
+
+### Agent Framework Adapters
+| Adapter | NPM package |
+| --- | --- |
+| AI SDK | [@goat-sdk/adapter-vercel-ai](https://www.npmjs.com/package/@goat-sdk/adapter-vercel-ai) |
+| Langchain | [@goat-sdk/adapter-langchain](https://www.npmjs.com/package/@goat-sdk/adapter-langchain) |
+| ElevenLabs | [@goat-sdk/adapter-elevenlabs](https://www.npmjs.com/package/@goat-sdk/adapter-elevenlabs) | |
+| LlamaIndex | [@goat-sdk/adapter-llamaindex](https://www.npmjs.com/package/@goat-sdk/adapter-llamaindex) | |
+| Model Context Protocol | [@goat-sdk/adapter-model-context-protocol](https://www.npmjs.com/package/@goat-sdk/adapter-model-context-protocol) | |
+
+**Eliza, ZerePy and GAME have direct integrations on their respective repos.*
+
+### Plugins
+| Plugin | Tools | NPM package |
+| --- | --- | --- |
+| 0x | Get quotes and swap on 0x | [@goat-sdk/plugin-0x](https://www.npmjs.com/package/@goat-sdk/plugin-0x) |
+| 1inch | Get the balances of a wallet using 1inch API | [@goat-sdk/plugin-1inch](https://www.npmjs.com/package/@goat-sdk/plugin-1inch) |
+| Allora | Get price predictions using Allora API | [@goat-sdk/plugin-allora](https://www.npmjs.com/package/@goat-sdk/plugin-allora) |
+| Avnu | Swap tokens on Starknet | [@goat-sdk/plugin-avnu](https://www.npmjs.com/package/@goat-sdk/plugin-avnu) |
+| Balancer | Swap tokens and provide liquidity on Balancer | [@goat-sdk/plugin-balancer](https://www.npmjs.com/package/@goat-sdk/plugin-balancer) |
+| Balmy | Swap tokens on Balmy | [@goat-sdk/plugin-balmy](https://www.npmjs.com/package/@goat-sdk/plugin-balmy) |
+| BirdEye | Get token insights using BirdEye API | [@goat-sdk/plugin-birdeye](https://www.npmjs.com/package/@goat-sdk/plugin-birdeye) |
+| CoinGecko | Get coin information using CoinGecko API | [@goat-sdk/plugin-coingecko](https://www.npmjs.com/package/@goat-sdk/plugin-coingecko) |
+| Coinmarketcap | Get coin information using Coinmarketcap API | [@goat-sdk/plugin-coinmarketcap](https://www.npmjs.com/package/@goat-sdk/plugin-coinmarketcap) |
+| Cosmosbank | Interact with Cosmos tokens | [@goat-sdk/plugin-cosmosbank](https://www.npmjs.com/package/@goat-sdk/plugin-cosmosbank) |
+| Crossmint Headless Checkout | Purchase any NFT on any chain using Crossmint | [@goat-sdk/plugin-crossmint-headless-checkout](https://www.npmjs.com/package/@goat-sdk/plugin-crossmint-headless-checkout) |
+| Crossmint Mint, Faucet, Wallets | Create a wallet, mint tokens and get test tokens on any chain using Crossmint | [@goat-sdk/plugin-crossmint-mint-faucet-wallets](https://www.npmjs.com/package/@goat-sdk/plugin-crossmint-mint-faucet-wallets) |
+| DeBridge | Bridge tokens on DeBridge | [@goat-sdk/plugin-debridge](https://www.npmjs.com/package/@goat-sdk/plugin-debridge) |
+| Dexscreener | Get token information using Dexscreener API | [@goat-sdk/plugin-dexscreener](https://www.npmjs.com/package/@goat-sdk/plugin-dexscreener) |
+| ERC20 | Interact with any ERC20 token | [@goat-sdk/plugin-erc20](https://www.npmjs.com/package/@goat-sdk/plugin-erc20) |
+| ERC721 | Interact with any ERC721 token | [@goat-sdk/plugin-erc721](https://www.npmjs.com/package/@goat-sdk/plugin-erc721) |
+| Etherscan | Get transaction information using Etherscan API | [@goat-sdk/plugin-etherscan](https://www.npmjs.com/package/@goat-sdk/plugin-etherscan) |
+| Farcaster | Read and post casts on Farcaster | [@goat-sdk/plugin-farcaster](https://www.npmjs.com/package/@goat-sdk/plugin-farcaster) |
+| Ionic | Borrow and lend on Ionic | [@goat-sdk/plugin-ionic](https://www.npmjs.com/package/@goat-sdk/plugin-ionic) |
+| Ironclad | Create positions on Ironclad | [@goat-sdk/plugin-ironclad](https://www.npmjs.com/package/@goat-sdk/plugin-ironclad) |
+| JSON RPC | Call any JSON RPC endpoint |[@goat-sdk/plugin-json-rpc](https://www.npmjs.com/package/@goat-sdk/plugin-json-rpc) | |
+| Jupiter | Swap tokens on Jupiter | [@goat-sdk/plugin-jupiter](https://www.npmjs.com/package/@goat-sdk/plugin-jupiter) |
+| KIM | Swap tokens on KIM | [@goat-sdk/plugin-kim](https://www.npmjs.com/package/@goat-sdk/plugin-kim) |
+| Lulo | Deposit USDC on Lulo | [@goat-sdk/plugin-lulo](https://www.npmjs.com/package/@goat-sdk/plugin-lulo) |
+| Meteora | Create liquidity pools on Meteora | [@goat-sdk/plugin-meteora](https://www.npmjs.com/package/@goat-sdk/plugin-meteora) |
+| Mode Governance | Create a governance proposal on Mode | [@goat-sdk/plugin-mode-governance](https://www.npmjs.com/package/@goat-sdk/plugin-mode-governance) |
+| Mode Voting | Vote on a governance proposal on Mode | [@goat-sdk/plugin-mode-voting](https://www.npmjs.com/package/@goat-sdk/plugin-mode-voting) |
+| Mode Spray | Spray tokens on Mode | [@goat-sdk/plugin-mode-spray](https://www.npmjs.com/package/@goat-sdk/plugin-mode-spray) |
+| Nansen | Get Nansen information using Nansen API | [@goat-sdk/plugin-nansen](https://www.npmjs.com/package/@goat-sdk/plugin-nansen) |
+| OpenSea | Get nft and sales information using OpenSea API | [@goat-sdk/plugin-opensea](https://www.npmjs.com/package/@goat-sdk/plugin-opensea) |
+| Orca | Create positions on Orca | [@goat-sdk/plugin-orca](https://www.npmjs.com/package/@goat-sdk/plugin-orca) |
+| Polymarket | Bet on Polymarket | [@goat-sdk/plugin-polymarket](https://www.npmjs.com/package/@goat-sdk/plugin-polymarket) |
+| Pump.fun | Launch a token on Pump.fun | [@goat-sdk/plugin-pump-fun](https://www.npmjs.com/package/@goat-sdk/plugin-pump-fun) |
+| Renzo | Create a position on Renzo | [@goat-sdk/plugin-renzo](https://www.npmjs.com/package/@goat-sdk/plugin-renzo) |
+| Rugcheck | Check SPL token validity on Rugcheck | [@goat-sdk/plugin-rugcheck](https://www.npmjs.com/package/@goat-sdk/plugin-rugcheck) |
+| SNS | Interact with SNS | [@goat-sdk/plugin-sns](https://www.npmjs.com/package/@goat-sdk/plugin-sns) |
+| Solana Magic Eden | Purchase NFTs on Magic Eden | [@goat-sdk/plugin-solana-magiceden](https://www.npmjs.com/package/@goat-sdk/plugin-solana-magiceden) |
+| Solana NFTs | Get NFT information using Solana NFTs API | [@goat-sdk/plugin-solana-nfts](https://www.npmjs.com/package/@goat-sdk/plugin-solana-nfts) | |
+| SPL Tokens | Interact with SPL tokens | [@goat-sdk/plugin-spl-tokens](https://www.npmjs.com/package/@goat-sdk/plugin-spl-tokens) | |
+| Starknet Token | Interact with Starknet tokens | [@goat-sdk/plugin-starknet-token](https://www.npmjs.com/package/@goat-sdk/plugin-starknet-token) | |
+| Superfluid | Create streams with Superfluid | [@goat-sdk/plugin-superfluid](https://www.npmjs.com/package/@goat-sdk/plugin-superfluid) | |
+| Tensor | Purchase tokens on Tensor | [@goat-sdk/plugin-tensor](https://www.npmjs.com/package/@goat-sdk/plugin-tensor) | |
+| Uniswap | Swap tokens on Uniswap | [@goat-sdk/plugin-uniswap](https://www.npmjs.com/package/@goat-sdk/plugin-uniswap) | |
+| Velodrome | Create a position on Velodrome | [@goat-sdk/plugin-velodrome](https://www.npmjs.com/package/@goat-sdk/plugin-velodrome) | |
+| Worldstore | Purchase physical assets on Worldstore | [@goat-sdk/plugin-worldstore](https://www.npmjs.com/package/@goat-sdk/plugin-worldstore) | |
+| ZeroDev Global Address | Create a global address on ZeroDev | [@goat-sdk/plugin-zero-dev-global-address](https://www.npmjs.com/package/@goat-sdk/plugin-zero-dev-global-address) | |
+| Zilliqa | Interact with Zilliqa | [@goat-sdk/plugin-zilliqa](https://www.npmjs.com/package/@goat-sdk/plugin-zilliqa) | |
diff --git a/typescript/examples/eleven-labs/conversational-agent/CHANGELOG.md b/typescript/examples/eleven-labs/conversational-agent/CHANGELOG.md
index bbe2ed0f5..b8ff3984e 100644
--- a/typescript/examples/eleven-labs/conversational-agent/CHANGELOG.md
+++ b/typescript/examples/eleven-labs/conversational-agent/CHANGELOG.md
@@ -1,5 +1,21 @@
# conversational-agent
+## 0.2.15
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/wallet-viem@0.2.7
+
+## 0.2.14
+
+### Patch Changes
+
+- 1f361d5: Support raw txs
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.2.13
### Patch Changes
diff --git a/typescript/examples/eleven-labs/conversational-agent/package.json b/typescript/examples/eleven-labs/conversational-agent/package.json
index 4eab6c447..afb2bb9ac 100644
--- a/typescript/examples/eleven-labs/conversational-agent/package.json
+++ b/typescript/examples/eleven-labs/conversational-agent/package.json
@@ -1,6 +1,6 @@
{
"name": "conversational-agent",
- "version": "0.2.13",
+ "version": "0.2.15",
"private": true,
"scripts": {
"dev": "next dev",
@@ -22,7 +22,7 @@
"@goat-sdk/wallet-solana": "workspace:*",
"@goat-sdk/wallet-viem": "workspace:*",
"@tanstack/react-query": "^5.62.2",
- "next": "15.0.3",
+ "next": "15.1.2",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"viem": "catalog:",
diff --git a/typescript/examples/eleven-labs/conversational-agent/src/app/utils/index.ts b/typescript/examples/eleven-labs/conversational-agent/src/app/utils/index.ts
index 84ca6fa23..5bbc01a15 100644
--- a/typescript/examples/eleven-labs/conversational-agent/src/app/utils/index.ts
+++ b/typescript/examples/eleven-labs/conversational-agent/src/app/utils/index.ts
@@ -59,6 +59,10 @@ export function createSolanaWalletFromDynamic(connection: Connection, signer: IS
};
}
+ async sendRawTransaction(transaction: string): Promise<{ hash: string }> {
+ throw new Error("Not implemented");
+ }
+
async balanceOf(address: string) {
const pubkey = new PublicKey(address);
const balance = await connection.getBalance(pubkey);
diff --git a/typescript/examples/langchain/cosmos/CHANGELOG.md b/typescript/examples/langchain/cosmos/CHANGELOG.md
index ef9044a64..ecec80bbf 100644
--- a/typescript/examples/langchain/cosmos/CHANGELOG.md
+++ b/typescript/examples/langchain/cosmos/CHANGELOG.md
@@ -1,5 +1,14 @@
# goat-examples-langchain-cosmos
+## 0.0.3
+
+### Patch Changes
+
+- db65128: Minor fixes
+- Updated dependencies [db65128]
+ - @goat-sdk/wallet-cosmos@0.0.3
+ - @goat-sdk/plugin-cosmosbank@0.0.3
+
## 0.0.2
### Patch Changes
diff --git a/typescript/examples/langchain/cosmos/index.ts b/typescript/examples/langchain/cosmos/index.ts
index c943ebf58..9130765f6 100644
--- a/typescript/examples/langchain/cosmos/index.ts
+++ b/typescript/examples/langchain/cosmos/index.ts
@@ -3,8 +3,8 @@ import type { ChatPromptTemplate } from "@langchain/core/prompts";
import { AgentExecutor, createStructuredChatAgent } from "langchain/agents";
import { pull } from "langchain/hub";
+import { SigningCosmWasmClient } from "@cosmjs/cosmwasm-stargate";
import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing";
-import { SigningStargateClient } from "@cosmjs/stargate";
import { getOnChainTools } from "@goat-sdk/adapter-langchain";
import { cosmosbank } from "@goat-sdk/plugin-cosmosbank";
@@ -21,7 +21,7 @@ require("dotenv").config();
const [Account] = await wallet.getAccounts();
const rpcEndpoint = process.env.RPC_PROVIDER_URL as `0x${string}`;
- const client = await SigningStargateClient.connectWithSigner(rpcEndpoint, wallet);
+ const client = await SigningCosmWasmClient.connectWithSigner(rpcEndpoint, wallet);
const walletClient: CosmosWalletOptions = {
client: client,
diff --git a/typescript/examples/langchain/cosmos/package.json b/typescript/examples/langchain/cosmos/package.json
index 4ca844625..81a4d2512 100644
--- a/typescript/examples/langchain/cosmos/package.json
+++ b/typescript/examples/langchain/cosmos/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-langchain-cosmos",
- "version": "0.0.2",
+ "version": "0.0.3",
"description": "",
"private": true,
"scripts": {
@@ -13,7 +13,7 @@
"@goat-sdk/plugin-cosmosbank": "workspace:*",
"@goat-sdk/wallet-cosmos": "workspace:*",
"@goat-sdk/core": "workspace:*",
- "@cosmjs/stargate": "^0.32.4",
+ "@cosmjs/cosmwasm-stargate": "^0.33.0",
"@langchain/core": "catalog:",
"@langchain/cohere": "^0.3.2",
"@cosmjs/proto-signing": "^0.32.4",
diff --git a/typescript/examples/langchain/lit/CHANGELOG.md b/typescript/examples/langchain/lit/CHANGELOG.md
index 70a8dc836..947bfe608 100644
--- a/typescript/examples/langchain/lit/CHANGELOG.md
+++ b/typescript/examples/langchain/lit/CHANGELOG.md
@@ -1,5 +1,22 @@
# goat-examples-langchain-lit
+## 0.1.18
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/plugin-erc20@0.2.9
+ - @goat-sdk/wallet-lit@0.2.14
+
+## 0.1.17
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-lit@0.2.13
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.1.16
### Patch Changes
diff --git a/typescript/examples/langchain/lit/package.json b/typescript/examples/langchain/lit/package.json
index ca8c3a4a1..fca03709d 100644
--- a/typescript/examples/langchain/lit/package.json
+++ b/typescript/examples/langchain/lit/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-langchain-lit",
- "version": "0.1.16",
+ "version": "0.1.18",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/langchain/viem/CHANGELOG.md b/typescript/examples/langchain/viem/CHANGELOG.md
index b05d4bbfb..79fdc1f24 100644
--- a/typescript/examples/langchain/viem/CHANGELOG.md
+++ b/typescript/examples/langchain/viem/CHANGELOG.md
@@ -1,5 +1,14 @@
# goat-examples-langchain-viem
+## 0.2.12
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/plugin-erc20@0.2.9
+ - @goat-sdk/wallet-viem@0.2.7
+
## 0.2.11
### Patch Changes
diff --git a/typescript/examples/langchain/viem/package.json b/typescript/examples/langchain/viem/package.json
index 8028ee9f9..a92d06a3f 100644
--- a/typescript/examples/langchain/viem/package.json
+++ b/typescript/examples/langchain/viem/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-langchain-viem",
- "version": "0.2.11",
+ "version": "0.2.12",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/model-context-protocol/mode/CHANGELOG.md b/typescript/examples/model-context-protocol/mode/CHANGELOG.md
index d73e4ed0e..b4cdd30ef 100644
--- a/typescript/examples/model-context-protocol/mode/CHANGELOG.md
+++ b/typescript/examples/model-context-protocol/mode/CHANGELOG.md
@@ -1,5 +1,15 @@
# goat-examples-model-context-protocol-viem
+## 0.2.11
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/plugin-erc20@0.2.9
+ - @goat-sdk/plugin-kim@0.1.9
+ - @goat-sdk/wallet-viem@0.2.7
+
## 0.2.10
### Patch Changes
diff --git a/typescript/examples/model-context-protocol/mode/package.json b/typescript/examples/model-context-protocol/mode/package.json
index 6da9646f5..469be6bab 100644
--- a/typescript/examples/model-context-protocol/mode/package.json
+++ b/typescript/examples/model-context-protocol/mode/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-model-context-protocol-viem",
- "version": "0.2.10",
+ "version": "0.2.11",
"type": "module",
"description": "",
"private": true,
diff --git a/typescript/examples/vercel-ai/abstract/CHANGELOG.md b/typescript/examples/vercel-ai/abstract/CHANGELOG.md
index ac48e8ad0..1a5518db2 100644
--- a/typescript/examples/vercel-ai/abstract/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/abstract/CHANGELOG.md
@@ -1,5 +1,14 @@
# goat-examples-vercel-ai-abstract
+## 0.2.10
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/plugin-erc20@0.2.9
+ - @goat-sdk/wallet-viem@0.2.7
+
## 0.2.9
### Patch Changes
diff --git a/typescript/examples/vercel-ai/abstract/package.json b/typescript/examples/vercel-ai/abstract/package.json
index 11833986a..782818413 100644
--- a/typescript/examples/vercel-ai/abstract/package.json
+++ b/typescript/examples/vercel-ai/abstract/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-abstract",
- "version": "0.2.9",
+ "version": "0.2.10",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/vercel-ai/allora/CHANGELOG.md b/typescript/examples/vercel-ai/allora/CHANGELOG.md
index 45385374e..0a0e14397 100644
--- a/typescript/examples/vercel-ai/allora/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/allora/CHANGELOG.md
@@ -1,5 +1,11 @@
# goat-examples-vercel-ai-allora
+## 0.1.7
+
+### Patch Changes
+
+- @goat-sdk/wallet-viem@0.2.7
+
## 0.1.6
### Patch Changes
diff --git a/typescript/examples/vercel-ai/allora/package.json b/typescript/examples/vercel-ai/allora/package.json
index 53d08884b..f272006b8 100644
--- a/typescript/examples/vercel-ai/allora/package.json
+++ b/typescript/examples/vercel-ai/allora/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-allora",
- "version": "0.1.6",
+ "version": "0.1.7",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/vercel-ai/crossmint-smart-wallets/CHANGELOG.md b/typescript/examples/vercel-ai/crossmint-smart-wallets/CHANGELOG.md
index 2e582924d..7f350587e 100644
--- a/typescript/examples/vercel-ai/crossmint-smart-wallets/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/crossmint-smart-wallets/CHANGELOG.md
@@ -1,5 +1,21 @@
# goat-examples-vercel-ai-crossmint-smart-wallets
+## 0.2.17
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/plugin-erc20@0.2.9
+ - @goat-sdk/crossmint@0.3.15
+
+## 0.2.16
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/crossmint@0.3.14
+
## 0.2.15
### Patch Changes
diff --git a/typescript/examples/vercel-ai/crossmint-smart-wallets/package.json b/typescript/examples/vercel-ai/crossmint-smart-wallets/package.json
index 4c85036a3..8ddba5e61 100644
--- a/typescript/examples/vercel-ai/crossmint-smart-wallets/package.json
+++ b/typescript/examples/vercel-ai/crossmint-smart-wallets/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-crossmint-smart-wallets",
- "version": "0.2.15",
+ "version": "0.2.17",
"private": true,
"description": "",
"scripts": {
diff --git a/typescript/examples/vercel-ai/crossmint-solana-custodial-wallets/CHANGELOG.md b/typescript/examples/vercel-ai/crossmint-solana-custodial-wallets/CHANGELOG.md
index c5012819f..2f53a5f85 100644
--- a/typescript/examples/vercel-ai/crossmint-solana-custodial-wallets/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/crossmint-solana-custodial-wallets/CHANGELOG.md
@@ -1,5 +1,20 @@
# goat-examples-vercel-ai-crossmint-solana-custodial-wallets
+## 0.2.16
+
+### Patch Changes
+
+- @goat-sdk/crossmint@0.3.15
+
+## 0.2.15
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/crossmint@0.3.14
+ - @goat-sdk/wallet-solana@0.2.12
+ - @goat-sdk/plugin-solana-nfts@0.2.12
+
## 0.2.14
### Patch Changes
diff --git a/typescript/examples/vercel-ai/crossmint-solana-custodial-wallets/package.json b/typescript/examples/vercel-ai/crossmint-solana-custodial-wallets/package.json
index ae78f79bc..04773ea6f 100644
--- a/typescript/examples/vercel-ai/crossmint-solana-custodial-wallets/package.json
+++ b/typescript/examples/vercel-ai/crossmint-solana-custodial-wallets/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-crossmint-solana-custodial-wallets",
- "version": "0.2.14",
+ "version": "0.2.16",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/vercel-ai/debridge-bridging/.env.template b/typescript/examples/vercel-ai/debridge-bridging/.env.template
new file mode 100644
index 000000000..45121904d
--- /dev/null
+++ b/typescript/examples/vercel-ai/debridge-bridging/.env.template
@@ -0,0 +1,3 @@
+OPENAI_API_KEY=
+WALLET_PRIVATE_KEY=
+RPC_PROVIDER_URL=https://eth.llamarpc.com
diff --git a/typescript/examples/vercel-ai/debridge-bridging/.gitignore b/typescript/examples/vercel-ai/debridge-bridging/.gitignore
new file mode 100644
index 000000000..36b023e0f
--- /dev/null
+++ b/typescript/examples/vercel-ai/debridge-bridging/.gitignore
@@ -0,0 +1,26 @@
+# Dependencies
+node_modules/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# Environment variables
+.env
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# Build outputs
+dist/
+build/
+.next/
+out/
+
+# IDE and editor files
+.idea/
+.vscode/
+*.swp
+*.swo
+.DS_Store
diff --git a/typescript/examples/vercel-ai/debridge-bridging/CHANGELOG.md b/typescript/examples/vercel-ai/debridge-bridging/CHANGELOG.md
new file mode 100644
index 000000000..944e4044d
--- /dev/null
+++ b/typescript/examples/vercel-ai/debridge-bridging/CHANGELOG.md
@@ -0,0 +1,16 @@
+# goat-examples-vercel-ai-debridge-bridging
+
+## 0.0.3
+
+### Patch Changes
+
+- @goat-sdk/plugin-debridge@0.0.2
+- @goat-sdk/wallet-viem@0.2.7
+
+## 0.0.2
+
+### Patch Changes
+
+- 61239bf: Release plugin
+- Updated dependencies [61239bf]
+ - @goat-sdk/plugin-debridge@0.0.1
diff --git a/typescript/examples/vercel-ai/debridge-bridging/README.md b/typescript/examples/vercel-ai/debridge-bridging/README.md
new file mode 100644
index 000000000..01ae0de1b
--- /dev/null
+++ b/typescript/examples/vercel-ai/debridge-bridging/README.md
@@ -0,0 +1,29 @@
+# Vercel AI with DeBridge Example
+
+## Setup
+
+Copy the `.env.template` and populate with your values:
+- `OPENAI_API_KEY`: Your OpenAI API key
+- `WALLET_PRIVATE_KEY`: Your wallet's private key
+- `RPC_PROVIDER_URL`: Ethereum RPC URL
+
+```
+cp .env.template .env
+```
+
+## Usage
+
+```
+npx ts-node index.ts
+```
+
+## Examples
+
+Try these prompts:
+```
+I want to bridge ETH to DBR token on Solana
+Find DBR token on Solana and show me its details
+What's the current quote for bridging 0.1 ETH to Solana?
+```
+
+Note: For cross-chain transfers to Solana, you'll need a Solana wallet address to receive tokens.
diff --git a/typescript/examples/vercel-ai/debridge-bridging/index.ts b/typescript/examples/vercel-ai/debridge-bridging/index.ts
new file mode 100644
index 000000000..cdae82466
--- /dev/null
+++ b/typescript/examples/vercel-ai/debridge-bridging/index.ts
@@ -0,0 +1,118 @@
+import { randomUUID } from "node:crypto";
+import readline from "node:readline";
+import { openai } from "@ai-sdk/openai";
+import { getOnChainTools } from "@goat-sdk/adapter-vercel-ai";
+import { debridge } from "@goat-sdk/plugin-debridge";
+import { viem } from "@goat-sdk/wallet-viem";
+import { Message, generateText } from "ai";
+import { config } from "dotenv";
+import { http, createWalletClient } from "viem";
+import { privateKeyToAccount } from "viem/accounts";
+import { mainnet } from "viem/chains";
+
+// Load environment variables
+config();
+
+// Ensure private key is properly formatted
+const privateKey = process.env.WALLET_PRIVATE_KEY?.startsWith("0x")
+ ? process.env.WALLET_PRIVATE_KEY
+ : `0x${process.env.WALLET_PRIVATE_KEY}`;
+
+if (!privateKey) {
+ throw new Error("WALLET_PRIVATE_KEY is required in .env file");
+}
+
+const account = privateKeyToAccount(privateKey as `0x${string}`);
+const walletClient = createWalletClient({
+ account,
+ chain: mainnet,
+ transport: http(process.env.RPC_PROVIDER_URL),
+});
+
+(async () => {
+ // Initialize tools with debridge plugin
+ const tools = await getOnChainTools({
+ wallet: viem(walletClient),
+ plugins: [
+ debridge(),
+ // coingecko({ apiKey: process.env.COINGECKO_API_KEY as string })
+ ],
+ });
+
+ const rl = readline.createInterface({
+ input: process.stdin,
+ output: process.stdout,
+ });
+
+ // Initialize the AI model once
+ const model = openai("gpt-4o", {});
+ const messages: Message[] = [];
+
+ while (true) {
+ const prompt = await new Promise((resolve) => {
+ rl.question('Enter your prompt (or "exit" to quit): ', resolve);
+ });
+
+ if (prompt === "exit") {
+ rl.close();
+ break;
+ }
+
+ console.log("\n-------------------\n");
+ console.log("TOOLS CALLED");
+ console.log("\n-------------------\n");
+
+ console.log("\n-------------------\n");
+ console.log("RESPONSE");
+ console.log("\n-------------------\n");
+
+ try {
+ // Add the system message only if this is the first message
+ if (messages.length === 0) {
+ messages.push({
+ id: randomUUID(),
+ role: "system",
+ content: `You are a DeFi assistant helping users bridge tokens between chains using DeBridge.
+When handling token addresses:
+- For native ETH, always use 0x0000000000000000000000000000000000000000 as the token address
+- Chain IDs: Ethereum = "1", Solana = "7565164"
+- Always format amounts in token decimals (e.g., for ETH, multiply by 1e18)
+- Always ask for confirmation before proceeding with a transaction
+- When bridging to Solana, ask for the recipient's Solana address`,
+ });
+ }
+
+ // Add the user's message
+ messages.push({
+ id: randomUUID(),
+ role: "user",
+ content: prompt,
+ });
+
+ const result = await generateText({
+ model,
+ tools,
+ maxSteps: 10, // Increase max steps
+ messages,
+ maxTokens: 4096,
+ onStepFinish: (event) => {
+ if (event.toolResults) {
+ console.log(JSON.stringify(event.toolResults, null, 2));
+ }
+ },
+ });
+
+ // Add the assistant's response to the conversation
+ messages.push({
+ id: randomUUID(),
+ role: "assistant",
+ content: result.text,
+ });
+
+ console.log(result.text);
+ } catch (error) {
+ console.error(error);
+ }
+ console.log("\n-------------------\n");
+ }
+})();
diff --git a/typescript/examples/vercel-ai/debridge-bridging/package.json b/typescript/examples/vercel-ai/debridge-bridging/package.json
new file mode 100644
index 000000000..9cb80100f
--- /dev/null
+++ b/typescript/examples/vercel-ai/debridge-bridging/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "goat-examples-vercel-ai-debridge-bridging",
+ "version": "0.0.3",
+ "description": "",
+ "private": true,
+ "scripts": {
+ "test": "vitest run --passWithNoTests"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "@ai-sdk/openai": "^1.0.4",
+ "@goat-sdk/adapter-vercel-ai": "workspace:*",
+ "@goat-sdk/core": "workspace:*",
+ "@goat-sdk/plugin-debridge": "workspace:*",
+ "@goat-sdk/wallet-viem": "workspace:*",
+ "ai": "catalog:",
+ "dotenv": "^16.4.5",
+ "viem": "2.21.49"
+ }
+}
diff --git a/typescript/examples/vercel-ai/debridge-bridging/tsconfig.json b/typescript/examples/vercel-ai/debridge-bridging/tsconfig.json
new file mode 100644
index 000000000..a7fc4a937
--- /dev/null
+++ b/typescript/examples/vercel-ai/debridge-bridging/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "dist"
+ },
+ "include": ["index.ts"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/typescript/examples/vercel-ai/form-curves/.env.template b/typescript/examples/vercel-ai/form-curves/.env.template
new file mode 100644
index 000000000..c5257dc08
--- /dev/null
+++ b/typescript/examples/vercel-ai/form-curves/.env.template
@@ -0,0 +1,21 @@
+#################
+# LLM #
+#################
+OPENAI_API_KEY=
+
+#################
+# WALLET #
+#################
+WALLET_PRIVATE_KEY=
+
+#################
+# Form chain #
+#################
+# RPC_PROVIDER_URL=https://rpc.form.network/http # Mainnet RPC
+RPC_PROVIDER_URL=https://sepolia-rpc.form.network/http
+
+#################
+# Curves #
+#################
+CURVES_CONTRACT_ADDRESS=0x3e4A86563f0a6688378a692e3D2a9651F4b704e9
+# CURVES_CONTRACT_ADDRESS=0xEad4138380B508949Ccd48B97AD930bd89aAb719 # Mainnet Curves
diff --git a/typescript/examples/vercel-ai/form-curves/CHANGELOG.md b/typescript/examples/vercel-ai/form-curves/CHANGELOG.md
new file mode 100644
index 000000000..608647204
--- /dev/null
+++ b/typescript/examples/vercel-ai/form-curves/CHANGELOG.md
@@ -0,0 +1,9 @@
+# goat-examples-vercel-ai-form-curves
+
+## 0.2.14
+
+### Patch Changes
+
+- 18461a3: Release plugin
+- Updated dependencies [18461a3]
+ - @goat-sdk/plugin-curves@0.0.2
diff --git a/typescript/examples/vercel-ai/form-curves/README.md b/typescript/examples/vercel-ai/form-curves/README.md
new file mode 100644
index 000000000..1ca0a5e26
--- /dev/null
+++ b/typescript/examples/vercel-ai/form-curves/README.md
@@ -0,0 +1,54 @@
+# Vercel AI with Form Curves Example
+
+This example demonstrates how to use GOAT with Vercel AI SDK and viem for Curves contract operations (on Form chain).
+It provides a natural language interface through a CLI for Curves tokens trading (buy/sell) withdrawal and deposit (to and from associated ERC20 token) and price querying.
+
+## Setup
+
+1. Install dependencies:
+```bash
+pnpm install
+```
+
+2. Copy the `.env.template` and populate with your values:
+```bash
+cp .env.template .env
+```
+
+### Required Environment Variables:
+- `OPENAI_API_KEY`: Your OpenAI API key for the AI model
+- `WALLET_PRIVATE_KEY`: Your wallet's private key (with 0x prefix)
+
+### Default Environment Variables:
+- `RPC_PROVIDER_URL`: Defaults to the Form Testnet chain but can be switched to any EVM compatible chain given there is a Curves contract deployed to interact with
+- `CURVES_CONTRACT_ADDRESS`: Defaults to the Form Testnet deployed Curves contract but can be switched to any Curves ABI compatible contract address
+
+## Usage
+
+1. Run the interactive CLI:
+```bash
+npx ts-node index.ts
+```
+
+2. Example interactions:
+```
+# Buy Ooperations
+- How much does 0x123...789 cost?
+- Buy one 0x123...789
+
+# Sell Operations
+- How much is 0x123...789 is sold for?
+- Sell one 0x123...789
+
+# ERC20 Operations
+- Mint my ERC20 token
+- Set ERC20 token name to 'Great On-chain Agent Toolkil' and symbol to 'GOAT'
+- Withdraw 3 curves
+- Deposit 2 curves
+```
+
+3. Understanding responses:
+ - Transaction confirmations
+ - Balance updates
+ - Error messages
+ - Operation status
diff --git a/typescript/examples/vercel-ai/form-curves/form.ts b/typescript/examples/vercel-ai/form-curves/form.ts
new file mode 100644
index 000000000..f9769b2e6
--- /dev/null
+++ b/typescript/examples/vercel-ai/form-curves/form.ts
@@ -0,0 +1,46 @@
+import { defineChain } from "viem";
+import { mainnet } from "viem/chains";
+import { chainConfig } from "viem/op-stack";
+
+export default defineChain({
+ ...chainConfig,
+ id: 478,
+ name: "Form",
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
+ rpcUrls: {
+ default: { http: ["https://rpc.form.network/http"] },
+ },
+ blockExplorers: {
+ default: {
+ name: "Form Explorer",
+ url: "https://explorer.form.network/",
+ },
+ },
+ contracts: {
+ addressManager: {
+ [mainnet.id]: {
+ address: "0x15c249E46A2F924C2dB3A1560CF86729bAD1f07B",
+ },
+ },
+ l1CrossDomainMessenger: {
+ [mainnet.id]: {
+ address: "0xF333158DCCad1dF6C3F0a3aEe8BC31fA94d9eD5c",
+ },
+ },
+ l2OutputOracle: {
+ [mainnet.id]: {
+ address: "0x4ccAAF69F41c5810cA875183648B577CaCf1F67E",
+ },
+ },
+ portal: {
+ [mainnet.id]: {
+ address: "0x4E259Ee5F4136408908160dD32295A5031Fa426F",
+ },
+ },
+ l1StandardBridge: {
+ [mainnet.id]: {
+ address: "0xdc20aA63D3DE59574E065957190D8f24e0F7B8Ba",
+ },
+ },
+ },
+});
diff --git a/typescript/examples/vercel-ai/form-curves/formt.testnet.ts b/typescript/examples/vercel-ai/form-curves/formt.testnet.ts
new file mode 100644
index 000000000..fded3ee99
--- /dev/null
+++ b/typescript/examples/vercel-ai/form-curves/formt.testnet.ts
@@ -0,0 +1,50 @@
+import { defineChain } from "viem";
+import { sepolia } from "viem/chains";
+import { chainConfig } from "viem/op-stack";
+
+export default defineChain({
+ ...chainConfig,
+ id: 132902,
+ name: "Form Testnet",
+ nativeCurrency: {
+ decimals: 18,
+ name: "Ether",
+ symbol: "ETH",
+ },
+ rpcUrls: {
+ default: { http: ["https://sepolia-rpc.form.network/http"] },
+ },
+ blockExplorers: {
+ default: {
+ name: "Form Testnet Explorer",
+ url: "https://sepolia-explorer.form.network/",
+ },
+ },
+ contracts: {
+ addressManager: {
+ [sepolia.id]: {
+ address: "0xd5C38fa934f7fd7477D4800F4f38a1c5BFdF1373",
+ },
+ },
+ l1CrossDomainMessenger: {
+ [sepolia.id]: {
+ address: "0x37A68565c4BE9700b3E3Ec60cC4416cAC3052FAa",
+ },
+ },
+ l2OutputOracle: {
+ [sepolia.id]: {
+ address: "0x9eA2239E65a59EC9C7F1ED4C116dD58Da71Fc1e2",
+ },
+ },
+ portal: {
+ [sepolia.id]: {
+ address: "0x60377e3cE15dF4CCA24c4beF076b60314240b032",
+ },
+ },
+ l1StandardBridge: {
+ [sepolia.id]: {
+ address: "0xD4531f633942b2725896F47cD2aFd260b44Ab1F7",
+ },
+ },
+ },
+});
diff --git a/typescript/examples/vercel-ai/form-curves/index.ts b/typescript/examples/vercel-ai/form-curves/index.ts
new file mode 100644
index 000000000..dc0385735
--- /dev/null
+++ b/typescript/examples/vercel-ai/form-curves/index.ts
@@ -0,0 +1,157 @@
+import readline from "node:readline";
+
+import { openai } from "@ai-sdk/openai";
+import { CoreTool, generateText } from "ai";
+
+import { http } from "viem";
+import { createWalletClient } from "viem";
+import { privateKeyToAccount } from "viem/accounts";
+
+import { getOnChainTools } from "@goat-sdk/adapter-vercel-ai";
+import { Token, erc20 } from "@goat-sdk/plugin-erc20";
+
+import { curves } from "@goat-sdk/plugin-curves";
+import { sendETH } from "@goat-sdk/wallet-evm";
+import { viem } from "@goat-sdk/wallet-viem";
+
+import { default as formTestnet } from "./formt.testnet";
+
+require("dotenv").config();
+
+type FunctionTool = CoreTool & {
+ type?: "function";
+ description?: string;
+};
+
+const account = privateKeyToAccount(process.env.WALLET_PRIVATE_KEY as `0x${string}`);
+
+const walletClient = createWalletClient({
+ account: account,
+ transport: http(process.env.RPC_PROVIDER_URL),
+ chain: formTestnet,
+});
+
+(async () => {
+ // Declare WETH token on testnet
+ const WETH: Token = {
+ name: "Wrapped Ether",
+ symbol: "WETH",
+ decimals: 18,
+ chains: {
+ [132902]: {
+ contractAddress: "0xA65be6D7DE4A82Cc9638FB3Dbf8E68b7f2e757ab",
+ },
+ },
+ };
+
+ // Declare USDC token on testnet
+ const USDC: Token = {
+ decimals: 6,
+ symbol: "USDC",
+ name: "USD Coin",
+ chains: {
+ [132902]: {
+ contractAddress: "0xaC96dbABb398ee0c49660049590a6e5527Ae581F",
+ },
+ },
+ };
+
+ // Load Form tools
+ const tools = await getOnChainTools({
+ wallet: viem(walletClient),
+ plugins: [
+ curves(), // Add Curves plugin with all tools
+ sendETH(), // Add sendETH plugin for compatibilty showcase
+ erc20({
+ tokens: [WETH, USDC],
+ }), // Add erc20 plugin for compatibilty showcase
+ ],
+ });
+
+ const rl = readline.createInterface({
+ input: process.stdin,
+ output: process.stdout,
+ });
+
+ const log = {
+ header: (text: string) => console.log(`\nπ ${text.toUpperCase()} π\n`),
+ section: (text: string) => console.log(`\nπ ${text}\n`),
+ info: (text: string) => console.log(` βΉοΈ ${text}`),
+ success: (text: string) => console.log(` β
${text}`),
+ warning: (text: string) => console.log(` β οΈ ${text}`),
+ error: (text: string, e?: Error) => {
+ console.error(` β ${text}`);
+
+ // Parse and simplify the error message
+ if (e?.message) {
+ const errorMessage = e.message.toLowerCase();
+
+ // Common error cases
+ if (errorMessage.includes("execution reverted")) {
+ log.warning("Transaction was rejected by the network. Possible reasons:");
+ log.list([
+ "Insufficient balance",
+ "You don't own the tokens you're trying to sell",
+ "Contract restrictions prevent this operation",
+ ]);
+ } else if (errorMessage.includes("insufficient funds")) {
+ log.warning("You don't have enough funds for this transaction");
+ } else {
+ // For unknown errors, show a simplified message
+ console.error(` Reason: ${e.message.split("Raw Call Arguments")[0].trim()}`);
+ }
+ }
+ },
+ list: (items: string[]) => {
+ for (const item of items) {
+ console.log(` β’ ${item}`);
+ }
+ },
+ step: (num: number, text: string) => console.log(`\nβ Step ${num}: ${text}`),
+ result: (text: string) => console.log(` ${text}`),
+ spacer: () => console.log(""),
+ };
+
+ // Usage in your code:
+ log.header("Form Curves CLI");
+ log.section("Available Tools");
+ log.list(
+ Object.values(tools)
+ .filter((t) => (t.type === undefined || t.type === "function") && "description" in t)
+ .map((t) => (t as FunctionTool).description || "No description available"),
+ );
+ while (true) {
+ log.spacer();
+ const prompt = await new Promise((resolve) => {
+ rl.question('π What would you like to do? (type "exit" to quit): ', resolve);
+ });
+
+ if (prompt === "exit") {
+ log.info("Thanks for using Form Curves CLI!");
+ rl.close();
+ break;
+ }
+
+ log.section("Processing Your Request");
+
+ try {
+ const result = await generateText({
+ model: openai("gpt-4o-mini"),
+ tools,
+ maxSteps: 10,
+ prompt,
+ onStepFinish: (event) => {
+ if (event.toolResults) {
+ event.toolResults.forEach((result, index) => {
+ log.info(`tool_call[${index + 1}]: ${JSON.stringify(result)}`);
+ });
+ }
+ },
+ });
+ log.spacer();
+ log.success(result.text.replace(/`/g, "")); // Remove backticks for cleaner output
+ } catch (error) {
+ log.error("Sorry, there was a problem with your request", error as Error);
+ }
+ }
+})();
diff --git a/typescript/examples/vercel-ai/form-curves/package.json b/typescript/examples/vercel-ai/form-curves/package.json
new file mode 100644
index 000000000..6b568fe41
--- /dev/null
+++ b/typescript/examples/vercel-ai/form-curves/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "goat-examples-vercel-ai-form-curves",
+ "version": "0.2.14",
+ "description": "",
+ "private": true,
+ "scripts": {
+ "test": "vitest run --passWithNoTests"
+ },
+ "author": "",
+ "license": "MIT",
+ "dependencies": {
+ "@ai-sdk/openai": "^1.0.4",
+ "@goat-sdk/adapter-vercel-ai": "workspace:*",
+ "@goat-sdk/core": "workspace:*",
+ "@goat-sdk/plugin-erc20": "workspace:*",
+ "@goat-sdk/plugin-uniswap": "workspace:*",
+ "@goat-sdk/plugin-curves": "workspace:*",
+ "@goat-sdk/wallet-evm": "workspace:*",
+ "@goat-sdk/wallet-viem": "workspace:*",
+ "ai": "catalog:",
+ "dotenv": "^16.4.5",
+ "viem": "2.21.49"
+ }
+}
diff --git a/typescript/examples/vercel-ai/form-curves/tsconfig.json b/typescript/examples/vercel-ai/form-curves/tsconfig.json
new file mode 100644
index 000000000..a7fc4a937
--- /dev/null
+++ b/typescript/examples/vercel-ai/form-curves/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../../tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "dist"
+ },
+ "include": ["index.ts"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/typescript/examples/vercel-ai/headless-checkout/CHANGELOG.md b/typescript/examples/vercel-ai/headless-checkout/CHANGELOG.md
index 278db2281..7cfba7ced 100644
--- a/typescript/examples/vercel-ai/headless-checkout/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/headless-checkout/CHANGELOG.md
@@ -1,5 +1,21 @@
# goat-examples-vercel-ai-headless-checkout
+## 0.2.10
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/plugin-crossmint-headless-checkout@0.0.6
+ - @goat-sdk/wallet-viem@0.2.7
+
+## 0.2.9
+
+### Patch Changes
+
+- Updated dependencies [220dd8d]
+ - @goat-sdk/plugin-crossmint-headless-checkout@0.0.5
+
## 0.2.8
### Patch Changes
diff --git a/typescript/examples/vercel-ai/headless-checkout/package.json b/typescript/examples/vercel-ai/headless-checkout/package.json
index c4190c4cf..a94799d20 100644
--- a/typescript/examples/vercel-ai/headless-checkout/package.json
+++ b/typescript/examples/vercel-ai/headless-checkout/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-headless-checkout",
- "version": "0.2.8",
+ "version": "0.2.10",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/vercel-ai/mode/CHANGELOG.md b/typescript/examples/vercel-ai/mode/CHANGELOG.md
index 061b2b2c3..d8b053ea5 100644
--- a/typescript/examples/vercel-ai/mode/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/mode/CHANGELOG.md
@@ -1,5 +1,16 @@
# goat-examples-vercel-ai-mode
+## 0.2.11
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/plugin-erc20@0.2.9
+ - @goat-sdk/plugin-erc721@0.1.18
+ - @goat-sdk/plugin-kim@0.1.9
+ - @goat-sdk/wallet-viem@0.2.7
+
## 0.2.10
### Patch Changes
diff --git a/typescript/examples/vercel-ai/mode/package.json b/typescript/examples/vercel-ai/mode/package.json
index a37f68584..a13ec4ab9 100644
--- a/typescript/examples/vercel-ai/mode/package.json
+++ b/typescript/examples/vercel-ai/mode/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-mode",
- "version": "0.2.10",
+ "version": "0.2.11",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/vercel-ai/modespray/CHANGELOG.md b/typescript/examples/vercel-ai/modespray/CHANGELOG.md
index 61dbade8a..24f1fb4bc 100644
--- a/typescript/examples/vercel-ai/modespray/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/modespray/CHANGELOG.md
@@ -1,5 +1,17 @@
# goat-examples-vercel-ai-modespray
+## 0.2.7
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/plugin-erc20@0.2.9
+ - @goat-sdk/plugin-erc721@0.1.18
+ - @goat-sdk/plugin-kim@0.1.9
+ - @goat-sdk/plugin-modespray@0.1.4
+ - @goat-sdk/wallet-viem@0.2.7
+
## 0.2.6
### Patch Changes
diff --git a/typescript/examples/vercel-ai/modespray/package.json b/typescript/examples/vercel-ai/modespray/package.json
index 3547dcff6..279df5fcb 100644
--- a/typescript/examples/vercel-ai/modespray/package.json
+++ b/typescript/examples/vercel-ai/modespray/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-modespray",
- "version": "0.2.6",
+ "version": "0.2.7",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/vercel-ai/opensea/CHANGELOG.md b/typescript/examples/vercel-ai/opensea/CHANGELOG.md
index ba1e65128..806a6ca5d 100644
--- a/typescript/examples/vercel-ai/opensea/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/opensea/CHANGELOG.md
@@ -1,5 +1,11 @@
# goat-examples-vercel-ai-opensea
+## 0.1.5
+
+### Patch Changes
+
+- @goat-sdk/wallet-viem@0.2.7
+
## 0.1.4
### Patch Changes
diff --git a/typescript/examples/vercel-ai/opensea/package.json b/typescript/examples/vercel-ai/opensea/package.json
index 9f74e7ddf..27ccf05c1 100644
--- a/typescript/examples/vercel-ai/opensea/package.json
+++ b/typescript/examples/vercel-ai/opensea/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-opensea",
- "version": "0.1.4",
+ "version": "0.1.5",
"private": true,
"scripts": {
"test": "vitest run --passWithNoTests"
diff --git a/typescript/examples/vercel-ai/polymarket/CHANGELOG.md b/typescript/examples/vercel-ai/polymarket/CHANGELOG.md
index dd3ad9105..7bf4fc8f4 100644
--- a/typescript/examples/vercel-ai/polymarket/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/polymarket/CHANGELOG.md
@@ -1,5 +1,12 @@
# goat-examples-vercel-ai-polymarket
+## 0.2.10
+
+### Patch Changes
+
+- @goat-sdk/plugin-polymarket@0.3.9
+- @goat-sdk/wallet-viem@0.2.7
+
## 0.2.9
### Patch Changes
diff --git a/typescript/examples/vercel-ai/polymarket/index.ts b/typescript/examples/vercel-ai/polymarket/index.ts
index 0958fb301..43abc19a1 100644
--- a/typescript/examples/vercel-ai/polymarket/index.ts
+++ b/typescript/examples/vercel-ai/polymarket/index.ts
@@ -34,9 +34,9 @@ async function main() {
plugins: [
polymarket({
credentials: {
- key: process.env.POLYMARKET_API_KEY as string,
- secret: process.env.POLYMARKET_SECRET as string,
- passphrase: process.env.POLYMARKET_PASSPHRASE as string,
+ key: process.env.POLYMARKET_API_KEY as string, // API key for Polymarket operations
+ secret: process.env.POLYMARKET_SECRET as string, // API secret for authentication
+ passphrase: process.env.POLYMARKET_PASSPHRASE as string, // API passphrase for security
},
}),
],
@@ -51,7 +51,7 @@ async function main() {
model: openai("gpt-4o-mini"),
messages,
tools: tools,
- maxSteps: 5,
+ maxSteps: 5, // Maximum number of tool invocations per request
});
let fullResponse = "";
diff --git a/typescript/examples/vercel-ai/polymarket/package.json b/typescript/examples/vercel-ai/polymarket/package.json
index a3f774266..b77cb8f6d 100644
--- a/typescript/examples/vercel-ai/polymarket/package.json
+++ b/typescript/examples/vercel-ai/polymarket/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-polymarket",
- "version": "0.2.9",
+ "version": "0.2.10",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/vercel-ai/send-nft-to-twitter/CHANGELOG.md b/typescript/examples/vercel-ai/send-nft-to-twitter/CHANGELOG.md
index d68f1e134..f2369a47b 100644
--- a/typescript/examples/vercel-ai/send-nft-to-twitter/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/send-nft-to-twitter/CHANGELOG.md
@@ -1,5 +1,21 @@
# goat-examples-vercel-ai-send-nft-to-twitter
+## 0.2.11
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/crossmint@0.3.15
+ - @goat-sdk/wallet-viem@0.2.7
+
+## 0.2.10
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/crossmint@0.3.14
+
## 0.2.9
### Patch Changes
diff --git a/typescript/examples/vercel-ai/send-nft-to-twitter/README.md b/typescript/examples/vercel-ai/send-nft-to-twitter/README.md
index e1ac4b6d7..91ba6f64a 100644
--- a/typescript/examples/vercel-ai/send-nft-to-twitter/README.md
+++ b/typescript/examples/vercel-ai/send-nft-to-twitter/README.md
@@ -1,17 +1,47 @@
-# Send NFT to Twitter address
+# Send NFT to Twitter Address Example
-This example shows how to send an NFT to a Twitter address. It generates a wallet for the Twitter user using Crossmint wallets and sends the NFT to it.
+This example demonstrates how to use GOAT with Vercel AI SDK to send NFTs to Twitter users by automatically generating Crossmint wallets. It provides a natural language interface for NFT transfers, handling wallet creation and NFT sending in a single interaction.
## Setup
-Copy the `.env.template` and populate with your values.
-
+1. Install dependencies:
+```bash
+pnpm install
```
+
+2. Copy the `.env.template` and populate with your values:
+```bash
cp .env.template .env
```
+### Required Environment Variables:
+- `OPENAI_API_KEY`: Your OpenAI API key for the AI model
+- `WALLET_PRIVATE_KEY`: Your wallet's private key (with 0x prefix)
+- `RPC_PROVIDER_URL`: Sepolia RPC URL
+- `CROSSMINT_API_KEY`: Your Crossmint API key for wallet operations
+ - Use staging key (`CROSSMINT_STAGING_API_KEY`) for development and testing
+ - Use production key (`CROSSMINT_API_KEY`) for mainnet operations
+
## Usage
-```
+1. Run the interactive CLI:
+```bash
npx ts-node index.ts
```
+
+2. Example interactions:
+```
+# Send NFT to Twitter User
+Send NFT with ID 123 to Twitter user @example
+Transfer my NFT to @cryptouser
+
+# Check Status
+Verify wallet creation
+Check transfer status
+```
+
+3. Understanding responses:
+ - Wallet creation confirmation
+ - Transfer transaction details
+ - Error messages
+ - Operation status
diff --git a/typescript/examples/vercel-ai/send-nft-to-twitter/index.ts b/typescript/examples/vercel-ai/send-nft-to-twitter/index.ts
index c9f2b7940..34c87e686 100644
--- a/typescript/examples/vercel-ai/send-nft-to-twitter/index.ts
+++ b/typescript/examples/vercel-ai/send-nft-to-twitter/index.ts
@@ -23,13 +23,14 @@ const walletClient = createWalletClient({
chain: sepolia,
});
-const apiKey = process.env.CROSSMINT_STAGING_API_KEY;
+const apiKey = process.env.CROSSMINT_STAGING_API_KEY; // Use staging key for development, production key for mainnet
if (!apiKey) {
throw new Error("Missing Crossmint API key");
}
-const { wallets, mint } = crossmint(apiKey);
+// Initialize Crossmint plugins for wallet creation and NFT minting
+const { wallets, mint } = crossmint(apiKey); // wallets() for Twitter user wallets, mint() for NFT operations
(async () => {
const tools = await getOnChainTools({
@@ -56,7 +57,7 @@ const { wallets, mint } = crossmint(apiKey);
const result = await generateText({
model: openai("gpt-4o-mini"),
tools: tools,
- maxSteps: 10,
+ maxSteps: 10, // Maximum number of tool invocations per request
prompt: prompt,
onStepFinish: (event) => {
console.log("\n-------------------\n");
diff --git a/typescript/examples/vercel-ai/send-nft-to-twitter/package.json b/typescript/examples/vercel-ai/send-nft-to-twitter/package.json
index 90c34a970..10742dc95 100644
--- a/typescript/examples/vercel-ai/send-nft-to-twitter/package.json
+++ b/typescript/examples/vercel-ai/send-nft-to-twitter/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-send-nft-to-twitter",
- "version": "0.2.9",
+ "version": "0.2.11",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/vercel-ai/sns/CHANGELOG.md b/typescript/examples/vercel-ai/sns/CHANGELOG.md
index be5d4417a..dbb105e6c 100644
--- a/typescript/examples/vercel-ai/sns/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/sns/CHANGELOG.md
@@ -1,5 +1,13 @@
# goat-examples-vercel-ai-sns
+## 0.1.6
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+ - @goat-sdk/plugin-sns@0.1.4
+
## 0.1.5
### Patch Changes
diff --git a/typescript/examples/vercel-ai/sns/README.md b/typescript/examples/vercel-ai/sns/README.md
index bd5f43843..bfc26deb5 100644
--- a/typescript/examples/vercel-ai/sns/README.md
+++ b/typescript/examples/vercel-ai/sns/README.md
@@ -1,15 +1,44 @@
-# Vercel AI SNS Example
+# Vercel AI with Solana Name Service (SNS) Example
-## Setup
+This example demonstrates how to use GOAT with Vercel AI SDK to interact with Solana Name Service (SNS). It provides a natural language interface for sending SOL to SNS domains (e.g., "example.sol") on the Solana blockchain.
-Copy the `.env.template` and populate with your values.
+## Setup
+1. Install dependencies:
+```bash
+pnpm install
```
+
+2. Copy the `.env.template` and populate with your values:
+```bash
cp .env.template .env
```
+### Required Environment Variables:
+- `OPENAI_API_KEY`: Your OpenAI API key for the AI model
+- `WALLET_PRIVATE_KEY`: Your Solana wallet's private key (Base58 encoded)
+- `RPC_PROVIDER_URL`: Solana RPC URL
+
## Usage
-```
+1. Run the example:
+```bash
npx ts-node index.ts
```
+
+2. Example interactions:
+```
+# SOL Transfers to SNS Domains
+Send 0.005 SOL to example.sol
+Transfer SOL to myname.sol
+
+# Check Status
+Verify transaction status
+Check remaining balance
+```
+
+3. Understanding responses:
+ - Domain resolution confirmation
+ - Transaction details
+ - Error messages
+ - Operation status
diff --git a/typescript/examples/vercel-ai/sns/index.ts b/typescript/examples/vercel-ai/sns/index.ts
index a445cd741..aaad00d7e 100644
--- a/typescript/examples/vercel-ai/sns/index.ts
+++ b/typescript/examples/vercel-ai/sns/index.ts
@@ -20,13 +20,16 @@ const keypair = Keypair.fromSecretKey(base58.decode(process.env.WALLET_PRIVATE_K
keypair,
connection,
}),
- plugins: [sendSOL(), sns()],
+ plugins: [
+ sendSOL(), // Enable SOL transfers
+ sns(), // Enable SNS domain resolution
+ ],
});
const result = await generateText({
model: openai("gpt-4o-mini"),
tools: tools,
- maxSteps: 5,
+ maxSteps: 5, // Maximum number of tool invocations per request
prompt: "Send 0.005 SOL to investigations.sol",
});
diff --git a/typescript/examples/vercel-ai/sns/package.json b/typescript/examples/vercel-ai/sns/package.json
index 0a0d484d5..adb6962a3 100644
--- a/typescript/examples/vercel-ai/sns/package.json
+++ b/typescript/examples/vercel-ai/sns/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-sns",
- "version": "0.1.5",
+ "version": "0.1.6",
"private": true,
"scripts": {
"test": "vitest run --passWithNoTests"
diff --git a/typescript/examples/vercel-ai/solana/CHANGELOG.md b/typescript/examples/vercel-ai/solana/CHANGELOG.md
index 0af4ff567..5e9857e29 100644
--- a/typescript/examples/vercel-ai/solana/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/solana/CHANGELOG.md
@@ -1,5 +1,15 @@
# goat-examples-vercel-ai-solana
+## 0.2.16
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+ - @goat-sdk/plugin-jupiter@0.2.12
+ - @goat-sdk/plugin-pumpfun@0.1.5
+ - @goat-sdk/plugin-spl-token@0.2.14
+
## 0.2.15
### Patch Changes
diff --git a/typescript/examples/vercel-ai/solana/README.md b/typescript/examples/vercel-ai/solana/README.md
index a86b74fdd..1ab2733d0 100644
--- a/typescript/examples/vercel-ai/solana/README.md
+++ b/typescript/examples/vercel-ai/solana/README.md
@@ -1,15 +1,63 @@
# Vercel AI with Solana Example
-## Setup
+This example demonstrates how to use GOAT with Vercel AI SDK to create an interactive DeFi assistant for the Solana ecosystem. It provides a natural language interface for trading, token swaps, and market analysis using multiple Solana protocols and data providers.
+
+## Overview
+The example showcases:
+- Jupiter DEX integration for token swaps
+- SPL token operations
+- Coingecko price data integration
+- PumpFun protocol interaction
+- Interactive chat interface
+- Natural language DeFi operations
+- Solana blockchain integration
-Copy the `.env.template` and populate with your values.
+## Setup
+1. Install dependencies:
+```bash
+pnpm install
```
+
+2. Copy the `.env.template` and populate with your values:
+```bash
cp .env.template .env
```
+### Required Environment Variables:
+- `OPENAI_API_KEY`: Your OpenAI API key for the AI model
+- `SOLANA_PRIVATE_KEY`: Your Solana wallet's private key (Base58 encoded)
+- `SOLANA_RPC_URL`: Solana RPC endpoint URL
+- `COINGECKO_API_KEY`: Your Coingecko API key for market data
+
## Usage
-```
+1. Run the interactive chat:
+```bash
npx ts-node index.ts
```
+
+2. Example interactions:
+```
+# Token Operations
+Swap 1 SOL for USDC
+Check my SPL token balances
+Send 5 USDC to address...
+
+# Market Analysis
+Get price of SOL
+Show market stats for BONK
+Check trading volume
+
+# DeFi Operations
+Find best swap route
+Execute trade on Jupiter
+Interact with PumpFun
+```
+
+3. Understanding responses:
+ - Market data and analysis
+ - Transaction confirmations
+ - Protocol interactions
+ - Trading suggestions
+ - Error messages
diff --git a/typescript/examples/vercel-ai/solana/index.ts b/typescript/examples/vercel-ai/solana/index.ts
index f3ade3821..8fcb06b2a 100644
--- a/typescript/examples/vercel-ai/solana/index.ts
+++ b/typescript/examples/vercel-ai/solana/index.ts
@@ -37,13 +37,13 @@ async function chat() {
connection,
}),
plugins: [
- sendSOL(),
- jupiter(),
- splToken(),
+ sendSOL(), // Enable SOL transfers
+ jupiter(), // Enable Jupiter DEX swaps
+ splToken(), // Enable SPL token operations
coingecko({
apiKey: process.env.COINGECKO_API_KEY as string,
- }),
- pumpfun(),
+ }), // Enable market data access
+ pumpfun(), // Enable PumpFun protocol interactions
],
});
@@ -61,7 +61,7 @@ async function chat() {
const result = await generateText({
model: openai("gpt-4o-mini"),
tools: tools,
- maxSteps: 10,
+ maxSteps: 10, // Maximum number of tool invocations per request
prompt: `You are a based crypto degen assistant. You're knowledgeable about DeFi, NFTs, and trading. You use crypto slang naturally and stay up to date with Solana ecosystem. You help users with their trades and provide market insights. Keep responses concise and use emojis occasionally.
Previous conversation:
diff --git a/typescript/examples/vercel-ai/solana/package.json b/typescript/examples/vercel-ai/solana/package.json
index 4e221e81f..3f4536a5a 100644
--- a/typescript/examples/vercel-ai/solana/package.json
+++ b/typescript/examples/vercel-ai/solana/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-solana",
- "version": "0.2.15",
+ "version": "0.2.16",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/vercel-ai/viem/CHANGELOG.md b/typescript/examples/vercel-ai/viem/CHANGELOG.md
index 936adba72..af0a5d139 100644
--- a/typescript/examples/vercel-ai/viem/CHANGELOG.md
+++ b/typescript/examples/vercel-ai/viem/CHANGELOG.md
@@ -1,5 +1,15 @@
# goat-examples-vercel-ai-viem
+## 0.2.13
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/plugin-erc20@0.2.9
+ - @goat-sdk/plugin-uniswap@0.2.10
+ - @goat-sdk/wallet-viem@0.2.7
+
## 0.2.12
### Patch Changes
diff --git a/typescript/examples/vercel-ai/viem/README.md b/typescript/examples/vercel-ai/viem/README.md
index 9f2da5069..eda351cf3 100644
--- a/typescript/examples/vercel-ai/viem/README.md
+++ b/typescript/examples/vercel-ai/viem/README.md
@@ -1,15 +1,52 @@
# Vercel AI with viem Example
-## Setup
+This example demonstrates how to use GOAT with Vercel AI SDK and viem for EVM network operations (with Base). It provides a natural language interface for ETH transfers, ERC20 token operations (USDC, PEPE), and Uniswap trading through an interactive CLI.
-Copy the `.env.template` and populate with your values.
+## Setup
+1. Install dependencies:
+```bash
+pnpm install
```
+
+2. Copy the `.env.template` and populate with your values:
+```bash
cp .env.template .env
```
+### Required Environment Variables:
+- `OPENAI_API_KEY`: Your OpenAI API key for the AI model
+- `WALLET_PRIVATE_KEY`: Your wallet's private key (with 0x prefix)
+- `RPC_PROVIDER_URL`: EVM network RPC URL (with Base)
+- `UNISWAP_API_KEY`: Your Uniswap API key
+- `UNISWAP_BASE_URL`: Uniswap API base URL
+
## Usage
-```
+1. Run the interactive CLI:
+```bash
npx ts-node index.ts
```
+
+2. Example interactions:
+```
+# ETH Operations
+Send 0.1 ETH to 0x...
+Check ETH balance
+
+# Token Operations
+Send 100 USDC to 0x...
+Check PEPE balance
+
+# Uniswap Trading
+Swap 10 USDC for PEPE
+Get best trade route
+Execute Uniswap trade
+```
+
+3. Understanding responses:
+ - Transaction confirmations
+ - Balance updates
+ - Trade quotes
+ - Error messages
+ - Operation status
diff --git a/typescript/examples/vercel-ai/viem/index.ts b/typescript/examples/vercel-ai/viem/index.ts
index cce459416..12ab507fc 100644
--- a/typescript/examples/vercel-ai/viem/index.ts
+++ b/typescript/examples/vercel-ai/viem/index.ts
@@ -29,12 +29,12 @@ const walletClient = createWalletClient({
const tools = await getOnChainTools({
wallet: viem(walletClient),
plugins: [
- sendETH(),
- erc20({ tokens: [USDC, PEPE] }),
+ sendETH(), // Enable ETH transfers
+ erc20({ tokens: [USDC, PEPE] }), // Enable ERC20 token operations
uniswap({
baseUrl: process.env.UNISWAP_BASE_URL as string,
apiKey: process.env.UNISWAP_API_KEY as string,
- }),
+ }), // Enable Uniswap trading
],
});
@@ -64,7 +64,7 @@ const walletClient = createWalletClient({
const result = await generateText({
model: openai("gpt-4o-mini"),
tools: tools,
- maxSteps: 10,
+ maxSteps: 10, // Maximum number of tool invocations per request
prompt: prompt,
onStepFinish: (event) => {
console.log(event.toolResults);
diff --git a/typescript/examples/vercel-ai/viem/package.json b/typescript/examples/vercel-ai/viem/package.json
index d87626d9d..85e6c59e0 100644
--- a/typescript/examples/vercel-ai/viem/package.json
+++ b/typescript/examples/vercel-ai/viem/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-vercel-ai-viem",
- "version": "0.2.12",
+ "version": "0.2.13",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/examples/virtuals-game/viem/CHANGELOG.md b/typescript/examples/virtuals-game/viem/CHANGELOG.md
index 7aa00771d..344a11cb2 100644
--- a/typescript/examples/virtuals-game/viem/CHANGELOG.md
+++ b/typescript/examples/virtuals-game/viem/CHANGELOG.md
@@ -1,5 +1,15 @@
# goat-examples-virtuals-game-viem
+## 0.2.9
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/plugin-erc20@0.2.9
+ - @goat-sdk/plugin-kim@0.1.9
+ - @goat-sdk/wallet-viem@0.2.7
+
## 0.2.8
### Patch Changes
diff --git a/typescript/examples/virtuals-game/viem/README.md b/typescript/examples/virtuals-game/viem/README.md
index 896a7e383..ccaf48267 100644
--- a/typescript/examples/virtuals-game/viem/README.md
+++ b/typescript/examples/virtuals-game/viem/README.md
@@ -1,15 +1,49 @@
# GAME with viem Example
-## Setup
+This example demonstrates how to integrate GOAT with the Virtuals Protocol GAME framework using viem for Ethereum operations. It shows how to create a GameAgent that can execute on-chain actions through custom GameFunctions, specifically focusing on token swaps and transfers on the Mode network.
+
+## Overview
+The example showcases:
+- Integration with Virtuals Protocol GAME framework
+- Custom GameFunction creation from GOAT tools
+- Mode network integration
+- ERC20 token operations (USDC, PEPE)
+- ETH transfer capabilities
+- Automated agent execution
-Copy the `.env.template` and populate with your values.
+## Setup
+1. Install dependencies:
+```bash
+pnpm install
```
+
+2. Copy the `.env.template` and populate with your values:
+```bash
cp .env.template .env
```
+### Required Environment Variables:
+- `OPENAI_API_KEY`: Your OpenAI API key
+- `WALLET_PRIVATE_KEY`: Your wallet's private key (with 0x prefix)
+- `RPC_PROVIDER_URL`: Mode network RPC URL
+- `VIRTUALS_GAME_API_KEY`: Your Virtuals Protocol GAME API key
+
## Usage
-```
+1. Run the example:
+```bash
npx ts-node index.ts
```
+
+2. The script will:
+ - Initialize GOAT tools for ETH and ERC20 operations
+ - Convert tools to GameFunctions
+ - Create a GameWorker with the functions
+ - Initialize a GameAgent with the worker
+ - Execute the agent's goal (swap 0.01 USDC to MODE)
+
+3. Monitor Progress:
+ - Watch verbose output for step-by-step execution
+ - Check transaction status and results
+ - Review any error messages
diff --git a/typescript/examples/virtuals-game/viem/index.ts b/typescript/examples/virtuals-game/viem/index.ts
index b3a6c2816..ce76f4b32 100644
--- a/typescript/examples/virtuals-game/viem/index.ts
+++ b/typescript/examples/virtuals-game/viem/index.ts
@@ -31,7 +31,10 @@ const walletClient = createWalletClient({
(async () => {
const tools: ToolBase[] = await getTools({
wallet: viem(walletClient),
- plugins: [sendETH(), erc20({ tokens: [USDC, PEPE] })],
+ plugins: [
+ sendETH(), // Enable ETH transfers
+ erc20({ tokens: [USDC, PEPE] }), // Enable ERC20 token operations
+ ],
});
const workerFunctions = tools.map((tool) => {
@@ -85,6 +88,6 @@ const walletClient = createWalletClient({
await agent.init();
await agent.run(10, {
- verbose: true,
+ verbose: true, // Enable detailed execution logging
});
})();
diff --git a/typescript/examples/virtuals-game/viem/package.json b/typescript/examples/virtuals-game/viem/package.json
index a9d42d559..3a01320aa 100644
--- a/typescript/examples/virtuals-game/viem/package.json
+++ b/typescript/examples/virtuals-game/viem/package.json
@@ -1,6 +1,6 @@
{
"name": "goat-examples-virtuals-game-viem",
- "version": "0.2.8",
+ "version": "0.2.9",
"description": "",
"private": true,
"scripts": {
diff --git a/typescript/packages/core/README.md b/typescript/packages/core/README.md
index 037d37f91..5cc864656 100644
--- a/typescript/packages/core/README.md
+++ b/typescript/packages/core/README.md
@@ -1,90 +1,450 @@
-
-Go out and eat some grass.
-[Docs](https://ohmygoat.dev) | [Examples](https://github.com/goat-sdk/goat/tree/main/typescript/examples) | [Discord](https://discord.gg/goat-sdk)
+[Website](https://ohmygoat.dev) | [X](https://x.com/goat_sdk) | [Discord](https://discord.gg/goat-sdk)
-GOAT is sponsored by [Crossmint](https://www.crossmint.com)
-
+GOAT is free software, MIT licensed, sponsored by [Crossmint](https://www.crossmint.com)
-## Goat π
-GOAT π (Great Onchain Agent Toolkit) is an open-source framework for adding blockchain tools such as wallets, being able to hold or trade tokens, or interacting with blockchain smart contracts, to your AI agent.
+
+
-**Problem**:
+
-Making agents perform onchain actions is tedious. The ecosystem is heavily fragmented, spanning 5+ popular agent development frameworks, multiple programming languages, and dozens of different blockchains and wallet architectures.
-For developers without blockchain expertise, finding clear instructions to perform simple actions - like sending USDC payments or placing Polymarket bets - is nearly impossible.
-**Solution**:
+
-GOAT solves this by providing an open-source, provider-agnostic framework that abstracts away all these combinations.
+# GOAT π (Typescript)
+
-- **For agent developers**: GOAT offers an always-growing catalog of ready made blockchain actions (sending tokens, using a DeFi protocol, ...) that can be imported as tools into your existing agent. It works with the most popular agent frameworks (Langchain, Vercel's AI SDK, Eliza, etc), Typescript and Python, 30+ blockchains (Solana, Base, Polygon, Mode, ...), and many wallet providers.
-- **For dApp / smart contract developers**: develop a plug-in in GOAT, and allow agents built with any of the most popular agent development frameworks to access your service.
+GOAT (Great Onchain Agent Toolkit) is a library that adds more than +200 onchain tools to your AI agent.
-### Key features
-1. **Works Everywhere**: Compatible with Langchain, Vercelβs AI SDK, Eliza, and more.
-2. **Wallet Agnostic**: Supports all wallets, from your own key pairs to [Crossmint Smart Wallets](https://docs.crossmint.com/wallets/smart-wallets/overview) and Coinbase.
-3. **Multi-Chain**: Supports EVM chains and Solana (more coming π).
-4. **Customizable**: Use or build plugins for any onchain functionality (sending tokens, checking wallet balance, etc) and protocol (Polymarket, Uniswap, etc).
+* **[+200 tools](#plugins)**: DeFi (Uniswap, Jupiter, KIM, Orca, etc.), minting (OpenSea, MagicEden, etc.), betting (Polymarket, etc.), analytics (CoinGecko, BirdEye, Allora, etc.) and more
+* **Chains**: EVM (Base, Polygon, Mode, Sei, etc.), Solana, Aptos, Chromia, Fuel, Sui, Starknet and Zilliqa
+* **[Wallets](#wallets)**: keypair, smart wallets (Crossmint, etc.), LIT, MPC (Coinbase, etc.)
+* **[Agent Frameworks](#agent-frameworks-adapters)**: AI SDK, Langchain, Eliza, ZerePy, GAME, ElevenLabs, etc.
-
-### How it works
-GOAT plugs into your agents tool calling capabilities adding all the functions your agent needs to interact with the blockchain.
+## Table of Contens
+- [See all plugins](#plugins)
+- [Installation](#installation)
+- [Usage](#usage)
+- [Examples](https://github.com/goat-sdk/goat/tree/main/typescript/examples)
+- [How to create a plugin](#how-to-create-a-plugin)
+ - [Using the plugin generator](#using-the-plugin-generator)
+ - [Manual creation](#manual-creation)
+- [How to add a chain](#how-to-add-a-chain)
+- [How to add a wallet provider](#how-to-add-a-wallet-provider)
+- [Packages](#packages)
+ - [Plugins](#plugins)
+ - [Wallets](#wallets)
+ - [Adapters](#agent-framework-adapters)
-High-level, here's how it works:
+## Installation
+1. Install the core package
+```bash
+npm install @goat-sdk/core
+```
+2. Depending on the type of wallet you want to use, install the corresponding wallet (see all wallets [here](#wallets)):
+```bash
+npm install @goat-sdk/wallet-solana
+```
+3. Install the plugins for the protocols you need (see all available plugins [here](#plugins))
-#### Configure the wallet you want to use
+```bash
+npm install @goat-sdk/plugin-jupiter @goat-sdk/plugin-spl-tokens
+```
+4. Install the adapter for the agent framework you want to use (see all available adapters [here](#adapters))
+```bash
+npm install @goat-sdk/adapter-ai-sdk
+```
+
+## Usage
+1. Configure your wallet
```typescript
-// ... Code to connect your wallet (e.g createWalletClient from viem)
-const wallet = ...
+import { Connection, Keypair } from "@solana/web3.js";
+
+const connection = new Connection(process.env.SOLANA_RPC_URL as string);
+const keypair = Keypair.fromSecretKey(base58.decode(process.env.SOLANA_PRIVATE_KEY as string));
+
-const tools = getOnChainTools({
- wallet: viem(wallet),
-})
```
-#### Add the plugins you need to interact with the protocols you want
+2. Configure your tools for the framework you want to use
```typescript
-const wallet = ...
+import { getOnChainTools } from "@goat-sdk/adapter-ai-sdk";
+import { solana, sendSOL } from "@goat-sdk/wallet-solana";
+import { jupiter } from "@goat-sdk/plugin-jupiter";
+import { splToken } from "@goat-sdk/plugin-spl-token";
-const tools = getOnChainTools({
- wallet: viem(wallet),
- plugins: [
- sendETH(),
- erc20({ tokens: [USDC, PEPE] }),
- faucet(),
- polymarket(),
- // ...
- ],
-})
-```
-
-#### Connect it to your agent framework of choice
-```typescript
-// ... Code to connect your wallet (e.g createWalletClient from viem)
-const wallet = ...
+const tools = await getOnChainTools({
+ wallet: solana({
+ keypair,
+ connection,
+ }),
+ plugins: [
+ sendSOL(),
+ jupiter(),
+ splToken(),
+ ],
+ });
+```
-const tools = getOnChainTools({
- wallet: viem(wallet),
- plugins: [
- sendETH(),
- erc20({ tokens: [USDC, PEPE] }),
- faucet(),
- polymarket(),
- // ...
- ],
-})
-
-// Vercel's AI SDK
+3. Plug into your agent framework
+```typescript
const result = await generateText({
model: openai("gpt-4o-mini"),
tools: tools,
- maxSteps: 5,
- prompt: "Send 420 ETH to ohmygoat.eth",
+ maxSteps: 10,
+ prompt: "Swap 10 USDC for JLP",
});
+
+console.log(result);
+```
+
+## How to create a plugin
+GOAT plugins enable your agent to interact with various blockchain protocols.
+
+Plugins can be chain-specific (EVM, Solana, etc.) or chain-agnostic. If a plugin is chain-specific it will fail to compile when being used with a wallet of a different chain.
+
+You can see all available plugins [here](#plugins).
+
+### Using the Plugin Generator
+Use the `create-plugin` command to generate all the necessary files and configuration for a new plugin
+
+```bash
+# Create a plugin with default type (any)
+pnpm create-plugin -n your-plugin-name
+
+# Create a plugin for a specific chain type
+pnpm create-plugin -n your-plugin-name -t evm # For EVM chains
+pnpm create-plugin -n your-plugin-name -t solana # For Solana
+```
+The command will generate:
+- A `package.json` with standard metadata and dependencies
+- TypeScript configuration files (`tsconfig.json`, `tsup.config.ts`)
+- A basic plugin structure in the `src` directory:
+ - `parameters.ts` - Example parameters using Zod schema
+ - `your-plugin-name.service.ts` - Service class with an example tool
+ - `your-plugin-name.plugin.ts` - Plugin class extending PluginBase
+ - `index.ts` - Exports for your plugin
+
+
+### Manual Creation
+#### 1. Define your plugin extending the [PluginBase](https://github.com/goat-sdk/goat/tree/main/typescript/packages/core/src/classes/PluginBase.ts) class.
+
+```typescript
+import { PluginBase, WalletClientBase } from "@goat-sdk/core";
+
+// For a chain-agnostic plugin we use the WalletClientBase interface, for a chain-specific plugin we use the EVMWalletClient, SolanaWalletClient, or corresponding interfaces
+export class MyPlugin extends PluginBase {
+ constructor() {
+ // We define the name of the plugin
+ super("myPlugin", []);
+ }
+
+ // We define the chain support for the plugin, in this case we support all chains
+ supportsChain = (chain: Chain) => true;
+}
+
+// We export a factory function to create a new instance of the plugin
+export const myPlugin = () => new MyPlugin();
+```
+
+#### 2. Add tools to the plugin
+
+There are two ways to add tools to the plugin:
+1. Using the `@Tool` decorator on our own class
+2. Using the `getTools` and `createTool` functions to create tools dynamically
+
+##### Option 1: Using the `@Tool` decorator
+The `@Tool` decorator is a way to create tools in a more declarative way.
+
+You can create a class and decorate its methods with the `@Tool` decorator to create tools.
+
+The tool methods will receive the wallet client as the first argument and the parameters as the second argument.
+
+```typescript
+import { Tool } from "@goat-sdk/core";
+import { createToolParameters } from "@goat-sdk/core";
+import { z } from "zod";
+
+export class SignMessageParameters extends createToolParameters(
+ z.object({
+ message: z.string(),
+ }),
+) {}
+
+class MyTools {
+ @Tool({
+ name: "sign_message",
+ description: "Sign a message",
+ })
+ async signMessage(walletClient: WalletClientBase, parameters: SignMessageParameters) {
+ const signed = await walletClient.signMessage(parameters.message);
+ return signed.signedMessage;
+ }
+}
```
-See [here](https://github.com/goat-sdk/goat/tree/main/typescript/examples) for more examples.
+Once we have our class we now need to import it in our plugin class.
+
+```typescript
+export class MyPlugin extends PluginBase {
+ constructor() {
+ // We define the name of the plugin
+ super("myPlugin", [new MyTools()]);
+ }
+
+ // We define the chain support for the plugin, in this case we support all chains
+ supportsChain = (chain: Chain) => true;
+}
+
+// We export a factory function to create a new instance of the plugin
+export const myPlugin = () => new MyPlugin();
+```
+
+##### Option 2: Using the `getTools` and `createTool` functions
+We will implement the `getTools` method in our plugin class.
+
+Inside the method, we will return an array of tools created using the `createTool` function.
+
+```typescript
+import { PluginBase, WalletClientBase, createTool } from "@goat-sdk/core";
+
+// Since we are creating a chain-agnostic plugin, we can use the WalletClientBase interface
+export class MyPlugin extends PluginBase {
+ constructor() {
+ // We define the name of the plugin
+ super("myPlugin", []);
+ }
+
+ // We define the chain support for the plugin, in this case we support all chains
+ supportsChain = (chain: Chain) => true;
+
+ getTools(walletClient: WalletClientBase) {
+ return [
+ // Create tool requires two arguments:
+ // 1. The tool metadata (name, description, parameters)
+ // 2. The tool method (the function that will be executed when the tool is used)
+ createTool(
+ {
+ name: "sign_message",
+ description: "Sign a message",
+ parameters: z.object({
+ message: z.string(),
+ }),
+ },
+ async (parameters) => {
+ const signed = await walletClient.signMessage(parameters.message);
+ return signed.signedMessage;
+ },
+ ),
+ ];
+ }
+}
+
+// We export a factory function to create a new instance of the plugin
+export const myPlugin = () => new MyPlugin();
+```
+
+#### 3. Add the plugin to the agent
+
+```typescript
+import { getOnChainTools } from '@goat-sdk/adapter-vercel-ai';
+import { myPlugin } from './your-plugin-path/signMessagePlugin'; // Path to your plugin
+
+const wallet = /* Initialize your wallet client */;
+
+const tools = getOnChainTools({
+ wallet: viem(wallet), // or smartwallet(wallet), solana(wallet), etc.
+ plugins: [
+ myPlugin(),
+ // ...other plugins
+ ],
+});
+
+// Prompt: Sign the message "Sign the message 'Go out and eat grass π'"
+```
+
+#### Next steps
+- Share your plugin with others!
+- Open a PR to add it to the [plugins registry](https://github.com/goat-sdk/goat/tree/main/typescript/packages/plugins) in the [GOAT SDK](https://github.com/goat-sdk/goat).
+
+
+
+## How to add a chain
+
+### 1. Add the chain to the `Chain.ts` file
+Add your chain to the `Chain.ts` file in the [core package](https://github.com/goat-sdk/goat/tree/main/typescript/packages/core/src/types/Chain.ts).
+
+```typescript
+/**
+ * @param type - "evm" or "solana", extend this union as needed (e.g., "sui")
+ * @param id - Chain ID, optional for EVM
+ */
+export type Chain = EvmChain | SolanaChain | AptosChain | ChromiaChain | FuelChain | MyAwesomeChain;
+
+export type MyAwesomeChain = {
+ type: "my-awesome-chain";
+};
+```
+
+### 2. Create a new wallet provider package
+Create a new package in the [wallets directory](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets) with the name of your chain (e.g. `my-awesome-chain`) or copy an existing one (e.g. `evm`).
+In this package you will define the abstract class for your chain's wallet client which will extend the `WalletClientBase` class defined in the [core package](https://github.com/goat-sdk/goat/tree/main/typescript/packages/core/src/classes/WalletClientBase.ts).
+
+WalletClientBase only includes the methods that are supported by all chains such as:
+1. `getAddress`
+2. `getChain`
+3. `signMessage`
+4. `balanceOf`
+
+As well as includes the `getCoreTools` method which returns the core tools for the chain.
+
+```typescript
+export abstract class MyAwesomeChainWalletClient extends WalletClientBase {
+ // Add your chain's methods here
+ abstract getChain(): MyAwesomeChain;
+ sendTransaction: (transaction: AwesomeChainTransaction) => Promise;
+ read: (query: AwesomeChainQuery) => Promise;
+}
+```
+
+### 3. Create a plugin to allow sending your native token to a wallet
+Create a plugin to allow sending your native token to a wallet. Create a file in the same package as your wallet client and create a new file like `send.plugin.ts`.
+
+Implement the core plugin.
+
+
+```typescript
+export class SendAWESOMETOKENPlugin extends PluginBase {
+ constructor() {
+ super("sendAWESOMETOKEN", []);
+ }
+
+ supportsChain = (chain: Chain) => chain.type === "my-awesome-chain";
+
+ getTools(walletClient: MyAwesomeChainWalletClient) {
+ const sendTool = createTool(
+ {
+ name: `send_myawesometoken`,
+ description: `Send MYAWESOMETOKEN to an address.`,
+ parameters: sendAWESOMETOKENParametersSchema, // Define the parameters schema
+ },
+ // Implement the method
+ (parameters: z.infer) => sendAWESOMETOKENMethod(walletClient, parameters),
+ );
+ return [sendTool];
+ }
+}
+```
+
+### 4. Implement the wallet client
+Extend your abstract class with the methods you need to implement and create your first wallet client! (e.g `MyAwesomeChainKeyPairWalletClient`)
+
+```typescript
+export class MyAwesomeChainKeyPairWalletClient extends MyAwesomeChainWalletClient {
+ // Implement the methods here
+}
+
+// Export the wallet client with a factory function
+export const myAwesomeChain = () => new MyAwesomeChainKeyPairWalletClient();
+```
+
+### 5. Submit a PR
+Submit a PR to add your wallet provider to the [wallets directory](https://github.com/goat-sdk/goat/tree/main/typescript/packages/wallets).
+
+## How to add a wallet provider
+If you don't see your wallet provider supported, you can easily integrate it by implementing the specific [WalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/core.ts) interface for the chain and type of wallet you want to support:
+
+1. [EVMWalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/evm.ts) for all EVM chains
+2. [EVMSmartWalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/evm-smart-wallet.ts) for EVM smart wallets
+2. [SolanaWalletClient](https://github.com/goat-sdk/goat/blob/main/typescript/packages/core/src/wallets/solana.ts) for Solana
+
+Checkout [here how the viem client implementation](https://github.com/goat-sdk/goat/blob/main/typescript/packages/wallets/viem/src/index.ts).
+
+If you would like to see your wallet provider supported, please open an issue or submit a PR.
+
+## Packages
+### Core
+| | NPM package |
+| --- | --- |
+| Core | [@goat-sdk/core](https://www.npmjs.com/package/@goat-sdk/core) |
+
+### Wallets
+| Wallet | NPM package |
+| --- | --- |
+|EVM | [@goat-sdk/wallet-evm](https://www.npmjs.com/package/@goat-sdk/wallet-evm) |
+|Viem | [@goat-sdk/wallet-evm-viem](https://www.npmjs.com/package/@goat-sdk/wallet-evm-viem) | [goat-sdk-wallet-evm](https://pypi.org/project/goat-sdk-wallet-evm/) |
+| Solana | [@goat-sdk/wallet-solana](https://www.npmjs.com/package/@goat-sdk/wallet-solana) | [@goat-sdk-wallet-solana](https://pypi.org/project/goat-sdk-wallet-solana/) |
+| Crossmint (smart and custodial wallets) | [@goat-sdk/wallet-crossmint](https://www.npmjs.com/package/@goat-sdk/wallet-crossmint) | [@goat-sdk-wallet-crossmint](https://pypi.org/project/goat-sdk-wallet-crossmint/) |
+| Aptos | [@goat-sdk/wallet-aptos](https://www.npmjs.com/package/@goat-sdk/wallet-aptos) |
+| Chromia | [@goat-sdk/wallet-chromia](https://www.npmjs.com/package/@goat-sdk/wallet-chromia) |
+| Cosmos | [@goat-sdk/wallet-cosmos](https://www.npmjs.com/package/@goat-sdk/wallet-cosmos) |
+| Fuel | [@goat-sdk/wallet-fuel](https://www.npmjs.com/package/@goat-sdk/wallet-fuel) |
+| Sui | [@goat-sdk/wallet-sui](https://www.npmjs.com/package/@goat-sdk/wallet-sui) |
+| Starknet | [@goat-sdk/wallet-starknet](https://www.npmjs.com/package/@goat-sdk/wallet-starknet) |
+| Zilliqa | [@goat-sdk/wallet-zilliqa](https://www.npmjs.com/package/@goat-sdk/wallet-zilliqa) |
+
+### Agent Framework Adapters
+| Adapter | NPM package |
+| --- | --- |
+| AI SDK | [@goat-sdk/adapter-ai-sdk](https://www.npmjs.com/package/@goat-sdk/adapter-ai-sdk) |
+| Langchain | [@goat-sdk/adapter-langchain](https://www.npmjs.com/package/@goat-sdk/adapter-langchain) |
+| ElevenLabs | [@goat-sdk/adapter-elevenlabs](https://www.npmjs.com/package/@goat-sdk/adapter-elevenlabs) | |
+| LlamaIndex | [@goat-sdk/adapter-llamaindex](https://www.npmjs.com/package/@goat-sdk/adapter-llamaindex) | |
+| Model Context Protocol | [@goat-sdk/adapter-model-context-protocol](https://www.npmjs.com/package/@goat-sdk/adapter-model-context-protocol) | |
+
+**Eliza, ZerePy and GAME have direct integrations on their respective repos.*
+
+### Plugins
+| Plugin | Tools | NPM package |
+| --- | --- | --- |
+| 0x | Get quotes and swap on 0x | [@goat-sdk/plugin-0x](https://www.npmjs.com/package/@goat-sdk/plugin-0x) |
+| 1inch | Get the balances of a wallet using 1inch API | [@goat-sdk/plugin-1inch](https://www.npmjs.com/package/@goat-sdk/plugin-1inch) |
+| Allora | Get price predictions using Allora API | [@goat-sdk/plugin-allora](https://www.npmjs.com/package/@goat-sdk/plugin-allora) |
+| Avnu | Swap tokens on Starknet | [@goat-sdk/plugin-avnu](https://www.npmjs.com/package/@goat-sdk/plugin-avnu) |
+| Balancer | Swap tokens and provide liquidity on Balancer | [@goat-sdk/plugin-balancer](https://www.npmjs.com/package/@goat-sdk/plugin-balancer) |
+| Balmy | Swap tokens on Balmy | [@goat-sdk/plugin-balmy](https://www.npmjs.com/package/@goat-sdk/plugin-balmy) |
+| BirdEye | Get token insights using BirdEye API | [@goat-sdk/plugin-birdeye](https://www.npmjs.com/package/@goat-sdk/plugin-birdeye) |
+| CoinGecko | Get coin information using CoinGecko API | [@goat-sdk/plugin-coingecko](https://www.npmjs.com/package/@goat-sdk/plugin-coingecko) |
+| Coinmarketcap | Get coin information using Coinmarketcap API | [@goat-sdk/plugin-coinmarketcap](https://www.npmjs.com/package/@goat-sdk/plugin-coinmarketcap) |
+| Cosmosbank | Interact with Cosmos tokens | [@goat-sdk/plugin-cosmosbank](https://www.npmjs.com/package/@goat-sdk/plugin-cosmosbank) |
+| Crossmint Headless Checkout | Purchase any NFT on any chain using Crossmint | [@goat-sdk/plugin-crossmint-headless-checkout](https://www.npmjs.com/package/@goat-sdk/plugin-crossmint-headless-checkout) |
+| Crossmint Mint, Faucet, Wallets | Create a wallet, mint tokens and get test tokens on any chain using Crossmint | [@goat-sdk/plugin-crossmint-mint-faucet-wallets](https://www.npmjs.com/package/@goat-sdk/plugin-crossmint-mint-faucet-wallets) |
+| DeBridge | Bridge tokens on DeBridge | [@goat-sdk/plugin-debridge](https://www.npmjs.com/package/@goat-sdk/plugin-debridge) |
+| Dexscreener | Get token information using Dexscreener API | [@goat-sdk/plugin-dexscreener](https://www.npmjs.com/package/@goat-sdk/plugin-dexscreener) |
+| ERC20 | Interact with any ERC20 token | [@goat-sdk/plugin-erc20](https://www.npmjs.com/package/@goat-sdk/plugin-erc20) |
+| ERC721 | Interact with any ERC721 token | [@goat-sdk/plugin-erc721](https://www.npmjs.com/package/@goat-sdk/plugin-erc721) |
+| Etherscan | Get transaction information using Etherscan API | [@goat-sdk/plugin-etherscan](https://www.npmjs.com/package/@goat-sdk/plugin-etherscan) |
+| Farcaster | Read and post casts on Farcaster | [@goat-sdk/plugin-farcaster](https://www.npmjs.com/package/@goat-sdk/plugin-farcaster) |
+| Ionic | Borrow and lend on Ionic | [@goat-sdk/plugin-ionic](https://www.npmjs.com/package/@goat-sdk/plugin-ionic) |
+| Ironclad | Create positions on Ironclad | [@goat-sdk/plugin-ironclad](https://www.npmjs.com/package/@goat-sdk/plugin-ironclad) |
+| JSON RPC | Call any JSON RPC endpoint |[@goat-sdk/plugin-json-rpc](https://www.npmjs.com/package/@goat-sdk/plugin-json-rpc) | |
+| Jupiter | Swap tokens on Jupiter | [@goat-sdk/plugin-jupiter](https://www.npmjs.com/package/@goat-sdk/plugin-jupiter) |
+| KIM | Swap tokens on KIM | [@goat-sdk/plugin-kim](https://www.npmjs.com/package/@goat-sdk/plugin-kim) |
+| Lulo | Deposit USDC on Lulo | [@goat-sdk/plugin-lulo](https://www.npmjs.com/package/@goat-sdk/plugin-lulo) |
+| Meteora | Create liquidity pools on Meteora | [@goat-sdk/plugin-meteora](https://www.npmjs.com/package/@goat-sdk/plugin-meteora) |
+| Mode Governance | Create a governance proposal on Mode | [@goat-sdk/plugin-mode-governance](https://www.npmjs.com/package/@goat-sdk/plugin-mode-governance) |
+| Mode Voting | Vote on a governance proposal on Mode | [@goat-sdk/plugin-mode-voting](https://www.npmjs.com/package/@goat-sdk/plugin-mode-voting) |
+| Mode Spray | Spray tokens on Mode | [@goat-sdk/plugin-mode-spray](https://www.npmjs.com/package/@goat-sdk/plugin-mode-spray) |
+| Nansen | Get Nansen information using Nansen API | [@goat-sdk/plugin-nansen](https://www.npmjs.com/package/@goat-sdk/plugin-nansen) |
+| OpenSea | Get nft and sales information using OpenSea API | [@goat-sdk/plugin-opensea](https://www.npmjs.com/package/@goat-sdk/plugin-opensea) |
+| Orca | Create positions on Orca | [@goat-sdk/plugin-orca](https://www.npmjs.com/package/@goat-sdk/plugin-orca) |
+| Polymarket | Bet on Polymarket | [@goat-sdk/plugin-polymarket](https://www.npmjs.com/package/@goat-sdk/plugin-polymarket) |
+| Pump.fun | Launch a token on Pump.fun | [@goat-sdk/plugin-pump-fun](https://www.npmjs.com/package/@goat-sdk/plugin-pump-fun) |
+| Renzo | Create a position on Renzo | [@goat-sdk/plugin-renzo](https://www.npmjs.com/package/@goat-sdk/plugin-renzo) |
+| Rugcheck | Check SPL token validity on Rugcheck | [@goat-sdk/plugin-rugcheck](https://www.npmjs.com/package/@goat-sdk/plugin-rugcheck) |
+| SNS | Interact with SNS | [@goat-sdk/plugin-sns](https://www.npmjs.com/package/@goat-sdk/plugin-sns) |
+| Solana Magic Eden | Purchase NFTs on Magic Eden | [@goat-sdk/plugin-solana-magiceden](https://www.npmjs.com/package/@goat-sdk/plugin-solana-magiceden) |
+| Solana NFTs | Get NFT information using Solana NFTs API | [@goat-sdk/plugin-solana-nfts](https://www.npmjs.com/package/@goat-sdk/plugin-solana-nfts) | |
+| SPL Tokens | Interact with SPL tokens | [@goat-sdk/plugin-spl-tokens](https://www.npmjs.com/package/@goat-sdk/plugin-spl-tokens) | |
+| Starknet Token | Interact with Starknet tokens | [@goat-sdk/plugin-starknet-token](https://www.npmjs.com/package/@goat-sdk/plugin-starknet-token) | |
+| Superfluid | Create streams with Superfluid | [@goat-sdk/plugin-superfluid](https://www.npmjs.com/package/@goat-sdk/plugin-superfluid) | |
+| Tensor | Purchase tokens on Tensor | [@goat-sdk/plugin-tensor](https://www.npmjs.com/package/@goat-sdk/plugin-tensor) | |
+| Uniswap | Swap tokens on Uniswap | [@goat-sdk/plugin-uniswap](https://www.npmjs.com/package/@goat-sdk/plugin-uniswap) | |
+| Velodrome | Create a position on Velodrome | [@goat-sdk/plugin-velodrome](https://www.npmjs.com/package/@goat-sdk/plugin-velodrome) | |
+| Worldstore | Purchase physical assets on Worldstore | [@goat-sdk/plugin-worldstore](https://www.npmjs.com/package/@goat-sdk/plugin-worldstore) | |
+| ZeroDev Global Address | Create a global address on ZeroDev | [@goat-sdk/plugin-zero-dev-global-address](https://www.npmjs.com/package/@goat-sdk/plugin-zero-dev-global-address) | |
+| Zilliqa | Interact with Zilliqa | [@goat-sdk/plugin-zilliqa](https://www.npmjs.com/package/@goat-sdk/plugin-zilliqa) | |
+
diff --git a/typescript/packages/core/src/types/Chain.ts b/typescript/packages/core/src/types/Chain.ts
index 6ca84c556..1017a37ab 100644
--- a/typescript/packages/core/src/types/Chain.ts
+++ b/typescript/packages/core/src/types/Chain.ts
@@ -10,7 +10,8 @@ export type Chain =
| FuelChain
| SuiChain
| ZilliqaChain
- | CosmosChain;
+ | CosmosChain
+ | StarknetChain;
export type SuiChain = {
type: "sui";
@@ -46,3 +47,7 @@ export type ZilliqaChain = {
export type CosmosChain = {
type: "cosmos";
};
+
+export type StarknetChain = {
+ type: "starknet";
+};
diff --git a/typescript/packages/plugins/0x/CHANGELOG.md b/typescript/packages/plugins/0x/CHANGELOG.md
index d584857c2..eda345099 100644
--- a/typescript/packages/plugins/0x/CHANGELOG.md
+++ b/typescript/packages/plugins/0x/CHANGELOG.md
@@ -1,5 +1,24 @@
# @goat-sdk/plugin-0x
+## 0.1.4
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
+## 0.1.3
+
+### Patch Changes
+
+- 7531ece: Update docs
+
+## 0.1.2
+
+### Patch Changes
+
+- 83439c5: Add tool to approve contract
+
## 0.1.1
### Patch Changes
diff --git a/typescript/packages/plugins/0x/README.md b/typescript/packages/plugins/0x/README.md
new file mode 100644
index 000000000..65ee0a8c3
--- /dev/null
+++ b/typescript/packages/plugins/0x/README.md
@@ -0,0 +1,26 @@
+# 0x GOAT Plugin
+
+Get quotes and swap on 0x
+
+## Installation
+```bash
+npm install @goat-sdk/plugin-0x
+```
+
+## Usage
+```typescript
+import { zeroEx } from '@goat-sdk/plugin-0x';
+
+const tools = await getOnChainTools({
+ wallet: // ...
+ plugins: [
+ zeroEx({
+ apiKey: process.env.ZEROEX_API_KEY
+ })
+ ]
+});
+```
+
+## Tools
+* Get quote
+* Swap
diff --git a/typescript/packages/plugins/0x/package.json b/typescript/packages/plugins/0x/package.json
index 6f84d41ee..b77ab7d35 100644
--- a/typescript/packages/plugins/0x/package.json
+++ b/typescript/packages/plugins/0x/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-0x",
- "version": "0.1.1",
+ "version": "0.1.4",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/0x/src/0x.service.ts b/typescript/packages/plugins/0x/src/0x.service.ts
index 1e6e9c761..f7000bb61 100644
--- a/typescript/packages/plugins/0x/src/0x.service.ts
+++ b/typescript/packages/plugins/0x/src/0x.service.ts
@@ -39,8 +39,8 @@ export class ZeroExService {
sellToken: parameters.sellToken,
buyToken: parameters.buyToken,
sellAmount: parameters.sellAmount,
- taker: parameters.taker,
- txOrigin: parameters.txOrigin,
+ taker: walletClient.getAddress(),
+ txOrigin: walletClient.getAddress(),
slippageBps: parameters.slippageBps?.toString(),
};
@@ -64,4 +64,12 @@ export class ZeroExService {
return tx.hash;
}
+
+ @Tool({
+ name: "0x_get_contract_address_to_give_allowance_for_swap",
+ description: "Get the contract address to give allowance for a swap",
+ })
+ async getContractAddressToGiveAllowanceForSwap(walletClient: EVMWalletClient, parameters: GetQuoteParameters) {
+ return "0x0000000000001fF3684f28c67538d4D072C22734";
+ }
}
diff --git a/typescript/packages/plugins/0x/src/parameters.ts b/typescript/packages/plugins/0x/src/parameters.ts
index 165d3440b..4066b3550 100644
--- a/typescript/packages/plugins/0x/src/parameters.ts
+++ b/typescript/packages/plugins/0x/src/parameters.ts
@@ -7,15 +7,6 @@ export class GetQuoteParameters extends createToolParameters(
sellToken: z.string().describe("The token to sell"),
buyToken: z.string().describe("The token to buy"),
sellAmount: z.string().describe("The amount of tokens to sell in base units"),
- taker: z
- .string()
- .describe("The address which holds the sellToken balance and has the allowance set for the swap"),
- txOrigin: z
- .string()
- .optional()
- .describe(
- "The contract address of the external account that started the transaction. This is only needed if taker is a smart contract.",
- ),
slippageBps: z
.number()
.optional()
diff --git a/typescript/packages/plugins/1inch/CHANGELOG.md b/typescript/packages/plugins/1inch/CHANGELOG.md
index 3a63dd03a..a8b2b096d 100644
--- a/typescript/packages/plugins/1inch/CHANGELOG.md
+++ b/typescript/packages/plugins/1inch/CHANGELOG.md
@@ -1,5 +1,18 @@
# @goat-sdk/plugin-1inch
+## 0.1.4
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
+## 0.1.3
+
+### Patch Changes
+
+- 7531ece: Update docs
+
## 0.1.2
### Patch Changes
diff --git a/typescript/packages/plugins/1inch/README.md b/typescript/packages/plugins/1inch/README.md
new file mode 100644
index 000000000..5c9b2bb89
--- /dev/null
+++ b/typescript/packages/plugins/1inch/README.md
@@ -0,0 +1,25 @@
+# 1inch GOAT Plugin
+
+Get balances for different tokens for a wallet using the 1inch API.
+
+## Installation
+```bash
+npm install @goat-sdk/plugin-1inch
+```
+
+## Usage
+```typescript
+import { oneInch } from '@goat-sdk/plugin-1inch';
+
+const tools = await getOnChainTools({
+ wallet: // ...
+ plugins: [
+ oneInch({
+ apiKey: process.env.ONEINCH_API_KEY
+ })
+ ]
+});
+```
+
+## Tools
+* Get balances
diff --git a/typescript/packages/plugins/1inch/package.json b/typescript/packages/plugins/1inch/package.json
index 7ba184dd2..a4b155669 100644
--- a/typescript/packages/plugins/1inch/package.json
+++ b/typescript/packages/plugins/1inch/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-1inch",
- "version": "0.1.2",
+ "version": "0.1.4",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/1inch/src/index.ts b/typescript/packages/plugins/1inch/src/index.ts
index c7c4a5fd4..39b9a61b2 100644
--- a/typescript/packages/plugins/1inch/src/index.ts
+++ b/typescript/packages/plugins/1inch/src/index.ts
@@ -1,3 +1 @@
-export * from "./balance.service";
-export * from "./parameters";
-export * from "./types";
+export * from "./plugin";
diff --git a/typescript/packages/plugins/1inch/src/plugin.ts b/typescript/packages/plugins/1inch/src/plugin.ts
new file mode 100644
index 000000000..87304c936
--- /dev/null
+++ b/typescript/packages/plugins/1inch/src/plugin.ts
@@ -0,0 +1,20 @@
+import { PluginBase } from "@goat-sdk/core";
+import { Chain } from "@goat-sdk/core";
+import { EVMWalletClient } from "@goat-sdk/wallet-evm";
+import { BalanceService } from "./service";
+
+export type OneInchCtorParams = {
+ apiKey: string;
+};
+
+export class OneInchPlugin extends PluginBase {
+ constructor(params: OneInchCtorParams) {
+ super("1inch", [new BalanceService(params)]);
+ }
+
+ supportsChain = (chain: Chain) => chain.type === "evm";
+}
+
+export function oneInch(params: OneInchCtorParams) {
+ return new OneInchPlugin(params);
+}
diff --git a/typescript/packages/plugins/1inch/src/balance.service.ts b/typescript/packages/plugins/1inch/src/service.ts
similarity index 100%
rename from typescript/packages/plugins/1inch/src/balance.service.ts
rename to typescript/packages/plugins/1inch/src/service.ts
diff --git a/typescript/packages/plugins/avnu/CHANGELOG.md b/typescript/packages/plugins/avnu/CHANGELOG.md
new file mode 100644
index 000000000..b298c3bf4
--- /dev/null
+++ b/typescript/packages/plugins/avnu/CHANGELOG.md
@@ -0,0 +1,7 @@
+# @goat-sdk/plugin-avnu
+
+## 0.1.1
+
+### Patch Changes
+
+- 33d391d: Release package
diff --git a/typescript/packages/plugins/avnu/README.md b/typescript/packages/plugins/avnu/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/typescript/packages/plugins/avnu/package.json b/typescript/packages/plugins/avnu/package.json
new file mode 100644
index 000000000..eda4c798d
--- /dev/null
+++ b/typescript/packages/plugins/avnu/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "@goat-sdk/plugin-avnu",
+ "version": "0.1.1",
+ "files": ["dist/**/*", "README.md", "package.json"],
+ "scripts": {
+ "build": "tsup",
+ "clean": "rm -rf dist",
+ "test": "vitest run --passWithNoTests"
+ },
+ "sideEffects": false,
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "description": "",
+ "dependencies": {
+ "@avnu/avnu-sdk": "^3.0.0",
+ "@goat-sdk/core": "workspace:*",
+ "@goat-sdk/wallet-starknet": "workspace:*",
+ "@types/dotenv": "^8.2.3",
+ "dotenv": "^16.4.7",
+ "ethers": "^6.13.4",
+ "get-starknet": "^3.3.3",
+ "starknet": "^6.11.0",
+ "zod": "catalog:"
+ },
+ "peerDependencies": {
+ "viem": "catalog:",
+ "@goat-sdk/core": "workspace:*"
+ },
+ "homepage": "https://ohmygoat.dev",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/goat-sdk/goat.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/goat-sdk/goat/issues"
+ },
+ "keywords": ["ai", "agents", "web3"]
+}
diff --git a/typescript/packages/plugins/avnu/src/avnu.plugin.ts b/typescript/packages/plugins/avnu/src/avnu.plugin.ts
new file mode 100644
index 000000000..65a71095e
--- /dev/null
+++ b/typescript/packages/plugins/avnu/src/avnu.plugin.ts
@@ -0,0 +1,13 @@
+import { type Chain, PluginBase } from "@goat-sdk/core";
+import { StarknetWalletClient } from "@goat-sdk/wallet-starknet";
+import { AvnuService } from "./avnu.service";
+
+export class AvnuPlugin extends PluginBase {
+ constructor() {
+ super("avnu", [new AvnuService()]);
+ }
+
+ supportsChain = (chain: Chain) => chain.type === "starknet";
+}
+
+export const avnu = () => new AvnuPlugin();
diff --git a/typescript/packages/plugins/avnu/src/avnu.service.ts b/typescript/packages/plugins/avnu/src/avnu.service.ts
new file mode 100644
index 000000000..1998e5cb6
--- /dev/null
+++ b/typescript/packages/plugins/avnu/src/avnu.service.ts
@@ -0,0 +1,100 @@
+import { type Quote, executeSwap, fetchQuotes } from "@avnu/avnu-sdk";
+import { Tool } from "@goat-sdk/core";
+import { StarknetAccountWalletClient } from "@goat-sdk/wallet-starknet";
+import { SwapConfigParams } from "./parameters";
+
+export class AvnuService {
+ private options = {
+ baseUrl: "https://starknet.api.avnu.fi",
+ };
+
+ private async getQuote(params: {
+ sellTokenAddress: string;
+ buyTokenAddress: string;
+ sellAmount: string;
+ }): Promise {
+ try {
+ const sellAmountBigInt = BigInt(params.sellAmount);
+
+ const quotes = await fetchQuotes(
+ {
+ sellTokenAddress: params.sellTokenAddress,
+ buyTokenAddress: params.buyTokenAddress,
+ sellAmount: sellAmountBigInt,
+ },
+ this.options,
+ );
+
+ if (!quotes || quotes.length === 0) {
+ throw new Error("No quotes found");
+ }
+
+ return quotes;
+ } catch (error) {
+ if (error instanceof Error && error.message.includes("BigInt")) {
+ throw new Error(`Invalid sellAmount format: ${params.sellAmount}`);
+ }
+ throw new Error(`Error fetching quotes: ${error}`);
+ }
+ }
+
+ @Tool({
+ name: "executeSwap",
+ description: `Executes a token swap on Avnu DEX.
+ IMPORTANT: Never use placeholder any kind of placeholder values.
+ Always get actual token addresses and converted amounts before executing a swap.
+ You are a helpful assistant that executes token swaps on Starknet.
+
+To perform a swap, you MUST follow these steps in order and use the EXACT values returned from each tool:
+
+1. Get token addresses:
+ For each token (sell and buy), either:
+ - If a symbol is provided (like ETH, USDC, STARK): use get_token_info_by_symbol
+ - If an address is provided: use that address directly
+ Save both addresses for use in step 3
+
+2. Use convert_to_base_unit:
+ - Use the amount from user's request
+ - Save the exact number returned
+
+3. Use executeSwap:
+ - sellTokenAddress: Use the address from step 1 for sell token
+ - buyTokenAddress: Use the address from step 1 for buy token
+ - sellAmount: Use the EXACT number from step 2
+
+Example flows:
+1. Using symbols:
+ - get_token_info_by_symbol("USDC") -> returns address1
+ - get_token_info_by_symbol("STARK") -> returns address2
+ - convert_to_base_unit("0.01") -> returns amount
+ - executeSwap with {sellTokenAddress: address1, buyTokenAddress: address2, sellAmount: amount}
+
+2. Using addresses:
+ - Sell token address provided directly: 0x123...
+ - Buy token address provided directly: 0x456...
+ - convert_to_base_unit("0.01") -> returns amount
+ - executeSwap with {sellTokenAddress: "0x123...", buyTokenAddress: "0x456...", sellAmount: amount}
+
+DO NOT proceed to the next step until you have the actual values from the current step.
+DO NOT use placeholder values like or .`,
+ })
+ async executeSwap(walletClient: StarknetAccountWalletClient, params: SwapConfigParams) {
+ try {
+ const quotes = await this.getQuote(params);
+ const bestQuote = quotes[0]; // Assuming the first quote is the best one
+
+ const swapResponse = await executeSwap(
+ walletClient.getAccount(),
+ bestQuote,
+ {
+ executeApprove: true,
+ slippage: params.slippage,
+ },
+ this.options,
+ );
+ return swapResponse;
+ } catch (error) {
+ throw new Error(`Error executing swap: ${error}`);
+ }
+ }
+}
diff --git a/typescript/packages/plugins/avnu/src/index.ts b/typescript/packages/plugins/avnu/src/index.ts
new file mode 100644
index 000000000..25c6009c4
--- /dev/null
+++ b/typescript/packages/plugins/avnu/src/index.ts
@@ -0,0 +1 @@
+export * from "./avnu.plugin";
diff --git a/typescript/packages/plugins/avnu/src/parameters.ts b/typescript/packages/plugins/avnu/src/parameters.ts
new file mode 100644
index 000000000..97beac4ae
--- /dev/null
+++ b/typescript/packages/plugins/avnu/src/parameters.ts
@@ -0,0 +1,19 @@
+import { createToolParameters } from "@goat-sdk/core";
+import { z } from "zod";
+
+export const SwapConfigSchema = z.object({
+ sellTokenAddress: z
+ .string()
+ .regex(/^0x[a-fA-F0-9]{64}$/, "Must be a valid Starknet address (0x followed by 64 hex characters)")
+ .describe("The address of the token to sell"),
+
+ buyTokenAddress: z
+ .string()
+ .regex(/^0x[a-fA-F0-9]{64}$/, "Must be a valid Starknet address (0x followed by 64 hex characters)")
+ .describe("The address of the token to buy"),
+
+ sellAmount: z.string().describe("The amount of tokens to sell in base units"),
+ slippage: z.number().min(0).max(0.5).describe("Slippage tolerance (default: 0.3 = 30%)").default(0.3),
+});
+
+export class SwapConfigParams extends createToolParameters(SwapConfigSchema) {}
diff --git a/typescript/packages/plugins/avnu/src/types/index.ts b/typescript/packages/plugins/avnu/src/types/index.ts
new file mode 100644
index 000000000..eea524d65
--- /dev/null
+++ b/typescript/packages/plugins/avnu/src/types/index.ts
@@ -0,0 +1 @@
+export * from "./types";
diff --git a/typescript/packages/plugins/avnu/src/types/types.ts b/typescript/packages/plugins/avnu/src/types/types.ts
new file mode 100644
index 000000000..cb9a263c9
--- /dev/null
+++ b/typescript/packages/plugins/avnu/src/types/types.ts
@@ -0,0 +1,14 @@
+export interface ConfigSchema {
+ base_url: string;
+ Starknet_rpc: string;
+ private_key: string;
+ account_address: string;
+}
+
+export interface GetQuoteBodySchema {
+ sellTokenAddress: string;
+ buyTokenAddress: string;
+ sellAmount: bigint;
+ takerAddress: string;
+ size: number;
+}
diff --git a/typescript/packages/plugins/avnu/tsconfig.json b/typescript/packages/plugins/avnu/tsconfig.json
new file mode 100644
index 000000000..b4ae67c1f
--- /dev/null
+++ b/typescript/packages/plugins/avnu/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "../../../tsconfig.base.json",
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/typescript/packages/plugins/avnu/tsup.config.ts b/typescript/packages/plugins/avnu/tsup.config.ts
new file mode 100644
index 000000000..2d38789ad
--- /dev/null
+++ b/typescript/packages/plugins/avnu/tsup.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "tsup";
+import { treeShakableConfig } from "../../../tsup.config.base";
+
+export default defineConfig({
+ ...treeShakableConfig,
+});
diff --git a/typescript/packages/plugins/balancer/CHANGELOG.md b/typescript/packages/plugins/balancer/CHANGELOG.md
new file mode 100644
index 000000000..d7d821eba
--- /dev/null
+++ b/typescript/packages/plugins/balancer/CHANGELOG.md
@@ -0,0 +1,8 @@
+# @goat-sdk/plugin-balancer
+
+## 0.1.9
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
diff --git a/typescript/packages/plugins/balancer/package.json b/typescript/packages/plugins/balancer/package.json
new file mode 100644
index 000000000..dfa9b6476
--- /dev/null
+++ b/typescript/packages/plugins/balancer/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "@goat-sdk/plugin-balancer",
+ "version": "0.1.9",
+ "files": ["dist/**/*", "README.md", "package.json"],
+ "scripts": {
+ "build": "tsup",
+ "clean": "rm -rf dist",
+ "test": "vitest run --passWithNoTests"
+ },
+ "sideEffects": false,
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "dependencies": {
+ "@balancer/sdk": "^1.1.0",
+ "@goat-sdk/core": "workspace:*",
+ "@goat-sdk/wallet-evm": "workspace:*",
+ "viem": "catalog:",
+ "zod": "catalog:"
+ },
+ "peerDependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "viem": "catalog:"
+ },
+ "homepage": "https://ohmygoat.dev",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/goat-sdk/goat.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/goat-sdk/goat/issues"
+ },
+ "keywords": ["ai", "agents", "web3"]
+}
diff --git a/typescript/packages/plugins/balancer/src/balancer.plugin.ts b/typescript/packages/plugins/balancer/src/balancer.plugin.ts
new file mode 100644
index 000000000..4f5667e56
--- /dev/null
+++ b/typescript/packages/plugins/balancer/src/balancer.plugin.ts
@@ -0,0 +1,22 @@
+import { Chain, PluginBase } from "@goat-sdk/core";
+import { arbitrum, avalanche, base, fraxtal, gnosis, mode, optimism, polygon, polygonZkEvm } from "viem/chains";
+import { BalancerService } from "./balancer.service";
+
+export type BalancerConfig = {
+ rpcUrl: string;
+ apiUrl?: string;
+};
+
+const SUPPORTED_CHAINS = [mode, base, polygon, gnosis, arbitrum, avalanche, optimism, polygonZkEvm, fraxtal];
+
+export class BalancerPlugin extends PluginBase {
+ constructor(config: BalancerConfig) {
+ super("balancer", [new BalancerService(config)]);
+ }
+
+ supportsChain = (chain: Chain) => chain.type === "evm" && SUPPORTED_CHAINS.some((c) => c.id === chain.id);
+}
+
+export function balancer(config: BalancerConfig) {
+ return new BalancerPlugin(config);
+}
diff --git a/typescript/packages/plugins/balancer/src/balancer.service.ts b/typescript/packages/plugins/balancer/src/balancer.service.ts
new file mode 100644
index 000000000..d2ff0fd25
--- /dev/null
+++ b/typescript/packages/plugins/balancer/src/balancer.service.ts
@@ -0,0 +1,186 @@
+import {
+ AddLiquidity,
+ AddLiquidityInput,
+ AddLiquidityKind,
+ BalancerApi,
+ ChainId,
+ InputAmount,
+ RemoveLiquidity,
+ RemoveLiquidityInput,
+ RemoveLiquidityKind,
+ Slippage,
+ Swap,
+ SwapBuildOutputExactIn,
+ SwapKind,
+ Token,
+ TokenAmount,
+} from "@balancer/sdk";
+import { Tool } from "@goat-sdk/core";
+import { EVMWalletClient } from "@goat-sdk/wallet-evm";
+import { BalancerConfig } from "./balancer.plugin";
+import { LiquidityParameters, RemoveLiquidityParameters, SwapParameters } from "./parameters";
+
+export class BalancerService {
+ private rpcUrl: string;
+ private apiUrl: string;
+
+ constructor(config: BalancerConfig) {
+ this.rpcUrl = config.rpcUrl;
+ this.apiUrl = config.apiUrl ?? "https://api-v3.balancer.fi/";
+ }
+
+ private getBalancerApi(chainId: ChainId) {
+ return new BalancerApi(this.apiUrl, chainId);
+ }
+
+ @Tool({
+ name: "swap_on_balancer",
+ description: "Swap a token on Balancer using Smart Order Router",
+ })
+ async swapOnBalancer(walletClient: EVMWalletClient, parameters: SwapParameters) {
+ const chainId = walletClient.getChain().id as ChainId;
+ const balancerApi = this.getBalancerApi(chainId);
+
+ const tokenIn = new Token(chainId, parameters.tokenIn as `0x${string}`, parameters.tokenInDecimals);
+ const tokenOut = new Token(chainId, parameters.tokenOut as `0x${string}`, parameters.tokenOutDecimals);
+ const swapAmount = TokenAmount.fromRawAmount(tokenIn, parameters.amountIn);
+
+ const sorPaths = await balancerApi.sorSwapPaths.fetchSorSwapPaths({
+ chainId,
+ tokenIn: tokenIn.address,
+ tokenOut: tokenOut.address,
+ swapKind: SwapKind.GivenIn,
+ swapAmount,
+ });
+
+ const swap = new Swap({
+ chainId,
+ paths: sorPaths,
+ swapKind: SwapKind.GivenIn,
+ });
+
+ const updated = await swap.query(this.rpcUrl);
+
+ const callData = swap.buildCall({
+ slippage: Slippage.fromPercentage(`${Number(parameters.slippage)}`),
+ deadline: BigInt(Math.floor(Date.now() / 1000) + (parameters.deadline || 3600)),
+ queryOutput: updated,
+ wethIsEth: parameters.wethIsEth ?? false,
+ sender: walletClient.getAddress() as `0x${string}`,
+ recipient: walletClient.getAddress() as `0x${string}`,
+ }) as SwapBuildOutputExactIn;
+
+ const tx = await walletClient.sendTransaction({
+ to: callData.to as `0x${string}`,
+ value: callData.value,
+ data: callData.callData,
+ });
+
+ return {
+ success: true,
+ data: {
+ amountOut: callData.minAmountOut.amount.toString(),
+ txHash: tx.hash,
+ },
+ };
+ }
+
+ @Tool({
+ name: "add_liquidity_to_balancer",
+ description: "Add liquidity to a Balancer pool",
+ })
+ async addLiquidity(walletClient: EVMWalletClient, parameters: LiquidityParameters) {
+ const chainId = walletClient.getChain().id as ChainId;
+ const balancerApi = this.getBalancerApi(chainId);
+
+ const poolState = await balancerApi.pools.fetchPoolState(parameters.pool as `0x${string}`);
+
+ const amountsIn = parameters.amounts.map((amount: { amount: string; decimals: number; token: string }) => ({
+ rawAmount: BigInt(amount.amount),
+ decimals: amount.decimals,
+ address: amount.token as `0x${string}`,
+ }));
+
+ const addLiquidityInput: AddLiquidityInput = {
+ chainId,
+ rpcUrl: this.rpcUrl,
+ amountsIn,
+ kind: AddLiquidityKind.Unbalanced,
+ };
+
+ const addLiquidity = new AddLiquidity();
+ const queryOutput = await addLiquidity.query(addLiquidityInput, poolState);
+
+ const call = addLiquidity.buildCall({
+ ...queryOutput,
+ slippage: Slippage.fromPercentage(`${Number(parameters.slippage)}`),
+ chainId,
+ wethIsEth: parameters.wethIsEth ?? false,
+ });
+
+ const tx = await walletClient.sendTransaction({
+ to: call.to as `0x${string}`,
+ value: call.value,
+ data: call.callData,
+ });
+
+ return {
+ success: true,
+ data: {
+ bptOut: queryOutput.bptOut.amount.toString(),
+ txHash: tx.hash,
+ },
+ };
+ }
+
+ @Tool({
+ name: "remove_liquidity_from_balancer",
+ description: "Remove liquidity from a Balancer pool proportionally",
+ })
+ async removeLiquidity(walletClient: EVMWalletClient, parameters: RemoveLiquidityParameters) {
+ const chainId = walletClient.getChain().id as ChainId;
+ const balancerApi = this.getBalancerApi(chainId);
+
+ const poolState = await balancerApi.pools.fetchPoolState(parameters.pool as `0x${string}`);
+
+ const bptIn: InputAmount = {
+ rawAmount: BigInt(parameters.bptAmountIn),
+ decimals: 18, // BPT tokens always have 18 decimals
+ address: poolState.address,
+ };
+
+ const removeLiquidityInput: RemoveLiquidityInput = {
+ chainId,
+ rpcUrl: this.rpcUrl,
+ bptIn,
+ kind: RemoveLiquidityKind.Proportional,
+ };
+
+ const removeLiquidity = new RemoveLiquidity();
+ const queryOutput = await removeLiquidity.query(removeLiquidityInput, poolState);
+
+ const call = removeLiquidity.buildCall({
+ ...queryOutput,
+ slippage: Slippage.fromPercentage(`${Number(parameters.slippage)}`),
+ chainId,
+ wethIsEth: parameters.wethIsEth ?? false,
+ });
+
+ const tx = await walletClient.sendTransaction({
+ to: call.to as `0x${string}`,
+ value: call.value,
+ data: call.callData,
+ });
+
+ return {
+ success: true,
+ data: {
+ amountsOut: queryOutput.amountsOut.map((amount) => ({
+ token: amount.token.address,
+ amount: amount.amount.toString(),
+ })),
+ txHash: tx.hash,
+ },
+ };
+ }
+}
diff --git a/typescript/packages/plugins/balancer/src/index.ts b/typescript/packages/plugins/balancer/src/index.ts
new file mode 100644
index 000000000..05dbf443f
--- /dev/null
+++ b/typescript/packages/plugins/balancer/src/index.ts
@@ -0,0 +1,2 @@
+export { BalancerPlugin, balancer } from "./balancer.plugin";
+export type { SwapParameters, LiquidityParameters } from "./parameters";
diff --git a/typescript/packages/plugins/balancer/src/parameters.ts b/typescript/packages/plugins/balancer/src/parameters.ts
new file mode 100644
index 000000000..fcaa13712
--- /dev/null
+++ b/typescript/packages/plugins/balancer/src/parameters.ts
@@ -0,0 +1,52 @@
+import { createToolParameters } from "@goat-sdk/core";
+import { z } from "zod";
+
+const hexAddress = z.string().regex(/^0x[a-fA-F0-9]{40}$/);
+
+export class SwapParameters extends createToolParameters(
+ z.object({
+ tokenIn: hexAddress.describe("The address of the input token"),
+ tokenOut: hexAddress.describe("The address of the output token"),
+ tokenInDecimals: z.number().describe("The number of decimals for the input token"),
+ tokenOutDecimals: z.number().describe("The number of decimals for the output token"),
+ amountIn: z.string().describe("The amount of input tokens to swap (in basis points/wei)"),
+ slippage: z.string().default("0.1").describe("Maximum slippage allowed (in percentage)"),
+ deadline: z.number().optional().describe("Transaction deadline (in seconds)"),
+ wethIsEth: z.boolean().default(false).describe("Whether to use ETH instead of WETH"),
+ }),
+) {}
+
+const TokenAmount = z.object({
+ token: hexAddress.describe("Token address"),
+ amount: z.string().describe("Token amount (in basis points/wei)"),
+ decimals: z.number().describe("Token decimals"),
+});
+
+export class LiquidityParameters extends createToolParameters(
+ z.object({
+ pool: hexAddress.describe("The address of the Balancer pool"),
+ amounts: z
+ .array(
+ z.object({
+ token: hexAddress.describe("Token address"),
+ amount: z.string().describe("Token amount (in basis points/wei)"),
+ decimals: z.number().describe("Token decimals"),
+ }),
+ )
+ .describe("Array of token amounts to add as liquidity"),
+ kind: z.enum(["Unbalanced", "Exact"]).describe("Type of liquidity addition"),
+ slippage: z.string().default("0.1").describe("Maximum slippage allowed (in percentage)"),
+ deadline: z.number().optional().describe("Transaction deadline (in seconds)"),
+ wethIsEth: z.boolean().default(false).describe("Whether to use ETH instead of WETH"),
+ }),
+) {}
+
+export class RemoveLiquidityParameters extends createToolParameters(
+ z.object({
+ pool: hexAddress.describe("The address of the Balancer pool"),
+ bptAmountIn: z.string().describe("Amount of BPT tokens to remove"),
+ kind: z.enum(["Proportional", "Single"]).describe("Type of liquidity removal"),
+ slippage: z.string().default("0.1").describe("Maximum slippage allowed (in percentage)"),
+ wethIsEth: z.boolean().default(false).describe("Whether to unwrap WETH to ETH"),
+ }),
+) {}
diff --git a/typescript/packages/plugins/balancer/tsconfig.json b/typescript/packages/plugins/balancer/tsconfig.json
new file mode 100644
index 000000000..86200e6c7
--- /dev/null
+++ b/typescript/packages/plugins/balancer/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "../../../tsconfig.base.json",
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "src/parameters.ts"]
+}
diff --git a/typescript/packages/plugins/balancer/tsup.config.ts b/typescript/packages/plugins/balancer/tsup.config.ts
new file mode 100644
index 000000000..2d38789ad
--- /dev/null
+++ b/typescript/packages/plugins/balancer/tsup.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "tsup";
+import { treeShakableConfig } from "../../../tsup.config.base";
+
+export default defineConfig({
+ ...treeShakableConfig,
+});
diff --git a/typescript/packages/plugins/balancer/turbo.json b/typescript/packages/plugins/balancer/turbo.json
new file mode 100644
index 000000000..45f951676
--- /dev/null
+++ b/typescript/packages/plugins/balancer/turbo.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://turbo.build/schema.json",
+ "extends": ["//"],
+ "tasks": {
+ "build": {
+ "inputs": ["src/**", "tsup.config.ts", "!./**/*.test.{ts,tsx}", "tsconfig.json"],
+ "dependsOn": ["^build"],
+ "outputs": ["dist/**"]
+ }
+ }
+}
diff --git a/typescript/packages/plugins/balmy/CHANGELOG.md b/typescript/packages/plugins/balmy/CHANGELOG.md
new file mode 100644
index 000000000..147c1d227
--- /dev/null
+++ b/typescript/packages/plugins/balmy/CHANGELOG.md
@@ -0,0 +1,14 @@
+# @goat-sdk/plugin-balmy
+
+## 0.1.10
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
+## 0.1.9
+
+### Patch Changes
+
+- 9fa3d47: Release package
diff --git a/typescript/packages/plugins/balmy/README.md b/typescript/packages/plugins/balmy/README.md
new file mode 100644
index 000000000..b3e0ae72f
--- /dev/null
+++ b/typescript/packages/plugins/balmy/README.md
@@ -0,0 +1,90 @@
+# Goat Balmy Plugin π - TypeScript
+
+Balmy plugin for [Goat π](https://ohmygoat.dev). Allows you to create tools for interacting with the Balmy protocol - a state-of-the-art DCA (Dollar Cost Average) protocol that enables users to DCA any ERC20 into any ERC20 with their preferred period frequency.
+
+## Installation
+```bash
+npm install @goat-sdk/plugin-balmy
+```
+
+## Usage
+
+```typescript
+import { balmy } from "@goat-sdk/plugin-balmy";
+
+// Initialize the plugin
+const plugin = balmy();
+
+// Get token balances across chains
+const balances = await plugin.getBalance({
+ account: "0x...",
+ tokens: {
+ 1: [
+ "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // USDC on Ethereum
+ "0x6b175474e89094c44da98b954eedeac495271d0f" // DAI on Ethereum
+ ],
+ 10: [
+ "0x7f5c764cbc14f9669b88837ca1490cca17c31607", // USDC on Optimism
+ "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1" // DAI on Optimism
+ ]
+ }
+});
+
+// Check token allowances
+const allowances = await plugin.getAllowance({
+ chainId: 1,
+ token: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // USDC
+ owner: "0x...",
+ spenders: ["0x..."]
+});
+
+// Get swap quotes
+const quotes = await plugin.getQuote({
+ chainId: 1,
+ sellToken: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // USDC
+ buyToken: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // WETH
+ order: {
+ type: "sell",
+ sellAmount: "1000000" // 1 USDC (6 decimals)
+ },
+ slippagePercentage: 1, // 1% slippage
+ gasSpeed: {
+ speed: "instant"
+ }
+});
+
+// Execute a swap with the best quote
+const tx = await plugin.executeSwap({
+ chainId: 1,
+ sellToken: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // USDC
+ buyToken: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", // WETH
+ order: {
+ type: "sell",
+ sellAmount: "1000000" // 1 USDC (6 decimals)
+ },
+ slippagePercentage: 1 // 1% slippage
+});
+```
+
+## Features
+
+- Get token balances across multiple chains
+- Check token allowances for multiple spenders
+- Get quotes from DEX aggregators for token swaps
+- Execute swaps using the best available quote
+- Built-in permit2 support for gasless approvals
+- Support for multiple EVM chains
+
+## Working example
+
+See the [Vercel AI example](https://github.com/goat-sdk/goat/tree/main/typescript/examples/vercel-ai/balmy) for a working example of how to use the Balmy plugin.
+
+## Goat
+
+
+Go out and eat some grass.
+
+[Docs](https://ohmygoat.dev) | [Examples](https://github.com/goat-sdk/goat/tree/main/typescript/examples) | [Discord](https://discord.gg/2F8zTVnnFz)
+
+## Goat π
+Goat π (Great Onchain Agent Toolkit) is an open-source library enabling AI agents to interact with blockchain protocols and smart contracts via their own wallets.
\ No newline at end of file
diff --git a/typescript/packages/plugins/balmy/package.json b/typescript/packages/plugins/balmy/package.json
new file mode 100644
index 000000000..6a0bed3d9
--- /dev/null
+++ b/typescript/packages/plugins/balmy/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "@goat-sdk/plugin-balmy",
+ "version": "0.1.10",
+ "files": ["dist/**/*", "README.md", "package.json"],
+ "scripts": {
+ "build": "tsup",
+ "clean": "rm -rf dist",
+ "test": "vitest run --passWithNoTests"
+ },
+ "sideEffects": false,
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "dependencies": {
+ "@balmy/sdk": "0.6.1",
+ "@goat-sdk/core": "workspace:*",
+ "@goat-sdk/wallet-evm": "workspace:*",
+ "viem": "catalog:",
+ "zod": "catalog:"
+ },
+ "peerDependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "viem": "catalog:"
+ },
+ "homepage": "https://ohmygoat.dev",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/goat-sdk/goat.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/goat-sdk/goat/issues"
+ },
+ "keywords": ["ai", "agents", "web3"]
+}
diff --git a/typescript/packages/plugins/balmy/src/balmy.plugin.ts b/typescript/packages/plugins/balmy/src/balmy.plugin.ts
new file mode 100644
index 000000000..04dc824a8
--- /dev/null
+++ b/typescript/packages/plugins/balmy/src/balmy.plugin.ts
@@ -0,0 +1,14 @@
+import { type Chain, PluginBase } from "@goat-sdk/core";
+import { BalmyService } from "./balmy.service";
+
+export class BalmyPlugin extends PluginBase {
+ constructor() {
+ super("balmy", [new BalmyService()]);
+ }
+
+ supportsChain = (chain: Chain) => chain.type === "evm";
+}
+
+export function balmy() {
+ return new BalmyPlugin();
+}
diff --git a/typescript/packages/plugins/balmy/src/balmy.service.ts b/typescript/packages/plugins/balmy/src/balmy.service.ts
new file mode 100644
index 000000000..33d6b4a2b
--- /dev/null
+++ b/typescript/packages/plugins/balmy/src/balmy.service.ts
@@ -0,0 +1,101 @@
+import { QuoteRequest, buildSDK } from "@balmy/sdk";
+import { Tool } from "@goat-sdk/core";
+import { EVMWalletClient } from "@goat-sdk/wallet-evm";
+import { ExecuteSwapParameters, GetQuoteParameters } from "./parameters";
+
+export class BalmyService {
+ private sdk;
+
+ constructor() {
+ this.sdk = buildSDK();
+ }
+
+ @Tool({
+ description: "Get quotes for a token swap using Balmy",
+ })
+ async getQuote(walletClient: EVMWalletClient, parameters: GetQuoteParameters) {
+ const chainid = await walletClient.getChain().id;
+
+ const request: QuoteRequest = {
+ chainId: chainid,
+ sellToken: parameters.tokenIn,
+ buyToken: parameters.tokenOut,
+ order:
+ parameters.order.type === "sell"
+ ? {
+ type: "sell",
+ sellAmount: parameters.order.amount,
+ }
+ : {
+ type: "buy",
+ buyAmount: parameters.order.amount,
+ },
+ slippagePercentage: parameters.slippagePercentage,
+ takerAddress: parameters.takerAddress || "0x0000000000000000000000000000000000000000",
+ };
+
+ const quotes = await this.sdk.quoteService.getAllQuotesWithTxs({
+ request: request,
+ config: {
+ timeout: "10s",
+ },
+ });
+
+ // Convert BigInt values to strings for logging and return
+ const quotesForLog = quotes.map((quote) => ({
+ ...quote,
+ sellAmount: {
+ ...quote.sellAmount,
+ amount: quote.sellAmount.amount.toString(),
+ },
+ buyAmount: {
+ ...quote.buyAmount,
+ amount: quote.buyAmount.amount.toString(),
+ },
+ maxSellAmount: {
+ ...quote.maxSellAmount,
+ amount: quote.maxSellAmount.amount.toString(),
+ },
+ minBuyAmount: {
+ ...quote.minBuyAmount,
+ amount: quote.minBuyAmount.amount.toString(),
+ },
+ gas: {
+ ...quote?.gas,
+ estimatedGas: quote?.gas?.estimatedGas?.toString() ?? "0",
+ estimatedCost: quote?.gas?.estimatedCost?.toString() ?? "0",
+ },
+ tx: {
+ ...quote.tx,
+ value: (quote.tx?.value ?? 0n).toString(),
+ },
+ customData: {
+ ...quote.customData,
+ tx: {
+ ...quote.customData.tx,
+ value: (quote.customData.tx?.value ?? 0n).toString(),
+ },
+ },
+ }));
+
+ return quotesForLog[0];
+ }
+
+ @Tool({
+ description:
+ "Execute a swap using the best quote using Balmy, also ensure that ERC20 approval is done before calling this",
+ })
+ async executeSwap(walletClient: EVMWalletClient, parameters: ExecuteSwapParameters) {
+ const bestQuote = await this.getQuote(walletClient, parameters);
+
+ const data = bestQuote.tx.data as `0x${string}`;
+
+ const swaptxn = await walletClient.sendTransaction({
+ to: bestQuote.tx.to,
+ value: BigInt(bestQuote.tx.value),
+ data: data,
+ });
+
+ return swaptxn.hash;
+ }
+}
diff --git a/typescript/packages/plugins/balmy/src/index.ts b/typescript/packages/plugins/balmy/src/index.ts
new file mode 100644
index 000000000..ef9e01e8c
--- /dev/null
+++ b/typescript/packages/plugins/balmy/src/index.ts
@@ -0,0 +1,5 @@
+export { balmy, BalmyPlugin } from "./balmy.plugin";
+export {
+ GetQuoteParameters,
+ ExecuteSwapParameters,
+} from "./parameters";
diff --git a/typescript/packages/plugins/balmy/src/parameters.ts b/typescript/packages/plugins/balmy/src/parameters.ts
new file mode 100644
index 000000000..c960a6c88
--- /dev/null
+++ b/typescript/packages/plugins/balmy/src/parameters.ts
@@ -0,0 +1,21 @@
+// @ts-nocheck
+import { createToolParameters } from "@goat-sdk/core";
+import { z } from "zod";
+
+export class GetQuoteParameters extends createToolParameters(
+ z.object({
+ chainId: z.number().describe("The chain ID"),
+ tokenIn: z.string().describe("The input token address"),
+ tokenOut: z.string().describe("The output token address"),
+ order: z
+ .object({
+ type: z.enum(["sell", "buy"]),
+ amount: z.string().describe("amount in basis points (e.g., 1000000 for 1 USDC)"),
+ })
+ .describe("Order details"),
+ slippagePercentage: z.number().describe("Maximum allowed slippage (e.g., 0.5 for 0.5%)"),
+ takerAddress: z.string().optional().describe("The address of the taker"),
+ }),
+) {}
+
+export class ExecuteSwapParameters extends GetQuoteParameters {}
diff --git a/typescript/packages/plugins/balmy/tsconfig.json b/typescript/packages/plugins/balmy/tsconfig.json
new file mode 100644
index 000000000..b4ae67c1f
--- /dev/null
+++ b/typescript/packages/plugins/balmy/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "../../../tsconfig.base.json",
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/typescript/packages/plugins/balmy/tsup.config.ts b/typescript/packages/plugins/balmy/tsup.config.ts
new file mode 100644
index 000000000..2d38789ad
--- /dev/null
+++ b/typescript/packages/plugins/balmy/tsup.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "tsup";
+import { treeShakableConfig } from "../../../tsup.config.base";
+
+export default defineConfig({
+ ...treeShakableConfig,
+});
diff --git a/typescript/packages/plugins/balmy/turbo.json b/typescript/packages/plugins/balmy/turbo.json
new file mode 100644
index 000000000..45f951676
--- /dev/null
+++ b/typescript/packages/plugins/balmy/turbo.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://turbo.build/schema.json",
+ "extends": ["//"],
+ "tasks": {
+ "build": {
+ "inputs": ["src/**", "tsup.config.ts", "!./**/*.test.{ts,tsx}", "tsconfig.json"],
+ "dependsOn": ["^build"],
+ "outputs": ["dist/**"]
+ }
+ }
+}
diff --git a/typescript/packages/plugins/cosmosbank/CHANGELOG.md b/typescript/packages/plugins/cosmosbank/CHANGELOG.md
index 3b267fc93..46960ca86 100644
--- a/typescript/packages/plugins/cosmosbank/CHANGELOG.md
+++ b/typescript/packages/plugins/cosmosbank/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-cosmosbank
+## 0.0.3
+
+### Patch Changes
+
+- Updated dependencies [db65128]
+ - @goat-sdk/wallet-cosmos@0.0.3
+
## 0.0.2
### Patch Changes
diff --git a/typescript/packages/plugins/cosmosbank/package.json b/typescript/packages/plugins/cosmosbank/package.json
index 2950c3b6f..563f9b90f 100644
--- a/typescript/packages/plugins/cosmosbank/package.json
+++ b/typescript/packages/plugins/cosmosbank/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-cosmosbank",
- "version": "0.0.2",
+ "version": "0.0.3",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/crossmint-headless-checkout/CHANGELOG.md b/typescript/packages/plugins/crossmint-headless-checkout/CHANGELOG.md
index 92280476c..c351436a5 100644
--- a/typescript/packages/plugins/crossmint-headless-checkout/CHANGELOG.md
+++ b/typescript/packages/plugins/crossmint-headless-checkout/CHANGELOG.md
@@ -1,5 +1,18 @@
# @goat-sdk/plugin-crossmint-headless-checkout
+## 0.0.6
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
+## 0.0.5
+
+### Patch Changes
+
+- 220dd8d: headless: insufficient funds check
+
## 0.0.4
### Patch Changes
diff --git a/typescript/packages/plugins/crossmint-headless-checkout/package.json b/typescript/packages/plugins/crossmint-headless-checkout/package.json
index 60fa03cc9..90c2e6051 100644
--- a/typescript/packages/plugins/crossmint-headless-checkout/package.json
+++ b/typescript/packages/plugins/crossmint-headless-checkout/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-crossmint-headless-checkout",
- "version": "0.0.4",
+ "version": "0.0.6",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/crossmint-headless-checkout/src/crossmint-headless-checkout.plugin.ts b/typescript/packages/plugins/crossmint-headless-checkout/src/crossmint-headless-checkout.plugin.ts
index f80c5faea..7697d6e3f 100644
--- a/typescript/packages/plugins/crossmint-headless-checkout/src/crossmint-headless-checkout.plugin.ts
+++ b/typescript/packages/plugins/crossmint-headless-checkout/src/crossmint-headless-checkout.plugin.ts
@@ -69,6 +69,11 @@ export class CrossmintHeadlessCheckoutPlugin extends PluginBase {
console.log("Created order:", order.orderId);
+ const isInsufficientFunds = order.payment.status === "crypto-payer-insufficient-funds";
+ if (isInsufficientFunds) {
+ throw new Error("Insufficient funds");
+ }
+
const serializedTransaction =
order.payment.preparation != null && "serializedTransaction" in order.payment.preparation
? order.payment.preparation.serializedTransaction
diff --git a/typescript/packages/plugins/curves/CHANGELOG.md b/typescript/packages/plugins/curves/CHANGELOG.md
new file mode 100644
index 000000000..879bf4440
--- /dev/null
+++ b/typescript/packages/plugins/curves/CHANGELOG.md
@@ -0,0 +1,7 @@
+# @goat-sdk/plugin-curves
+
+## 0.0.2
+
+### Patch Changes
+
+- 18461a3: Release plugin
diff --git a/typescript/packages/plugins/curves/README.md b/typescript/packages/plugins/curves/README.md
new file mode 100644
index 000000000..1d60014d5
--- /dev/null
+++ b/typescript/packages/plugins/curves/README.md
@@ -0,0 +1,56 @@
+# Goat Curves Plugin π - TypeScript
+
+## Installation
+```
+npm install @goat-sdk/plugin-curves
+```
+
+## Usage
+
+### Basic Setup
+```typescript
+import { viem } from "@goat-sdk/wallet-viem";
+import { curves } from "@goat-sdk/plugin-curves";
+
+const account = privateKeyToAccount(process.env.WALLET_PRIVATE_KEY as `0x${string}`);
+
+ // Create a wallet client
+const walletClient = createWalletClient({
+ account: account,
+ transport: http(process.env.RPC_PROVIDER_URL),
+ chain: base,
+});
+
+const tools = await getOnChainTools({
+ wallet: viem(walletClient),
+ plugins: [
+ curves(),
+ ],
+});
+
+// Or with custom curves address and abi
+const tools2 = await getOnChainTools({
+ wallet: viem(walletClient),
+ plugins: [
+ curves({
+ address: YOUR_CURVES_ADDRESS,
+ abi: YOUR_CUSTOM_ABI
+ }),
+ ],
+});
+```
+
+## Plugin Tools
+When using with Goat SDK, the following tools are available:
+
+- `buy_curves_token`: Buy curves tokens
+- `get_buy_curves_token`: Get curves token buy price
+- `sell_curves_token`: Sell curves tokens
+- `get_sell_curves_token`: Get curves token sell price
+- `get_curves_erc20`: Get ERC20 token information
+- `get_curves_balance`: Get curves token balance
+- `withdraw_curves`: Withdraw to ERC20 tokens
+- `deposit_curves`: Deposit from ERC20 tokens
+- `mint_curves_erc20`: Set name and symbol for your ERC20 token and mint it
+
+Each tool handles parameter validation and provides clear error messages.
diff --git a/typescript/packages/plugins/curves/package.json b/typescript/packages/plugins/curves/package.json
new file mode 100644
index 000000000..53c9c13f6
--- /dev/null
+++ b/typescript/packages/plugins/curves/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "@goat-sdk/plugin-curves",
+ "version": "0.0.2",
+ "sideEffects": false,
+ "files": ["dist/**/*", "README.md", "package.json"],
+ "scripts": {
+ "build": "tsup",
+ "clean": "rm -rf dist",
+ "test": "vitest run --passWithNoTests"
+ },
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "dependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "abitype": "^1.0.6",
+ "viem": "catalog:",
+ "zod": "catalog:"
+ },
+ "peerDependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "@goat-sdk/wallet-viem": "workspace:*"
+ },
+ "homepage": "https://ohmygoat.dev",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/goat-sdk/goat.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/goat-sdk/goat/issues"
+ },
+ "keywords": ["ai", "agents", "web3", "form"]
+}
diff --git a/typescript/packages/plugins/curves/src/abi/curves.json b/typescript/packages/plugins/curves/src/abi/curves.json
new file mode 100644
index 000000000..72871e2b1
--- /dev/null
+++ b/typescript/packages/plugins/curves/src/abi/curves.json
@@ -0,0 +1,1135 @@
+[
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesERC20Factory_",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "feeRedistributor_",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "name": "CannotSendFunds",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ContractCannotReceiveTransfer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "CurveAlreadyExists",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ERC20TokenAlreadyMinted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ExceededMaxBuyAmount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InsufficientPayment",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidERC20Metadata",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidFeeDefinition",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidPresaleStartTime",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidValue",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "LastTokenCannotBeSold",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NonIntegerDepositAmount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PresaleUnavailable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SaleNotOpen",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "TokenAbsentForCurvesTokenSubject",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "Unauthorized",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "UnauthorizedCurvesTokenSubject",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "UnverifiedProof",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "erc20token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "symbol",
+ "type": "string"
+ }
+ ],
+ "name": "TokenDeployed",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "trader",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "subject",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isBuy",
+ "type": "bool"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "tokenAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "ethAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "protocolEthAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "subjectEthAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "supply",
+ "type": "uint256"
+ }
+ ],
+ "name": "Trade",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "presale",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "root",
+ "type": "bytes32"
+ }
+ ],
+ "name": "WhitelistUpdated",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "DEFAULT_NAME",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "DEFAULT_SYMBOL",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "buyCurvesToken",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "startTime",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "merkleRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxBuy",
+ "type": "uint256"
+ }
+ ],
+ "name": "buyCurvesTokenForPresale",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes32[]",
+ "name": "proof",
+ "type": "bytes32[]"
+ }
+ ],
+ "name": "buyCurvesTokenWhitelisted",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "subjectToken",
+ "type": "address"
+ }
+ ],
+ "name": "claimFees",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "curvesERC20Factory",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "curvesTokenBalance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "curvesTokenSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "deposit",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "externalCurvesToSubject",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "externalCurvesTokens",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "symbol",
+ "type": "string"
+ },
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "feeRedistributor",
+ "outputs": [
+ {
+ "internalType": "contract FeeSplitter",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "feesEconomics",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "protocolFeeDestination",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "protocolFeePercent",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "subjectFeePercent",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "referralFeePercent",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "holdersFeePercent",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxFeePercent",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "getBuyPrice",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "getBuyPriceAfterFee",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "price",
+ "type": "uint256"
+ }
+ ],
+ "name": "getFees",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "protocolFee",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "subjectFee",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "referralFee",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "holdersFee",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "totalFee",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner_",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "getOwnedCurvesTokenAt",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner_",
+ "type": "address"
+ }
+ ],
+ "name": "getOwnedCurvesTokenLength",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "supply",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPrice",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "getSellPrice",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "getSellPriceAfterFee",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "managers",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "presalesBuys",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "presalesMeta",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "presaleEndTime",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "merkleRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "maxBuy",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "referralFeeDestination",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "sellCurvesToken",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "sellExternalCurvesToken",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "factory_",
+ "type": "address"
+ }
+ ],
+ "name": "setERC20Factory",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "subjectFeePercent_",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "referralFeePercent_",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "holdersFeePercent_",
+ "type": "uint256"
+ }
+ ],
+ "name": "setExternalFeePercent",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "feeRedistributor_",
+ "type": "address"
+ }
+ ],
+ "name": "setFeeRedistributor",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "manager_",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "value",
+ "type": "bool"
+ }
+ ],
+ "name": "setManager",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "maxFeePercent_",
+ "type": "uint256"
+ }
+ ],
+ "name": "setMaxFeePercent",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "symbol",
+ "type": "string"
+ },
+ {
+ "internalType": "bool",
+ "name": "mintNow",
+ "type": "bool"
+ }
+ ],
+ "name": "setNameAndSymbol",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "protocolFeePercent_",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "protocolFeeDestination_",
+ "type": "address"
+ }
+ ],
+ "name": "setProtocolFeePercent",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "referralFeeDestination_",
+ "type": "address"
+ }
+ ],
+ "name": "setReferralFeeDestination",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "merkleRoot",
+ "type": "bytes32"
+ }
+ ],
+ "name": "setWhitelist",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "name": "symbolToSubject",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ }
+ ],
+ "name": "transferAllCurvesTokens",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferCurvesToken",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner_",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32[]",
+ "name": "proof",
+ "type": "bytes32[]"
+ }
+ ],
+ "name": "verifyMerkle",
+ "outputs": [],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curvesTokenSubject",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdraw",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+]
diff --git a/typescript/packages/plugins/curves/src/curves.config.ts b/typescript/packages/plugins/curves/src/curves.config.ts
new file mode 100644
index 000000000..ff6715096
--- /dev/null
+++ b/typescript/packages/plugins/curves/src/curves.config.ts
@@ -0,0 +1,40 @@
+import { Abi } from "viem";
+import rawAbi from "./abi/curves.json";
+import { CurvesOptions } from "./types";
+
+const curvesAbi = rawAbi as unknown as Abi;
+
+export class CurvesPluginConfigError extends Error {
+ constructor(message: string) {
+ super(message);
+ this.name = "CurvesPluginConfigError";
+ }
+}
+
+export interface ValidatedConfig {
+ curves: Required;
+}
+
+export function validateConfig(opts?: CurvesOptions): ValidatedConfig {
+ // Validation errors
+ const errors: string[] = [];
+
+ // Validate curves contract address
+ const curvesAddress = opts?.address ?? process.env.CURVES_CONTRACT_ADDRESS;
+ if (!curvesAddress) {
+ errors.push("Curves contract address not found in plugin options or environment");
+ }
+
+ if (errors.length > 0) {
+ throw new CurvesPluginConfigError(errors.join("\n"));
+ }
+
+ const curves: Required = {
+ address: curvesAddress,
+ abi: opts?.abi ?? curvesAbi,
+ } as Required;
+
+ return {
+ curves,
+ };
+}
diff --git a/typescript/packages/plugins/curves/src/curves.plugin.ts b/typescript/packages/plugins/curves/src/curves.plugin.ts
new file mode 100644
index 000000000..6e7e573bb
--- /dev/null
+++ b/typescript/packages/plugins/curves/src/curves.plugin.ts
@@ -0,0 +1,465 @@
+import { Chain, PluginBase, createTool } from "@goat-sdk/core";
+import { Address, formatUnits, parseUnits } from "viem";
+import { z } from "zod";
+import { EVMTransaction, EVMWalletClient } from "../../../wallets/evm/dist";
+import { validateConfig } from "./curves.config";
+import { CurvesOptions } from "./types";
+
+// Parameter Schemas
+const addressSchema = z.string().describe("Ethereum address");
+const amountSchema = z.number().describe("Amount of tokens");
+const erc20Schema = z.object({
+ name: z.string().describe("ERC20 token name"),
+ symbol: z.string().describe("ERC20 token symbol"),
+});
+const createTokenAmountSchema = (decimals = 18, symbol = "tokens") =>
+ z
+ .string()
+ .describe(`Amount in ${symbol} (e.g., '1.5' for 1.5 ${symbol})`)
+ .refine((val) => {
+ try {
+ parseUnits(val, decimals);
+ return true;
+ } catch {
+ return false;
+ }
+ }, `Invalid amount. Must be a valid decimal number with up to ${decimals} decimal places`);
+
+export class CurvesPluginError extends Error {
+ constructor(
+ message: string,
+ public readonly cause?: unknown,
+ ) {
+ super(message);
+ this.name = "CurvesPluginError";
+ }
+}
+
+export class CurvesPlugin extends PluginBase {
+ private curves: Required;
+
+ constructor(curvesOpts?: CurvesOptions) {
+ super("curves", []);
+
+ const { curves } = validateConfig(curvesOpts);
+
+ this.curves = curves;
+ }
+
+ supportsChain = (chain: Chain) => chain.type === "evm";
+
+ getTools(walletClient: EVMWalletClient) {
+ return [
+ // Buy Curves Token Tool
+ createTool(
+ {
+ name: "buy_curves_token",
+ description: "Buy curves tokens for a specific subject",
+ parameters: z.object({
+ subject: addressSchema,
+ amount: amountSchema.optional().default(1),
+ }),
+ },
+ async (parameters) => {
+ try {
+ // Get buy price
+ const buyPrice = await this.getBuyPrice(
+ walletClient,
+ parameters.subject as Address,
+ parameters.amount,
+ );
+
+ // Prepare transaction
+ const transaction: EVMTransaction = {
+ to: this.curves.address,
+ abi: this.curves.abi,
+ functionName: "buyCurvesToken",
+ args: [parameters.subject as Address, parameters.amount],
+ value: buyPrice,
+ options: {
+ // TODO: add gasLimit as option
+ // gasLimit: parseUnits('3000000', 0),
+ },
+ };
+
+ // Send transaction
+ const tx = await walletClient.sendTransaction(transaction);
+ return tx.hash;
+ } catch (error) {
+ if (error instanceof CurvesPluginError) {
+ throw new CurvesPluginError(`Buy curves token failed: ${error.message}`, error);
+ }
+ throw new CurvesPluginError(
+ `Unexpected error while buying curves token for subject ${parameters.subject}`,
+ error,
+ );
+ }
+ },
+ ),
+
+ // Get Curves Token Buy Price Tool
+ createTool(
+ {
+ name: "get_buy_curves_token",
+ description: "Get curves token buy price for a specific subject",
+ parameters: z.object({
+ subject: addressSchema,
+ amount: amountSchema.optional().default(1),
+ unit: z.enum(["wei", "gwei", "eth"]).optional().default("eth"),
+ }),
+ },
+ async (parameters) => {
+ try {
+ const price = await this.getBuyPrice(
+ walletClient,
+ parameters.subject as Address,
+ parameters.amount,
+ );
+ return formatPrice(price, {
+ unit: parameters.unit,
+ decimals: 18,
+ includeUnit: true,
+ });
+ } catch (error) {
+ if (error instanceof CurvesPluginError) {
+ throw new CurvesPluginError(`Get curves token buy price failed: ${error.message}`, error);
+ }
+ throw new CurvesPluginError(
+ `Unexpected error while reading curves token buy price for subject ${parameters.subject}`,
+ error,
+ );
+ }
+ },
+ ),
+
+ // Sell Curves Token Tool
+ createTool(
+ {
+ name: "sell_curves_token",
+ description: "Sell curves tokens for a specific subject",
+ parameters: z.object({
+ subject: addressSchema,
+ amount: amountSchema.optional().default(1),
+ }),
+ },
+ async (parameters) => {
+ try {
+ const transaction: EVMTransaction = {
+ to: this.curves.address,
+ abi: this.curves.abi,
+ functionName: "sellCurvesToken",
+ args: [parameters.subject as Address, parameters.amount],
+ options: {
+ // TODO: add gasLimit as option
+ // gasLimit: parseUnits('200000', 0),
+ },
+ };
+
+ const tx = await walletClient.sendTransaction(transaction);
+ return tx.hash;
+ } catch (error) {
+ if (error instanceof CurvesPluginError) {
+ throw new CurvesPluginError(`Sell curves token failed: ${error.message}`, error);
+ }
+ throw new CurvesPluginError(
+ `Unexpected error while selling curves token for subject ${parameters.subject}`,
+ error,
+ );
+ }
+ },
+ ),
+
+ // Get Curves Token Sell Price Tool
+ createTool(
+ {
+ name: "get_sell_curves_token",
+ description: "Get curves token sell price for a specific subject",
+ parameters: z.object({
+ subject: addressSchema,
+ amount: amountSchema.optional().default(1),
+ unit: z.enum(["wei", "gwei", "eth"]).optional().default("eth"),
+ }),
+ },
+ async (parameters) => {
+ try {
+ const price = await this.getSellPrice(
+ walletClient,
+ parameters.subject as Address,
+ parameters.amount,
+ );
+ return formatPrice(price, {
+ unit: parameters.unit,
+ decimals: 18,
+ includeUnit: true,
+ });
+ } catch (error) {
+ if (error instanceof CurvesPluginError) {
+ throw new CurvesPluginError(`Get curves token sell price failed: ${error.message}`, error);
+ }
+ throw new CurvesPluginError(
+ `Unexpected error while reading curves token sell price for subject ${parameters.subject}`,
+ error,
+ );
+ }
+ },
+ ),
+
+ // Get ERC20 Info Tool
+ createTool(
+ {
+ name: "get_curves_erc20",
+ description: "Get Curves minted ERC20 token information for a subject",
+ parameters: z.object({
+ subject: addressSchema.optional(),
+ }),
+ },
+ async (parameters) => {
+ try {
+ const address = parameters.subject || walletClient.getAddress();
+ const { value } = (await walletClient.read({
+ address: this.curves.address,
+ abi: this.curves.abi,
+ functionName: "externalCurvesTokens",
+ args: [address],
+ })) as {
+ value: Array;
+ };
+
+ return `ERC20 Token Details:
+ Name: ${value[0]}
+ Symbol: ${value[1]}
+ Contract Address: ${value[2]}`;
+ } catch (error) {
+ if (error instanceof CurvesPluginError) {
+ throw new CurvesPluginError(`Failed to get ERC20 info: ${error.message}`, error);
+ }
+ throw new CurvesPluginError(
+ `Unexpected error while fetching ERC20 info for subject ${parameters.subject || "self"}`,
+ error,
+ );
+ }
+ },
+ ),
+
+ // Get Balance Tool
+ createTool(
+ {
+ name: "get_curves_balance",
+ description: "Get curves token balance for a subject",
+ parameters: z.object({
+ subject: addressSchema,
+ }),
+ },
+ async (parameters) => {
+ try {
+ const result = await walletClient.read({
+ address: this.curves.address,
+ abi: this.curves.abi,
+ functionName: "curvesTokenBalance",
+ args: [parameters.subject, walletClient.getAddress()],
+ });
+
+ return `Curves Token Balance for ${parameters.subject}: ${result.value} tokens`;
+ } catch (error) {
+ if (error instanceof CurvesPluginError) {
+ throw new CurvesPluginError(`Failed to get balance: ${error.message}`, error);
+ }
+ throw new CurvesPluginError(
+ `Unexpected error while fetching balance for subject ${parameters.subject}`,
+ error,
+ );
+ }
+ },
+ ),
+
+ // Withdraw Tool
+ createTool(
+ {
+ name: "withdraw_curves",
+ description: "Withdraw curves tokens to ERC20 tokens",
+ parameters: z.object({
+ subject: addressSchema,
+ amount: amountSchema.optional().default(1),
+ }),
+ },
+ async (parameters) => {
+ try {
+ const transaction: EVMTransaction = {
+ to: this.curves.address,
+ abi: this.curves.abi,
+ functionName: "withdraw",
+ args: [parameters.subject, parameters.amount],
+ options: {
+ // TODO: add gasLimit as option
+ // gasLimit: parseUnits('300000', 0),
+ },
+ };
+
+ const tx = await walletClient.sendTransaction(transaction);
+ return tx.hash;
+ } catch (error) {
+ if (error instanceof CurvesPluginError) {
+ throw new CurvesPluginError(`Withdrawal failed: ${error.message}`, error);
+ }
+ throw new CurvesPluginError(
+ `Unexpected error during withdrawal for subject ${parameters.subject}`,
+ error,
+ );
+ }
+ },
+ ),
+
+ // Deposit Tool
+ createTool(
+ {
+ name: "deposit_curves",
+ description: "Deposit ERC20 tokens to curves tokens",
+ parameters: z.object({
+ subject: addressSchema,
+ amount: createTokenAmountSchema().optional().default("1"),
+ }),
+ },
+ async (parameters) => {
+ try {
+ // Parse input amount to ERC20 minimal denominatin (default is 18 decimals)
+ const depositAmount = parseUnits(parameters.amount, 18);
+ const transaction: EVMTransaction = {
+ to: this.curves.address,
+ abi: this.curves.abi,
+ functionName: "deposit",
+ args: [parameters.subject, depositAmount],
+ options: {
+ // TODO: add gasLimit as option
+ // gasLimit: parseUnits('300000', 0),
+ },
+ };
+
+ const tx = await walletClient.sendTransaction(transaction);
+ return tx.hash;
+ } catch (error) {
+ if (error instanceof CurvesPluginError) {
+ throw new CurvesPluginError(`Deposit failed: ${error.message}`, error);
+ }
+ throw new CurvesPluginError(
+ `Unexpected error during deposit for subject ${parameters.subject}`,
+ error,
+ );
+ }
+ },
+ ),
+
+ // Set Mint Curves ERC20 Tool
+ createTool(
+ {
+ name: "mint_curves_erc20",
+ description: "Set name and symbol for your ERC20 token and mint it",
+ parameters: erc20Schema,
+ },
+ async (parameters) => {
+ try {
+ const transaction: EVMTransaction = {
+ to: this.curves.address,
+ abi: this.curves.abi,
+ functionName: "setNameAndSymbol",
+ args: [parameters.name, parameters.symbol, true],
+ options: {
+ // TODO: add gasLimit as option
+ // gasLimit: parseUnits('2000000', 0),
+ },
+ };
+
+ const tx = await walletClient.sendTransaction(transaction);
+ return tx.hash;
+ } catch (error) {
+ if (error instanceof CurvesPluginError) {
+ throw new CurvesPluginError(
+ `Failed to set ERC20 metadata and mint it: ${error.message}`,
+ error,
+ );
+ }
+ throw new CurvesPluginError(
+ `Unexpected error while setting ERC20 metadata and minting token (name: ${parameters.name}, symbol: ${parameters.symbol})`,
+ error,
+ );
+ }
+ },
+ ),
+ ];
+ }
+
+ private async getBuyPrice(walletClient: EVMWalletClient, subject: string, amount: number): Promise {
+ const result = await walletClient.read({
+ address: this.curves.address,
+ abi: this.curves.abi,
+ functionName: "getBuyPrice",
+ args: [subject, amount],
+ });
+
+ // Assert result type
+ const price = result.value as unknown;
+ if (typeof price === "bigint") {
+ return price;
+ }
+
+ // Handle other potential return types
+ if (typeof price === "string" || typeof price === "number") {
+ return BigInt(price);
+ }
+
+ throw new CurvesPluginError("Invalid price format returned from contract");
+ }
+
+ private async getSellPrice(walletClient: EVMWalletClient, subject: Address, amount: number): Promise {
+ const result = await walletClient.read({
+ address: this.curves.address,
+ abi: this.curves.abi,
+ functionName: "getSellPrice",
+ args: [subject, amount],
+ });
+
+ // Assert result type
+ const price = result.value as unknown;
+ if (typeof price === "bigint") {
+ return price;
+ }
+
+ // Handle other potential return types
+ if (typeof price === "string" || typeof price === "number") {
+ return BigInt(price);
+ }
+
+ throw new CurvesPluginError("Invalid price format returned from contract");
+ }
+}
+
+const formatPrice = (
+ price: bigint,
+ options?: {
+ unit?: "wei" | "gwei" | "eth";
+ decimals?: number;
+ includeUnit?: boolean;
+ },
+) => {
+ const defaultOptions = {
+ unit: "eth" as const,
+ decimals: 6,
+ includeUnit: true,
+ };
+ const opts = { ...defaultOptions, ...options };
+
+ const decimalsMap = {
+ wei: 0,
+ gwei: 9,
+ eth: 18,
+ };
+
+ const formatted = formatUnits(price, decimalsMap[opts.unit]).slice(
+ 0,
+ opts.decimals === 0 ? undefined : -18 + opts.decimals + 19,
+ );
+
+ return opts.includeUnit ? `${formatted} ${opts.unit.toUpperCase()}` : formatted;
+};
+
+// Export factory function
+export const curves = (curvesOpts?: CurvesOptions) => new CurvesPlugin(curvesOpts);
diff --git a/typescript/packages/plugins/curves/src/index.ts b/typescript/packages/plugins/curves/src/index.ts
new file mode 100644
index 000000000..289a7f510
--- /dev/null
+++ b/typescript/packages/plugins/curves/src/index.ts
@@ -0,0 +1,2 @@
+export * from "./curves.config";
+export * from "./curves.plugin";
diff --git a/typescript/packages/plugins/curves/src/types/CurvesOptions.ts b/typescript/packages/plugins/curves/src/types/CurvesOptions.ts
new file mode 100644
index 000000000..795627861
--- /dev/null
+++ b/typescript/packages/plugins/curves/src/types/CurvesOptions.ts
@@ -0,0 +1,6 @@
+import { Abi, Address } from "viem";
+
+export interface CurvesOptions {
+ address?: Address;
+ abi?: Abi;
+}
diff --git a/typescript/packages/plugins/curves/src/types/index.ts b/typescript/packages/plugins/curves/src/types/index.ts
new file mode 100644
index 000000000..1e4233df3
--- /dev/null
+++ b/typescript/packages/plugins/curves/src/types/index.ts
@@ -0,0 +1 @@
+export * from "./CurvesOptions";
diff --git a/typescript/packages/plugins/curves/tsconfig.json b/typescript/packages/plugins/curves/tsconfig.json
new file mode 100644
index 000000000..b4ae67c1f
--- /dev/null
+++ b/typescript/packages/plugins/curves/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "../../../tsconfig.base.json",
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/typescript/packages/plugins/curves/tsup.config.ts b/typescript/packages/plugins/curves/tsup.config.ts
new file mode 100644
index 000000000..2d38789ad
--- /dev/null
+++ b/typescript/packages/plugins/curves/tsup.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "tsup";
+import { treeShakableConfig } from "../../../tsup.config.base";
+
+export default defineConfig({
+ ...treeShakableConfig,
+});
diff --git a/typescript/packages/plugins/curves/turbo.json b/typescript/packages/plugins/curves/turbo.json
new file mode 100644
index 000000000..45f951676
--- /dev/null
+++ b/typescript/packages/plugins/curves/turbo.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://turbo.build/schema.json",
+ "extends": ["//"],
+ "tasks": {
+ "build": {
+ "inputs": ["src/**", "tsup.config.ts", "!./**/*.test.{ts,tsx}", "tsconfig.json"],
+ "dependsOn": ["^build"],
+ "outputs": ["dist/**"]
+ }
+ }
+}
diff --git a/typescript/packages/plugins/debridge/CHANGELOG.md b/typescript/packages/plugins/debridge/CHANGELOG.md
new file mode 100644
index 000000000..234415e0b
--- /dev/null
+++ b/typescript/packages/plugins/debridge/CHANGELOG.md
@@ -0,0 +1,14 @@
+# @goat-sdk/plugin-debridge
+
+## 0.0.2
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
+## 0.0.1
+
+### Patch Changes
+
+- 61239bf: Release plugin
diff --git a/typescript/packages/plugins/debridge/README.md b/typescript/packages/plugins/debridge/README.md
new file mode 100644
index 000000000..b908963d5
--- /dev/null
+++ b/typescript/packages/plugins/debridge/README.md
@@ -0,0 +1,43 @@
+# Goat DeBridge Plugin π - TypeScript
+
+DeBridge plugin for Goat. Allows you to create tools for bridging tokens across different chains using the DeBridge Liquidity Network (DLN).
+
+## Installation
+```
+npm install @goat-sdk/plugin-debridge
+```
+
+## Setup
+
+```typescript
+import { debridge } from "@goat-sdk/plugin-debridge";
+
+// Using default DeBridge API URL
+const plugin = debridge();
+
+// Or with custom API URL
+const plugin = debridge({
+ baseUrl: process.env.DEBRIDGE_BASE_URL
+});
+```
+
+## Available Actions
+
+### Create Bridge Order
+Creates a cross-chain token transfer order.
+
+### Get Bridge Quote
+Gets a quote for a cross-chain token transfer.
+
+### Execute Bridge Transaction
+Signs and broadcasts the bridge transaction.
+
+## Goat
+
+
+Go out and eat some grass.
+
+[Docs](https://ohmygoat.dev) | [API](https://dln.debridge.finance/v1.0) | [Discord](https://discord.com/invite/debridge)
+
+## Goat π
+Goat π (Great Onchain Agent Toolkit) is an open-source library enabling AI agents to interact with blockchain protocols and smart contracts via their own wallets.
\ No newline at end of file
diff --git a/typescript/packages/plugins/debridge/package.json b/typescript/packages/plugins/debridge/package.json
new file mode 100644
index 000000000..640bf60c4
--- /dev/null
+++ b/typescript/packages/plugins/debridge/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "@goat-sdk/plugin-debridge",
+ "version": "0.0.2",
+ "private": true,
+ "files": ["dist/**/*", "README.md", "package.json"],
+ "scripts": {
+ "build": "tsup",
+ "clean": "rm -rf dist",
+ "test": "vitest run --passWithNoTests"
+ },
+ "sideEffects": false,
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "dependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "@goat-sdk/wallet-evm": "workspace:*",
+ "viem": "catalog:",
+ "zod": "catalog:"
+ },
+ "peerDependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "@goat-sdk/wallet-evm": "workspace:*",
+ "viem": "catalog:"
+ },
+ "devDependencies": {
+ "@types/node": "^18.0.0",
+ "tsup": "^6.7.0",
+ "typescript": "^5.2.2",
+ "vitest": "^0.34.0"
+ },
+ "homepage": "https://app.debridge.finance/",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/goat-sdk/goat.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/goat-sdk/goat/issues"
+ },
+ "keywords": ["ai", "agents", "web3", "bridge", "debridge"]
+}
diff --git a/typescript/packages/plugins/debridge/src/abi/CrosschainForwarderv2.abi.json b/typescript/packages/plugins/debridge/src/abi/CrosschainForwarderv2.abi.json
new file mode 100644
index 000000000..2a968f35d
--- /dev/null
+++ b/typescript/packages/plugins/debridge/src/abi/CrosschainForwarderv2.abi.json
@@ -0,0 +1,937 @@
+{
+ "abi": [
+ {
+ "inputs": [],
+ "name": "AdminBadRole",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "AffiliateFeeDistributionFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "expectedBalance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "actualBalance",
+ "type": "uint256"
+ }
+ ],
+ "name": "CallCausedBalanceDiscrepancy",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "CallFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "EthTransferFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "NotEnoughSrcFundsIn",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotSupportedRouter",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SignatureInvalidV",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "srcTokenOut",
+ "type": "address"
+ }
+ ],
+ "name": "SwapEmptyResult",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "srcRouter",
+ "type": "address"
+ }
+ ],
+ "name": "SwapFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "WrongArgumentLength",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "version",
+ "type": "uint8"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ }
+ ],
+ "name": "Refund",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "previousAdminRole",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "newAdminRole",
+ "type": "bytes32"
+ }
+ ],
+ "name": "RoleAdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleGranted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleRevoked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "srcSwapRouter",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isSupported",
+ "type": "bool"
+ }
+ ],
+ "name": "SupportedRouter",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "router",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "tokenIn",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amountIn",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "tokenOut",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amountOut",
+ "type": "uint256"
+ }
+ ],
+ "name": "SwapExecuted",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "DEFAULT_ADMIN_ROLE",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "NATIVE_TOKEN",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "deBridgeGate",
+ "outputs": [
+ {
+ "internalType": "contract IDeBridgeGateExtended",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getRoleAdmin",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "grantRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasRole",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "contract IDeBridgeGateExtended",
+ "name": "_deBridgeGate",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "renounceRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "recipient",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "rescueFunds",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "revokeRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_srcTokenIn",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_srcAmountIn",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_srcTokenInPermitEnvelope",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "useAssetFee",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint32",
+ "name": "referralCode",
+ "type": "uint32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "autoParams",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct ICrossChainForwarder.GateParams",
+ "name": "_gateParams",
+ "type": "tuple"
+ }
+ ],
+ "name": "sendV2",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_srcTokenIn",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_srcAmountIn",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_srcTokenInPermitEnvelope",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_affiliateFeeAmount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "_affiliateFeeRecipient",
+ "type": "address"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "useAssetFee",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint32",
+ "name": "referralCode",
+ "type": "uint32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "autoParams",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct ICrossChainForwarder.GateParams",
+ "name": "_gateParams",
+ "type": "tuple"
+ }
+ ],
+ "name": "sendV3",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_srcTokenIn",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_srcAmountIn",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_srcTokenInPermitEnvelope",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "_srcSwapRouter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_srcSwapCalldata",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "_srcTokenOut",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_srcTokenExpectedAmountOut",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "_srcTokenRefundRecipient",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_targetData",
+ "type": "bytes"
+ }
+ ],
+ "name": "strictlySwapAndCall",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_srcTokenIn",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_srcAmountIn",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_srcTokenInPermitEnvelope",
+ "type": "bytes"
+ },
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "swapRouter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "swapCalldata",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "tokenOut",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenOutExpectedAmount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "tokenOutRefundRecipient",
+ "type": "address"
+ }
+ ],
+ "internalType": "struct CrosschainForwarder.SwapDetails",
+ "name": "_swapDetails",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "_target",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_targetData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "_orderId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "strictlySwapAndCallDln",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "supportedRouters",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_srcTokenIn",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_srcAmountIn",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_srcTokenInPermitEnvelope",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "_srcSwapRouter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_srcSwapCalldata",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "_srcTokenOut",
+ "type": "address"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "useAssetFee",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint32",
+ "name": "referralCode",
+ "type": "uint32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "autoParams",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct ICrossChainForwarder.GateParams",
+ "name": "_gateParams",
+ "type": "tuple"
+ }
+ ],
+ "name": "swapAndSendV2",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_srcTokenIn",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_srcAmountIn",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_srcTokenInPermitEnvelope",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_affiliateFeeAmount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "_affiliateFeeRecipient",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_srcSwapRouter",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_srcSwapCalldata",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "_srcTokenOut",
+ "type": "address"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "chainId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "useAssetFee",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint32",
+ "name": "referralCode",
+ "type": "uint32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "autoParams",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct ICrossChainForwarder.GateParams",
+ "name": "_gateParams",
+ "type": "tuple"
+ }
+ ],
+ "name": "swapAndSendV3",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_srcSwapRouter",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "_isSupported",
+ "type": "bool"
+ }
+ ],
+ "name": "updateSupportedRouter",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "version",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "stateMutability": "payable",
+ "type": "receive"
+ }
+ ]
+}
diff --git a/typescript/packages/plugins/debridge/src/abi/debridge.ts b/typescript/packages/plugins/debridge/src/abi/debridge.ts
new file mode 100644
index 000000000..1a2bd06cc
--- /dev/null
+++ b/typescript/packages/plugins/debridge/src/abi/debridge.ts
@@ -0,0 +1,4 @@
+import { type Abi } from "viem";
+import abi from "./CrosschainForwarderv2.abi.json";
+
+export const DEBRIDGE_ABI = abi.abi as Abi;
diff --git a/typescript/packages/plugins/debridge/src/index.ts b/typescript/packages/plugins/debridge/src/index.ts
new file mode 100644
index 000000000..6cb964bae
--- /dev/null
+++ b/typescript/packages/plugins/debridge/src/index.ts
@@ -0,0 +1,38 @@
+/**
+ * @fileoverview DeBridge Plugin for cross-chain token swaps and bridging
+ */
+
+import { type Chain, PluginBase, WalletClientBase } from "@goat-sdk/core";
+import { DebridgeTools } from "./tools";
+
+/**
+ * Configuration options for the DeBridge plugin
+ */
+export type DebridgeOptions = {
+ baseUrl?: string;
+};
+
+/** Default base URL for DeBridge API endpoints */
+const DEFAULT_BASE_URL = "https://deswap.debridge.finance/v1.0";
+
+/**
+ * DeBridge Plugin class for handling cross-chain token operations
+ * @extends PluginBase
+ */
+export class Debridge extends PluginBase {
+ constructor(options: DebridgeOptions = {}) {
+ const baseUrl = options.baseUrl || DEFAULT_BASE_URL;
+ super("debridge", [new DebridgeTools({ baseUrl })]);
+ }
+
+ supportsChain(chain: Chain): boolean {
+ return chain.type === "evm"; // TODO: Add support for more blockchains
+ }
+}
+
+/**
+ * Factory function to create a new DeBridge plugin instance
+ */
+export const debridge = (options: DebridgeOptions = {}): Debridge => {
+ return new Debridge(options);
+};
diff --git a/typescript/packages/plugins/debridge/src/parameters.ts b/typescript/packages/plugins/debridge/src/parameters.ts
new file mode 100644
index 000000000..08e907f1c
--- /dev/null
+++ b/typescript/packages/plugins/debridge/src/parameters.ts
@@ -0,0 +1,326 @@
+/**
+ * @fileoverview Parameter schemas for DeBridge API interactions
+ * Defines and validates the required parameters for various DeBridge operations
+ */
+
+import { createToolParameters } from "@goat-sdk/core";
+import { z } from "zod";
+
+/**
+ * Regular expressions for validating addresses
+ */
+const SOLANA_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;
+const EVM_ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/;
+
+/**
+ * Chain ID validation schema
+ * Based on DLN API v1.0 specification
+ * Note: This is a format validation only, the actual supported chains are determined by the API
+ */
+const chainIdSchema = z.string().refine(
+ (val) => {
+ // Convert to number for easier comparison
+ const num = Number.parseInt(val, 10);
+ // Regular chain IDs (1-99999)
+ if (num > 0 && num < 100000) return true;
+ // Special chain IDs (100000000+)
+ if (num >= 100000000) return true;
+ // Solana chain ID (7565164)
+ if (num === 7565164) return true;
+ return false;
+ },
+ {
+ message: "Chain ID must be either 1-99999, 7565164 (Solana), or 100000000+",
+ },
+);
+
+/**
+ * Interface representing a token's information from DeBridge API
+ */
+export interface TokenInfo {
+ /** Token name */
+ name: string;
+ /** Token symbol */
+ symbol: string;
+ /** Token address */
+ address: string;
+ /** Token decimals */
+ decimals: number;
+}
+
+/**
+ * Interface representing the response from getTokenInfo
+ */
+export interface TokenInfoResponse {
+ tokens: Record;
+}
+
+/**
+ * Interface representing a chain's information from DeBridge API
+ */
+export interface ChainInfo {
+ /** Chain ID */
+ chainId: string;
+ /** Original chain ID (may differ for some chains) */
+ originalChainId: string;
+ /** Chain name */
+ chainName: string;
+}
+
+/**
+ * Interface representing the response from getSupportedChains
+ */
+export interface SupportedChainsResponse {
+ chains: ChainInfo[];
+}
+
+/**
+ * Schema for parameters required to get token information
+ */
+export class getTokenInfoParametersSchema extends createToolParameters(
+ z.object({
+ /** Chain ID to query tokens for */
+ chainId: chainIdSchema.describe("Chain ID to get token information for"),
+
+ /** Optional token address to filter results */
+ tokenAddress: z.string().optional().describe("Specific token address to query information for"),
+
+ /** Optional search term to filter tokens by name or symbol */
+ search: z.string().optional().describe("Search term to filter tokens by name or symbol"),
+ }),
+) {}
+
+/**
+ * Schema for parameters required to get a bridge quote
+ * Used to estimate token amounts and fees for cross-chain transfers
+ */
+export class getBridgeQuoteParametersSchema extends createToolParameters(
+ z.object({
+ /** Chain ID of the source blockchain */
+ srcChainId: chainIdSchema.describe("Source chain ID (e.g., '1' for Ethereum)"),
+
+ /** Token address on the source chain to be bridged */
+ srcChainTokenIn: z
+ .string()
+ .regex(EVM_ADDRESS_REGEX, "Token address must be '0x0' for native token (ETH) or a valid EVM address"),
+
+ /** Amount of tokens to bridge in base units (e.g., wei for ETH) */
+ srcChainTokenInAmount: z
+ .union([z.literal("auto"), z.string().pipe(z.coerce.number().positive().int().transform(String))])
+ .describe("Amount must be 'auto' or a positive integer in token decimals"),
+
+ /** Chain ID of the destination blockchain */
+ dstChainId: chainIdSchema
+ .refine((val) => val !== "srcChainId", "Destination chain must be different from source chain")
+ .describe("Destination chain ID (e.g., '56' for BSC, '7565164' for Solana)"),
+
+ /** Token address on the destination chain to receive */
+ dstChainTokenOut: z
+ .string()
+ .describe("Destination token address (EVM format for EVM chains, native format for Solana)"),
+
+ /** Slippage percentage for the quote */
+ slippage: z
+ .string()
+ .pipe(z.coerce.number().min(0).max(100).transform(String))
+ .optional()
+ .describe("Slippage must be a valid percentage between 0 and 100"),
+
+ /** Whether to include operating expenses in the quote */
+ prependOperatingExpenses: z
+ .boolean()
+ .optional()
+ .default(true)
+ .describe(
+ "Whether to include operating expenses in the transaction. Always true for native token transfers.",
+ ),
+ }),
+) {}
+
+/**
+ * Schema for parameters required to create a bridge order
+ * Used to initiate a cross-chain token transfer
+ */
+export class createBridgeOrderParametersSchema extends createToolParameters(
+ z.object({
+ /** Chain ID of the source blockchain */
+ srcChainId: chainIdSchema.describe(
+ "Source chain ID (e.g., '1' for Ethereum, '56' for BSC) where the cross-chain swap will start",
+ ),
+
+ /** Token address on the source chain */
+ srcChainTokenIn: z
+ .string()
+ .refine(
+ (val) => EVM_ADDRESS_REGEX.test(val) || SOLANA_ADDRESS_REGEX.test(val),
+ "Token address must be either a valid EVM address (0x-prefixed) or Solana address (base58)",
+ )
+ .describe(
+ "Token address on source chain. For EVM: use 0x0000000000000000000000000000000000000000 for native token. For Solana: use proper token mint address",
+ ),
+
+ /** Amount of tokens to bridge */
+ srcChainTokenInAmount: z
+ .string()
+ .pipe(z.coerce.number().positive().int().transform(String))
+ .describe("Amount of input tokens in base units (e.g., wei for ETH, 10^6 for USDT)"),
+
+ /** Chain ID of the destination blockchain */
+ dstChainId: chainIdSchema
+ .refine((val) => true, {
+ message: "Destination chain must be different from source chain",
+ })
+ .describe("Destination chain ID (e.g., '7565164' for Solana)"),
+
+ /** Token address on the destination chain */
+ dstChainTokenOut: z
+ .string()
+ .refine(
+ (val) => EVM_ADDRESS_REGEX.test(val) || SOLANA_ADDRESS_REGEX.test(val),
+ "Token address must be either a valid EVM address (0x-prefixed) or Solana address (base58)",
+ )
+ .describe("Full token address on destination chain."),
+
+ /** Recipient address on the destination chain */
+ dstChainTokenOutRecipient: z
+ .string()
+ .refine(
+ (val) => EVM_ADDRESS_REGEX.test(val) || SOLANA_ADDRESS_REGEX.test(val),
+ "Recipient address must be either a valid EVM address (0x-prefixed) or Solana address (base58)",
+ )
+ .describe(
+ "Recipient address on destination chain. For EVM: use 0x-prefixed address. For Solana: use base58 wallet address. Required for transaction construction!",
+ ),
+
+ /** Sender's address */
+ senderAddress: z
+ .string()
+ .regex(EVM_ADDRESS_REGEX, "Sender address must be a valid EVM address")
+ .refine((addr) => addr !== "0x0000000000000000000000000000000000000000", {
+ message: "Sender address cannot be the zero address",
+ })
+ .describe("The user's wallet address that will sign and send the transaction on the source chain"),
+
+ /** Authority address on the source chain */
+ srcChainOrderAuthorityAddress: z
+ .string()
+ .regex(EVM_ADDRESS_REGEX, "Authority address must be a valid EVM address")
+ .refine((addr) => addr !== "0x0000000000000000000000000000000000000000", {
+ message: "Authority address cannot be the zero address",
+ })
+ .describe(
+ "Optional: The user's wallet address that can cancel/modify the order. If not provided, defaults to senderAddress.",
+ )
+ .optional(),
+
+ /** Refund address on the source chain */
+ srcChainRefundAddress: z
+ .string()
+ .regex(EVM_ADDRESS_REGEX, "Refund address must be a valid EVM address")
+ .refine((addr) => addr !== "0x0000000000000000000000000000000000000000", {
+ message: "Refund address cannot be the zero address",
+ })
+ .describe(
+ "Optional: The user's wallet address to receive refunds if the transaction fails. Defaults to senderAddress.",
+ )
+ .optional(),
+
+ /** Authority address on the destination chain */
+ dstChainOrderAuthorityAddress: z
+ .string()
+ .refine(
+ (val) => EVM_ADDRESS_REGEX.test(val) || SOLANA_ADDRESS_REGEX.test(val),
+ "Authority address must be either a valid EVM address (0x-prefixed) or Solana address (base58)",
+ )
+ .refine((addr) => addr !== "0x0000000000000000000000000000000000000000", {
+ message: "Authority address cannot be the zero address",
+ })
+ .describe("Optional: Authority address on destination chain. Defaults to dstChainTokenOutRecipient.")
+ .optional(),
+
+ /** Referral code */
+ referralCode: z.string().optional(),
+
+ /** Whether to include operating expenses */
+ prependOperatingExpenses: z
+ .boolean()
+ .optional()
+ .default(true)
+ .describe(
+ "Whether to include operating expenses in the transaction. Always true for native token transfers.",
+ ),
+
+ /** Optional app identifier */
+ deBridgeApp: z.string().optional(),
+ }),
+) {}
+
+/**
+ * Schema for parameters required to execute a bridge transaction
+ * Used to submit the final transaction to the blockchain
+ */
+export class executeBridgeTransactionParametersSchema extends createToolParameters(
+ z.object({
+ /** Transaction data required for execution */
+ txData: z
+ .object({
+ /** Destination contract address */
+ to: z.string().regex(EVM_ADDRESS_REGEX, "Contract address must be a valid EVM address"),
+
+ /** Encoded transaction data */
+ data: z.string().regex(/^0x[a-fA-F0-9]*$/, "Transaction data must be valid hex"),
+
+ /** Transaction value in base units */
+ value: z
+ .string()
+ .pipe(z.coerce.number().nonnegative().int().transform(String))
+ .optional()
+ .describe("Value must be a non-negative integer in wei"),
+ })
+ .describe("Transaction data from createBridgeOrder"),
+ }),
+) {}
+
+/**
+ * Schema for parameters required to get supported chains
+ * Note: No parameters are required, but Tool decorator requires a parameter schema
+ */
+export class getSupportedChainsParametersSchema extends createToolParameters(z.object({})) {}
+
+/**
+ * Interface representing the response from getOrderIds
+ */
+export interface OrderIdsResponse {
+ orderIds: string[];
+}
+
+/**
+ * Interface representing the response from getOrderStatus
+ */
+export interface OrderStatusResponse {
+ status:
+ | "None"
+ | "Created"
+ | "Fulfilled"
+ | "SentUnlock"
+ | "OrderCancelled"
+ | "SentOrderCancel"
+ | "ClaimedUnlock"
+ | "ClaimedOrderCancel";
+ orderId: string;
+ /** Link to view the order on deBridge app */
+ orderLink: string;
+}
+
+/**
+ * Schema for parameters required to check transaction status
+ */
+export class checkTransactionStatusParametersSchema extends createToolParameters(
+ z.object({
+ /** Transaction hash to check status for */
+ txHash: z
+ .string()
+ .regex(/^0x[a-fA-F0-9]{64}$/, "Transaction hash must be a valid hex string")
+ .describe("Transaction hash to check status for"),
+ }),
+) {}
diff --git a/typescript/packages/plugins/debridge/src/tools.ts b/typescript/packages/plugins/debridge/src/tools.ts
new file mode 100644
index 000000000..25ff7be02
--- /dev/null
+++ b/typescript/packages/plugins/debridge/src/tools.ts
@@ -0,0 +1,466 @@
+/**
+ * @fileoverview Tools for interacting with the DeBridge protocol
+ * Provides functionality for cross-chain token bridging and swaps
+ */
+
+import { Tool } from "@goat-sdk/core";
+import { EVMWalletClient } from "@goat-sdk/wallet-evm";
+import { DebridgeOptions } from "./index";
+import {
+ OrderIdsResponse,
+ OrderStatusResponse,
+ SupportedChainsResponse,
+ checkTransactionStatusParametersSchema,
+ createBridgeOrderParametersSchema,
+ executeBridgeTransactionParametersSchema,
+ getBridgeQuoteParametersSchema,
+ getSupportedChainsParametersSchema,
+ getTokenInfoParametersSchema,
+} from "./parameters";
+
+/** Default referral code for DeBridge transactions */
+const REFERRAL_CODE = "21064";
+
+/**
+ * Core tools for interacting with the DeBridge protocol
+ * Provides methods for getting quotes, creating orders, and executing bridge transactions
+ */
+export class DebridgeTools {
+ constructor(private options: DebridgeOptions) {}
+
+ /** Solana's native token (SOL) address in base58 format */
+ private static readonly SOLANA_NATIVE_TOKEN = "11111111111111111111111111111111";
+
+ /** EVM native token (ETH/BNB/etc) address */
+ private static readonly EVM_NATIVE_TOKEN = "0x0000000000000000000000000000000000000000";
+
+ /**
+ * Get a quote for bridging tokens between chains
+ * This method provides an estimate of the token amounts and fees for a cross-chain transfer
+ *
+ * @param {EVMWalletClient} walletClient - The wallet client for transaction signing
+ * @param {getBridgeQuoteParametersSchema} parameters - Parameters for the bridge quote
+ * @returns {Promise} Quote information including estimated amounts and fees
+ * @throws {Error} If the API request fails or returns an error
+ *
+ * @example
+ * ```typescript
+ * const quote = await debridgeTools.getBridgeQuote(wallet, {
+ * srcChainId: "1",
+ * srcChainTokenIn: "0x0000000000000000000000000000000000000000",
+ * srcChainTokenInAmount: "1000000000000000000",
+ * dstChainId: "7565164",
+ * dstChainTokenOut: "DBRiDgJAMsM95moTzJs7M9LnkGErpbv9v6CUR1DXnUu5"
+ * });
+ * ```
+ */
+ @Tool({
+ name: "get_bridge_quote",
+ description:
+ "Get a quote for bridging tokens between chains. Use get_token_info first to get correct token addresses.",
+ })
+ async getBridgeQuote(walletClient: EVMWalletClient, parameters: getBridgeQuoteParametersSchema) {
+ try {
+ const isSameChain = parameters.srcChainId === parameters.dstChainId;
+ const userAddress = await walletClient.getAddress();
+
+ const url = isSameChain
+ ? `${this.options.baseUrl}/chain/transaction?${new URLSearchParams({
+ chainId: parameters.srcChainId,
+ tokenIn: parameters.srcChainTokenIn,
+ tokenInAmount: parameters.srcChainTokenInAmount,
+ tokenOut: parameters.dstChainTokenOut,
+ tokenOutRecipient: userAddress,
+ slippage: parameters.slippage?.toString() || "auto",
+ affiliateFeePercent: "0",
+ })}`
+ : `${this.options.baseUrl}/dln/order/create-tx?${new URLSearchParams({
+ srcChainId: parameters.srcChainId,
+ srcChainTokenIn: parameters.srcChainTokenIn,
+ srcChainTokenInAmount: parameters.srcChainTokenInAmount,
+ dstChainId: parameters.dstChainId,
+ dstChainTokenOut: parameters.dstChainTokenOut,
+ dstChainTokenOutAmount: "auto",
+ prependOperatingExpenses: "true",
+ additionalTakerRewardBps: "0",
+ })}`;
+
+ console.log("Making request to:", url);
+
+ const response = await fetch(url);
+
+ if (!response.ok) {
+ const text = await response.text();
+ throw new Error(`HTTP error! status: ${response.status}, body: ${text}`);
+ }
+
+ const data = await response.json();
+ console.log("Bridge quote response:", JSON.stringify(data, null, 2));
+ if (data.error) {
+ throw new Error(data.error);
+ }
+ return data;
+ } catch (error) {
+ throw new Error(`Failed to get bridge quote: ${error}`);
+ }
+ }
+
+ /**
+ * Create a bridge order to transfer tokens between chains
+ * This method initiates the cross-chain transfer by creating an order on DeBridge
+ *
+ * @param {createBridgeOrderParametersSchema} parameters - Parameters for creating the bridge order
+ * @returns {Promise} Order details including transaction data and fees
+ * @throws {Error} If the API request fails or returns an error
+ *
+ * @example
+ * ```typescript
+ * const order = await debridgeTools.createBridgeOrder({
+ * srcChainId: "1",
+ * srcChainTokenIn: "0x0000000000000000000000000000000000000000",
+ * srcChainTokenInAmount: "1000000000000000000",
+ * dstChainId: "7565164",
+ * dstChainTokenOut: "DBRiDgJAMsM95moTzJs7M9LnkGErpbv9v6CUR1DXnUu5",
+ * dstChainTokenOutRecipient: "9ZNXcG5SgqKwQj6uGt9DjmBwzJAhbX9qQH5pHhDFKxJc"
+ * });
+ * ```
+ */
+ @Tool({
+ name: "create_bridge_order",
+ description: `Create a bridge order to transfer tokens between chains.
+Use the user requested target asset full address(eg:DBRiDgJAMsM95moTzJs7M9LnkGErpbv9v6CUR1DXnUu5) for dstChainTokenOut do NOT use the ticker(eg:DBR) for dstChainTokenOut
+
+EVM to EVM:
+1. Set dstChainTokenOutRecipient to recipient's EVM address
+3. Set dstChainTokenOut to the erc-20 format address of the token to receive, not the ticker
+
+To Solana (7565164):
+1. Ask for Solana recipient address (base58, e.g. DXu6uARB7gVxqtuwjMyK2mgEchorxDDyrSN9dRK1Af7q)
+2. Set dstChainTokenOut to the base58 address of the token to receive on Solana, not the ticker
+
+From Solana:
+1. Ask for EVM recipient address (ERC-20 format)
+2. Set dstChainTokenOut must be the erc-20 format address of the token to receive, not the ticker`,
+ })
+ async createBridgeOrder(parameters: createBridgeOrderParametersSchema) {
+ try {
+ const params = new URLSearchParams();
+ params.append("srcChainId", parameters.srcChainId);
+ params.append("srcChainTokenIn", parameters.srcChainTokenIn);
+ params.append("srcChainTokenInAmount", parameters.srcChainTokenInAmount);
+ params.append("dstChainId", parameters.dstChainId);
+ params.append("dstChainTokenOut", parameters.dstChainTokenOut);
+ params.append("dstChainTokenOutRecipient", parameters.dstChainTokenOutRecipient);
+ params.append("senderAddress", parameters.senderAddress);
+ // Always use senderAddress for source chain authorities
+ params.append("srcChainOrderAuthorityAddress", parameters.senderAddress);
+ params.append("srcChainRefundAddress", parameters.senderAddress);
+ // Always use dstChainTokenOutRecipient for destination chain authority
+ params.append("dstChainOrderAuthorityAddress", parameters.dstChainTokenOutRecipient);
+ params.append("referralCode", parameters.referralCode || REFERRAL_CODE || "21064");
+ params.append("prependOperatingExpenses", "true");
+ // params.append("deBridgeApp", "goat");
+ // params.append("enableEstimate", parameters.enableEstimate?.toString() || "false");
+ // if (parameters.allowedTaker) {
+ // params.append('allowedTaker', parameters.allowedTaker);
+ // }
+
+ const url = `${this.options.baseUrl}/dln/order/create-tx?${params}`;
+
+ console.log("Making create bridge order request to:", url);
+
+ const response = await fetch(url);
+
+ if (!response.ok) {
+ const text = await response.text();
+ throw new Error(`HTTP error! status: ${response.status}, body: ${text}`);
+ }
+
+ const data = await response.json();
+
+ if (data.error) {
+ throw new Error(data.error);
+ }
+
+ // Format the txData to ensure it's properly stringified
+ if (data.tx?.data) {
+ data.tx.data = data.tx.data.toString();
+ }
+
+ return data;
+ } catch (error) {
+ throw new Error(`Failed to create bridge order: ${error}`);
+ }
+ }
+
+ /**
+ * Get token information from a chain. For EVM: use 0x-prefixed address. For Solana: use base58 token address.
+ *
+ * @param {getTokenInfoParametersSchema} parameters - Parameters for getting token info
+ * @returns {Promise} Token information including name, symbol, and decimals
+ * @throws {Error} If the API request fails or returns an error
+ *
+ * @example
+ * ```typescript
+ * const tokenInfo = await debridgeTools.getTokenInfo({
+ * chainId: "7565164",
+ * tokenAddress: "DBRiDgJAMsM95moTzJs7M9LnkGErpbv9v6CUR1DXnUu5"
+ * });
+ * ```
+ */
+ @Tool({
+ name: "get_token_info",
+ description:
+ "Get token information from a chain. For EVM: use 0x-prefixed address. For Solana: use base58 token address.",
+ })
+ async getTokenInfo(parameters: getTokenInfoParametersSchema) {
+ try {
+ const url = `${this.options.baseUrl}/token-list?chainId=${parameters.chainId}`;
+
+ console.log("Fetching token information from:", url);
+
+ const response = await fetch(url);
+
+ if (!response.ok) {
+ const text = await response.text();
+ throw new Error(`HTTP error! status: ${response.status}, body: ${text}`);
+ }
+
+ const responseData = await response.json();
+ const data = responseData.tokens;
+
+ // Define token data type
+ type TokenData = {
+ name: string;
+ symbol: string;
+ decimals: number;
+ };
+
+ // If a specific token address is provided, return just that token's info
+ if (parameters.tokenAddress) {
+ const tokenInfo = data[parameters.tokenAddress];
+ if (!tokenInfo) {
+ throw new Error(`Token ${parameters.tokenAddress} not found on chain ${parameters.chainId}`);
+ }
+ return {
+ name: tokenInfo.name,
+ symbol: tokenInfo.symbol,
+ address: parameters.tokenAddress,
+ decimals: tokenInfo.decimals,
+ };
+ }
+
+ // Filter tokens by search term
+ const searchTerm = parameters.search?.toLowerCase() || "";
+ const tokens = Object.entries(data as Record)
+ .filter(
+ ([, token]: [string, TokenData]) =>
+ token.symbol && (!searchTerm || token.symbol.toLowerCase().includes(searchTerm)),
+ )
+ .reduce(
+ (acc, [address, token]: [string, TokenData]) => {
+ acc[address] = {
+ name: token.name,
+ symbol: token.symbol,
+ address: address, // Use the full address from the key
+ decimals: token.decimals,
+ };
+ return acc;
+ },
+ {} as Record<
+ string,
+ {
+ name: string;
+ symbol: string;
+ address: string;
+ decimals: number;
+ }
+ >,
+ );
+
+ // Log matched tokens with full addresses
+ const matchedTokens = Object.values(tokens);
+ if (searchTerm && matchedTokens.length > 0) {
+ console.log(
+ `Found ${matchedTokens.length} token(s) matching symbol "${searchTerm}":`,
+ JSON.stringify(matchedTokens, null, 2),
+ );
+ }
+
+ return { tokens };
+ } catch (error) {
+ console.error("Error fetching token information:", error);
+ throw error;
+ }
+ }
+
+ /**
+ * Get a list of supported chains from DeBridge API
+ * This method retrieves information about all chains supported by the protocol
+ *
+ * @param {getSupportedChainsParametersSchema} parameters - Optional parameters
+ * @returns {Promise} List of supported chains with their IDs and names
+ * @throws {Error} If the API request fails or returns an error
+ *
+ * @example
+ * ```typescript
+ * const chains = await debridgeTools.getSupportedChains({});
+ * console.log(chains.chains); // List of supported chains
+ * ```
+ */
+ @Tool({
+ name: "get_supported_chains",
+ description: "Get a list of all chains supported by DeBridge protocol.",
+ })
+ async getSupportedChains(parameters: getSupportedChainsParametersSchema): Promise {
+ try {
+ const url = `${this.options.baseUrl}/supported-chains-info`;
+ console.log("Making request to:", url);
+
+ const response = await fetch(url);
+ if (!response.ok) {
+ const text = await response.text();
+ throw new Error(`HTTP error! status: ${response.status}, body: ${text}`);
+ }
+
+ const data = await response.json();
+ console.log("Supported chains response:", JSON.stringify(data, null, 2));
+ if (data.error) {
+ throw new Error(data.error);
+ }
+ return data;
+ } catch (error) {
+ throw new Error(`Failed to get supported chains: ${error}`);
+ }
+ }
+
+ /**
+ * Execute a bridge transaction with the provided transaction data
+ * This method signs and sends the transaction to the blockchain
+ *
+ * @param {EVMWalletClient} walletClient - The wallet client for transaction signing
+ * @param {executeBridgeTransactionParametersSchema} parameters - Parameters for executing the bridge transaction
+ * @returns {Promise} Transaction hash and other details
+ * @throws {Error} If the transaction fails or returns an error
+ *
+ * @example
+ * ```typescript
+ * // Execute transaction using order's tx data
+ * const result = await debridgeTools.executeBridgeTransaction(wallet, {
+ * txData: order.tx
+ * });
+ * ```
+ */
+ @Tool({
+ name: "execute_bridge_transaction",
+ description:
+ "Execute a bridge transaction using tx data from create_bridge_order tool. Always ask for confirmation before proceeding",
+ })
+ async executeBridgeTransaction(
+ walletClient: EVMWalletClient,
+ parameters: executeBridgeTransactionParametersSchema,
+ ) {
+ try {
+ const { txData } = parameters;
+
+ // Validate transaction data
+ if (!txData.to || !txData.data) {
+ throw new Error("Invalid transaction data: missing 'to' or 'data' field");
+ }
+
+ // Validate data format
+ if (!txData.data.startsWith("0x")) {
+ throw new Error("Invalid transaction data: 'data' field must start with '0x'");
+ }
+
+ // Enhanced logging for debugging
+ console.log("Executing bridge transaction with data:", {
+ to: txData.to,
+ value: txData.value ? `${txData.value} (${BigInt(txData.value)})` : "undefined",
+ data: {
+ full: txData.data,
+ functionSelector: txData.data.slice(0, 10),
+ parameters: txData.data.slice(10),
+ },
+ });
+
+ // Send transaction using raw transaction data
+ console.log("Sending transaction...");
+ const sendRes = await walletClient.sendTransaction({
+ to: txData.to as `0x${string}`,
+ data: txData.data as `0x${string}`,
+ value: txData.value ? BigInt(txData.value) : undefined,
+ });
+
+ console.log("Transaction sent! Hash:", sendRes.hash);
+ return { hash: sendRes.hash };
+ } catch (error) {
+ console.error("Bridge transaction execution failed:", error);
+ throw new Error(`Failed to execute bridge transaction: ${error}`);
+ }
+ }
+
+ /**
+ * Check the status of bridge transactions
+ * This method retrieves the current status of one or more bridge transactions
+ *
+ * @param {checkTransactionStatusParametersSchema} parameters - Parameters for checking transaction status
+ * @returns {Promise} Status information for the transactions
+ * @throws {Error} If the API request fails or returns an error
+ *
+ * @example
+ * ```typescript
+ * const status = await debridgeTools.checkTransactionStatus({
+ * orderId: "0x1234567890abcdef"
+ * });
+ * ```
+ */
+ @Tool({
+ name: "check_transaction_status",
+ description: "Check the status of bridge transactions using their order IDs.",
+ })
+ async checkTransactionStatus(parameters: checkTransactionStatusParametersSchema): Promise {
+ try {
+ // First get the order IDs for the transaction
+ const orderIdsUrl = `${this.options.baseUrl}/dln/tx/${parameters.txHash}/order-ids`;
+ console.log("Getting order IDs from:", orderIdsUrl);
+
+ const orderIdsResponse = await fetch(orderIdsUrl);
+ if (!orderIdsResponse.ok) {
+ const text = await orderIdsResponse.text();
+ throw new Error(`HTTP error! status: ${orderIdsResponse.status}, body: ${text}`);
+ }
+
+ const orderIdsData = (await orderIdsResponse.json()) as OrderIdsResponse;
+ console.log("Order IDs response:", JSON.stringify(orderIdsData, null, 2));
+
+ if (!orderIdsData.orderIds || orderIdsData.orderIds.length === 0) {
+ throw new Error("No order IDs found for this transaction");
+ }
+
+ // Then get the status for each order
+ const statuses = await Promise.all(
+ orderIdsData.orderIds.map(async (orderId) => {
+ const statusUrl = `${this.options.baseUrl}/dln/order/${orderId}/status`;
+ console.log("Getting status from:", statusUrl);
+
+ const statusResponse = await fetch(statusUrl);
+ if (!statusResponse.ok) {
+ const text = await statusResponse.text();
+ throw new Error(`HTTP error! status: ${statusResponse.status}, body: ${text}`);
+ }
+
+ const statusData = (await statusResponse.json()) as OrderStatusResponse;
+ // Add the deBridge app link
+ statusData.orderLink = `https://app.debridge.finance/order?orderId=${orderId}`;
+ console.log("Status response:", JSON.stringify(statusData, null, 2));
+ return statusData;
+ }),
+ );
+
+ return statuses;
+ } catch (error) {
+ throw new Error(`Failed to check transaction status: ${error}`);
+ }
+ }
+}
diff --git a/typescript/packages/plugins/debridge/tsconfig.json b/typescript/packages/plugins/debridge/tsconfig.json
new file mode 100644
index 000000000..b4ae67c1f
--- /dev/null
+++ b/typescript/packages/plugins/debridge/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "../../../tsconfig.base.json",
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/typescript/packages/plugins/debridge/tsup.config.ts b/typescript/packages/plugins/debridge/tsup.config.ts
new file mode 100644
index 000000000..2d38789ad
--- /dev/null
+++ b/typescript/packages/plugins/debridge/tsup.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "tsup";
+import { treeShakableConfig } from "../../../tsup.config.base";
+
+export default defineConfig({
+ ...treeShakableConfig,
+});
diff --git a/typescript/packages/plugins/debridge/turbo.json b/typescript/packages/plugins/debridge/turbo.json
new file mode 100644
index 000000000..45f951676
--- /dev/null
+++ b/typescript/packages/plugins/debridge/turbo.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://turbo.build/schema.json",
+ "extends": ["//"],
+ "tasks": {
+ "build": {
+ "inputs": ["src/**", "tsup.config.ts", "!./**/*.test.{ts,tsx}", "tsconfig.json"],
+ "dependsOn": ["^build"],
+ "outputs": ["dist/**"]
+ }
+ }
+}
diff --git a/typescript/packages/plugins/erc20/CHANGELOG.md b/typescript/packages/plugins/erc20/CHANGELOG.md
index a3cca9096..0291f19a1 100644
--- a/typescript/packages/plugins/erc20/CHANGELOG.md
+++ b/typescript/packages/plugins/erc20/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-erc20
+## 0.2.9
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.2.8
### Patch Changes
diff --git a/typescript/packages/plugins/erc20/package.json b/typescript/packages/plugins/erc20/package.json
index 718601e44..0462c1b90 100644
--- a/typescript/packages/plugins/erc20/package.json
+++ b/typescript/packages/plugins/erc20/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-erc20",
- "version": "0.2.8",
+ "version": "0.2.9",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/erc721/CHANGELOG.md b/typescript/packages/plugins/erc721/CHANGELOG.md
index 0373aa87f..021221962 100644
--- a/typescript/packages/plugins/erc721/CHANGELOG.md
+++ b/typescript/packages/plugins/erc721/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-erc721
+## 0.1.18
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.1.17
### Patch Changes
diff --git a/typescript/packages/plugins/erc721/package.json b/typescript/packages/plugins/erc721/package.json
index 6f3335cd8..b09bf5b02 100644
--- a/typescript/packages/plugins/erc721/package.json
+++ b/typescript/packages/plugins/erc721/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-erc721",
- "version": "0.1.17",
+ "version": "0.1.18",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/ionic/CHANGELOG.md b/typescript/packages/plugins/ionic/CHANGELOG.md
new file mode 100644
index 000000000..761bf56cd
--- /dev/null
+++ b/typescript/packages/plugins/ionic/CHANGELOG.md
@@ -0,0 +1,14 @@
+# @goat-sdk/plugin-ionic
+
+## 0.1.2
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
+## 0.1.1
+
+### Patch Changes
+
+- b6cfa78: Release plugin
diff --git a/typescript/packages/plugins/ionic/package.json b/typescript/packages/plugins/ionic/package.json
new file mode 100644
index 000000000..ae1c45185
--- /dev/null
+++ b/typescript/packages/plugins/ionic/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "@goat-sdk/plugin-ionic",
+ "version": "0.1.2",
+ "files": ["dist/**/*", "README.md", "package.json"],
+ "scripts": {
+ "build": "tsup",
+ "clean": "rm -rf dist",
+ "test": "vitest run --passWithNoTests"
+ },
+ "sideEffects": false,
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "dependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "@goat-sdk/wallet-evm": "workspace:*",
+ "viem": "catalog:",
+ "zod": "catalog:"
+ },
+ "peerDependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "viem": "catalog:"
+ },
+ "homepage": "https://ohmygoat.dev",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/goat-sdk/goat.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/goat-sdk/goat/issues"
+ },
+ "keywords": ["ai", "agents", "web3"]
+}
diff --git a/typescript/packages/plugins/ionic/src/abis/AddressesProvider.ts b/typescript/packages/plugins/ionic/src/abis/AddressesProvider.ts
new file mode 100644
index 000000000..1cc48b771
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/abis/AddressesProvider.ts
@@ -0,0 +1,9 @@
+export const addressesProviderAbi = [
+ {
+ inputs: [{ name: "id", type: "string" }],
+ name: "getAddress",
+ outputs: [{ name: "", type: "address" }],
+ stateMutability: "view",
+ type: "function",
+ },
+] as const;
diff --git a/typescript/packages/plugins/ionic/src/abis/Cerc20DelegatorAbi.ts b/typescript/packages/plugins/ionic/src/abis/Cerc20DelegatorAbi.ts
new file mode 100644
index 000000000..0996f9ee5
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/abis/Cerc20DelegatorAbi.ts
@@ -0,0 +1,896 @@
+export const cerc20DelegatorAbi = [
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "underlying_",
+ type: "address",
+ },
+ {
+ internalType: "contract IonicComptroller",
+ name: "comptroller_",
+ type: "address",
+ },
+ {
+ internalType: "address payable",
+ name: "ionicAdmin_",
+ type: "address",
+ },
+ {
+ internalType: "contract InterestRateModel",
+ name: "interestRateModel_",
+ type: "address",
+ },
+ {
+ internalType: "string",
+ name: "name_",
+ type: "string",
+ },
+ {
+ internalType: "string",
+ name: "symbol_",
+ type: "string",
+ },
+ {
+ internalType: "uint256",
+ name: "reserveFactorMantissa_",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "adminFeeMantissa_",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "constructor",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bytes4",
+ name: "_functionSelector",
+ type: "bytes4",
+ },
+ {
+ internalType: "address",
+ name: "_currentImpl",
+ type: "address",
+ },
+ ],
+ name: "FunctionAlreadyAdded",
+ type: "error",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bytes4",
+ name: "_functionSelector",
+ type: "bytes4",
+ },
+ ],
+ name: "FunctionNotFound",
+ type: "error",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "cashPrior",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "interestAccumulated",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "borrowIndex",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "totalBorrows",
+ type: "uint256",
+ },
+ ],
+ name: "AccrueInterest",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: true,
+ internalType: "address",
+ name: "owner",
+ type: "address",
+ },
+ {
+ indexed: true,
+ internalType: "address",
+ name: "spender",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "amount",
+ type: "uint256",
+ },
+ ],
+ name: "Approval",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "borrowAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "accountBorrows",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "totalBorrows",
+ type: "uint256",
+ },
+ ],
+ name: "Borrow",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "liquidator",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "repayAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "cTokenCollateral",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "seizeTokens",
+ type: "uint256",
+ },
+ ],
+ name: "LiquidateBorrow",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "minter",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "mintAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "mintTokens",
+ type: "uint256",
+ },
+ ],
+ name: "Mint",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "oldAdminFeeMantissa",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newAdminFeeMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "NewAdminFee",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "oldImplementation",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "newImplementation",
+ type: "address",
+ },
+ ],
+ name: "NewImplementation",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "oldIonicFeeMantissa",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newIonicFeeMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "NewIonicFee",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "contract InterestRateModel",
+ name: "oldInterestRateModel",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "contract InterestRateModel",
+ name: "newInterestRateModel",
+ type: "address",
+ },
+ ],
+ name: "NewMarketInterestRateModel",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "oldReserveFactorMantissa",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newReserveFactorMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "NewReserveFactor",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "redeemer",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "redeemAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "redeemTokens",
+ type: "uint256",
+ },
+ ],
+ name: "Redeem",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "payer",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "repayAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "accountBorrows",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "totalBorrows",
+ type: "uint256",
+ },
+ ],
+ name: "RepayBorrow",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "benefactor",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "addAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newTotalReserves",
+ type: "uint256",
+ },
+ ],
+ name: "ReservesAdded",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "admin",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "reduceAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newTotalReserves",
+ type: "uint256",
+ },
+ ],
+ name: "ReservesReduced",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: true,
+ internalType: "address",
+ name: "from",
+ type: "address",
+ },
+ {
+ indexed: true,
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "amount",
+ type: "uint256",
+ },
+ ],
+ name: "Transfer",
+ type: "event",
+ },
+ {
+ stateMutability: "nonpayable",
+ type: "fallback",
+ },
+ {
+ inputs: [],
+ name: "_listExtensions",
+ outputs: [
+ {
+ internalType: "address[]",
+ name: "",
+ type: "address[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "contract DiamondExtension",
+ name: "extensionToAdd",
+ type: "address",
+ },
+ {
+ internalType: "contract DiamondExtension",
+ name: "extensionToReplace",
+ type: "address",
+ },
+ ],
+ name: "_registerExtension",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "implementation_",
+ type: "address",
+ },
+ {
+ internalType: "bytes",
+ name: "becomeImplementationData",
+ type: "bytes",
+ },
+ ],
+ name: "_setImplementationSafe",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "_upgrade",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "accrualBlockNumber",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "adminFeeMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "borrowIndex",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "comptroller",
+ outputs: [
+ {
+ internalType: "contract IonicComptroller",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "decimals",
+ outputs: [
+ {
+ internalType: "uint8",
+ name: "",
+ type: "uint8",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "feeSeizeShareMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "implementation",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "interestRateModel",
+ outputs: [
+ {
+ internalType: "contract InterestRateModel",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "ionicAdmin",
+ outputs: [
+ {
+ internalType: "address payable",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "ionicFeeMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "name",
+ outputs: [
+ {
+ internalType: "string",
+ name: "",
+ type: "string",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "protocolSeizeShareMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "reserveFactorMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "symbol",
+ outputs: [
+ {
+ internalType: "string",
+ name: "",
+ type: "string",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "totalAdminFees",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "totalBorrows",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "totalIonicFees",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "totalReserves",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "totalSupply",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "underlying",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "owner", internalType: "address", type: "address" }],
+ name: "balanceOf",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "owner", internalType: "address", type: "address" }],
+ name: "balanceOfUnderlying",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "account", internalType: "address", type: "address" }],
+ name: "borrowBalanceCurrent",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "borrowIndex",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "borrowRatePerBlock",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "borrowAmount", internalType: "uint256", type: "uint256" }],
+ name: "borrowRatePerBlockAfterBorrow",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ // custom added
+ {
+ type: "function",
+ inputs: [{ name: "owner", internalType: "address", type: "address" }],
+ name: "balanceOfUnderlying",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "account", internalType: "address", type: "address" }],
+ name: "borrowBalanceCurrent",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "borrowIndex",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "borrowRatePerBlock",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "borrowAmount", internalType: "uint256", type: "uint256" }],
+ name: "borrowRatePerBlockAfterBorrow",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "exchangeRateCurrent",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "nonpayable",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "exchangeRateStored",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "feeSeizeShareMantissa",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "getCash",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "getTotalUnderlyingSupplied",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "ionicAdminHasRights",
+ outputs: [{ name: "", internalType: "bool", type: "bool" }],
+ stateMutability: "view",
+ },
+] as const;
diff --git a/typescript/packages/plugins/ionic/src/abis/Comptroller.ts b/typescript/packages/plugins/ionic/src/abis/Comptroller.ts
new file mode 100644
index 000000000..3651a5e6d
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/abis/Comptroller.ts
@@ -0,0 +1,87 @@
+export const comptrollerAbi = [
+ {
+ inputs: [],
+ stateMutability: "nonpayable",
+ type: "constructor",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address[]",
+ name: "markets",
+ type: "address[]",
+ },
+ ],
+ name: "enterMarkets",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "",
+ type: "uint256[]",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "getAssets",
+ outputs: [
+ {
+ internalType: "address[]",
+ name: "",
+ type: "address[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "market",
+ type: "address",
+ },
+ ],
+ name: "exitMarket",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "account",
+ type: "address",
+ },
+ ],
+ name: "getAccountLiquidity",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+] as const;
diff --git a/typescript/packages/plugins/ionic/src/abis/ComptrollerProxyAbi.ts b/typescript/packages/plugins/ionic/src/abis/ComptrollerProxyAbi.ts
new file mode 100644
index 000000000..474490fa5
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/abis/ComptrollerProxyAbi.ts
@@ -0,0 +1,1493 @@
+export const ComptrollerProxyAbi = [
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "rewardsDistributor",
+ type: "address",
+ },
+ ],
+ name: "AddedRewardsDistributor",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "error",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "info",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "detail",
+ type: "uint256",
+ },
+ ],
+ name: "Failure",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "contract ICErc20",
+ name: "cToken",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "account",
+ type: "address",
+ },
+ ],
+ name: "MarketEntered",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "contract ICErc20",
+ name: "cToken",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "account",
+ type: "address",
+ },
+ ],
+ name: "MarketExited",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "contract ICErc20",
+ name: "cToken",
+ type: "address",
+ },
+ ],
+ name: "MarketListed",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "oldCloseFactorMantissa",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newCloseFactorMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "NewCloseFactor",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "contract ICErc20",
+ name: "cToken",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "oldCollateralFactorMantissa",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newCollateralFactorMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "NewCollateralFactor",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "oldLiquidationIncentiveMantissa",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newLiquidationIncentiveMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "NewLiquidationIncentive",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "contract BasePriceOracle",
+ name: "oldPriceOracle",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "contract BasePriceOracle",
+ name: "newPriceOracle",
+ type: "address",
+ },
+ ],
+ name: "NewPriceOracle",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "bool",
+ name: "enforce",
+ type: "bool",
+ },
+ ],
+ name: "WhitelistEnforcementChanged",
+ type: "event",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "distributor",
+ type: "address",
+ },
+ ],
+ name: "_addRewardsDistributor",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "_afterNonReentrant",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "_becomeImplementation",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "_beforeNonReentrant",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "_borrowGuardianPaused",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint8",
+ name: "delegateType",
+ type: "uint8",
+ },
+ {
+ internalType: "bytes",
+ name: "constructorData",
+ type: "bytes",
+ },
+ {
+ internalType: "bytes",
+ name: "becomeImplData",
+ type: "bytes",
+ },
+ {
+ internalType: "uint256",
+ name: "collateralFactorMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "_deployMarket",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "_getExtensionFunctions",
+ outputs: [
+ {
+ internalType: "bytes4[]",
+ name: "functionSelectors",
+ type: "bytes4[]",
+ },
+ ],
+ stateMutability: "pure",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "_mintGuardianPaused",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "newCloseFactorMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "_setCloseFactor",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "contract ICErc20",
+ name: "cToken",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "newCollateralFactorMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "_setCollateralFactor",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "newLiquidationIncentiveMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "_setLiquidationIncentive",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "contract BasePriceOracle",
+ name: "newOracle",
+ type: "address",
+ },
+ ],
+ name: "_setPriceOracle",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bool",
+ name: "enforce",
+ type: "bool",
+ },
+ ],
+ name: "_setWhitelistEnforcement",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address[]",
+ name: "suppliers",
+ type: "address[]",
+ },
+ {
+ internalType: "bool[]",
+ name: "statuses",
+ type: "bool[]",
+ },
+ ],
+ name: "_setWhitelistStatuses",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ name: "accountAssets",
+ outputs: [
+ {
+ internalType: "contract ICErc20",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "admin",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "adminHasRights",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ name: "allBorrowers",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ name: "allMarkets",
+ outputs: [
+ {
+ internalType: "contract ICErc20",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cToken",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "borrowAmount",
+ type: "uint256",
+ },
+ ],
+ name: "borrowAllowed",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "borrowCapForCollateral",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "borrowCapGuardian",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "borrowCaps",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "borrowGuardianPaused",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cToken",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "accountBorrowsNew",
+ type: "uint256",
+ },
+ ],
+ name: "borrowWithinLimits",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "borrowingAgainstCollateralBlacklist",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "cTokensByUnderlying",
+ outputs: [
+ {
+ internalType: "contract ICErc20",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "account",
+ type: "address",
+ },
+ {
+ internalType: "contract ICErc20",
+ name: "cToken",
+ type: "address",
+ },
+ ],
+ name: "checkMembership",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "closeFactorMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "enforceWhitelist",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address[]",
+ name: "cTokens",
+ type: "address[]",
+ },
+ ],
+ name: "enterMarkets",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "",
+ type: "uint256[]",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cTokenAddress",
+ type: "address",
+ },
+ ],
+ name: "exitMarket",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "account",
+ type: "address",
+ },
+ ],
+ name: "getAccountLiquidity",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "account",
+ type: "address",
+ },
+ ],
+ name: "getAssetsIn",
+ outputs: [
+ {
+ internalType: "contract ICErc20[]",
+ name: "",
+ type: "address[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "account",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "cTokenModify",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "redeemTokens",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "borrowAmount",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "repayAmount",
+ type: "uint256",
+ },
+ ],
+ name: "getHypotheticalAccountLiquidity",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "account",
+ type: "address",
+ },
+ {
+ internalType: "contract ICErc20",
+ name: "cTokenModify",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "isBorrow",
+ type: "bool",
+ },
+ ],
+ name: "getMaxRedeemOrBorrow",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "ionicAdmin",
+ outputs: [
+ {
+ internalType: "address payable",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "ionicAdminHasRights",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "isComptroller",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "contract ICErc20",
+ name: "cToken",
+ type: "address",
+ },
+ ],
+ name: "isDeprecated",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cTokenBorrowed",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "cTokenCollateral",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "liquidator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "repayAmount",
+ type: "uint256",
+ },
+ ],
+ name: "liquidateBorrowAllowed",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cTokenBorrowed",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "cTokenCollateral",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "actualRepayAmount",
+ type: "uint256",
+ },
+ ],
+ name: "liquidateCalculateSeizeTokens",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "liquidationIncentiveMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "markets",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "isListed",
+ type: "bool",
+ },
+ {
+ internalType: "uint256",
+ name: "collateralFactorMantissa",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cTokenAddress",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "minter",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "mintAmount",
+ type: "uint256",
+ },
+ ],
+ name: "mintAllowed",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "mintGuardianPaused",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cToken",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "minter",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "actualMintAmount",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "mintTokens",
+ type: "uint256",
+ },
+ ],
+ name: "mintVerify",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ name: "nonAccruingRewardsDistributors",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "oracle",
+ outputs: [
+ {
+ internalType: "contract BasePriceOracle",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "pauseGuardian",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "pendingAdmin",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cToken",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "redeemer",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "redeemTokens",
+ type: "uint256",
+ },
+ ],
+ name: "redeemAllowed",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cToken",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "redeemer",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "redeemAmount",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "redeemTokens",
+ type: "uint256",
+ },
+ ],
+ name: "redeemVerify",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cToken",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "payer",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "repayAmount",
+ type: "uint256",
+ },
+ ],
+ name: "repayBorrowAllowed",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ name: "rewardsDistributors",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cTokenCollateral",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "cTokenBorrowed",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "liquidator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "seizeTokens",
+ type: "uint256",
+ },
+ ],
+ name: "seizeAllowed",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "seizeGuardianPaused",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "suppliers",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "supplyCaps",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "cToken",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "src",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "dst",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "transferTokens",
+ type: "uint256",
+ },
+ ],
+ name: "transferAllowed",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "transferGuardianPaused",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "whitelist",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ name: "whitelistArray",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+] as const;
diff --git a/typescript/packages/plugins/ionic/src/abis/ERC20.ts b/typescript/packages/plugins/ionic/src/abis/ERC20.ts
new file mode 100644
index 000000000..7dbfe9727
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/abis/ERC20.ts
@@ -0,0 +1,62 @@
+export const erc20Abi = [
+ {
+ constant: true,
+ inputs: [
+ {
+ name: "_owner",
+ type: "address",
+ },
+ {
+ name: "_spender",
+ type: "address",
+ },
+ ],
+ name: "allowance",
+ outputs: [
+ {
+ name: "remaining",
+ type: "uint256",
+ },
+ ],
+ payable: false,
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ constant: false,
+ inputs: [
+ {
+ name: "_spender",
+ type: "address",
+ },
+ {
+ name: "_value",
+ type: "uint256",
+ },
+ ],
+ name: "approve",
+ outputs: [
+ {
+ name: "success",
+ type: "bool",
+ },
+ ],
+ payable: false,
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ constant: true,
+ inputs: [],
+ name: "decimals",
+ outputs: [
+ {
+ name: "",
+ type: "uint8",
+ },
+ ],
+ payable: false,
+ stateMutability: "view",
+ type: "function",
+ },
+] as const;
diff --git a/typescript/packages/plugins/ionic/src/abis/Pool.ts b/typescript/packages/plugins/ionic/src/abis/Pool.ts
new file mode 100644
index 000000000..a8d195536
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/abis/Pool.ts
@@ -0,0 +1,996 @@
+export const poolAbi = [
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "cashPrior",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "interestAccumulated",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "borrowIndex",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "totalBorrows",
+ type: "uint256",
+ },
+ ],
+ name: "AccrueInterest",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: true,
+ internalType: "address",
+ name: "owner",
+ type: "address",
+ },
+ {
+ indexed: true,
+ internalType: "address",
+ name: "spender",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "amount",
+ type: "uint256",
+ },
+ ],
+ name: "Approval",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "borrowAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "accountBorrows",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "totalBorrows",
+ type: "uint256",
+ },
+ ],
+ name: "Borrow",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "error",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "info",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "detail",
+ type: "uint256",
+ },
+ ],
+ name: "Failure",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "liquidator",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "repayAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "cTokenCollateral",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "seizeTokens",
+ type: "uint256",
+ },
+ ],
+ name: "LiquidateBorrow",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "minter",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "mintAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "mintTokens",
+ type: "uint256",
+ },
+ ],
+ name: "Mint",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "oldAdminFeeMantissa",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newAdminFeeMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "NewAdminFee",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "oldIonicFeeMantissa",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newIonicFeeMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "NewIonicFee",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "contract InterestRateModel",
+ name: "oldInterestRateModel",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "contract InterestRateModel",
+ name: "newInterestRateModel",
+ type: "address",
+ },
+ ],
+ name: "NewMarketInterestRateModel",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "oldReserveFactorMantissa",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newReserveFactorMantissa",
+ type: "uint256",
+ },
+ ],
+ name: "NewReserveFactor",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "redeemer",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "redeemAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "redeemTokens",
+ type: "uint256",
+ },
+ ],
+ name: "Redeem",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "payer",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "repayAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "accountBorrows",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "totalBorrows",
+ type: "uint256",
+ },
+ ],
+ name: "RepayBorrow",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "benefactor",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "addAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newTotalReserves",
+ type: "uint256",
+ },
+ ],
+ name: "ReservesAdded",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "admin",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "reduceAmount",
+ type: "uint256",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "newTotalReserves",
+ type: "uint256",
+ },
+ ],
+ name: "ReservesReduced",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: true,
+ internalType: "address",
+ name: "from",
+ type: "address",
+ },
+ {
+ indexed: true,
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "amount",
+ type: "uint256",
+ },
+ ],
+ name: "Transfer",
+ type: "event",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bytes",
+ name: "",
+ type: "bytes",
+ },
+ ],
+ name: "_becomeImplementation",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "_getExtensionFunctions",
+ outputs: [
+ {
+ internalType: "bytes4[]",
+ name: "functionSelectors",
+ type: "bytes4[]",
+ },
+ ],
+ stateMutability: "pure",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "withdrawAmount",
+ type: "uint256",
+ },
+ ],
+ name: "_withdrawAdminFees",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "withdrawAmount",
+ type: "uint256",
+ },
+ ],
+ name: "_withdrawIonicFees",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "accrualBlockNumber",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "adminFeeMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "ap",
+ outputs: [
+ {
+ internalType: "contract AddressesProvider",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "_token",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "_spender",
+ type: "address",
+ },
+ ],
+ name: "approve",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "borrowAmount",
+ type: "uint256",
+ },
+ ],
+ name: "borrow",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "borrowIndex",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "claim",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "comptroller",
+ outputs: [
+ {
+ internalType: "contract IonicComptroller",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "contractType",
+ outputs: [
+ {
+ internalType: "string",
+ name: "",
+ type: "string",
+ },
+ ],
+ stateMutability: "pure",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "decimals",
+ outputs: [
+ {
+ internalType: "uint8",
+ name: "",
+ type: "uint8",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "delegateType",
+ outputs: [
+ {
+ internalType: "uint8",
+ name: "",
+ type: "uint8",
+ },
+ ],
+ stateMutability: "pure",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "feeSeizeShareMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "getCash",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "interestRateModel",
+ outputs: [
+ {
+ internalType: "contract InterestRateModel",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "ionicAdmin",
+ outputs: [
+ {
+ internalType: "address payable",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "ionicFeeMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "repayAmount",
+ type: "uint256",
+ },
+ {
+ internalType: "address",
+ name: "cTokenCollateral",
+ type: "address",
+ },
+ ],
+ name: "liquidateBorrow",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "mintAmount",
+ type: "uint256",
+ },
+ ],
+ name: "mint",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "name",
+ outputs: [
+ {
+ internalType: "string",
+ name: "",
+ type: "string",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "protocolSeizeShareMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "redeemTokens",
+ type: "uint256",
+ },
+ ],
+ name: "redeem",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "redeemAmount",
+ type: "uint256",
+ },
+ ],
+ name: "redeemUnderlying",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "repayAmount",
+ type: "uint256",
+ },
+ ],
+ name: "repayBorrow",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "repayAmount",
+ type: "uint256",
+ },
+ ],
+ name: "repayBorrowBehalf",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "reserveFactorMantissa",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "liquidator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "borrower",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "seizeTokens",
+ type: "uint256",
+ },
+ ],
+ name: "seize",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "from",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "amount",
+ type: "uint256",
+ },
+ ],
+ name: "selfTransferIn",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "amount",
+ type: "uint256",
+ },
+ ],
+ name: "selfTransferOut",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "symbol",
+ outputs: [
+ {
+ internalType: "string",
+ name: "",
+ type: "string",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "totalAdminFees",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "totalBorrows",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "totalIonicFees",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "totalReserves",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "totalSupply",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "underlying",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+] as const;
diff --git a/typescript/packages/plugins/ionic/src/abis/PoolDirectory.ts b/typescript/packages/plugins/ionic/src/abis/PoolDirectory.ts
new file mode 100644
index 000000000..9b239f0ca
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/abis/PoolDirectory.ts
@@ -0,0 +1,968 @@
+export const poolDirectoryAbi = [
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "previousAdmin",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "newAdmin",
+ type: "address",
+ },
+ ],
+ name: "AdminChanged",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: true,
+ internalType: "address",
+ name: "beacon",
+ type: "address",
+ },
+ ],
+ name: "BeaconUpgraded",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: true,
+ internalType: "address",
+ name: "implementation",
+ type: "address",
+ },
+ ],
+ name: "Upgraded",
+ type: "event",
+ },
+ {
+ stateMutability: "payable",
+ type: "fallback",
+ },
+ {
+ inputs: [],
+ name: "admin",
+ outputs: [
+ {
+ internalType: "address",
+ name: "admin_",
+ type: "address",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "newAdmin",
+ type: "address",
+ },
+ ],
+ name: "changeAdmin",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "implementation",
+ outputs: [
+ {
+ internalType: "address",
+ name: "implementation_",
+ type: "address",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "newImplementation",
+ type: "address",
+ },
+ ],
+ name: "upgradeTo",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "newImplementation",
+ type: "address",
+ },
+ {
+ internalType: "bytes",
+ name: "data",
+ type: "bytes",
+ },
+ ],
+ name: "upgradeToAndCall",
+ outputs: [],
+ stateMutability: "payable",
+ type: "function",
+ },
+ {
+ stateMutability: "payable",
+ type: "receive",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address[]",
+ name: "admins",
+ type: "address[]",
+ },
+ {
+ indexed: false,
+ internalType: "bool",
+ name: "status",
+ type: "bool",
+ },
+ ],
+ name: "AdminWhitelistUpdated",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint8",
+ name: "version",
+ type: "uint8",
+ },
+ ],
+ name: "Initialized",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "oldOwner",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "newOwner",
+ type: "address",
+ },
+ ],
+ name: "NewOwner",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "address",
+ name: "oldPendingOwner",
+ type: "address",
+ },
+ {
+ indexed: false,
+ internalType: "address",
+ name: "newPendingOwner",
+ type: "address",
+ },
+ ],
+ name: "NewPendingOwner",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: true,
+ internalType: "address",
+ name: "previousOwner",
+ type: "address",
+ },
+ {
+ indexed: true,
+ internalType: "address",
+ name: "newOwner",
+ type: "address",
+ },
+ ],
+ name: "OwnershipTransferred",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "index",
+ type: "uint256",
+ },
+ {
+ components: [
+ {
+ internalType: "string",
+ name: "name",
+ type: "string",
+ },
+ {
+ internalType: "address",
+ name: "creator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "comptroller",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "blockPosted",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "timestampPosted",
+ type: "uint256",
+ },
+ ],
+ indexed: false,
+ internalType: "struct PoolDirectory.Pool",
+ name: "pool",
+ type: "tuple",
+ },
+ ],
+ name: "PoolRegistered",
+ type: "event",
+ },
+ {
+ inputs: [],
+ name: "_acceptOwner",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "comptroller",
+ type: "address",
+ },
+ ],
+ name: "_deprecatePool",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "index",
+ type: "uint256",
+ },
+ ],
+ name: "_deprecatePool",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address[]",
+ name: "admins",
+ type: "address[]",
+ },
+ {
+ internalType: "bool",
+ name: "status",
+ type: "bool",
+ },
+ ],
+ name: "_editAdminWhitelist",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address[]",
+ name: "deployers",
+ type: "address[]",
+ },
+ {
+ internalType: "bool",
+ name: "status",
+ type: "bool",
+ },
+ ],
+ name: "_editDeployerWhitelist",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bool",
+ name: "enforce",
+ type: "bool",
+ },
+ ],
+ name: "_setDeployerWhitelistEnforcement",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "newPendingOwner",
+ type: "address",
+ },
+ ],
+ name: "_setPendingOwner",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "adminWhitelist",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "name",
+ type: "string",
+ },
+ {
+ internalType: "address",
+ name: "implementation",
+ type: "address",
+ },
+ {
+ internalType: "bytes",
+ name: "constructorData",
+ type: "bytes",
+ },
+ {
+ internalType: "bool",
+ name: "enforceWhitelist",
+ type: "bool",
+ },
+ {
+ internalType: "uint256",
+ name: "closeFactor",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "liquidationIncentive",
+ type: "uint256",
+ },
+ {
+ internalType: "address",
+ name: "priceOracle",
+ type: "address",
+ },
+ ],
+ name: "deployPool",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "deployerWhitelist",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "enforceDeployerWhitelist",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "getActivePools",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "",
+ type: "uint256[]",
+ },
+ {
+ components: [
+ {
+ internalType: "string",
+ name: "name",
+ type: "string",
+ },
+ {
+ internalType: "address",
+ name: "creator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "comptroller",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "blockPosted",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "timestampPosted",
+ type: "uint256",
+ },
+ ],
+ internalType: "struct PoolDirectory.Pool[]",
+ name: "",
+ type: "tuple[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "getAllPools",
+ outputs: [
+ {
+ components: [
+ {
+ internalType: "string",
+ name: "name",
+ type: "string",
+ },
+ {
+ internalType: "address",
+ name: "creator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "comptroller",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "blockPosted",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "timestampPosted",
+ type: "uint256",
+ },
+ ],
+ internalType: "struct PoolDirectory.Pool[]",
+ name: "",
+ type: "tuple[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "account",
+ type: "address",
+ },
+ ],
+ name: "getPoolsByAccount",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "",
+ type: "uint256[]",
+ },
+ {
+ components: [
+ {
+ internalType: "string",
+ name: "name",
+ type: "string",
+ },
+ {
+ internalType: "address",
+ name: "creator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "comptroller",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "blockPosted",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "timestampPosted",
+ type: "uint256",
+ },
+ ],
+ internalType: "struct PoolDirectory.Pool[]",
+ name: "",
+ type: "tuple[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "user",
+ type: "address",
+ },
+ ],
+ name: "getPoolsOfUser",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "",
+ type: "uint256[]",
+ },
+ {
+ components: [
+ {
+ internalType: "string",
+ name: "name",
+ type: "string",
+ },
+ {
+ internalType: "address",
+ name: "creator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "comptroller",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "blockPosted",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "timestampPosted",
+ type: "uint256",
+ },
+ ],
+ internalType: "struct PoolDirectory.Pool[]",
+ name: "",
+ type: "tuple[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "getPublicPools",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "",
+ type: "uint256[]",
+ },
+ {
+ components: [
+ {
+ internalType: "string",
+ name: "name",
+ type: "string",
+ },
+ {
+ internalType: "address",
+ name: "creator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "comptroller",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "blockPosted",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "timestampPosted",
+ type: "uint256",
+ },
+ ],
+ internalType: "struct PoolDirectory.Pool[]",
+ name: "",
+ type: "tuple[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bool",
+ name: "whitelistedAdmin",
+ type: "bool",
+ },
+ ],
+ name: "getPublicPoolsByVerification",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "",
+ type: "uint256[]",
+ },
+ {
+ components: [
+ {
+ internalType: "string",
+ name: "name",
+ type: "string",
+ },
+ {
+ internalType: "address",
+ name: "creator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "comptroller",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "blockPosted",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "timestampPosted",
+ type: "uint256",
+ },
+ ],
+ internalType: "struct PoolDirectory.Pool[]",
+ name: "",
+ type: "tuple[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "account",
+ type: "address",
+ },
+ ],
+ name: "getVerifiedPoolsOfWhitelistedAccount",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "",
+ type: "uint256[]",
+ },
+ {
+ components: [
+ {
+ internalType: "string",
+ name: "name",
+ type: "string",
+ },
+ {
+ internalType: "address",
+ name: "creator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "comptroller",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "blockPosted",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "timestampPosted",
+ type: "uint256",
+ },
+ ],
+ internalType: "struct PoolDirectory.Pool[]",
+ name: "",
+ type: "tuple[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bool",
+ name: "_enforceDeployerWhitelist",
+ type: "bool",
+ },
+ {
+ internalType: "address[]",
+ name: "_deployerWhitelist",
+ type: "address[]",
+ },
+ ],
+ name: "initialize",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "owner",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "pendingOwner",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ name: "poolExists",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ name: "pools",
+ outputs: [
+ {
+ internalType: "string",
+ name: "name",
+ type: "string",
+ },
+ {
+ internalType: "address",
+ name: "creator",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "comptroller",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "blockPosted",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "timestampPosted",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "poolsCounter",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "renounceOwnership",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "index",
+ type: "uint256",
+ },
+ {
+ internalType: "string",
+ name: "name",
+ type: "string",
+ },
+ ],
+ name: "setPoolName",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "newOwner",
+ type: "address",
+ },
+ ],
+ name: "transferOwnership",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "_logic",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "admin_",
+ type: "address",
+ },
+ {
+ internalType: "bytes",
+ name: "_data",
+ type: "bytes",
+ },
+ ],
+ stateMutability: "payable",
+ type: "constructor",
+ },
+] as const;
diff --git a/typescript/packages/plugins/ionic/src/abis/PoolLens.ts b/typescript/packages/plugins/ionic/src/abis/PoolLens.ts
new file mode 100644
index 000000000..d656114e5
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/abis/PoolLens.ts
@@ -0,0 +1,22 @@
+export const poolLensAbi = [
+ {
+ inputs: [
+ { name: "user", type: "address" },
+ { name: "comptroller", type: "address" },
+ ],
+ name: "getUserPoolData",
+ outputs: [
+ {
+ components: [
+ { name: "totalBorrow", type: "uint256" },
+ { name: "totalCollateral", type: "uint256" },
+ { name: "healthFactor", type: "uint256" },
+ ],
+ name: "",
+ type: "tuple",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+] as const;
diff --git a/typescript/packages/plugins/ionic/src/abis/index.ts b/typescript/packages/plugins/ionic/src/abis/index.ts
new file mode 100644
index 000000000..57aa579a7
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/abis/index.ts
@@ -0,0 +1,6 @@
+export { poolLensAbi } from "./PoolLens";
+export { poolAbi } from "./Pool";
+export { comptrollerAbi } from "./Comptroller";
+export { erc20Abi } from "./ERC20";
+export { masterPriceOracleAbi } from "./masterPriceOracleAbi";
+export { cerc20DelegatorAbi } from "./Cerc20DelegatorAbi";
diff --git a/typescript/packages/plugins/ionic/src/abis/masterPriceOracleAbi.ts b/typescript/packages/plugins/ionic/src/abis/masterPriceOracleAbi.ts
new file mode 100644
index 000000000..ca9b59ac5
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/abis/masterPriceOracleAbi.ts
@@ -0,0 +1,140 @@
+export const masterPriceOracleAbi = [
+ {
+ type: "function",
+ inputs: [
+ { name: "underlyings", internalType: "address[]", type: "address[]" },
+ { name: "_oracles", internalType: "contract BasePriceOracle[]", type: "address[]" },
+ ],
+ name: "add",
+ outputs: [],
+ stateMutability: "nonpayable",
+ },
+ {
+ type: "function",
+ inputs: [
+ { name: "underlyings", internalType: "address[]", type: "address[]" },
+ { name: "_oracles", internalType: "contract BasePriceOracle[]", type: "address[]" },
+ ],
+ name: "addFallbacks",
+ outputs: [],
+ stateMutability: "nonpayable",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "admin",
+ outputs: [{ name: "", internalType: "address", type: "address" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "canAdminOverwrite",
+ outputs: [{ name: "", internalType: "bool", type: "bool" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "newAdmin", internalType: "address", type: "address" }],
+ name: "changeAdmin",
+ outputs: [],
+ stateMutability: "nonpayable",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "defaultOracle",
+ outputs: [{ name: "", internalType: "contract BasePriceOracle", type: "address" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "", internalType: "address", type: "address" }],
+ name: "fallbackOracles",
+ outputs: [{ name: "", internalType: "contract BasePriceOracle", type: "address" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "cToken", internalType: "contract ICErc20", type: "address" }],
+ name: "getUnderlyingPrice",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [
+ { name: "underlyings", internalType: "address[]", type: "address[]" },
+ { name: "_oracles", internalType: "contract BasePriceOracle[]", type: "address[]" },
+ { name: "_defaultOracle", internalType: "contract BasePriceOracle", type: "address" },
+ { name: "_admin", internalType: "address", type: "address" },
+ { name: "_canAdminOverwrite", internalType: "bool", type: "bool" },
+ { name: "_wtoken", internalType: "address", type: "address" },
+ ],
+ name: "initialize",
+ outputs: [],
+ stateMutability: "nonpayable",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "", internalType: "address", type: "address" }],
+ name: "oracles",
+ outputs: [{ name: "", internalType: "contract BasePriceOracle", type: "address" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "underlying", internalType: "address", type: "address" }],
+ name: "price",
+ outputs: [{ name: "", internalType: "uint256", type: "uint256" }],
+ stateMutability: "view",
+ },
+ {
+ type: "function",
+ inputs: [{ name: "newOracle", internalType: "contract BasePriceOracle", type: "address" }],
+ name: "setDefaultOracle",
+ outputs: [],
+ stateMutability: "nonpayable",
+ },
+ {
+ type: "function",
+ inputs: [],
+ name: "wtoken",
+ outputs: [{ name: "", internalType: "address", type: "address" }],
+ stateMutability: "view",
+ },
+ {
+ type: "event",
+ anonymous: false,
+ inputs: [{ name: "version", internalType: "uint8", type: "uint8", indexed: false }],
+ name: "Initialized",
+ },
+ {
+ type: "event",
+ anonymous: false,
+ inputs: [
+ { name: "oldAdmin", internalType: "address", type: "address", indexed: false },
+ { name: "newAdmin", internalType: "address", type: "address", indexed: false },
+ ],
+ name: "NewAdmin",
+ },
+ {
+ type: "event",
+ anonymous: false,
+ inputs: [
+ { name: "oldOracle", internalType: "address", type: "address", indexed: false },
+ { name: "newOracle", internalType: "address", type: "address", indexed: false },
+ ],
+ name: "NewDefaultOracle",
+ },
+ {
+ type: "event",
+ anonymous: false,
+ inputs: [
+ { name: "underlying", internalType: "address", type: "address", indexed: false },
+ { name: "oldOracle", internalType: "address", type: "address", indexed: false },
+ { name: "newOracle", internalType: "address", type: "address", indexed: false },
+ ],
+ name: "NewOracle",
+ },
+] as const;
diff --git a/typescript/packages/plugins/ionic/src/index.ts b/typescript/packages/plugins/ionic/src/index.ts
new file mode 100644
index 000000000..50547fe74
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/index.ts
@@ -0,0 +1,2 @@
+export * from "./ionic.plugin";
+export * from "./types";
diff --git a/typescript/packages/plugins/ionic/src/ionic.config.ts b/typescript/packages/plugins/ionic/src/ionic.config.ts
new file mode 100644
index 000000000..4b7693bc6
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/ionic.config.ts
@@ -0,0 +1,86 @@
+export interface IonicProtocolAddresses {
+ assets: {
+ [symbol: string]: {
+ address?: `0x${string}`;
+ decimals?: number;
+ };
+ };
+ PoolDirectory?: `0x${string}`;
+ PoolLens?: `0x${string}`;
+ Comptroller?: `0x${string}`;
+ PriceOracle?: `0x${string}`;
+}
+
+export const ionicProtocolAddresses: {
+ [chainId: number]: IonicProtocolAddresses;
+} = {
+ // Mode Chain
+ 34443: {
+ assets: {
+ ionUSDC: { address: "0x2BE717340023C9e14C1Bb12cb3ecBcfd3c3fB038", decimals: 6 },
+ ionWETH: { address: "0x71ef7EDa2Be775E5A7aa8afD02C45F059833e9d2", decimals: 18 },
+ ionMODE: { address: "0xe77fb5c088b194c46695780322d39c791d5ada16", decimals: 18 },
+ ionEzETH: { address: "0x59e710215d45F584f44c0FEe83DA6d43D762D857", decimals: 18 },
+ ionSTONE: { address: "0x959FA710CCBb22c7Ce1e59Da82A247e686629310", decimals: 18 },
+ ionWrsETH: { address: "0x49950319aBE7CE5c3A6C90698381b45989C99b46", decimals: 18 },
+ ionWeETH: { address: "0xA0D844742B4abbbc43d8931a6Edb00C56325aA18", decimals: 18 },
+ iondMBTC: { address: "0x5158ae44C1351682B3DC046541Edf84BF28c8ca4", decimals: 18 },
+ },
+ PoolDirectory: "0x39C353Cf9041CcF467A04d0e78B63d961E81458a", // Mode PoolDirectory
+ PoolLens: "0x70BB19a56BfAEc65aE861E6275A90163AbDF36a6", // Mode PoolLens
+ Comptroller: "0xfb3323e24743caf4add0fdccfb268565c0685556",
+ PriceOracle: "0x2BAF3A2B667A5027a83101d218A9e8B73577F117",
+ },
+ // Base Chain
+ 8453: {
+ assets: {
+ ionEzETH: { address: "0x079f84161642D81aaFb67966123C9949F9284bf5", decimals: 18 },
+ ionWstETH: { address: "0x9D62e30c6cB7964C99314DCf5F847e36Fcb29ca9", decimals: 18 },
+ ionCbETH: { address: "0x9c201024A62466F9157b2dAaDda9326207ADDd29", decimals: 18 },
+ ionAERO: { address: "0x014e08F05ac11BB532BE62774A4C548368f59779", decimals: 18 },
+ ionUSDC: { address: "0xa900A17a49Bc4D442bA7F72c39FA2108865671f0", decimals: 6 },
+ ionWETH: { address: "0x49420311B518f3d0c94e897592014de53831cfA3", decimals: 18 },
+ ionWeETH: { address: "0x84341B650598002d427570298564d6701733c805", decimals: 18 },
+ ionEUSD: { address: "0x9c2A4f9c5471fd36bE3BBd8437A33935107215A1", decimals: 18 },
+ ionBsdETH: { address: "0x3D9669DE9E3E98DB41A1CbF6dC23446109945E3C", decimals: 18 },
+ ionHyUSD: { address: "0x751911bDa88eFcF412326ABE649B7A3b28c4dEDe", decimals: 18 },
+ ionRSR: { address: "0xfc6b82668E10AFF62f208C492fc95ef1fa9C0426", decimals: 18 },
+ ionWSuperOETHb: { address: "0xC462eb5587062e2f2391990b8609D2428d8Cf598", decimals: 18 },
+ ionWUSDM: { address: "0xe30965Acd0Ee1CE2e0Cd0AcBFB3596bD6fC78A51", decimals: 18 },
+ ionCbBTC: { address: "0x1De166df671AE6DB4C4C98903df88E8007593748", decimals: 8 },
+ ionEURC: { address: "0x0E5A87047F871050c0D713321Deb0F008a41C495", decimals: 18 },
+ ionOGN: { address: "0xE00B2B2ca7ac347bc7Ca82fE5CfF0f76222FF375", decimals: 18 },
+ ionUSDPlus: { address: "0x74109171033F662D5b898A7a2FcAB2f1EF80c201", decimals: 18 },
+ ionUSDz: { address: "0xa4442b665d4c6DBC6ea43137B336e3089f05626C", decimals: 18 },
+ ionWUSDPlus: { address: "0xF1bbECD6aCF648540eb79588Df692c6b2F0fbc09", decimals: 18 },
+ ionSUSDz: { address: "0xf64bfd19DdCB2Bb54e6f976a233d0A9400ed84eA", decimals: 18 },
+ ionUSOL: { address: "0xbd06905590b6E1b6Ac979Fc477A0AebB58d52371", decimals: 18 },
+ ionUSUI: { address: "0xAa255Cf8e294BD7fcAB21897C0791e50C99BAc69", decimals: 18 },
+ ionFBOMB: { address: "0xd333681242F376f9005d1208ff946C3EE73eD659", decimals: 18 },
+ ionKLIMA: { address: "0x600D660440f15EeADbC3fc1403375e04b318F07e", decimals: 9 },
+ },
+ PoolDirectory: "0xE1A3006be645a80F206311d9f18C866c204bA02f", // Base PoolDirectory
+ PoolLens: "0x6ec80f9aCd960b568932696C0F0bE06FBfCd175a", // Base PoolLens
+ Comptroller: "0x05c9C6417F246600f8f5f49fcA9Ee991bfF73D13",
+ PriceOracle: "0x0Dc808adcE2099A9F62AA87D9670745AbA741746",
+ },
+ // OP Chain
+ 10: {
+ assets: {
+ ionWETH: { address: "0x53b1D15b24d93330b2fD359C798dE7183255e7f2", decimals: 18 },
+ ionLUSD: { address: "0x9F4089Ea33773A090ac514934517990dF04ae5a7", decimals: 18 },
+ ionUSDC: { address: "0x50549be7e21C3dc0Db03c3AbAb83e1a78d07e6e0", decimals: 6 },
+ ionWstETH: { address: "0x2527e8cC363Ef3fd470c6320B22956021cacd149", decimals: 18 },
+ ionUSDT: { address: "0xb2918350826C1FB3c8b25A553B5d49611698206f", decimals: 6 },
+ ionOP: { address: "0xAec01BB498bec2Fe8f3416314D5E0Db7EC76576b", decimals: 18 },
+ ionSNX: { address: "0xe4c5Aeb87762789F854B3Bae7515CF00d77a1f5e", decimals: 18 },
+ ionWBTC: { address: "0x863dccAaD60A1105f4B948C67895B4F0411C4497", decimals: 8 },
+ ionUSDM: { address: "0xc63B18Fc9025ACC7830B9df05e5A0B208940a3EE", decimals: 18 },
+ ionWeETH: { address: "0xC741af01903f39841228dE21d9DdD31Ba604Fec5", decimals: 18 },
+ },
+ PoolDirectory: "0xBbDcA7858ac2417b06636F7BA35e7d9EA39402ea", // Optimism PoolDirectory
+ PoolLens: "0x9c9CB0C521b05b368A11BC3B2AB6adb870D05f87", // Optimism PoolLens
+ Comptroller: "0xaFB4A254D125B0395610fdc8f1D022936c7b166B",
+ PriceOracle: "0x4d6D585eE00B1DF3F4c16075fE2489566AE3eBc9",
+ },
+};
diff --git a/typescript/packages/plugins/ionic/src/ionic.plugin.ts b/typescript/packages/plugins/ionic/src/ionic.plugin.ts
new file mode 100644
index 000000000..80b6c7987
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/ionic.plugin.ts
@@ -0,0 +1,18 @@
+import { type Chain, PluginBase } from "@goat-sdk/core";
+import { EVMWalletClient } from "@goat-sdk/wallet-evm";
+import { base, mode, optimism } from "viem/chains";
+import { IonicService } from "./ionic.service";
+
+export class IonicPlugin extends PluginBase {
+ constructor() {
+ super("ionic", [new IonicService()]);
+ }
+
+ supportsChain(chain: Chain): boolean {
+ return chain.type === "evm" && (chain.id === mode.id || chain.id === base.id || chain.id === optimism.id);
+ }
+}
+
+export function ionic() {
+ return new IonicPlugin();
+}
diff --git a/typescript/packages/plugins/ionic/src/ionic.service.ts b/typescript/packages/plugins/ionic/src/ionic.service.ts
new file mode 100644
index 000000000..d011ee255
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/ionic.service.ts
@@ -0,0 +1,305 @@
+import { Tool } from "@goat-sdk/core";
+import { EVMWalletClient } from "@goat-sdk/wallet-evm";
+import { type Address, formatUnits, parseUnits } from "viem";
+import { cerc20DelegatorAbi } from "./abis";
+import { ComptrollerProxyAbi } from "./abis/ComptrollerProxyAbi";
+import { poolAbi } from "./abis/Pool";
+import { ionicProtocolAddresses } from "./ionic.config";
+import {
+ BorrowAssetParameters,
+ GetHealthMetricsParameters,
+ LoopAssetParameters,
+ SupplyAssetParameters,
+ SwapCollateralParameters,
+} from "./parameters";
+import type { HealthMetrics } from "./types";
+
+export class IonicService {
+ private async getAssetConfig(chainId: number, symbol: string): Promise<{ address: Address; decimals: number }> {
+ const config = ionicProtocolAddresses[chainId]?.assets?.[symbol];
+ if (!config?.address || config.decimals === undefined) {
+ throw new Error(`Asset ${symbol} not found in Ionic Protocol addresses for chain ${chainId}`);
+ }
+ return { address: config.address as Address, decimals: config.decimals };
+ }
+
+ @Tool({
+ name: "ionic_supply_asset",
+ description: "Supply an asset to an Ionic Protocol pool. Make sure to approve the pool first.",
+ })
+ async supplyAsset(wallet: EVMWalletClient, params: SupplyAssetParameters): Promise {
+ const { asset, amount } = params;
+ const chain = wallet.getChain();
+
+ // Get token address from config
+ const tokenAddress = ionicProtocolAddresses[chain.id]?.assets?.[asset]?.address;
+ if (!tokenAddress) {
+ throw new Error(`Token address not found for ${asset} on chain ${chain.id}`);
+ }
+
+ // Then supply to pool
+ const txn = await wallet.sendTransaction({
+ to: tokenAddress,
+ abi: poolAbi,
+ functionName: "mint",
+ args: [BigInt(amount)],
+ });
+
+ return txn.hash;
+ }
+
+ @Tool({
+ name: "ionic_borrow_asset",
+ description: "Borrow an asset from an Ionic Protocol pool",
+ })
+ async borrowAsset(wallet: EVMWalletClient, params: BorrowAssetParameters): Promise {
+ const { asset, amount } = params;
+ const chain = await wallet.getChain();
+ const { address } = await this.getAssetConfig(chain.id, asset);
+
+ const comptrollerAddress = ionicProtocolAddresses[chain.id]?.Comptroller;
+ if (!comptrollerAddress) throw new Error("Comptroller not found");
+
+ const tokenAddress = ionicProtocolAddresses[chain.id]?.assets?.[asset]?.address;
+ if (!tokenAddress) {
+ throw new Error(`Token address not found for ${asset} on chain ${chain.id}`);
+ }
+
+ // Check borrow allowed
+ const borrowAllowed = await wallet.read({
+ address: comptrollerAddress,
+ abi: ComptrollerProxyAbi,
+ functionName: "borrowAllowed",
+ args: [address, wallet.getAddress(), amount],
+ });
+
+ if (borrowAllowed.toString() !== "0") {
+ throw new Error(`Borrow not allowed: ${borrowAllowed}`);
+ }
+
+ // Execute borrow
+ const txn = await wallet.sendTransaction({
+ to: tokenAddress,
+ abi: poolAbi,
+ functionName: "borrow",
+ args: [amount],
+ });
+
+ return txn.hash;
+ }
+
+ @Tool({
+ name: "ionic_get_health_metrics",
+ description: "Get health metrics for an Ionic Protocol position including LTV and liquidation risk",
+ })
+ async getHealthMetrics(wallet: EVMWalletClient, params: GetHealthMetricsParameters): Promise {
+ try {
+ const chain = wallet.getChain();
+ const userAddress = wallet.getAddress();
+
+ // Get Comptroller contract
+ const comptrollerAddress = ionicProtocolAddresses[chain.id]?.Comptroller;
+ if (!comptrollerAddress) throw new Error("Comptroller not found");
+
+ // Get account liquidity info
+ const result = await wallet.read({
+ address: comptrollerAddress,
+ abi: ComptrollerProxyAbi,
+ functionName: "getAccountLiquidity",
+ args: [userAddress],
+ });
+
+ const accountLiquidity = (result as { value: [bigint, bigint, bigint, bigint] }).value;
+
+ const [errorCode, collateralValue, liquidity, shortfall] = accountLiquidity;
+
+ if (errorCode.toString() !== "0") {
+ throw new Error(`Error getting account liquidity: ${errorCode}`);
+ }
+
+ // Calculate health factor using BigInt arithmetic
+ let healthFactor = "β"; // Default value when there's no borrow
+ if (collateralValue > 0n && collateralValue - liquidity > 0n) {
+ // Convert to number after calculation to avoid precision loss
+ const healthFactorBig = (collateralValue * 10000n) / (collateralValue - liquidity);
+ healthFactor = (Number(healthFactorBig) / 10000).toString();
+ }
+
+ // Get all markets user is in
+ const assetsResult = await wallet.read({
+ address: comptrollerAddress,
+ abi: ComptrollerProxyAbi,
+ functionName: "getAssetsIn",
+ args: [userAddress],
+ });
+ const assets = (assetsResult as { value: Address[] }).value;
+
+ let totalSuppliedUSD = 0n;
+ let totalBorrowedUSD = 0n;
+
+ for (const asset of assets) {
+ const supplyBalanceResult = await wallet.read({
+ address: asset,
+ abi: cerc20DelegatorAbi,
+ functionName: "balanceOf",
+ args: [userAddress],
+ });
+ const supplyBalance = (supplyBalanceResult as { value: bigint }).value;
+
+ // Get exchange rate to convert cToken balance to underlying
+ const exchangeRateResult = await wallet.read({
+ address: asset,
+ abi: cerc20DelegatorAbi,
+ functionName: "exchangeRateCurrent",
+ });
+ const exchangeRate = (exchangeRateResult as { value: bigint }).value;
+
+ const actualSupplyBalance = (supplyBalance * exchangeRate) / parseUnits("1", 18);
+
+ const borrowBalanceResult = await wallet.read({
+ address: asset,
+ abi: cerc20DelegatorAbi,
+ functionName: "borrowBalanceCurrent",
+ args: [userAddress],
+ });
+
+ const borrowBalance = (borrowBalanceResult as { value: bigint }).value;
+
+ // Calculate USD values using the formatted price
+ const SuppliedUSD = Number(formatUnits(actualSupplyBalance, 18));
+ const BorrowedUSD = Number(formatUnits(borrowBalance, 18));
+
+ // Convert back to BigInt with proper scaling
+ totalSuppliedUSD += SuppliedUSD !== 0 ? BigInt(Math.floor(SuppliedUSD * 1e18)) : 0n;
+ totalBorrowedUSD += BorrowedUSD !== 0 ? BigInt(Math.floor(BorrowedUSD * 1e18)) : 0n;
+ }
+
+ // Calculate LTV using BigInt arithmetic
+ let ltvString = "0";
+ if (totalSuppliedUSD > 0n) {
+ const ltvBig = (totalBorrowedUSD * parseUnits("1", 18)) / totalSuppliedUSD;
+ ltvString = formatUnits(ltvBig, 18);
+ }
+
+ return {
+ totalSuppliedUSD: formatUnits(totalSuppliedUSD, 6),
+ totalBorrowedUSD: formatUnits(totalBorrowedUSD, 18),
+ ltv: ltvString,
+ liquidity: formatUnits(liquidity, 18),
+ shortfall: formatUnits(shortfall, 18),
+ healthFactor: healthFactor,
+ };
+ } catch (error) {
+ throw new Error(`Failed to get health metrics: ${error}`);
+ }
+ }
+
+ @Tool({
+ name: "ionic_loop_asset",
+ description: "Loop (leverage) an asset position in Ionic Protocol",
+ })
+ async loopAsset(wallet: EVMWalletClient, params: LoopAssetParameters) {
+ try {
+ const { asset, initialAmount, targetltv, maxIterations } = params;
+ const chain = wallet.getChain();
+ const { address: assetAddress } = await this.getAssetConfig(chain.id, asset);
+
+ // Get Comptroller contract
+ const comptrollerAddress = ionicProtocolAddresses[chain.id]?.Comptroller;
+ if (!comptrollerAddress) throw new Error("Comptroller not found");
+
+ // Enter markets first to enable collateral
+ const enterMarketsTx = await wallet.sendTransaction({
+ to: comptrollerAddress,
+ abi: ComptrollerProxyAbi,
+ functionName: "enterMarkets",
+ args: [[assetAddress]],
+ });
+
+ // Initial supply
+ const initialSupplyTx = await wallet.sendTransaction({
+ to: assetAddress,
+ abi: cerc20DelegatorAbi,
+ functionName: "mint",
+ args: [BigInt(initialAmount)],
+ });
+
+ let currentAmount = BigInt(initialAmount);
+ const targetLTV = parseUnits(targetltv, 18);
+ const iterations = maxIterations || 5;
+
+ for (let i = 0; i < iterations; i++) {
+ // Check if target LTV reached
+ const metrics = await this.getHealthMetrics(wallet, {});
+ const currentLTV = parseUnits(metrics.ltv, 18);
+
+ if (currentLTV >= targetLTV) {
+ // target ltv reached , stop looping
+ break;
+ }
+
+ // Calculate borrow amount based on target LTV
+ const borrowAmount = (currentAmount * targetLTV) / parseUnits("1.0", 18);
+
+ // Borrow
+ await wallet.sendTransaction({
+ to: assetAddress,
+ abi: cerc20DelegatorAbi,
+ functionName: "borrow",
+ args: [borrowAmount],
+ });
+
+ // Supply borrowed amount
+ await wallet.sendTransaction({
+ to: assetAddress,
+ abi: cerc20DelegatorAbi,
+ functionName: "mint",
+ args: [borrowAmount],
+ });
+
+ currentAmount = borrowAmount;
+ }
+
+ return {
+ initialSupplyTx: initialSupplyTx.hash,
+ enterMarketsTx: enterMarketsTx.hash,
+ iterations: iterations,
+ currentAmount: formatUnits(currentAmount, 18),
+ };
+ } catch (error) {
+ throw new Error(`Failed to loop asset: ${error}`);
+ }
+ }
+
+ @Tool({
+ name: "ionic_swap_collateral",
+ description: "Swap one collateral asset for another while maintaining borrow position",
+ })
+ async swapCollateral(wallet: EVMWalletClient, params: SwapCollateralParameters) {
+ const { fromAsset, toAsset, amount } = params;
+ const chain = wallet.getChain();
+
+ // First withdraw the collateral
+ const fromAssetConfig = await this.getAssetConfig(chain.id, fromAsset);
+
+ // Withdraw collateral
+ const pool = await wallet.sendTransaction({
+ to: fromAssetConfig.address,
+ abi: poolAbi,
+ functionName: "redeemUnderlying",
+ args: [BigInt(amount)],
+ });
+
+ const supplynewcollateral = await wallet.sendTransaction({
+ to: fromAssetConfig.address,
+ abi: poolAbi,
+ functionName: "supplyAsset",
+ args: [toAsset, amount],
+ });
+
+ return {
+ poolTx: pool.hash,
+ supplyNewCollateralTx: supplynewcollateral.hash,
+ };
+ }
+}
diff --git a/typescript/packages/plugins/ionic/src/parameters.ts b/typescript/packages/plugins/ionic/src/parameters.ts
new file mode 100644
index 000000000..230eb404c
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/parameters.ts
@@ -0,0 +1,62 @@
+import { createToolParameters } from "@goat-sdk/core";
+import { z } from "zod";
+
+export class SupplyAssetParameters extends createToolParameters(
+ z.object({
+ poolId: z.string().describe("The ID of the pool to supply to"),
+ asset: z.string().describe("The asset to supply (e.g. ionUSDC, ionWETH)"),
+ amount: z.string().describe("The amount to supply in base units"),
+ }),
+) {}
+
+export class BorrowAssetParameters extends createToolParameters(
+ z.object({
+ asset: z.string().describe("The asset to borrow (e.g. ionUSDC, ionWETH)"),
+ amount: z.string().describe("The amount to borrow in base units"),
+ }),
+) {}
+
+export class GetHealthMetricsParameters extends createToolParameters(z.object({})) {}
+
+export class LoopAssetParameters extends createToolParameters(
+ z.object({
+ asset: z.string().describe("The asset to loop (e.g. ionWeETH, iondMBTC)"),
+ initialAmount: z.string().describe("Initial amount to supply"),
+ targetltv: z.string().describe("Target Loan-to-Value ratio"),
+ maxIterations: z.number().optional().describe("Maximum number of loop iterations"),
+ }),
+) {}
+
+export class SwapCollateralParameters extends createToolParameters(
+ z.object({
+ fromAsset: z.string().describe("Asset to swap from"),
+ toAsset: z.string().describe("Asset to swap to"),
+ amount: z.string().describe("Amount to swap"),
+ }),
+) {}
+
+export class GetPoolDataParameters extends createToolParameters(
+ z.object({
+ poolId: z.string().describe("The pool ID to get data for"),
+ }),
+) {}
+
+export class GetPoolAssetsParameters extends createToolParameters(
+ z.object({
+ poolId: z.string().describe("The pool ID to get assets for"),
+ }),
+) {}
+
+export class GetPoolRatesParameters extends createToolParameters(
+ z.object({
+ poolId: z.string().describe("The pool ID to get rates for"),
+ asset: z.string().describe("The asset to get rates for (e.g. ionUSDC, ionWETH)"),
+ }),
+) {}
+
+export class GetUserPositionParameters extends createToolParameters(
+ z.object({
+ poolId: z.string().describe("The pool ID to get position for"),
+ user: z.string().describe("The user address to get position for"),
+ }),
+) {}
diff --git a/typescript/packages/plugins/ionic/src/types.ts b/typescript/packages/plugins/ionic/src/types.ts
new file mode 100644
index 000000000..bf8929272
--- /dev/null
+++ b/typescript/packages/plugins/ionic/src/types.ts
@@ -0,0 +1,63 @@
+export interface HealthMetrics {
+ totalSuppliedUSD: string;
+ totalBorrowedUSD: string;
+ ltv: string;
+ liquidity: string;
+ shortfall: string;
+ healthFactor: string;
+}
+
+export interface LoopingConfig {
+ maxLeverage: number;
+ supportedAssets: string[];
+ minCollateralUSD: number;
+}
+
+export interface SupplyPosition {
+ asset: string;
+ amount: string;
+ value: string;
+ apy: number;
+}
+
+export interface CollateralSwapConfig {
+ slippageTolerance: number;
+ maxSwapSize: number;
+}
+
+export interface BorrowPosition {
+ asset: string;
+ amount: string;
+ value: string;
+ apy: number;
+ collateral: boolean;
+}
+
+export interface PoolAsset {
+ symbol: string;
+ decimals: number;
+ totalSupply: bigint;
+ totalSupplyUSD: bigint;
+ totalBorrowUSD: bigint;
+ supplyAPY: bigint;
+ utilization: bigint;
+}
+
+export interface PoolData {
+ assets: PoolAsset[];
+}
+
+export interface PortfolioHealth {
+ totalBorrowUSD: string;
+ totalCollateralUSD: string;
+ healthFactor: string;
+ ltv: string;
+ liquidationRisk: "LOW" | "MEDIUM" | "HIGH";
+ positions: {
+ asset: string;
+ supplyBalanceUSD: string;
+ borrowBalanceUSD: string;
+ supplyAPY: number;
+ borrowAPY: number;
+ }[];
+}
diff --git a/typescript/packages/plugins/ionic/tsconfig.json b/typescript/packages/plugins/ionic/tsconfig.json
new file mode 100644
index 000000000..b4ae67c1f
--- /dev/null
+++ b/typescript/packages/plugins/ionic/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "../../../tsconfig.base.json",
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/typescript/packages/plugins/ionic/tsup.config.ts b/typescript/packages/plugins/ionic/tsup.config.ts
new file mode 100644
index 000000000..2d38789ad
--- /dev/null
+++ b/typescript/packages/plugins/ionic/tsup.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "tsup";
+import { treeShakableConfig } from "../../../tsup.config.base";
+
+export default defineConfig({
+ ...treeShakableConfig,
+});
diff --git a/typescript/packages/plugins/ionic/turbo.json b/typescript/packages/plugins/ionic/turbo.json
new file mode 100644
index 000000000..45f951676
--- /dev/null
+++ b/typescript/packages/plugins/ionic/turbo.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://turbo.build/schema.json",
+ "extends": ["//"],
+ "tasks": {
+ "build": {
+ "inputs": ["src/**", "tsup.config.ts", "!./**/*.test.{ts,tsx}", "tsconfig.json"],
+ "dependsOn": ["^build"],
+ "outputs": ["dist/**"]
+ }
+ }
+}
diff --git a/typescript/packages/plugins/ironclad/CHANGELOG.md b/typescript/packages/plugins/ironclad/CHANGELOG.md
index 9147ec61d..6397a7a66 100644
--- a/typescript/packages/plugins/ironclad/CHANGELOG.md
+++ b/typescript/packages/plugins/ironclad/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-ironclad
+## 0.1.5
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.1.4
### Patch Changes
diff --git a/typescript/packages/plugins/ironclad/package.json b/typescript/packages/plugins/ironclad/package.json
index 673798d8d..ef5d8bc0e 100644
--- a/typescript/packages/plugins/ironclad/package.json
+++ b/typescript/packages/plugins/ironclad/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-ironclad",
- "version": "0.1.4",
+ "version": "0.1.5",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/jupiter/CHANGELOG.md b/typescript/packages/plugins/jupiter/CHANGELOG.md
index 825bf4eb9..e0c31d555 100644
--- a/typescript/packages/plugins/jupiter/CHANGELOG.md
+++ b/typescript/packages/plugins/jupiter/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-jupiter
+## 0.2.12
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.2.11
### Patch Changes
diff --git a/typescript/packages/plugins/jupiter/package.json b/typescript/packages/plugins/jupiter/package.json
index 8b4214c22..bd825e11a 100644
--- a/typescript/packages/plugins/jupiter/package.json
+++ b/typescript/packages/plugins/jupiter/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-jupiter",
- "version": "0.2.11",
+ "version": "0.2.12",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/kim/CHANGELOG.md b/typescript/packages/plugins/kim/CHANGELOG.md
index ea1968754..313974213 100644
--- a/typescript/packages/plugins/kim/CHANGELOG.md
+++ b/typescript/packages/plugins/kim/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-kim
+## 0.1.9
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.1.8
### Patch Changes
diff --git a/typescript/packages/plugins/kim/package.json b/typescript/packages/plugins/kim/package.json
index 0f29b5371..fea45df76 100644
--- a/typescript/packages/plugins/kim/package.json
+++ b/typescript/packages/plugins/kim/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-kim",
- "version": "0.1.8",
+ "version": "0.1.9",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/lulo/CHANGELOG.md b/typescript/packages/plugins/lulo/CHANGELOG.md
new file mode 100644
index 000000000..bd8049120
--- /dev/null
+++ b/typescript/packages/plugins/lulo/CHANGELOG.md
@@ -0,0 +1,7 @@
+# @goat-sdk/plugin-lulo
+
+## 0.1.1
+
+### Patch Changes
+
+- ead5c2c: Release package
diff --git a/typescript/packages/plugins/lulo/package.json b/typescript/packages/plugins/lulo/package.json
new file mode 100644
index 000000000..9847727fb
--- /dev/null
+++ b/typescript/packages/plugins/lulo/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "@goat-sdk/plugin-lulo",
+ "version": "0.1.1",
+ "files": ["dist/**/*", "README.md", "package.json"],
+ "scripts": {
+ "build": "tsup",
+ "clean": "rm -rf dist",
+ "test": "vitest run --passWithNoTests"
+ },
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "sideEffects": false,
+ "homepage": "https://ohmygoat.dev",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/goat-sdk/goat.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/goat-sdk/goat/issues"
+ },
+ "keywords": ["ai", "agents", "web3"],
+ "dependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "zod": "catalog:",
+ "@goat-sdk/wallet-solana": "workspace:*"
+ },
+ "peerDependencies": {
+ "@goat-sdk/core": "workspace:*"
+ }
+}
diff --git a/typescript/packages/plugins/lulo/src/index.ts b/typescript/packages/plugins/lulo/src/index.ts
new file mode 100644
index 000000000..081cda8cb
--- /dev/null
+++ b/typescript/packages/plugins/lulo/src/index.ts
@@ -0,0 +1,2 @@
+export * from "./lulo.plugin";
+export * from "./parameters";
diff --git a/typescript/packages/plugins/lulo/src/lulo.plugin.ts b/typescript/packages/plugins/lulo/src/lulo.plugin.ts
new file mode 100644
index 000000000..253c05ad2
--- /dev/null
+++ b/typescript/packages/plugins/lulo/src/lulo.plugin.ts
@@ -0,0 +1,14 @@
+import { PluginBase } from "@goat-sdk/core";
+import { LuloService } from "./lulo.service";
+
+export class LuloPlugin extends PluginBase {
+ constructor() {
+ super("lulo", [new LuloService()]);
+ }
+
+ supportsChain = () => true;
+}
+
+export function lulo() {
+ return new LuloPlugin();
+}
diff --git a/typescript/packages/plugins/lulo/src/lulo.service.ts b/typescript/packages/plugins/lulo/src/lulo.service.ts
new file mode 100644
index 000000000..15d376f59
--- /dev/null
+++ b/typescript/packages/plugins/lulo/src/lulo.service.ts
@@ -0,0 +1,27 @@
+import { Tool } from "@goat-sdk/core";
+import { SolanaWalletClient } from "@goat-sdk/wallet-solana";
+import { DepositUSDCParameters } from "./parameters";
+
+export class LuloService {
+ @Tool({
+ name: "lulo_deposit_usdc",
+ description: "Deposit USDC into Lulo",
+ })
+ async depositUSDC(walletClient: SolanaWalletClient, parameters: DepositUSDCParameters) {
+ const response = await fetch(`https://blink.lulo.fi/actions?amount=${parameters.amount}&symbol=USDC`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ account: walletClient.getAddress(),
+ }),
+ });
+
+ const data = await response.json();
+
+ const tx = await walletClient.sendRawTransaction(data.transaction);
+
+ return tx.hash;
+ }
+}
diff --git a/typescript/packages/plugins/lulo/src/parameters.ts b/typescript/packages/plugins/lulo/src/parameters.ts
new file mode 100644
index 000000000..1ff3fd151
--- /dev/null
+++ b/typescript/packages/plugins/lulo/src/parameters.ts
@@ -0,0 +1,8 @@
+import { createToolParameters } from "@goat-sdk/core";
+import { z } from "zod";
+
+export class DepositUSDCParameters extends createToolParameters(
+ z.object({
+ amount: z.string().describe("Amount of USDC to deposit"),
+ }),
+) {}
diff --git a/typescript/packages/plugins/lulo/tsconfig.json b/typescript/packages/plugins/lulo/tsconfig.json
new file mode 100644
index 000000000..b4ae67c1f
--- /dev/null
+++ b/typescript/packages/plugins/lulo/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "../../../tsconfig.base.json",
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/typescript/packages/plugins/lulo/tsup.config.ts b/typescript/packages/plugins/lulo/tsup.config.ts
new file mode 100644
index 000000000..2d38789ad
--- /dev/null
+++ b/typescript/packages/plugins/lulo/tsup.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "tsup";
+import { treeShakableConfig } from "../../../tsup.config.base";
+
+export default defineConfig({
+ ...treeShakableConfig,
+});
diff --git a/typescript/packages/plugins/lulo/turbo.json b/typescript/packages/plugins/lulo/turbo.json
new file mode 100644
index 000000000..45f951676
--- /dev/null
+++ b/typescript/packages/plugins/lulo/turbo.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://turbo.build/schema.json",
+ "extends": ["//"],
+ "tasks": {
+ "build": {
+ "inputs": ["src/**", "tsup.config.ts", "!./**/*.test.{ts,tsx}", "tsconfig.json"],
+ "dependsOn": ["^build"],
+ "outputs": ["dist/**"]
+ }
+ }
+}
diff --git a/typescript/packages/plugins/meteora/CHANGELOG.md b/typescript/packages/plugins/meteora/CHANGELOG.md
index 7779306bf..dab0cf9ec 100644
--- a/typescript/packages/plugins/meteora/CHANGELOG.md
+++ b/typescript/packages/plugins/meteora/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-meteora
+## 0.2.12
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.2.11
### Patch Changes
diff --git a/typescript/packages/plugins/meteora/package.json b/typescript/packages/plugins/meteora/package.json
index c38c653f6..7060bd342 100644
--- a/typescript/packages/plugins/meteora/package.json
+++ b/typescript/packages/plugins/meteora/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-meteora",
- "version": "0.2.11",
+ "version": "0.2.12",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/mode-governance/CHANGELOG.md b/typescript/packages/plugins/mode-governance/CHANGELOG.md
index 8fc491734..78a968161 100644
--- a/typescript/packages/plugins/mode-governance/CHANGELOG.md
+++ b/typescript/packages/plugins/mode-governance/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-mode-governance
+## 0.0.8
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.0.7
### Patch Changes
diff --git a/typescript/packages/plugins/mode-governance/package.json b/typescript/packages/plugins/mode-governance/package.json
index 59fbb0e6c..fcd9eaac4 100644
--- a/typescript/packages/plugins/mode-governance/package.json
+++ b/typescript/packages/plugins/mode-governance/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-mode-governance",
- "version": "0.0.7",
+ "version": "0.0.8",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/mode-voting/CHANGELOG.md b/typescript/packages/plugins/mode-voting/CHANGELOG.md
index e76b1abcd..bdf66d574 100644
--- a/typescript/packages/plugins/mode-voting/CHANGELOG.md
+++ b/typescript/packages/plugins/mode-voting/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-mode-voting
+## 0.1.2
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.1.1
### Patch Changes
diff --git a/typescript/packages/plugins/mode-voting/package.json b/typescript/packages/plugins/mode-voting/package.json
index 3f79c3bed..4acc298d2 100644
--- a/typescript/packages/plugins/mode-voting/package.json
+++ b/typescript/packages/plugins/mode-voting/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-mode-voting",
- "version": "0.1.1",
+ "version": "0.1.2",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/modespray/CHANGELOG.md b/typescript/packages/plugins/modespray/CHANGELOG.md
index 9683416dc..bf15fab09 100644
--- a/typescript/packages/plugins/modespray/CHANGELOG.md
+++ b/typescript/packages/plugins/modespray/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-modespray
+## 0.1.4
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.1.3
### Patch Changes
diff --git a/typescript/packages/plugins/modespray/package.json b/typescript/packages/plugins/modespray/package.json
index ff32167f8..0ab351a57 100644
--- a/typescript/packages/plugins/modespray/package.json
+++ b/typescript/packages/plugins/modespray/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-modespray",
- "version": "0.1.3",
+ "version": "0.1.4",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/orca/CHANGELOG.md b/typescript/packages/plugins/orca/CHANGELOG.md
index a6d57159c..018ec730d 100644
--- a/typescript/packages/plugins/orca/CHANGELOG.md
+++ b/typescript/packages/plugins/orca/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-orca
+## 0.2.15
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.2.14
### Patch Changes
diff --git a/typescript/packages/plugins/orca/package.json b/typescript/packages/plugins/orca/package.json
index ae190bffa..bf0c403d1 100644
--- a/typescript/packages/plugins/orca/package.json
+++ b/typescript/packages/plugins/orca/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-orca",
- "version": "0.2.14",
+ "version": "0.2.15",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/polymarket/CHANGELOG.md b/typescript/packages/plugins/polymarket/CHANGELOG.md
index aa9ffba15..7e48d4eb6 100644
--- a/typescript/packages/plugins/polymarket/CHANGELOG.md
+++ b/typescript/packages/plugins/polymarket/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-polymarket
+## 0.3.9
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.3.8
### Patch Changes
diff --git a/typescript/packages/plugins/polymarket/package.json b/typescript/packages/plugins/polymarket/package.json
index a90e97f12..3e8ec2385 100644
--- a/typescript/packages/plugins/polymarket/package.json
+++ b/typescript/packages/plugins/polymarket/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-polymarket",
- "version": "0.3.8",
+ "version": "0.3.9",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/pumpfun/CHANGELOG.md b/typescript/packages/plugins/pumpfun/CHANGELOG.md
index 7caef6837..17ee08ed9 100644
--- a/typescript/packages/plugins/pumpfun/CHANGELOG.md
+++ b/typescript/packages/plugins/pumpfun/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-pumpfun
+## 0.1.5
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.1.4
### Patch Changes
diff --git a/typescript/packages/plugins/pumpfun/package.json b/typescript/packages/plugins/pumpfun/package.json
index 531908ab1..3969a6b3c 100644
--- a/typescript/packages/plugins/pumpfun/package.json
+++ b/typescript/packages/plugins/pumpfun/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-pumpfun",
- "version": "0.1.4",
+ "version": "0.1.5",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/renzo/CHANGELOG.md b/typescript/packages/plugins/renzo/CHANGELOG.md
index 08201929a..19aa58b83 100644
--- a/typescript/packages/plugins/renzo/CHANGELOG.md
+++ b/typescript/packages/plugins/renzo/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-renzo
+## 0.1.4
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.1.3
### Patch Changes
diff --git a/typescript/packages/plugins/renzo/package.json b/typescript/packages/plugins/renzo/package.json
index cf2ced516..4327fb29e 100644
--- a/typescript/packages/plugins/renzo/package.json
+++ b/typescript/packages/plugins/renzo/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-renzo",
- "version": "0.1.3",
+ "version": "0.1.4",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/sns/CHANGELOG.md b/typescript/packages/plugins/sns/CHANGELOG.md
index 968640870..8b65f0a56 100644
--- a/typescript/packages/plugins/sns/CHANGELOG.md
+++ b/typescript/packages/plugins/sns/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-sns
+## 0.1.4
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.1.3
### Patch Changes
diff --git a/typescript/packages/plugins/sns/package.json b/typescript/packages/plugins/sns/package.json
index 8cf992fd2..12893fb9c 100644
--- a/typescript/packages/plugins/sns/package.json
+++ b/typescript/packages/plugins/sns/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-sns",
- "version": "0.1.3",
+ "version": "0.1.4",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/solana-magiceden/CHANGELOG.md b/typescript/packages/plugins/solana-magiceden/CHANGELOG.md
index e3bc87c6e..9522310db 100644
--- a/typescript/packages/plugins/solana-magiceden/CHANGELOG.md
+++ b/typescript/packages/plugins/solana-magiceden/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-solana-magiceden
+## 0.2.13
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.2.12
### Patch Changes
diff --git a/typescript/packages/plugins/solana-magiceden/package.json b/typescript/packages/plugins/solana-magiceden/package.json
index 1c5e0cb7d..02f22ffa1 100644
--- a/typescript/packages/plugins/solana-magiceden/package.json
+++ b/typescript/packages/plugins/solana-magiceden/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-solana-magiceden",
- "version": "0.2.12",
+ "version": "0.2.13",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/solana-nfts/CHANGELOG.md b/typescript/packages/plugins/solana-nfts/CHANGELOG.md
index b03e1b279..838736c71 100644
--- a/typescript/packages/plugins/solana-nfts/CHANGELOG.md
+++ b/typescript/packages/plugins/solana-nfts/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-solana-nfts
+## 0.2.12
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.2.11
### Patch Changes
diff --git a/typescript/packages/plugins/solana-nfts/package.json b/typescript/packages/plugins/solana-nfts/package.json
index a3338bc4d..498aec2c3 100644
--- a/typescript/packages/plugins/solana-nfts/package.json
+++ b/typescript/packages/plugins/solana-nfts/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-solana-nfts",
- "version": "0.2.11",
+ "version": "0.2.12",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
@@ -20,7 +20,7 @@
"@metaplex-foundation/umi-bundle-defaults": "0.9.2",
"@metaplex-foundation/umi-web3js-adapters": "0.8.10",
"@solana/web3.js": "catalog:",
- "got": "5.6.0",
+ "got": "11.8.5",
"zod": "catalog:"
},
"peerDependencies": {
diff --git a/typescript/packages/plugins/spl-token/CHANGELOG.md b/typescript/packages/plugins/spl-token/CHANGELOG.md
index cf33d908b..26a4f1065 100644
--- a/typescript/packages/plugins/spl-token/CHANGELOG.md
+++ b/typescript/packages/plugins/spl-token/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-spl-token
+## 0.2.14
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.2.13
### Patch Changes
diff --git a/typescript/packages/plugins/spl-token/package.json b/typescript/packages/plugins/spl-token/package.json
index bf0d7985e..9519a2832 100644
--- a/typescript/packages/plugins/spl-token/package.json
+++ b/typescript/packages/plugins/spl-token/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-spl-token",
- "version": "0.2.13",
+ "version": "0.2.14",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/starknet-token/CHANGELOG.md b/typescript/packages/plugins/starknet-token/CHANGELOG.md
new file mode 100644
index 000000000..02189d4a8
--- /dev/null
+++ b/typescript/packages/plugins/starknet-token/CHANGELOG.md
@@ -0,0 +1,9 @@
+# @goat-sdk/plugin-starknet-token
+
+## 0.1.1
+
+### Patch Changes
+
+- 167f829: Release package
+- Updated dependencies [167f829]
+ - @goat-sdk/wallet-starknet@0.1.1
diff --git a/typescript/packages/plugins/starknet-token/README.md b/typescript/packages/plugins/starknet-token/README.md
new file mode 100644
index 000000000..4959246c6
--- /dev/null
+++ b/typescript/packages/plugins/starknet-token/README.md
@@ -0,0 +1,41 @@
+# @goat/starknet-token
+
+A Goat plugin for interacting with tokens on the Starknet blockchain.
+
+## Features
+
+- Support for ERC20 tokens on Starknet
+- Balance checking
+- Token transfers
+- Allowance management (approve/check allowance)
+- Pre-configured common tokens (ETH, USDC, STRK)
+- Support for mainnet network for now
+
+## Installation
+
+```bash
+npm install @goat/starknet-token
+```
+## Usage
+```typescript
+import { starknetToken, STARKNET_TOKENS } from "@goat-sdk/plugin-starknet-token";
+
+const plugin = starknetToken({ tokens: STARKNET_TOKENS });
+```
+
+## Working example
+See the [Vercel AI example](https://github.com/MahmoudMohajer/goat/tree/starknet_demo/typescript/examples/vercel-ai/avnu) for a working example of how to use the Starknet Token plugin.
+## Supported Networks
+
+- Mainnet
+
+## Pre-configured Tokens
+
+- ETH (Ether)
+- USDC (USD Coin)
+- STRK (Starknet Token)
+- EKUBO (Ekubo Token)
+
+## Contributing
+
+Contributions are welcome! Please feel free to submit a Pull Request.
\ No newline at end of file
diff --git a/typescript/packages/plugins/starknet-token/package.json b/typescript/packages/plugins/starknet-token/package.json
new file mode 100644
index 000000000..92f9ff364
--- /dev/null
+++ b/typescript/packages/plugins/starknet-token/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "@goat-sdk/plugin-starknet-token",
+ "version": "0.1.1",
+ "files": ["dist/**/*", "README.md", "package.json"],
+ "scripts": {
+ "build": "tsup",
+ "clean": "rm -rf dist",
+ "test": "vitest run --passWithNoTests"
+ },
+ "sideEffects": false,
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "dependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "@goat-sdk/wallet-starknet": "workspace:*",
+ "starknet": "^6.11.0",
+ "zod": "catalog:"
+ },
+ "peerDependencies": {
+ "@goat-sdk/core": "workspace:*"
+ },
+ "homepage": "https://ohmygoat.dev",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/goat-sdk/goat.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/goat-sdk/goat/issues"
+ },
+ "keywords": ["ai", "agents", "web3"]
+}
diff --git a/typescript/packages/plugins/starknet-token/src/index.ts b/typescript/packages/plugins/starknet-token/src/index.ts
new file mode 100644
index 000000000..55b273d15
--- /dev/null
+++ b/typescript/packages/plugins/starknet-token/src/index.ts
@@ -0,0 +1,3 @@
+export * from "./starknet-token.plugin";
+export * from "./starknet-token.service";
+export * from "./tokens";
diff --git a/typescript/packages/plugins/starknet-token/src/parameters.ts b/typescript/packages/plugins/starknet-token/src/parameters.ts
new file mode 100644
index 000000000..3333190f8
--- /dev/null
+++ b/typescript/packages/plugins/starknet-token/src/parameters.ts
@@ -0,0 +1,43 @@
+import { createToolParameters } from "@goat-sdk/core";
+import { z } from "zod";
+
+export class GetTokenInfoBySymbolParameters extends createToolParameters(
+ z.object({
+ symbol: z.string().describe("The symbol of the token to get the info of (e.g ETH, USDC, DAI)"),
+ }),
+) {}
+
+export class GetTokenBalanceByAddressParameters extends createToolParameters(
+ z.object({
+ walletAddress: z
+ .string()
+ .regex(/^0x[a-fA-F0-9]{64}$/, "Must be a valid Starknet address (0x followed by 64 hex characters)")
+ .describe("The address to get the balance of"),
+ tokenAddress: z
+ .string()
+ .regex(/^0x[a-fA-F0-9]{64}$/, "Must be a valid Starknet address (0x followed by 64 hex characters)")
+ .describe("The contract address of the token to get the balance of"),
+ decimals: z.number().describe("The decimals of the token"),
+ }),
+) {}
+
+export class TransferTokenParameters extends createToolParameters(
+ z.object({
+ tokenAddress: z
+ .string()
+ .regex(/^0x[a-fA-F0-9]{64}$/, "Must be a valid Starknet address (0x followed by 64 hex characters)")
+ .describe("The contract address of the token to transfer"),
+ to: z
+ .string()
+ .regex(/^0x[a-fA-F0-9]{64}$/, "Must be a valid Starknet address (0x followed by 64 hex characters)")
+ .describe("The address to transfer the token to"),
+ amount: z.string().describe("The amount of tokens to transfer in base unit"),
+ }),
+) {}
+
+export class ConvertToBaseUnitParameters extends createToolParameters(
+ z.object({
+ amount: z.number().describe("The amount of tokens to convert to base unit"),
+ decimals: z.number().describe("The decimals of the token"),
+ }),
+) {}
diff --git a/typescript/packages/plugins/starknet-token/src/starknet-token.plugin.ts b/typescript/packages/plugins/starknet-token/src/starknet-token.plugin.ts
new file mode 100644
index 000000000..804707b85
--- /dev/null
+++ b/typescript/packages/plugins/starknet-token/src/starknet-token.plugin.ts
@@ -0,0 +1,18 @@
+import { Chain, PluginBase } from "@goat-sdk/core";
+import { StarknetWalletClient } from "@goat-sdk/wallet-starknet";
+import { StarknetTokenService } from "./starknet-token.service";
+import { StarknetTokenPluginCtorParams } from "./types/StarknetTokenPluginCtorParams";
+
+export class StarknetTokenPlugin extends PluginBase {
+ constructor({ tokens }: StarknetTokenPluginCtorParams) {
+ super("starknet-token", [new StarknetTokenService({ tokens })]);
+ }
+
+ supportsChain(chain: Chain): boolean {
+ return chain.type === "starknet";
+ }
+}
+
+export function starknetToken({ tokens }: StarknetTokenPluginCtorParams) {
+ return new StarknetTokenPlugin({ tokens });
+}
diff --git a/typescript/packages/plugins/starknet-token/src/starknet-token.service.ts b/typescript/packages/plugins/starknet-token/src/starknet-token.service.ts
new file mode 100644
index 000000000..be4fe8447
--- /dev/null
+++ b/typescript/packages/plugins/starknet-token/src/starknet-token.service.ts
@@ -0,0 +1,112 @@
+import { Tool } from "@goat-sdk/core";
+import { StarknetAccountWalletClient } from "@goat-sdk/wallet-starknet";
+import {
+ ConvertToBaseUnitParameters,
+ GetTokenBalanceByAddressParameters,
+ GetTokenInfoBySymbolParameters,
+ TransferTokenParameters,
+} from "./parameters";
+import { STARKNET_TOKENS, type StarknetNetwork, type Token } from "./tokens";
+import type { StarknetTokenPluginCtorParams } from "./types/StarknetTokenPluginCtorParams";
+
+export class StarknetTokenService {
+ private network: StarknetNetwork;
+ private tokens: Token[];
+
+ constructor({ network = "mainnet", tokens = STARKNET_TOKENS }: StarknetTokenPluginCtorParams = {}) {
+ this.network = network;
+ this.tokens = tokens;
+ }
+
+ @Tool({
+ description: "Get the Starknet token info by its symbol, including the contract address, decimals, and name",
+ })
+ async getTokenInfoBySymbol(parameters: GetTokenInfoBySymbolParameters) {
+ const token = this.tokens.find((token) =>
+ [token.symbol, token.symbol.toLowerCase()].includes(parameters.symbol),
+ );
+ return {
+ symbol: token?.symbol,
+ contractAddress: token?.addresses[this.network],
+ decimals: token?.decimals,
+ name: token?.name,
+ };
+ }
+
+ @Tool({
+ description: "Get the balance of a Starknet token by its contract address",
+ })
+ async getTokenBalanceByAddress(
+ walletClient: StarknetAccountWalletClient,
+ parameters: GetTokenBalanceByAddressParameters,
+ ) {
+ try {
+ const { walletAddress, tokenAddress } = parameters;
+
+ const result = await walletClient.getClient().callContract({
+ contractAddress: tokenAddress,
+ entrypoint: "balanceOf",
+ calldata: [walletAddress],
+ });
+
+ if (!result || !result[0]) {
+ throw new Error("Failed to fetch balance");
+ }
+
+ // Convert hex string to decimal
+ const balanceHex = result[0].toString();
+ const balanceDecimal = BigInt(balanceHex).toString();
+ return Number(balanceDecimal) / 10 ** parameters.decimals;
+ } catch (error) {
+ throw new Error(`Failed to get token balance: ${error}`);
+ }
+ }
+
+ @Tool({
+ description: "Transfer a Starknet token by its contract address",
+ })
+ async transferToken(walletClient: StarknetAccountWalletClient, parameters: TransferTokenParameters) {
+ try {
+ const { tokenAddress, to, amount } = parameters;
+
+ // Convert amount string to BigInt and encode it as felt
+ const amountBigInt = BigInt(amount);
+
+ // Execute the transfer by calling the token contract
+ const result = await walletClient.sendTransaction({
+ calls: [
+ {
+ contractAddress: tokenAddress,
+ entrypoint: "transfer",
+ // Pass uint256 as two separate felts (low and high)
+ calldata: [
+ to,
+ amountBigInt.toString(10), // low
+ "0", // high
+ ],
+ },
+ ],
+ });
+
+ if (!result?.hash) {
+ throw new Error("Failed to execute transfer");
+ }
+
+ return {
+ transactionHash: result.hash,
+ status: "success",
+ };
+ } catch (error) {
+ throw new Error(`Failed to transfer token: ${error}`);
+ }
+ }
+
+ @Tool({
+ description: "Convert an amount of a Starknet token to its base unit",
+ })
+ async convertToBaseUnit(parameters: ConvertToBaseUnitParameters) {
+ const { amount, decimals } = parameters;
+ const baseUnit = amount * 10 ** decimals;
+ return baseUnit;
+ }
+}
diff --git a/typescript/packages/plugins/starknet-token/src/tokens.ts b/typescript/packages/plugins/starknet-token/src/tokens.ts
new file mode 100644
index 000000000..78aac611c
--- /dev/null
+++ b/typescript/packages/plugins/starknet-token/src/tokens.ts
@@ -0,0 +1,78 @@
+export type StarknetNetwork = "mainnet" | "testnet" | "goerli";
+
+export type Token = {
+ decimals: number;
+ symbol: string;
+ name: string;
+ addresses: Record;
+};
+
+export type NetworkSpecificToken = Omit & {
+ network: StarknetNetwork;
+ address: string;
+};
+
+export const ETH: Token = {
+ decimals: 18,
+ symbol: "ETH",
+ name: "Ether",
+ addresses: {
+ mainnet: "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
+ testnet: "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
+ goerli: "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7",
+ },
+};
+
+export const USDC: Token = {
+ decimals: 6,
+ symbol: "USDC",
+ name: "USD Coin",
+ addresses: {
+ mainnet: "0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8",
+ testnet: "0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8",
+ goerli: null,
+ },
+};
+
+export const STARK: Token = {
+ decimals: 18,
+ symbol: "STRK",
+ name: "Starknet Token",
+ addresses: {
+ mainnet: "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",
+ testnet: "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d",
+ goerli: null,
+ },
+};
+
+export const EKUBO: Token = {
+ decimals: 18,
+ symbol: "EKUBO",
+ name: "Ekubo",
+ addresses: {
+ mainnet: "0x075afe6402aD5A5c20Dd25E10eC3b3986aCAA647b77e4Ae24B0CBc9a54A27a87",
+ testnet: null,
+ goerli: null,
+ },
+};
+
+export const STARKNET_TOKENS: Token[] = [ETH, USDC, STARK, EKUBO];
+
+export function getTokensForNetwork(network: StarknetNetwork, tokens: Token[]): NetworkSpecificToken[] {
+ const result: NetworkSpecificToken[] = [];
+
+ for (const token of tokens) {
+ const address = token.addresses[network];
+ if (address) {
+ result.push({
+ network,
+ decimals: token.decimals,
+ symbol: token.symbol,
+ name: token.name,
+ address,
+ });
+ }
+ }
+
+ return result;
+}
diff --git a/typescript/packages/plugins/starknet-token/src/types/StarknetTokenPluginCtorParams.ts b/typescript/packages/plugins/starknet-token/src/types/StarknetTokenPluginCtorParams.ts
new file mode 100644
index 000000000..7679779e5
--- /dev/null
+++ b/typescript/packages/plugins/starknet-token/src/types/StarknetTokenPluginCtorParams.ts
@@ -0,0 +1,15 @@
+import type { StarknetNetwork, Token } from "../tokens";
+
+export interface StarknetTokenPluginCtorParams {
+ /**
+ * The Starknet network to use (mainnet, testnet, goerli)
+ * @default "mainnet"
+ */
+ network?: StarknetNetwork;
+
+ /**
+ * List of tokens with their contract addresses, symbols, decimals, and names
+ * @default STARKNET_TOKENS
+ */
+ tokens?: Token[];
+}
diff --git a/typescript/packages/plugins/starknet-token/src/types/index.ts b/typescript/packages/plugins/starknet-token/src/types/index.ts
new file mode 100644
index 000000000..e69de29bb
diff --git a/typescript/packages/plugins/starknet-token/tsconfig.json b/typescript/packages/plugins/starknet-token/tsconfig.json
new file mode 100644
index 000000000..b4ae67c1f
--- /dev/null
+++ b/typescript/packages/plugins/starknet-token/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "../../../tsconfig.base.json",
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/typescript/packages/plugins/starknet-token/tsup.config.ts b/typescript/packages/plugins/starknet-token/tsup.config.ts
new file mode 100644
index 000000000..2d38789ad
--- /dev/null
+++ b/typescript/packages/plugins/starknet-token/tsup.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "tsup";
+import { treeShakableConfig } from "../../../tsup.config.base";
+
+export default defineConfig({
+ ...treeShakableConfig,
+});
diff --git a/typescript/packages/plugins/superfluid/CHANGELOG.md b/typescript/packages/plugins/superfluid/CHANGELOG.md
index 8247faf53..a929578ee 100644
--- a/typescript/packages/plugins/superfluid/CHANGELOG.md
+++ b/typescript/packages/plugins/superfluid/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-superfluid
+## 0.1.5
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.1.4
### Patch Changes
diff --git a/typescript/packages/plugins/superfluid/package.json b/typescript/packages/plugins/superfluid/package.json
index 870eaa047..8580aaaeb 100644
--- a/typescript/packages/plugins/superfluid/package.json
+++ b/typescript/packages/plugins/superfluid/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-superfluid",
- "version": "0.1.4",
+ "version": "0.1.5",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/tensor/CHANGELOG.md b/typescript/packages/plugins/tensor/CHANGELOG.md
index 907001f7a..412dba53f 100644
--- a/typescript/packages/plugins/tensor/CHANGELOG.md
+++ b/typescript/packages/plugins/tensor/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-tensor
+## 0.2.13
+
+### Patch Changes
+
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.2.12
### Patch Changes
diff --git a/typescript/packages/plugins/tensor/package.json b/typescript/packages/plugins/tensor/package.json
index 8476a1084..dbadc398f 100644
--- a/typescript/packages/plugins/tensor/package.json
+++ b/typescript/packages/plugins/tensor/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-tensor",
- "version": "0.2.12",
+ "version": "0.2.13",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/uniswap/CHANGELOG.md b/typescript/packages/plugins/uniswap/CHANGELOG.md
index 4223ad1c6..d00c22a79 100644
--- a/typescript/packages/plugins/uniswap/CHANGELOG.md
+++ b/typescript/packages/plugins/uniswap/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/plugin-uniswap
+## 0.2.10
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.2.9
### Patch Changes
diff --git a/typescript/packages/plugins/uniswap/package.json b/typescript/packages/plugins/uniswap/package.json
index 86b164f38..12a4c2a36 100644
--- a/typescript/packages/plugins/uniswap/package.json
+++ b/typescript/packages/plugins/uniswap/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-uniswap",
- "version": "0.2.9",
+ "version": "0.2.10",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/plugins/velodrome-plugin/CHANGELOG.md b/typescript/packages/plugins/velodrome-plugin/CHANGELOG.md
new file mode 100644
index 000000000..3f8f3142f
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/CHANGELOG.md
@@ -0,0 +1,14 @@
+# @goat-sdk/plugin-velodrome
+
+## 0.1.3
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
+## 0.1.2
+
+### Patch Changes
+
+- 17e00e1: Release package
diff --git a/typescript/packages/plugins/velodrome-plugin/package.json b/typescript/packages/plugins/velodrome-plugin/package.json
new file mode 100644
index 000000000..49ff290ab
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "@goat-sdk/plugin-velodrome",
+ "version": "0.1.3",
+ "files": ["dist/**/*", "README.md", "package.json"],
+ "scripts": {
+ "build": "tsup",
+ "clean": "rm -rf dist",
+ "test": "vitest run --passWithNoTests"
+ },
+ "sideEffects": false,
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "exports": {
+ ".": {
+ "require": "./dist/index.js",
+ "import": "./dist/index.mjs",
+ "types": "./dist/index.d.ts"
+ }
+ },
+ "dependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "@goat-sdk/wallet-evm": "workspace:*",
+ "viem": "catalog:",
+ "zod": "catalog:"
+ },
+ "peerDependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "viem": "catalog:"
+ },
+ "homepage": "https://ohmygoat.dev",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/goat-sdk/goat.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/goat-sdk/goat/issues"
+ },
+ "keywords": ["ai", "agents", "web3"]
+}
diff --git a/typescript/packages/plugins/velodrome-plugin/src/abi/quoterabi.ts b/typescript/packages/plugins/velodrome-plugin/src/abi/quoterabi.ts
new file mode 100644
index 000000000..48f2d6c45
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/src/abi/quoterabi.ts
@@ -0,0 +1,226 @@
+export const quoterabi = [
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "_factory",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "_factoryV2",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "_WETH9",
+ type: "address",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "constructor",
+ },
+ {
+ inputs: [],
+ name: "WETH9",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "factory",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "factoryV2",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bytes",
+ name: "path",
+ type: "bytes",
+ },
+ {
+ internalType: "uint256",
+ name: "amountIn",
+ type: "uint256",
+ },
+ ],
+ name: "quoteExactInput",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "amountOut",
+ type: "uint256",
+ },
+ {
+ internalType: "uint160[]",
+ name: "v3SqrtPriceX96AfterList",
+ type: "uint160[]",
+ },
+ {
+ internalType: "uint32[]",
+ name: "v3InitializedTicksCrossedList",
+ type: "uint32[]",
+ },
+ {
+ internalType: "uint256",
+ name: "v3SwapGasEstimate",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ components: [
+ {
+ internalType: "address",
+ name: "tokenIn",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "tokenOut",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ {
+ internalType: "uint256",
+ name: "amountIn",
+ type: "uint256",
+ },
+ ],
+ internalType: "struct IMixedRouteQuoterV1.QuoteExactInputSingleV2Params",
+ name: "params",
+ type: "tuple",
+ },
+ ],
+ name: "quoteExactInputSingleV2",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "amountOut",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ components: [
+ {
+ internalType: "address",
+ name: "tokenIn",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "tokenOut",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "amountIn",
+ type: "uint256",
+ },
+ {
+ internalType: "int24",
+ name: "tickSpacing",
+ type: "int24",
+ },
+ {
+ internalType: "uint160",
+ name: "sqrtPriceLimitX96",
+ type: "uint160",
+ },
+ ],
+ internalType: "struct IMixedRouteQuoterV1.QuoteExactInputSingleV3Params",
+ name: "params",
+ type: "tuple",
+ },
+ ],
+ name: "quoteExactInputSingleV3",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "amountOut",
+ type: "uint256",
+ },
+ {
+ internalType: "uint160",
+ name: "sqrtPriceX96After",
+ type: "uint160",
+ },
+ {
+ internalType: "uint32",
+ name: "initializedTicksCrossed",
+ type: "uint32",
+ },
+ {
+ internalType: "uint256",
+ name: "gasEstimate",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "int256",
+ name: "amount0Delta",
+ type: "int256",
+ },
+ {
+ internalType: "int256",
+ name: "amount1Delta",
+ type: "int256",
+ },
+ {
+ internalType: "bytes",
+ name: "path",
+ type: "bytes",
+ },
+ ],
+ name: "uniswapV3SwapCallback",
+ outputs: [],
+ stateMutability: "view",
+ type: "function",
+ },
+] as const;
diff --git a/typescript/packages/plugins/velodrome-plugin/src/abi/routerabi.ts b/typescript/packages/plugins/velodrome-plugin/src/abi/routerabi.ts
new file mode 100644
index 000000000..9cf2dbf18
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/src/abi/routerabi.ts
@@ -0,0 +1,823 @@
+export const routerabi = [
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "_factory",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "_weth",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "_sfs",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "_recipient",
+ type: "address",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "constructor",
+ },
+ {
+ inputs: [],
+ name: "ETHTransferFailed",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "Expired",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InsufficientAmount",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InsufficientAmountA",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InsufficientAmountADesired",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InsufficientAmountB",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InsufficientAmountBDesired",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InsufficientLiquidity",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InsufficientOutputAmount",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InvalidPath",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "OnlyWETH",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "SameAddresses",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "ZeroAddress",
+ type: "error",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "tokenA",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "tokenB",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ {
+ internalType: "uint256",
+ name: "amountADesired",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountBDesired",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountAMin",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountBMin",
+ type: "uint256",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "deadline",
+ type: "uint256",
+ },
+ ],
+ name: "addLiquidity",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "amountA",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountB",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "liquidity",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "token",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ {
+ internalType: "uint256",
+ name: "amountTokenDesired",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountTokenMin",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountETHMin",
+ type: "uint256",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "deadline",
+ type: "uint256",
+ },
+ ],
+ name: "addLiquidityETH",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "amountToken",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountETH",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "liquidity",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "payable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "factory",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "amountIn",
+ type: "uint256",
+ },
+ {
+ components: [
+ {
+ internalType: "address",
+ name: "from",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ ],
+ internalType: "struct IRouter.Route[]",
+ name: "routes",
+ type: "tuple[]",
+ },
+ ],
+ name: "getAmountsOut",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "amounts",
+ type: "uint256[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "tokenA",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "tokenB",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ ],
+ name: "getReserves",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "reserveA",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "reserveB",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "tokenA",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "tokenB",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ ],
+ name: "poolFor",
+ outputs: [
+ {
+ internalType: "address",
+ name: "pool",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "poolImplementation",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "tokenA",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "tokenB",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ {
+ internalType: "uint256",
+ name: "amountADesired",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountBDesired",
+ type: "uint256",
+ },
+ ],
+ name: "quoteAddLiquidity",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "amountA",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountB",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "liquidity",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "tokenA",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "tokenB",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ {
+ internalType: "uint256",
+ name: "liquidity",
+ type: "uint256",
+ },
+ ],
+ name: "quoteRemoveLiquidity",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "amountA",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountB",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "tokenA",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "tokenB",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ {
+ internalType: "uint256",
+ name: "liquidity",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountAMin",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountBMin",
+ type: "uint256",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "deadline",
+ type: "uint256",
+ },
+ ],
+ name: "removeLiquidity",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "amountA",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountB",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "token",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ {
+ internalType: "uint256",
+ name: "liquidity",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountTokenMin",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountETHMin",
+ type: "uint256",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "deadline",
+ type: "uint256",
+ },
+ ],
+ name: "removeLiquidityETH",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "amountToken",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountETH",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "token",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ {
+ internalType: "uint256",
+ name: "liquidity",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountTokenMin",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountETHMin",
+ type: "uint256",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "deadline",
+ type: "uint256",
+ },
+ ],
+ name: "removeLiquidityETHSupportingFeeOnTransferTokens",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "amountETH",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "tokenA",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "tokenB",
+ type: "address",
+ },
+ ],
+ name: "sortTokens",
+ outputs: [
+ {
+ internalType: "address",
+ name: "token0",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "token1",
+ type: "address",
+ },
+ ],
+ stateMutability: "pure",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "amountOutMin",
+ type: "uint256",
+ },
+ {
+ components: [
+ {
+ internalType: "address",
+ name: "from",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ ],
+ internalType: "struct IRouter.Route[]",
+ name: "routes",
+ type: "tuple[]",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "deadline",
+ type: "uint256",
+ },
+ ],
+ name: "swapExactETHForTokens",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "amounts",
+ type: "uint256[]",
+ },
+ ],
+ stateMutability: "payable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "amountIn",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountOutMin",
+ type: "uint256",
+ },
+ {
+ components: [
+ {
+ internalType: "address",
+ name: "from",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ ],
+ internalType: "struct IRouter.Route[]",
+ name: "routes",
+ type: "tuple[]",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "deadline",
+ type: "uint256",
+ },
+ ],
+ name: "swapExactTokensForETH",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "amounts",
+ type: "uint256[]",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "amountIn",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "amountOutMin",
+ type: "uint256",
+ },
+ {
+ components: [
+ {
+ internalType: "address",
+ name: "from",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "bool",
+ name: "stable",
+ type: "bool",
+ },
+ ],
+ internalType: "struct IRouter.Route[]",
+ name: "routes",
+ type: "tuple[]",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "deadline",
+ type: "uint256",
+ },
+ ],
+ name: "swapExactTokensForTokens",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "amounts",
+ type: "uint256[]",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "tokenId",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "weth",
+ outputs: [
+ {
+ internalType: "contract IWETH",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ stateMutability: "payable",
+ type: "receive",
+ },
+] as const;
diff --git a/typescript/packages/plugins/velodrome-plugin/src/abi/universalrouterabi.ts b/typescript/packages/plugins/velodrome-plugin/src/abi/universalrouterabi.ts
new file mode 100644
index 000000000..694846c0a
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/src/abi/universalrouterabi.ts
@@ -0,0 +1,564 @@
+export const universalrouterabi = [
+ {
+ inputs: [
+ {
+ components: [
+ {
+ internalType: "address",
+ name: "permit2",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "weth9",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "seaportV1_5",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "seaportV1_4",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "openseaConduit",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "nftxZap",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "x2y2",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "foundation",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "sudoswap",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "elementMarket",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "nft20Zap",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "cryptopunks",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "looksRareV2",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "routerRewardsDistributor",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "looksRareRewardsDistributor",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "looksRareToken",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "v2Factory",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "v2Implementation",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "v3Factory",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "clImplementation",
+ type: "address",
+ },
+ ],
+ internalType: "struct RouterParameters",
+ name: "params",
+ type: "tuple",
+ },
+ {
+ internalType: "address",
+ name: "sfs",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "tokenId",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "constructor",
+ },
+ {
+ inputs: [],
+ name: "BalanceTooLow",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "BuyPunkFailed",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "ContractLocked",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "ETHNotAccepted",
+ type: "error",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "commandIndex",
+ type: "uint256",
+ },
+ {
+ internalType: "bytes",
+ name: "message",
+ type: "bytes",
+ },
+ ],
+ name: "ExecutionFailed",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "FromAddressIsNotOwner",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InsufficientETH",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InsufficientToken",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InvalidBips",
+ type: "error",
+ },
+ {
+ inputs: [
+ {
+ internalType: "uint256",
+ name: "commandType",
+ type: "uint256",
+ },
+ ],
+ name: "InvalidCommandType",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InvalidOwnerERC1155",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InvalidOwnerERC721",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InvalidPath",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InvalidReserves",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "InvalidSpender",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "LengthMismatch",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "NotUniversalRouter",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "SliceOutOfBounds",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "StableExactOutputUnsupported",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "TransactionDeadlinePassed",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "UnableToClaim",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "UnsafeCast",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "V2InvalidPath",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "V2TooLittleReceived",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "V2TooMuchRequested",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "V3InvalidAmountOut",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "V3InvalidCaller",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "V3InvalidSwap",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "V3TooLittleReceived",
+ type: "error",
+ },
+ {
+ inputs: [],
+ name: "V3TooMuchRequested",
+ type: "error",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: false,
+ internalType: "uint256",
+ name: "amount",
+ type: "uint256",
+ },
+ ],
+ name: "RewardsSent",
+ type: "event",
+ },
+ {
+ anonymous: false,
+ inputs: [
+ {
+ indexed: true,
+ internalType: "address",
+ name: "sender",
+ type: "address",
+ },
+ {
+ indexed: true,
+ internalType: "address",
+ name: "recipient",
+ type: "address",
+ },
+ ],
+ name: "UniversalRouterSwap",
+ type: "event",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bytes",
+ name: "looksRareClaim",
+ type: "bytes",
+ },
+ ],
+ name: "collectRewards",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bytes",
+ name: "commands",
+ type: "bytes",
+ },
+ {
+ internalType: "bytes[]",
+ name: "inputs",
+ type: "bytes[]",
+ },
+ ],
+ name: "execute",
+ outputs: [],
+ stateMutability: "payable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bytes",
+ name: "commands",
+ type: "bytes",
+ },
+ {
+ internalType: "bytes[]",
+ name: "inputs",
+ type: "bytes[]",
+ },
+ {
+ internalType: "uint256",
+ name: "deadline",
+ type: "uint256",
+ },
+ ],
+ name: "execute",
+ outputs: [],
+ stateMutability: "payable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ {
+ internalType: "uint256[]",
+ name: "",
+ type: "uint256[]",
+ },
+ {
+ internalType: "uint256[]",
+ name: "",
+ type: "uint256[]",
+ },
+ {
+ internalType: "bytes",
+ name: "",
+ type: "bytes",
+ },
+ ],
+ name: "onERC1155BatchReceived",
+ outputs: [
+ {
+ internalType: "bytes4",
+ name: "",
+ type: "bytes4",
+ },
+ ],
+ stateMutability: "pure",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "bytes",
+ name: "",
+ type: "bytes",
+ },
+ ],
+ name: "onERC1155Received",
+ outputs: [
+ {
+ internalType: "bytes4",
+ name: "",
+ type: "bytes4",
+ },
+ ],
+ stateMutability: "pure",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ {
+ internalType: "bytes",
+ name: "",
+ type: "bytes",
+ },
+ ],
+ name: "onERC721Received",
+ outputs: [
+ {
+ internalType: "bytes4",
+ name: "",
+ type: "bytes4",
+ },
+ ],
+ stateMutability: "pure",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "token",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "from",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "to",
+ type: "address",
+ },
+ {
+ internalType: "uint256",
+ name: "amount",
+ type: "uint256",
+ },
+ ],
+ name: "stf",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "bytes4",
+ name: "interfaceId",
+ type: "bytes4",
+ },
+ ],
+ name: "supportsInterface",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "pure",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "int256",
+ name: "amount0Delta",
+ type: "int256",
+ },
+ {
+ internalType: "int256",
+ name: "amount1Delta",
+ type: "int256",
+ },
+ {
+ internalType: "bytes",
+ name: "data",
+ type: "bytes",
+ },
+ ],
+ name: "uniswapV3SwapCallback",
+ outputs: [],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ stateMutability: "payable",
+ type: "receive",
+ },
+] as const;
diff --git a/typescript/packages/plugins/velodrome-plugin/src/index.ts b/typescript/packages/plugins/velodrome-plugin/src/index.ts
new file mode 100644
index 000000000..db843f2a8
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/src/index.ts
@@ -0,0 +1,3 @@
+export { VelodromePlugin, velodrome } from "./velodrome.plugin";
+export { VelodromeService } from "./velodrome.service";
+export * from "./parameters";
diff --git a/typescript/packages/plugins/velodrome-plugin/src/parameters.ts b/typescript/packages/plugins/velodrome-plugin/src/parameters.ts
new file mode 100644
index 000000000..8194a0b39
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/src/parameters.ts
@@ -0,0 +1,36 @@
+import { createToolParameters } from "@goat-sdk/core";
+import { z } from "zod";
+
+export class SwapExactTokensParams extends createToolParameters(
+ z.object({
+ tokenIn: z.string().describe("The address of the token to swap from"),
+ tokenOut: z.string().describe("The address of the token to swap to"),
+ amountIn: z.string().describe("The amount of input tokens to swap in base units"),
+ amountOutMin: z.string().describe("The minimum amount of output tokens to receive in base units"),
+ stable: z.boolean().describe("Whether to use stable or volatile pool for swap"),
+ to: z.string().optional().describe("The address to receive the output tokens"),
+ deadline: z
+ .number()
+ .optional()
+ .default(60 * 60 * 24)
+ .describe("The deadline for the swap in seconds from now"),
+ }),
+) {}
+
+export class AddLiquidityParams extends createToolParameters(
+ z.object({
+ token0: z.string().describe("The address of the first token"),
+ token1: z.string().describe("The address of the second token"),
+ stable: z.boolean().describe("Whether this is a stable or volatile pool"),
+ amount0Desired: z.string().describe("The desired amount of first token to add in base units"),
+ amount1Desired: z.string().describe("The desired amount of second token to add in base units"),
+ amount0Min: z.string().describe("The minimum amount of first token to add in base units"),
+ amount1Min: z.string().describe("The minimum amount of second token to add in base units"),
+ to: z.string().optional().describe("The address to receive the LP tokens"),
+ deadline: z
+ .number()
+ .optional()
+ .default(60 * 60 * 24)
+ .describe("The deadline for the transaction in seconds from now"),
+ }),
+) {}
diff --git a/typescript/packages/plugins/velodrome-plugin/src/velodrome.plugin.ts b/typescript/packages/plugins/velodrome-plugin/src/velodrome.plugin.ts
new file mode 100644
index 000000000..21c5a5f20
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/src/velodrome.plugin.ts
@@ -0,0 +1,16 @@
+import { type Chain, PluginBase } from "@goat-sdk/core";
+import type { EVMWalletClient } from "@goat-sdk/wallet-evm";
+import { fraxtal, metalL2, mode, optimism } from "viem/chains";
+import { VelodromeService } from "./velodrome.service";
+
+const SUPPORTED_CHAINS = [mode, optimism, fraxtal, metalL2];
+
+export class VelodromePlugin extends PluginBase {
+ constructor() {
+ super("velodrome", [new VelodromeService()]);
+ }
+
+ supportsChain = (chain: Chain) => chain.type === "evm" && SUPPORTED_CHAINS.some((c) => c.id === chain.id);
+}
+
+export const velodrome = () => new VelodromePlugin();
diff --git a/typescript/packages/plugins/velodrome-plugin/src/velodrome.service.ts b/typescript/packages/plugins/velodrome-plugin/src/velodrome.service.ts
new file mode 100644
index 000000000..ae59d9341
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/src/velodrome.service.ts
@@ -0,0 +1,294 @@
+import { Tool } from "@goat-sdk/core";
+import { EVMWalletClient } from "@goat-sdk/wallet-evm";
+import { quoterabi } from "./abi/quoterabi";
+import { routerabi } from "./abi/routerabi";
+import { AddLiquidityParams, SwapExactTokensParams } from "./parameters";
+
+// Router addresses for different chains
+const UNIVERSAL_ROUTER_ADDRESSES: Record = {
+ 10: "0x4bF3E32de155359D1D75e8B474b66848221142fc",
+ 34443: "0x652e53C6a4FE39B6B30426d9c96376a105C89A95",
+ 252: "0x652e53C6a4FE39B6B30426d9c96376a105C89A95",
+ 1750: "0x652e53C6a4FE39B6B30426d9c96376a105C89A95",
+ 1135: "0x652e53C6a4FE39B6B30426d9c96376a105C89A95",
+};
+
+const ROUTER_ADDRESS: Record = {
+ 34443: "0x3a63171DD9BebF4D07BC782FECC7eb0b890C2A45",
+};
+
+const FACTORY_ADDRESS: Record = {
+ 34443: "0xF1046053aa5682b4F9a81b5481394DA16BE5FF5a",
+};
+const QUOTER_ADDRESS: Record = {
+ 34443: "0x2f7150B288ef1cc553207bD9fbd40D4e0e093B24",
+};
+
+const WETH_ADDRESS: Record = {
+ 34443: "0x4200000000000000000000000000000000000006",
+};
+
+export class VelodromeService {
+ @Tool({
+ name: "swap_exact_tokens",
+ description: "Swap an exact amount of tokens on Velodrome.",
+ })
+ async swapExactTokens(walletClient: EVMWalletClient, parameters: SwapExactTokensParams) {
+ try {
+ const userAddress = await walletClient.getAddress();
+ if (!userAddress) {
+ throw new Error("Could not get user address");
+ }
+
+ const chain = await walletClient.getChain();
+ if (!chain) {
+ throw new Error("Chain not configured in wallet client");
+ }
+
+ const routerAddress = ROUTER_ADDRESS[chain.id];
+ if (!routerAddress) {
+ throw new Error(`Router not found for chain ${chain.id}`);
+ }
+
+ const wethAddress = WETH_ADDRESS[chain.id];
+ const isETHIn = parameters.tokenIn.toLowerCase() === wethAddress.toLowerCase();
+ const isETHOut = parameters.tokenOut.toLowerCase() === wethAddress.toLowerCase();
+
+ // Get quote first
+ const amountOutMin = await this.getQuote(
+ walletClient,
+ parameters.tokenIn,
+ parameters.tokenOut,
+ parameters.amountIn,
+ parameters.stable,
+ );
+
+ // Apply slippage to quote (e.g. 0.5% slippage)
+ const minAmountOut = (BigInt(amountOutMin) * BigInt(995)) / BigInt(1000);
+
+ const timestamp = Math.floor(Date.now() / 1000) + parameters.deadline;
+
+ // Create route array
+ const routes = [
+ {
+ from: parameters.tokenIn,
+ to: parameters.tokenOut,
+ stable: parameters.stable,
+ },
+ ];
+
+ let txHash: { hash: string };
+
+ if (isETHIn) {
+ // ETH -> Token
+ txHash = await walletClient.sendTransaction({
+ to: routerAddress,
+ abi: routerabi,
+ functionName: "swapExactETHForTokens",
+ args: [minAmountOut, routes, parameters.to || userAddress, timestamp],
+ value: BigInt(parameters.amountIn),
+ });
+ } else if (isETHOut) {
+ // Token -> ETH
+ txHash = await walletClient.sendTransaction({
+ to: routerAddress,
+ abi: routerabi,
+ functionName: "swapExactTokensForETH",
+ args: [parameters.amountIn, minAmountOut, routes, parameters.to || userAddress, timestamp],
+ });
+ } else {
+ // Token -> Token
+ txHash = await walletClient.sendTransaction({
+ to: routerAddress,
+ abi: routerabi,
+ functionName: "swapExactTokensForTokens",
+ args: [parameters.amountIn, minAmountOut, routes, parameters.to || userAddress, timestamp],
+ });
+ }
+
+ return txHash.hash;
+ } catch (error) {
+ console.error("Error in swapExactTokens:", error);
+ throw error;
+ }
+ }
+
+ private async getQuote(
+ walletClient: EVMWalletClient,
+ tokenIn: string,
+ tokenOut: string,
+ amountIn: string,
+ stable: boolean,
+ ): Promise {
+ const quoterAddress = QUOTER_ADDRESS[walletClient.getChain()?.id || 34443];
+
+ // Call quoter contract to get expected output amount
+ const quote = await walletClient.read({
+ address: quoterAddress,
+ abi: quoterabi,
+ functionName: "quoteExactInputSingleV2",
+ args: [
+ {
+ tokenIn,
+ tokenOut,
+ stable,
+ amountIn: BigInt(amountIn),
+ },
+ ],
+ });
+
+ // Extract the value from the quote object
+ const quoteValue = (quote as { value: bigint }).value.toString();
+ return quoteValue;
+ }
+
+ @Tool({
+ name: "add_liquidity",
+ description: "Add liquidity to a Velodrome pool. Gets quote first and ensures sufficient allowance.",
+ })
+ async addLiquidity(walletClient: EVMWalletClient, parameters: AddLiquidityParams) {
+ try {
+ const userAddress = await walletClient.getAddress();
+ if (!userAddress) {
+ throw new Error("Could not get user address");
+ }
+
+ const chain = await walletClient.getChain();
+ if (!chain) {
+ throw new Error("Chain not configured in wallet client");
+ }
+
+ const routerAddress = ROUTER_ADDRESS[chain.id];
+ if (!routerAddress) {
+ throw new Error(`Router not found for chain ${chain.id}`);
+ }
+
+ // Get pool info and quotes
+ const [token0, token1] = await this.sortTokens(walletClient, parameters.token0, parameters.token1);
+
+ // Get reserves from factory
+ const poolAddress = await this.getPool(walletClient, token0, token1, parameters.stable);
+
+ const [reserve0, reserve1] = await this.getReserves(walletClient, poolAddress);
+
+ // Calculate optimal amounts based on current reserves
+ const [amount0Optimal, amount1Optimal] = this.getOptimalAmounts(
+ BigInt(parameters.amount0Desired),
+ BigInt(parameters.amount1Desired),
+ reserve0,
+ reserve1,
+ );
+
+ // Verify amounts are within acceptable ranges
+ if (
+ BigInt(amount0Optimal) < BigInt(parameters.amount0Min) ||
+ BigInt(amount1Optimal) < BigInt(parameters.amount1Min)
+ ) {
+ throw new Error("Insufficient liquidity minted");
+ }
+
+ const timestamp = Math.floor(Date.now() / 1000) + parameters.deadline;
+
+ // Add liquidity using Router
+ const hash = await walletClient.sendTransaction({
+ to: routerAddress,
+ abi: routerabi,
+ functionName: "addLiquidity",
+ args: [
+ token0,
+ token1,
+ parameters.stable,
+ amount0Optimal,
+ amount1Optimal,
+ parameters.amount0Min,
+ parameters.amount1Min,
+ parameters.to || userAddress,
+ timestamp,
+ ],
+ });
+
+ return hash.hash;
+ } catch (error) {
+ console.error("Error in addLiquidity:", error);
+ throw error;
+ }
+ }
+
+ private async sortTokens(walletClient: EVMWalletClient, tokenA: string, tokenB: string): Promise<[string, string]> {
+ const routerAddress = ROUTER_ADDRESS[walletClient.getChain()?.id || 34443];
+ const result = (await walletClient.read({
+ address: routerAddress,
+ abi: routerabi,
+ functionName: "sortTokens",
+ args: [tokenA, tokenB],
+ })) as unknown as [string, string];
+ return [result[0], result[1]];
+ }
+
+ private async getPool(
+ walletClient: EVMWalletClient,
+ token0: string,
+ token1: string,
+ stable: boolean,
+ ): Promise {
+ const factoryAddress = FACTORY_ADDRESS[walletClient.getChain()?.id || 34443];
+ return (await walletClient.read({
+ address: factoryAddress,
+ abi: [
+ {
+ inputs: [
+ { internalType: "address", name: "tokenA", type: "address" },
+ { internalType: "address", name: "tokenB", type: "address" },
+ { internalType: "bool", name: "stable", type: "bool" },
+ ],
+ name: "getPair",
+ outputs: [{ internalType: "address", name: "", type: "address" }],
+ stateMutability: "view",
+ type: "function",
+ },
+ ],
+ functionName: "getPair",
+ args: [token0, token1, stable],
+ })) as unknown as string;
+ }
+
+ private async getReserves(walletClient: EVMWalletClient, poolAddress: string): Promise<[bigint, bigint]> {
+ const result = (await walletClient.read({
+ address: poolAddress,
+ abi: [
+ {
+ inputs: [],
+ name: "getReserves",
+ outputs: [
+ { internalType: "uint256", name: "_reserve0", type: "uint256" },
+ { internalType: "uint256", name: "_reserve1", type: "uint256" },
+ { internalType: "uint256", name: "_blockTimestampLast", type: "uint256" },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ ],
+ functionName: "getReserves",
+ })) as unknown as [bigint, bigint];
+ return [result[0], result[1]];
+ }
+
+ private getOptimalAmounts(
+ amount0Desired: bigint,
+ amount1Desired: bigint,
+ reserve0: bigint,
+ reserve1: bigint,
+ ): [bigint, bigint] {
+ if (reserve0 === 0n && reserve1 === 0n) {
+ return [amount0Desired, amount1Desired];
+ }
+
+ const amount1Optimal = (amount0Desired * reserve1) / reserve0;
+ if (amount1Optimal <= amount1Desired) {
+ return [amount0Desired, amount1Optimal];
+ }
+
+ const amount0Optimal = (amount1Desired * reserve0) / reserve1;
+ return [amount0Optimal, amount1Desired];
+ }
+}
diff --git a/typescript/packages/plugins/velodrome-plugin/tsconfig.json b/typescript/packages/plugins/velodrome-plugin/tsconfig.json
new file mode 100644
index 000000000..b4ae67c1f
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "../../../tsconfig.base.json",
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/typescript/packages/plugins/velodrome-plugin/tsup.config.ts b/typescript/packages/plugins/velodrome-plugin/tsup.config.ts
new file mode 100644
index 000000000..2d38789ad
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/tsup.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "tsup";
+import { treeShakableConfig } from "../../../tsup.config.base";
+
+export default defineConfig({
+ ...treeShakableConfig,
+});
diff --git a/typescript/packages/plugins/velodrome-plugin/turbo.json b/typescript/packages/plugins/velodrome-plugin/turbo.json
new file mode 100644
index 000000000..45f951676
--- /dev/null
+++ b/typescript/packages/plugins/velodrome-plugin/turbo.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://turbo.build/schema.json",
+ "extends": ["//"],
+ "tasks": {
+ "build": {
+ "inputs": ["src/**", "tsup.config.ts", "!./**/*.test.{ts,tsx}", "tsconfig.json"],
+ "dependsOn": ["^build"],
+ "outputs": ["dist/**"]
+ }
+ }
+}
diff --git a/typescript/packages/plugins/zilliqa/CHANGELOG.md b/typescript/packages/plugins/zilliqa/CHANGELOG.md
index 1018dc35a..d94ce2392 100644
--- a/typescript/packages/plugins/zilliqa/CHANGELOG.md
+++ b/typescript/packages/plugins/zilliqa/CHANGELOG.md
@@ -1,5 +1,13 @@
# @goat-sdk/plugin-zilliqa
+## 0.1.4
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/wallet-zilliqa@0.2.7
+
## 0.1.3
### Patch Changes
diff --git a/typescript/packages/plugins/zilliqa/package.json b/typescript/packages/plugins/zilliqa/package.json
index 14e5a9f3f..ceffbc71a 100644
--- a/typescript/packages/plugins/zilliqa/package.json
+++ b/typescript/packages/plugins/zilliqa/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/plugin-zilliqa",
- "version": "0.1.3",
+ "version": "0.1.4",
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
"build": "tsup",
diff --git a/typescript/packages/wallets/cosmos/CHANGELOG.md b/typescript/packages/wallets/cosmos/CHANGELOG.md
index ba4297c06..67b8360dd 100644
--- a/typescript/packages/wallets/cosmos/CHANGELOG.md
+++ b/typescript/packages/wallets/cosmos/CHANGELOG.md
@@ -1,5 +1,11 @@
# @goat-sdk/wallet-cosmos
+## 0.0.3
+
+### Patch Changes
+
+- db65128: Minor fixes
+
## 0.0.2
### Patch Changes
diff --git a/typescript/packages/wallets/cosmos/package.json b/typescript/packages/wallets/cosmos/package.json
index cd9b1bbb9..9190f28f8 100644
--- a/typescript/packages/wallets/cosmos/package.json
+++ b/typescript/packages/wallets/cosmos/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/wallet-cosmos",
- "version": "0.0.2",
+ "version": "0.0.3",
"sideEffects": false,
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
@@ -14,6 +14,7 @@
"dependencies": {
"@goat-sdk/core": "workspace:*",
"@cosmjs/stargate": "^0.32.4",
+ "@cosmjs/cosmwasm-stargate": "^0.33.0",
"@cosmjs/proto-signing": "^0.32.4",
"@cosmjs/tendermint-rpc": "^0.32.4",
"@cosmjs/crypto": "^0.32.4",
diff --git a/typescript/packages/wallets/cosmos/src/CosmosWalletClient.ts b/typescript/packages/wallets/cosmos/src/CosmosWalletClient.ts
index 7fdf5dfaf..8a65c90f3 100644
--- a/typescript/packages/wallets/cosmos/src/CosmosWalletClient.ts
+++ b/typescript/packages/wallets/cosmos/src/CosmosWalletClient.ts
@@ -1,18 +1,19 @@
+import { SigningCosmWasmClient } from "@cosmjs/cosmwasm-stargate";
import { Ed25519 } from "@cosmjs/crypto";
import { AccountData } from "@cosmjs/proto-signing";
-import { QueryClient, SigningStargateClient } from "@cosmjs/stargate";
+import { QueryClient } from "@cosmjs/stargate";
import { Tendermint34Client } from "@cosmjs/tendermint-rpc";
import { assets, chains } from "chain-registry";
-import { CosmosReadRequest, CosmosTransaction, CosmosWalletClient } from "./types";
+import { ContractReadData, ContractWriteData, CosmosReadRequest, CosmosTransaction, CosmosWalletClient } from "./types";
export type CosmosWalletOptions = {
- client: SigningStargateClient;
+ client: SigningCosmWasmClient;
account: AccountData;
};
export class CosmosClient extends CosmosWalletClient {
account: AccountData;
- client: SigningStargateClient;
+ client: SigningCosmWasmClient;
constructor(params: CosmosWalletOptions) {
super();
@@ -66,6 +67,28 @@ export class CosmosClient extends CosmosWalletClient {
};
}
+ async contractWrite(transaction: ContractWriteData) {
+ const { contractAdr, message } = transaction;
+ const id = await this.client.getChainId();
+
+ const fe = chains.find((ch) => ch.chain_id === id)?.fees?.fee_tokens[0];
+
+ if (!fe) throw new Error("network data is unavailable");
+
+ if (!contractAdr) throw new Error("Invalid Contarct Address");
+
+ const memo = "txn";
+ const gas = 400000;
+ let tk = fe?.high_gas_price ?? fe?.average_gas_price ?? fe?.low_gas_price ?? fe?.fixed_min_gas_price ?? 0;
+ tk = tk === 0 ? 0.25 : tk;
+ const fee = { amount: [{ denom: fe?.denom, amount: Math.round(tk * gas).toString() }], gas: gas.toString() };
+ const result = await this.client.execute(this.getAddress(), contractAdr, message, fee, memo);
+ if (!result.transactionHash) throw new Error("transaction was incomplete");
+ return {
+ value: result,
+ };
+ }
+
async read(requestdata: CosmosReadRequest) {
const cometClient = await Tendermint34Client.connect(process.env.RPC_PROVIDER_URL as `0x${string}`);
const cli = new QueryClient(cometClient);
@@ -76,14 +99,22 @@ export class CosmosClient extends CosmosWalletClient {
};
}
+ async contractRead(request: ContractReadData) {
+ const { contractAdr, message } = request;
+ if (!contractAdr) throw new Error("Invalid Contarct Address");
+ const result = await this.client.queryContractSmart(request.contractAdr, message);
+ return {
+ value: result,
+ };
+ }
+
async balanceOf(address: string) {
- const [balance] = await this.client.getAllBalances(address);
const ast = await this.getChainInfo();
if (!ast.asset) throw new Error("Asset data is unavailable");
-
- const _ast = ast.asset?.assets.find((a) => a.base === balance.denom);
+ const _ast = ast.asset?.assets[0];
const exp = _ast?.denom_units.find((d) => d.denom === _ast?.display);
+ const balance = await this.client.getBalance(address, _ast.base);
const ex = !exp?.exponent ? 0 : exp?.exponent;
return {
diff --git a/typescript/packages/wallets/cosmos/src/types.ts b/typescript/packages/wallets/cosmos/src/types.ts
index 318a07c48..00fd43726 100644
--- a/typescript/packages/wallets/cosmos/src/types.ts
+++ b/typescript/packages/wallets/cosmos/src/types.ts
@@ -1,5 +1,6 @@
+import { DeliverTxResponse, ExecuteResult, JsonObject } from "@cosmjs/cosmwasm-stargate";
import { EncodeObject } from "@cosmjs/proto-signing";
-import { DeliverTxResponse, QueryAbciResponse } from "@cosmjs/stargate";
+import { QueryAbciResponse } from "@cosmjs/stargate";
import { CosmosChain, WalletClientBase } from "@goat-sdk/core";
export type CosmosTransaction = {
@@ -10,21 +11,37 @@ export type CosmosReadRequest = {
message: EncodeObject;
};
-export type CosmosReadResult = {
- value: QueryAbciResponse;
+export type ContractWriteData = {
+ contractAdr: string;
+ message: JsonObject;
+};
+
+export type ContractReadData = {
+ contractAdr: string;
+ message: JsonObject;
};
export type CosmosTransactionResult = {
value: DeliverTxResponse;
};
-export type CosmosBalanceResponse = {
- value: string;
+export type CosmosReadResult = {
+ value: QueryAbciResponse;
+};
+
+export type ContractWriteResult = {
+ value: ExecuteResult;
+};
+
+export type ContractReadResult = {
+ value: JsonObject;
};
export abstract class CosmosWalletClient extends WalletClientBase {
abstract getChain(): CosmosChain;
abstract getChainId(): Promise;
abstract sendTransaction(transaction: CosmosTransaction): Promise;
+ abstract contractWrite(transaction: ContractWriteData): Promise;
abstract read(request: CosmosReadRequest): Promise;
+ abstract contractRead(request: ContractReadData): Promise;
}
diff --git a/typescript/packages/wallets/crossmint/CHANGELOG.md b/typescript/packages/wallets/crossmint/CHANGELOG.md
index 1651adfbd..d25f3d7aa 100644
--- a/typescript/packages/wallets/crossmint/CHANGELOG.md
+++ b/typescript/packages/wallets/crossmint/CHANGELOG.md
@@ -1,5 +1,20 @@
# @goat-sdk/crossmint
+## 0.3.15
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
+## 0.3.14
+
+### Patch Changes
+
+- 1f361d5: Support raw txs
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.3.13
### Patch Changes
diff --git a/typescript/packages/wallets/crossmint/package.json b/typescript/packages/wallets/crossmint/package.json
index f26fffd68..a34feb4e7 100644
--- a/typescript/packages/wallets/crossmint/package.json
+++ b/typescript/packages/wallets/crossmint/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/crossmint",
- "version": "0.3.13",
+ "version": "0.3.15",
"sideEffects": false,
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
diff --git a/typescript/packages/wallets/crossmint/src/wallets/CustodialSolanaWalletClient.ts b/typescript/packages/wallets/crossmint/src/wallets/CustodialSolanaWalletClient.ts
index 0cedbe927..e4828bb84 100644
--- a/typescript/packages/wallets/crossmint/src/wallets/CustodialSolanaWalletClient.ts
+++ b/typescript/packages/wallets/crossmint/src/wallets/CustodialSolanaWalletClient.ts
@@ -116,6 +116,29 @@ export class CustodialSolanaWalletClient extends SolanaWalletClient {
}
}
+ async sendRawTransaction(transaction: string): Promise<{ hash: string }> {
+ const { id: transactionId } = await this.#client.createTransactionForCustodialWallet(
+ this.#locator,
+ transaction,
+ );
+
+ while (true) {
+ const latestTransaction = await this.#client.checkTransactionStatus(this.#locator, transactionId);
+
+ if (latestTransaction.status === "success") {
+ return {
+ hash: latestTransaction.onChain?.txId ?? "",
+ };
+ }
+
+ if (latestTransaction.status === "failed") {
+ throw new Error(`Transaction failed: ${latestTransaction.onChain?.txId}`);
+ }
+
+ await new Promise((resolve) => setTimeout(resolve, 3000)); // Wait 3 seconds
+ }
+ }
+
async balanceOf(address: string) {
const pubkey = new PublicKey(address);
const balance = await this.connection.getBalance(pubkey);
diff --git a/typescript/packages/wallets/evm/CHANGELOG.md b/typescript/packages/wallets/evm/CHANGELOG.md
index 706b84e9b..d7f9f7bd3 100644
--- a/typescript/packages/wallets/evm/CHANGELOG.md
+++ b/typescript/packages/wallets/evm/CHANGELOG.md
@@ -1,5 +1,11 @@
# @goat-sdk/wallet-evm
+## 0.2.7
+
+### Patch Changes
+
+- bcc14a7: Remove viem dependency
+
## 0.2.6
### Patch Changes
diff --git a/typescript/packages/wallets/evm/package.json b/typescript/packages/wallets/evm/package.json
index 483a3a1eb..92af25ab9 100644
--- a/typescript/packages/wallets/evm/package.json
+++ b/typescript/packages/wallets/evm/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/wallet-evm",
- "version": "0.2.6",
+ "version": "0.2.7",
"sideEffects": false,
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
diff --git a/typescript/packages/wallets/evm/src/sendETH.plugin.ts b/typescript/packages/wallets/evm/src/sendETH.plugin.ts
index acea61ec1..97f64adbb 100644
--- a/typescript/packages/wallets/evm/src/sendETH.plugin.ts
+++ b/typescript/packages/wallets/evm/src/sendETH.plugin.ts
@@ -55,7 +55,11 @@ function getChainToken(chainId: number) {
const viemChain = allChains.find((c) => c.id === chainId);
if (!viemChain) {
- throw new Error(`Unsupported EVM chain ID: ${chainId}`);
+ return {
+ symbol: "ETH",
+ name: "ETH",
+ decimals: 18,
+ };
}
return {
diff --git a/typescript/packages/wallets/lit-protocol/CHANGELOG.md b/typescript/packages/wallets/lit-protocol/CHANGELOG.md
index 6eebdd9f7..dd3194167 100644
--- a/typescript/packages/wallets/lit-protocol/CHANGELOG.md
+++ b/typescript/packages/wallets/lit-protocol/CHANGELOG.md
@@ -1,5 +1,20 @@
# @goat-sdk/wallet-lit
+## 0.2.14
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
+## 0.2.13
+
+### Patch Changes
+
+- 1f361d5: Support raw txs
+- Updated dependencies [1f361d5]
+ - @goat-sdk/wallet-solana@0.2.12
+
## 0.2.12
### Patch Changes
diff --git a/typescript/packages/wallets/lit-protocol/package.json b/typescript/packages/wallets/lit-protocol/package.json
index 48ef1ec94..a4a3d9c6b 100644
--- a/typescript/packages/wallets/lit-protocol/package.json
+++ b/typescript/packages/wallets/lit-protocol/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/wallet-lit",
- "version": "0.2.12",
+ "version": "0.2.14",
"sideEffects": false,
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
diff --git a/typescript/packages/wallets/lit-protocol/src/solana.ts b/typescript/packages/wallets/lit-protocol/src/solana.ts
index 54edccc0a..cba0c3108 100644
--- a/typescript/packages/wallets/lit-protocol/src/solana.ts
+++ b/typescript/packages/wallets/lit-protocol/src/solana.ts
@@ -73,6 +73,26 @@ export class LitSolanaWallet extends SolanaWalletClient {
};
}
+ async sendRawTransaction(transaction: string): Promise<{ hash: string }> {
+ const litTransaction = {
+ serializedTransaction: transaction,
+ chain: this.chain,
+ };
+
+ const signedTransaction = await signTransactionWithEncryptedKey({
+ litNodeClient: this.litNodeClient,
+ pkpSessionSigs: this.pkpSessionSigs,
+ network: "solana",
+ id: this.wrappedKeyMetadata.id,
+ unsignedTransaction: litTransaction,
+ broadcast: true,
+ });
+
+ return {
+ hash: signedTransaction,
+ };
+ }
+
async balanceOf(address: string) {
const pubkey = new PublicKey(address);
const balance = await this.connection.getBalance(pubkey);
diff --git a/typescript/packages/wallets/solana/CHANGELOG.md b/typescript/packages/wallets/solana/CHANGELOG.md
index f2cd0a427..d890b4178 100644
--- a/typescript/packages/wallets/solana/CHANGELOG.md
+++ b/typescript/packages/wallets/solana/CHANGELOG.md
@@ -1,5 +1,11 @@
# @goat-sdk/wallet-solana
+## 0.2.12
+
+### Patch Changes
+
+- 1f361d5: Support raw txs
+
## 0.2.11
### Patch Changes
diff --git a/typescript/packages/wallets/solana/package.json b/typescript/packages/wallets/solana/package.json
index 0aef791ba..feb2aa88c 100644
--- a/typescript/packages/wallets/solana/package.json
+++ b/typescript/packages/wallets/solana/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/wallet-solana",
- "version": "0.2.11",
+ "version": "0.2.12",
"sideEffects": false,
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
diff --git a/typescript/packages/wallets/solana/src/SolanaKeypairWalletClient.ts b/typescript/packages/wallets/solana/src/SolanaKeypairWalletClient.ts
index 590767737..f7fa86d1c 100644
--- a/typescript/packages/wallets/solana/src/SolanaKeypairWalletClient.ts
+++ b/typescript/packages/wallets/solana/src/SolanaKeypairWalletClient.ts
@@ -58,6 +58,33 @@ export class SolanaKeypairWalletClient extends SolanaWalletClient {
hash,
};
}
+
+ async sendRawTransaction(transaction: string): Promise<{ hash: string }> {
+ const tx = VersionedTransaction.deserialize(Buffer.from(transaction, "base64"));
+
+ const latestBlockhash = await this.connection.getLatestBlockhash();
+ tx.message.recentBlockhash = latestBlockhash.blockhash;
+
+ tx.sign([this.#keypair]);
+
+ const hash = await this.connection.sendTransaction(tx, {
+ maxRetries: 10,
+ preflightCommitment: "confirmed",
+ });
+
+ await this.connection.confirmTransaction(
+ {
+ blockhash: latestBlockhash.blockhash,
+ lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
+ signature: hash,
+ },
+ "confirmed",
+ );
+
+ return {
+ hash,
+ };
+ }
}
export const solana = (params: SolanaKeypairWalletClientCtorParams) => new SolanaKeypairWalletClient(params);
diff --git a/typescript/packages/wallets/solana/src/SolanaWalletClient.ts b/typescript/packages/wallets/solana/src/SolanaWalletClient.ts
index 71736ae29..9b2de9191 100644
--- a/typescript/packages/wallets/solana/src/SolanaWalletClient.ts
+++ b/typescript/packages/wallets/solana/src/SolanaWalletClient.ts
@@ -64,6 +64,8 @@ export abstract class SolanaWalletClient extends WalletClientBase {
abstract sendTransaction(transaction: SolanaTransaction): Promise<{ hash: string }>;
+ abstract sendRawTransaction(transaction: string): Promise<{ hash: string }>;
+
protected async getAddressLookupTableAccounts(keys: string[]): Promise {
const addressLookupTableAccountInfos = await this.connection.getMultipleAccountsInfo(
keys.map((key) => new PublicKey(key)),
diff --git a/typescript/packages/wallets/starknet/CHANGELOG.md b/typescript/packages/wallets/starknet/CHANGELOG.md
new file mode 100644
index 000000000..00605cf53
--- /dev/null
+++ b/typescript/packages/wallets/starknet/CHANGELOG.md
@@ -0,0 +1,7 @@
+# @goat-sdk/wallet-starknet
+
+## 0.1.1
+
+### Patch Changes
+
+- 167f829: Release package
diff --git a/typescript/packages/wallets/starknet/package.json b/typescript/packages/wallets/starknet/package.json
new file mode 100644
index 000000000..b29444489
--- /dev/null
+++ b/typescript/packages/wallets/starknet/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "@goat-sdk/wallet-starknet",
+ "version": "0.1.1",
+ "sideEffects": false,
+ "files": ["dist/**/*", "README.md", "package.json"],
+ "scripts": {
+ "build": "tsup",
+ "clean": "rm -rf dist",
+ "test": "vitest run --passWithNoTests"
+ },
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "dependencies": {
+ "@goat-sdk/core": "workspace:*",
+ "ethers": "6.13.5",
+ "starknet": "^6.11.0",
+ "viem": "catalog:",
+ "zod": "catalog:"
+ },
+ "peerDependencies": {
+ "@goat-sdk/core": "workspace:*"
+ },
+ "homepage": "https://ohmygoat.dev",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/goat-sdk/goat.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/goat-sdk/goat/issues"
+ },
+ "keywords": ["ai", "agents", "web3"]
+}
diff --git a/typescript/packages/wallets/starknet/src/StarknetAccountWalletClient.ts b/typescript/packages/wallets/starknet/src/StarknetAccountWalletClient.ts
new file mode 100644
index 000000000..fa72547ac
--- /dev/null
+++ b/typescript/packages/wallets/starknet/src/StarknetAccountWalletClient.ts
@@ -0,0 +1,74 @@
+import type { Account } from "starknet";
+import { type StarknetTransaction, StarknetWalletClient, type StarknetWalletCtorParams } from "./StarknetWalletClient";
+
+export type StarknetAccountWalletCtorParams = StarknetWalletCtorParams & {
+ starknetAccount: Account;
+};
+
+export class StarknetAccountWalletClient extends StarknetWalletClient {
+ private starknetAccount: Account;
+
+ constructor(params: StarknetAccountWalletCtorParams) {
+ super({ starknetClient: params.starknetClient });
+ this.starknetAccount = params.starknetAccount;
+ }
+
+ getAddress() {
+ return this.starknetAccount.address;
+ }
+
+ async signMessage(message: string) {
+ try {
+ const signature = await this.starknetAccount.signMessage({
+ domain: {
+ name: "StarkNet",
+ chainId: "SN_MAIN",
+ version: "1",
+ },
+ types: {
+ Message: [{ name: "message", type: "felt" }],
+ },
+ primaryType: "Message",
+ message: { message },
+ });
+ return {
+ signature: signature.toString(),
+ };
+ } catch (error) {
+ throw new Error(`Signing message failed: ${error}`);
+ }
+ }
+
+ async sendTransaction({ calls, transactionDetails }: StarknetTransaction) {
+ try {
+ const result = await this.starknetAccount.execute(calls, undefined, {
+ maxFee: transactionDetails?.maxFee,
+ version: transactionDetails?.version,
+ nonce: transactionDetails?.nonce,
+ resourceBounds: transactionDetails?.resourceBounds,
+ });
+
+ const receipt = await this.starknetClient.waitForTransaction(result.transaction_hash, {
+ retryInterval: 1000,
+ });
+
+ if (!receipt.isSuccess()) {
+ throw new Error("Transaction failed");
+ }
+
+ return {
+ hash: receipt.transaction_hash,
+ };
+ } catch (error) {
+ throw new Error(`Transaction failed: ${error}`);
+ }
+ }
+
+ getAccount(): Account {
+ return this.starknetAccount;
+ }
+}
+
+export function starknet({ starknetAccount, starknetClient }: StarknetAccountWalletCtorParams) {
+ return new StarknetAccountWalletClient({ starknetAccount, starknetClient });
+}
diff --git a/typescript/packages/wallets/starknet/src/StarknetWalletClient.ts b/typescript/packages/wallets/starknet/src/StarknetWalletClient.ts
new file mode 100644
index 000000000..96d08f81a
--- /dev/null
+++ b/typescript/packages/wallets/starknet/src/StarknetWalletClient.ts
@@ -0,0 +1,61 @@
+import { WalletClientBase } from "@goat-sdk/core";
+import { formatUnits } from "ethers";
+import type { Call, InvocationsDetails, RpcProvider } from "starknet";
+
+export type StarknetWalletCtorParams = {
+ starknetClient: RpcProvider;
+};
+
+export type StarknetTransaction = {
+ calls: Call[];
+ transactionDetails?: InvocationsDetails;
+};
+
+export abstract class StarknetWalletClient extends WalletClientBase {
+ protected starknetClient: RpcProvider;
+
+ constructor(params: StarknetWalletCtorParams) {
+ super();
+ this.starknetClient = params.starknetClient;
+ }
+
+ getChain() {
+ return {
+ type: "starknet",
+ } as const;
+ }
+
+ getClient() {
+ return this.starknetClient;
+ }
+
+ abstract getAddress(): string;
+
+ abstract signMessage(message: string): Promise<{ signature: string }>;
+
+ abstract sendTransaction(transaction: StarknetTransaction): Promise<{ hash: string }>;
+
+ async balanceOf(address: string) {
+ try {
+ const ETH_CONTRACT = "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7";
+
+ const result = await this.starknetClient.callContract({
+ contractAddress: ETH_CONTRACT,
+ entrypoint: "balanceOf",
+ calldata: [address],
+ });
+
+ const balanceWei = result[0];
+
+ return {
+ decimals: 18,
+ symbol: "ETH",
+ name: "Ethereum",
+ value: formatUnits(balanceWei, 18),
+ inBaseUnits: balanceWei.toString(),
+ };
+ } catch (error) {
+ throw new Error(`Error fetching balance: ${error}`);
+ }
+ }
+}
diff --git a/typescript/packages/wallets/starknet/src/index.ts b/typescript/packages/wallets/starknet/src/index.ts
new file mode 100644
index 000000000..5ac40232a
--- /dev/null
+++ b/typescript/packages/wallets/starknet/src/index.ts
@@ -0,0 +1,3 @@
+export { StarknetWalletClient } from "./StarknetWalletClient";
+export { StarknetAccountWalletClient } from "./StarknetAccountWalletClient";
+export { starknet } from "./StarknetAccountWalletClient";
diff --git a/typescript/packages/wallets/starknet/tsconfig.json b/typescript/packages/wallets/starknet/tsconfig.json
new file mode 100644
index 000000000..b4ae67c1f
--- /dev/null
+++ b/typescript/packages/wallets/starknet/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "../../../tsconfig.base.json",
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/typescript/packages/wallets/starknet/tsup.config.ts b/typescript/packages/wallets/starknet/tsup.config.ts
new file mode 100644
index 000000000..2d38789ad
--- /dev/null
+++ b/typescript/packages/wallets/starknet/tsup.config.ts
@@ -0,0 +1,6 @@
+import { defineConfig } from "tsup";
+import { treeShakableConfig } from "../../../tsup.config.base";
+
+export default defineConfig({
+ ...treeShakableConfig,
+});
diff --git a/typescript/packages/wallets/viem/CHANGELOG.md b/typescript/packages/wallets/viem/CHANGELOG.md
index d49e47972..8fa6b0b39 100644
--- a/typescript/packages/wallets/viem/CHANGELOG.md
+++ b/typescript/packages/wallets/viem/CHANGELOG.md
@@ -1,5 +1,12 @@
# @goat-sdk/wallet-viem
+## 0.2.7
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+
## 0.2.6
### Patch Changes
diff --git a/typescript/packages/wallets/viem/package.json b/typescript/packages/wallets/viem/package.json
index 844f4bf79..a065149ef 100644
--- a/typescript/packages/wallets/viem/package.json
+++ b/typescript/packages/wallets/viem/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/wallet-viem",
- "version": "0.2.6",
+ "version": "0.2.7",
"sideEffects": false,
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
diff --git a/typescript/packages/wallets/zilliqa/CHANGELOG.md b/typescript/packages/wallets/zilliqa/CHANGELOG.md
index e53b8b61a..dfa4c91c1 100644
--- a/typescript/packages/wallets/zilliqa/CHANGELOG.md
+++ b/typescript/packages/wallets/zilliqa/CHANGELOG.md
@@ -1,5 +1,13 @@
# @goat-sdk/wallet-zilliqa
+## 0.2.7
+
+### Patch Changes
+
+- Updated dependencies [bcc14a7]
+ - @goat-sdk/wallet-evm@0.2.7
+ - @goat-sdk/wallet-viem@0.2.7
+
## 0.2.6
### Patch Changes
diff --git a/typescript/packages/wallets/zilliqa/package.json b/typescript/packages/wallets/zilliqa/package.json
index 371e5069a..3cb16074c 100644
--- a/typescript/packages/wallets/zilliqa/package.json
+++ b/typescript/packages/wallets/zilliqa/package.json
@@ -1,6 +1,6 @@
{
"name": "@goat-sdk/wallet-zilliqa",
- "version": "0.2.6",
+ "version": "0.2.7",
"sideEffects": false,
"files": ["dist/**/*", "README.md", "package.json"],
"scripts": {
diff --git a/typescript/pnpm-lock.yaml b/typescript/pnpm-lock.yaml
index c79cbedd3..b0b052bc7 100644
--- a/typescript/pnpm-lock.yaml
+++ b/typescript/pnpm-lock.yaml
@@ -98,7 +98,7 @@ importers:
version: 1.8.10
tsup:
specifier: 8.3.5
- version: 8.3.5(@swc/core@1.10.1(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.0)
+ version: 8.3.5(@swc/core@1.10.1(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.1)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.0)
tsx:
specifier: 4.19.2
version: 4.19.2
@@ -154,8 +154,8 @@ importers:
specifier: ^5.62.2
version: 5.62.15(react@18.3.1)
next:
- specifier: 15.0.3
- version: 15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: 15.1.2
+ version: 15.1.2(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react:
specifier: ^18.0.0
version: 18.3.1
@@ -180,16 +180,16 @@ importers:
version: 8.4.49
tailwindcss:
specifier: ^3.4.1
- version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.5)(typescript@5.6.3))
+ version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.6.3))
examples/langchain/cosmos:
dependencies:
+ '@cosmjs/cosmwasm-stargate':
+ specifier: ^0.33.0
+ version: 0.33.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@cosmjs/proto-signing':
specifier: ^0.32.4
version: 0.32.4
- '@cosmjs/stargate':
- specifier: ^0.32.4
- version: 0.32.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@goat-sdk/adapter-langchain':
specifier: workspace:*
version: link:../../../packages/adapters/langchain
@@ -489,6 +489,69 @@ importers:
specifier: 2.21.49
version: 2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.24.1)
+ examples/vercel-ai/debridge-bridging:
+ dependencies:
+ '@ai-sdk/openai':
+ specifier: ^1.0.4
+ version: 1.0.13(zod@3.24.1)
+ '@goat-sdk/adapter-vercel-ai':
+ specifier: workspace:*
+ version: link:../../../packages/adapters/vercel-ai
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../../packages/core
+ '@goat-sdk/plugin-debridge':
+ specifier: workspace:*
+ version: link:../../../packages/plugins/debridge
+ '@goat-sdk/wallet-viem':
+ specifier: workspace:*
+ version: link:../../../packages/wallets/viem
+ ai:
+ specifier: 'catalog:'
+ version: 4.0.3(react@18.3.1)(zod@3.24.1)
+ dotenv:
+ specifier: ^16.4.5
+ version: 16.4.7
+ viem:
+ specifier: 2.21.49
+ version: 2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.24.1)
+
+ examples/vercel-ai/form-curves:
+ dependencies:
+ '@ai-sdk/openai':
+ specifier: ^1.0.4
+ version: 1.0.13(zod@3.24.1)
+ '@goat-sdk/adapter-vercel-ai':
+ specifier: workspace:*
+ version: link:../../../packages/adapters/vercel-ai
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../../packages/core
+ '@goat-sdk/plugin-curves':
+ specifier: workspace:*
+ version: link:../../../packages/plugins/curves
+ '@goat-sdk/plugin-erc20':
+ specifier: workspace:*
+ version: link:../../../packages/plugins/erc20
+ '@goat-sdk/plugin-uniswap':
+ specifier: workspace:*
+ version: link:../../../packages/plugins/uniswap
+ '@goat-sdk/wallet-evm':
+ specifier: workspace:*
+ version: link:../../../packages/wallets/evm
+ '@goat-sdk/wallet-viem':
+ specifier: workspace:*
+ version: link:../../../packages/wallets/viem
+ ai:
+ specifier: 'catalog:'
+ version: 4.0.3(react@18.3.1)(zod@3.24.1)
+ dotenv:
+ specifier: ^16.4.5
+ version: 16.4.7
+ viem:
+ specifier: 2.21.49
+ version: 2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.24.1)
+
examples/vercel-ai/fuel:
dependencies:
'@ai-sdk/openai':
@@ -511,7 +574,7 @@ importers:
version: 16.4.7
fuels:
specifier: 0.97.2
- version: 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ version: 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
examples/vercel-ai/headless-checkout:
dependencies:
@@ -986,6 +1049,75 @@ importers:
specifier: 'catalog:'
version: 3.23.8
+ packages/plugins/avnu:
+ dependencies:
+ '@avnu/avnu-sdk':
+ specifier: ^3.0.0
+ version: 3.0.0(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(moment@2.30.1)(qs@6.13.0)(starknet@6.11.0(encoding@0.1.13))
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../core
+ '@goat-sdk/wallet-starknet':
+ specifier: workspace:*
+ version: link:../../wallets/starknet
+ '@types/dotenv':
+ specifier: ^8.2.3
+ version: 8.2.3
+ dotenv:
+ specifier: ^16.4.7
+ version: 16.4.7
+ ethers:
+ specifier: ^6.13.4
+ version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ get-starknet:
+ specifier: ^3.3.3
+ version: 3.3.3(starknet@6.11.0(encoding@0.1.13))
+ starknet:
+ specifier: ^6.11.0
+ version: 6.11.0(encoding@0.1.13)
+ viem:
+ specifier: 'catalog:'
+ version: 2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ zod:
+ specifier: 'catalog:'
+ version: 3.23.8
+
+ packages/plugins/balancer:
+ dependencies:
+ '@balancer/sdk':
+ specifier: ^1.1.0
+ version: 1.1.0(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../core
+ '@goat-sdk/wallet-evm':
+ specifier: workspace:*
+ version: link:../../wallets/evm
+ viem:
+ specifier: 'catalog:'
+ version: 2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ zod:
+ specifier: 'catalog:'
+ version: 3.23.8
+
+ packages/plugins/balmy:
+ dependencies:
+ '@balmy/sdk':
+ specifier: 0.6.1
+ version: 0.6.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../core
+ '@goat-sdk/wallet-evm':
+ specifier: workspace:*
+ version: link:../../wallets/evm
+ viem:
+ specifier: 'catalog:'
+ version: 2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ zod:
+ specifier: 'catalog:'
+ version: 3.23.8
+
packages/plugins/birdeye:
dependencies:
'@goat-sdk/core':
@@ -1065,6 +1197,52 @@ importers:
specifier: 'catalog:'
version: 3.23.8
+ packages/plugins/curves:
+ dependencies:
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../core
+ '@goat-sdk/wallet-viem':
+ specifier: workspace:*
+ version: link:../../wallets/viem
+ abitype:
+ specifier: ^1.0.6
+ version: 1.0.8(typescript@5.6.3)(zod@3.23.8)
+ viem:
+ specifier: 'catalog:'
+ version: 2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ zod:
+ specifier: 'catalog:'
+ version: 3.23.8
+
+ packages/plugins/debridge:
+ dependencies:
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../core
+ '@goat-sdk/wallet-evm':
+ specifier: workspace:*
+ version: link:../../wallets/evm
+ viem:
+ specifier: 'catalog:'
+ version: 2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ zod:
+ specifier: 'catalog:'
+ version: 3.23.8
+ devDependencies:
+ '@types/node':
+ specifier: ^18.0.0
+ version: 18.19.69
+ tsup:
+ specifier: ^6.7.0
+ version: 6.7.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@18.19.69)(typescript@5.6.3))(typescript@5.6.3)
+ typescript:
+ specifier: ^5.2.2
+ version: 5.6.3
+ vitest:
+ specifier: ^0.34.0
+ version: 0.34.6(terser@5.37.0)
+
packages/plugins/dexscreener:
dependencies:
'@goat-sdk/core':
@@ -1131,7 +1309,7 @@ importers:
devDependencies:
tsup:
specifier: ^7.2.0
- version: 7.3.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.7.4)(typescript@5.6.3))(typescript@5.6.3)
+ version: 7.3.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.6.3))(typescript@5.6.3)
typescript:
specifier: ^5.2.2
version: 5.6.3
@@ -1139,6 +1317,21 @@ importers:
specifier: ^0.34.6
version: 0.34.6(terser@5.37.0)
+ packages/plugins/ionic:
+ dependencies:
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../core
+ '@goat-sdk/wallet-evm':
+ specifier: workspace:*
+ version: link:../../wallets/evm
+ viem:
+ specifier: 'catalog:'
+ version: 2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ zod:
+ specifier: 'catalog:'
+ version: 3.23.8
+
packages/plugins/ironclad:
dependencies:
'@goat-sdk/core':
@@ -1196,6 +1389,18 @@ importers:
specifier: 'catalog:'
version: 3.23.8
+ packages/plugins/lulo:
+ dependencies:
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../core
+ '@goat-sdk/wallet-solana':
+ specifier: workspace:*
+ version: link:../../wallets/solana
+ zod:
+ specifier: 'catalog:'
+ version: 3.23.8
+
packages/plugins/meteora:
dependencies:
'@coral-xyz/anchor':
@@ -1431,8 +1636,8 @@ importers:
specifier: 'catalog:'
version: 1.95.8(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
got:
- specifier: 5.6.0
- version: 5.6.0
+ specifier: 11.8.5
+ version: 11.8.5
zod:
specifier: 'catalog:'
version: 3.23.8
@@ -1455,6 +1660,21 @@ importers:
specifier: 'catalog:'
version: 3.23.8
+ packages/plugins/starknet-token:
+ dependencies:
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../core
+ '@goat-sdk/wallet-starknet':
+ specifier: workspace:*
+ version: link:../../wallets/starknet
+ starknet:
+ specifier: ^6.11.0
+ version: 6.11.0(encoding@0.1.13)
+ zod:
+ specifier: 'catalog:'
+ version: 3.23.8
+
packages/plugins/superfluid:
dependencies:
'@goat-sdk/core':
@@ -1497,6 +1717,21 @@ importers:
specifier: 'catalog:'
version: 3.23.8
+ packages/plugins/velodrome-plugin:
+ dependencies:
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../core
+ '@goat-sdk/wallet-evm':
+ specifier: workspace:*
+ version: link:../../wallets/evm
+ viem:
+ specifier: 'catalog:'
+ version: 2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ zod:
+ specifier: 'catalog:'
+ version: 3.23.8
+
packages/plugins/worldstore:
dependencies:
'@goat-sdk/core':
@@ -1586,6 +1821,9 @@ importers:
'@chain-registry/types':
specifier: ^0.50.45
version: 0.50.50
+ '@cosmjs/cosmwasm-stargate':
+ specifier: ^0.33.0
+ version: 0.33.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@cosmjs/crypto':
specifier: ^0.32.4
version: 0.32.4
@@ -1660,7 +1898,7 @@ importers:
version: link:../../core
fuels:
specifier: 0.97.2
- version: 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ version: 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
zod:
specifier: 'catalog:'
version: 3.23.8
@@ -1729,6 +1967,24 @@ importers:
specifier: 'catalog:'
version: 3.23.8
+ packages/wallets/starknet:
+ dependencies:
+ '@goat-sdk/core':
+ specifier: workspace:*
+ version: link:../../core
+ ethers:
+ specifier: 6.13.5
+ version: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ starknet:
+ specifier: ^6.11.0
+ version: 6.11.0(encoding@0.1.13)
+ viem:
+ specifier: 'catalog:'
+ version: 2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ zod:
+ specifier: 'catalog:'
+ version: 3.23.8
+
packages/wallets/sui:
dependencies:
'@goat-sdk/core':
@@ -2039,6 +2295,15 @@ packages:
resolution: {integrity: sha512-d6nWtUI//fyEN8DeLjm3+ro87Ad6+IKwR9pCqfrs/Azahso1xR1Llxd/O6fj/m1DDsuDj/HAsCsy5TC/aKD6Eg==}
engines: {node: '>=11.0.0'}
+ '@avnu/avnu-sdk@3.0.0':
+ resolution: {integrity: sha512-BqqazrXDKn5RE1anyl9Ba+Kd/4VaKNsdKTl0ryTfXhMIYp+R4dXMaLD40emfXd+25kxM00xPKiZOiGHl2ntG5g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ ethers: ^6.13.0
+ moment: ^2.30.1
+ qs: ^6.13.0
+ starknet: ^6.11.0
+
'@aws-crypto/crc32@3.0.0':
resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==}
@@ -2199,8 +2464,8 @@ packages:
resolution: {integrity: sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==}
engines: {node: '>=18.0.0'}
- '@azure/core-rest-pipeline@1.18.1':
- resolution: {integrity: sha512-/wS73UEDrxroUEVywEm7J0p2c+IIiVxyfigCGfsKvCxxCET4V/Hef2aURqltrXMRjNmdmt5IuOgIpl8f6xdO5A==}
+ '@azure/core-rest-pipeline@1.18.2':
+ resolution: {integrity: sha512-IkTf/DWKyCklEtN/WYW3lqEsIaUDshlzWRlZNNwSYtFcCBQz++OtOjxNpm8rr1VcbMS6RpjybQa3u6B6nG0zNw==}
engines: {node: '>=18.0.0'}
'@azure/core-tracing@1.2.0':
@@ -2223,8 +2488,8 @@ packages:
resolution: {integrity: sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==}
engines: {node: '>=18.0.0'}
- '@azure/msal-browser@3.28.0':
- resolution: {integrity: sha512-1c1qUF6vB52mWlyoMem4xR1gdwiQWYEQB2uhDkbAL4wVJr8WmAcXybc1Qs33y19N4BdPI8/DHI7rPE8L5jMtWw==}
+ '@azure/msal-browser@3.28.1':
+ resolution: {integrity: sha512-OHHEWMB5+Zrix8yKvLVzU3rKDFvh7SOzAzXfICD7YgUXLxfHpTPX2pzOotrri1kskwhHqIj4a5LvhZlIqE7C7g==}
engines: {node: '>=0.8.0'}
'@azure/msal-common@14.16.0':
@@ -2243,6 +2508,10 @@ packages:
resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==}
engines: {node: '>=6.9.0'}
+ '@babel/compat-data@7.26.5':
+ resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/core@7.26.0':
resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
engines: {node: '>=6.9.0'}
@@ -2251,6 +2520,10 @@ packages:
resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==}
engines: {node: '>=6.9.0'}
+ '@babel/generator@7.26.5':
+ resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-annotate-as-pure@7.25.9':
resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
engines: {node: '>=6.9.0'}
@@ -2259,6 +2532,10 @@ packages:
resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-compilation-targets@7.26.5':
+ resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-create-class-features-plugin@7.25.9':
resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==}
engines: {node: '>=6.9.0'}
@@ -2302,6 +2579,10 @@ packages:
resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-plugin-utils@7.26.5':
+ resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-remap-async-to-generator@7.25.9':
resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==}
engines: {node: '>=6.9.0'}
@@ -2314,6 +2595,12 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
+ '@babel/helper-replace-supers@7.26.5':
+ resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
'@babel/helper-skip-transparent-expression-wrappers@7.25.9':
resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==}
engines: {node: '>=6.9.0'}
@@ -2343,6 +2630,11 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
+ '@babel/parser@7.26.7':
+ resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
'@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9':
resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==}
engines: {node: '>=6.9.0'}
@@ -2541,8 +2833,8 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-block-scoped-functions@7.25.9':
- resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==}
+ '@babel/plugin-transform-block-scoped-functions@7.26.5':
+ resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -2697,8 +2989,8 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-nullish-coalescing-operator@7.25.9':
- resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==}
+ '@babel/plugin-transform-nullish-coalescing-operator@7.26.6':
+ resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -2829,8 +3121,8 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-typeof-symbol@7.25.9':
- resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==}
+ '@babel/plugin-transform-typeof-symbol@7.26.7':
+ resolution: {integrity: sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -2898,6 +3190,10 @@ packages:
resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
engines: {node: '>=6.9.0'}
+ '@babel/runtime@7.26.7':
+ resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/template@7.25.9':
resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
engines: {node: '>=6.9.0'}
@@ -2906,10 +3202,25 @@ packages:
resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==}
engines: {node: '>=6.9.0'}
+ '@babel/traverse@7.26.7':
+ resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==}
+ engines: {node: '>=6.9.0'}
+
'@babel/types@7.26.3':
resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
engines: {node: '>=6.9.0'}
+ '@babel/types@7.26.7':
+ resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==}
+ engines: {node: '>=6.9.0'}
+
+ '@balancer/sdk@1.1.0':
+ resolution: {integrity: sha512-1AVrzP1X66G/qO59c710NywdUUahnr9ykkXXIo1Vz8GzuIFI1o5mG0DIzHZwFwLCY1rRvWRixkNAXqS3PSVOrg==}
+ engines: {node: '>=18.x'}
+
+ '@balmy/sdk@0.6.1':
+ resolution: {integrity: sha512-kSXksejQDaJge6YsK8FPd6Yh0BzHPiuN678YVPk9vZjoLYD0lCItWUxyVGpJJ9m71BMK9y/7nI5VbIAlaATgJA==}
+
'@biomejs/biome@1.9.4':
resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==}
engines: {node: '>=14.21.3'}
@@ -3095,36 +3406,72 @@ packages:
'@cosmjs/amino@0.32.4':
resolution: {integrity: sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q==}
+ '@cosmjs/amino@0.33.0':
+ resolution: {integrity: sha512-a4qnWGzuM2IrlkDTFQmU7bDd+wNIzyvfcRIZ43i00ZHvTEtrCcWopT94rIv/Zy6fdgkhQ3HWrsGVlIPDT/ibRw==}
+
+ '@cosmjs/cosmwasm-stargate@0.33.0':
+ resolution: {integrity: sha512-YJahXTLrfZ0evtSFcy5Aa4oorEAAHwe0ss6JVteiiNNDT7jHliONz5WOlg2/N7KLxoWCkVWcOpWJR4xZ/N3YEQ==}
+
'@cosmjs/crypto@0.32.4':
resolution: {integrity: sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==}
+ '@cosmjs/crypto@0.33.0':
+ resolution: {integrity: sha512-kkt06t+cFW2XRGDGUZ0cVf5yoQ2OhZnubwbYbz3QXdyhf1qOXYVPRThfFPsko7dssr+e8Yy4OJKlh5SLA8DXTQ==}
+
'@cosmjs/encoding@0.32.4':
resolution: {integrity: sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw==}
+ '@cosmjs/encoding@0.33.0':
+ resolution: {integrity: sha512-9z0g9mM7w5BISVVs8BK1Yp7KSQgNLGz2SBoWYOm4wODB/YcoitODgyRqECcuMZBXtd2sCyy2M1VLs9Z69BPZRQ==}
+
'@cosmjs/json-rpc@0.32.4':
resolution: {integrity: sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ==}
+ '@cosmjs/json-rpc@0.33.0':
+ resolution: {integrity: sha512-okXjxnT3zhhuYrA1aIDVD8VHt3syWyrJw3cAY6tMNM53bQcAtLGImueMrEoyv7DtLg5R5Tx5PMrQ7UYnpD8OwQ==}
+
'@cosmjs/math@0.32.4':
resolution: {integrity: sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw==}
+ '@cosmjs/math@0.33.0':
+ resolution: {integrity: sha512-B2uOgM12iuIhJWzGuAxGwO6zO+cI8Q4z7mVu7HgFrGJJTM1HtPTYgb55oMOuUN0OZ352MEEm5uAt8sA9jZQqbA==}
+
'@cosmjs/proto-signing@0.32.4':
resolution: {integrity: sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ==}
+ '@cosmjs/proto-signing@0.33.0':
+ resolution: {integrity: sha512-UHA92d/Siy3wnce/xhU4iagKrs6r8Ruacc0qeHj3mNrtuUH8f70cD7lzzClzI7wvRLcPprOY0YTeEzqGbPeBFw==}
+
'@cosmjs/socket@0.32.4':
resolution: {integrity: sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw==}
+ '@cosmjs/socket@0.33.0':
+ resolution: {integrity: sha512-a1eHsqVFmG6N5LR53tAB1Xo4XfsZaFlrYA34yC0GnX5m/cJVEe1wkZxMsWJIW2nfCgj7nAvFK6Gx4qj+ZLeqdw==}
+
'@cosmjs/stargate@0.32.4':
resolution: {integrity: sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ==}
+ '@cosmjs/stargate@0.33.0':
+ resolution: {integrity: sha512-Ti/2RRl+LKTNUrOqj6TpGnTRcbmQ5zD4Ujx/PDNPHEexyuwbz+tMcF8Y1kKPWQ1g4wWxLYO4tKY4Gm0J3c5hWA==}
+
'@cosmjs/stream@0.32.4':
resolution: {integrity: sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A==}
+ '@cosmjs/stream@0.33.0':
+ resolution: {integrity: sha512-SmsZW9Xzfk2T2MtWzVkit2WUclL7ZQHhiEhJz39EzKQRAdi4xY8nwefZF4VLQVJ0M33QfRCUzFzb+O/gddMQKA==}
+
'@cosmjs/tendermint-rpc@0.32.4':
resolution: {integrity: sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw==}
+ '@cosmjs/tendermint-rpc@0.33.0':
+ resolution: {integrity: sha512-A5h72fYesFKSjMjB+AMD5thcVVcdfbmWj4atJ1CYmKGyCTCPW8iEIz1ZKR0mUX+gkW6dM1h8flaRj/R14Oc0/A==}
+
'@cosmjs/utils@0.32.4':
resolution: {integrity: sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w==}
+ '@cosmjs/utils@0.33.0':
+ resolution: {integrity: sha512-Y6glwHNlNjcOgwPg8YmNr1PSrNm307EhJVytFt8HmA/G7MRcIA+jIzCL0VlOrWGU4TrAOXvshM+oJZbTIldFRA==}
+
'@crossmint/client-sdk-base@1.4.4':
resolution: {integrity: sha512-TkerlGDrsiu8LqyU03PY1gqp5NlNZxU4mMnx82tu5v7pZBiU11gxh7xXVijw/oPQoAQkosmHzxKqGpMPac5+uA==}
@@ -3335,6 +3682,12 @@ packages:
cpu: [ppc64]
os: [aix]
+ '@esbuild/android-arm64@0.17.19':
+ resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm64@0.19.12':
resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
engines: {node: '>=12'}
@@ -3359,6 +3712,12 @@ packages:
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm@0.17.19':
+ resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-arm@0.19.12':
resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
engines: {node: '>=12'}
@@ -3383,6 +3742,12 @@ packages:
cpu: [arm]
os: [android]
+ '@esbuild/android-x64@0.17.19':
+ resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/android-x64@0.19.12':
resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
engines: {node: '>=12'}
@@ -3407,6 +3772,12 @@ packages:
cpu: [x64]
os: [android]
+ '@esbuild/darwin-arm64@0.17.19':
+ resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-arm64@0.19.12':
resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
engines: {node: '>=12'}
@@ -3431,6 +3802,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-x64@0.17.19':
+ resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.19.12':
resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
engines: {node: '>=12'}
@@ -3455,6 +3832,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@esbuild/freebsd-arm64@0.17.19':
+ resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-arm64@0.19.12':
resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
engines: {node: '>=12'}
@@ -3479,6 +3862,12 @@ packages:
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.17.19':
+ resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.19.12':
resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
engines: {node: '>=12'}
@@ -3503,6 +3892,12 @@ packages:
cpu: [x64]
os: [freebsd]
+ '@esbuild/linux-arm64@0.17.19':
+ resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm64@0.19.12':
resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
engines: {node: '>=12'}
@@ -3527,6 +3922,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm@0.17.19':
+ resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-arm@0.19.12':
resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
engines: {node: '>=12'}
@@ -3551,6 +3952,12 @@ packages:
cpu: [arm]
os: [linux]
+ '@esbuild/linux-ia32@0.17.19':
+ resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-ia32@0.19.12':
resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
engines: {node: '>=12'}
@@ -3575,6 +3982,12 @@ packages:
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-loong64@0.17.19':
+ resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
'@esbuild/linux-loong64@0.19.12':
resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
engines: {node: '>=12'}
@@ -3599,6 +4012,12 @@ packages:
cpu: [loong64]
os: [linux]
+ '@esbuild/linux-mips64el@0.17.19':
+ resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
'@esbuild/linux-mips64el@0.19.12':
resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
engines: {node: '>=12'}
@@ -3623,6 +4042,12 @@ packages:
cpu: [mips64el]
os: [linux]
+ '@esbuild/linux-ppc64@0.17.19':
+ resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
'@esbuild/linux-ppc64@0.19.12':
resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
engines: {node: '>=12'}
@@ -3647,6 +4072,12 @@ packages:
cpu: [ppc64]
os: [linux]
+ '@esbuild/linux-riscv64@0.17.19':
+ resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-riscv64@0.19.12':
resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
engines: {node: '>=12'}
@@ -3671,6 +4102,12 @@ packages:
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-s390x@0.17.19':
+ resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
'@esbuild/linux-s390x@0.19.12':
resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
engines: {node: '>=12'}
@@ -3695,6 +4132,12 @@ packages:
cpu: [s390x]
os: [linux]
+ '@esbuild/linux-x64@0.17.19':
+ resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
'@esbuild/linux-x64@0.19.12':
resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
engines: {node: '>=12'}
@@ -3725,6 +4168,12 @@ packages:
cpu: [arm64]
os: [netbsd]
+ '@esbuild/netbsd-x64@0.17.19':
+ resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
'@esbuild/netbsd-x64@0.19.12':
resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
engines: {node: '>=12'}
@@ -3761,6 +4210,12 @@ packages:
cpu: [arm64]
os: [openbsd]
+ '@esbuild/openbsd-x64@0.17.19':
+ resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
'@esbuild/openbsd-x64@0.19.12':
resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
engines: {node: '>=12'}
@@ -3785,6 +4240,12 @@ packages:
cpu: [x64]
os: [openbsd]
+ '@esbuild/sunos-x64@0.17.19':
+ resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
'@esbuild/sunos-x64@0.19.12':
resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
engines: {node: '>=12'}
@@ -3809,6 +4270,12 @@ packages:
cpu: [x64]
os: [sunos]
+ '@esbuild/win32-arm64@0.17.19':
+ resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
'@esbuild/win32-arm64@0.19.12':
resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
engines: {node: '>=12'}
@@ -3833,6 +4300,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@esbuild/win32-ia32@0.17.19':
+ resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
'@esbuild/win32-ia32@0.19.12':
resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
engines: {node: '>=12'}
@@ -3857,6 +4330,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@esbuild/win32-x64@0.17.19':
+ resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
'@esbuild/win32-x64@0.19.12':
resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
engines: {node: '>=12'}
@@ -4886,6 +5365,12 @@ packages:
'@modelcontextprotocol/sdk@1.0.4':
resolution: {integrity: sha512-C+jw1lF6HSGzs7EZpzHbXfzz9rj9him4BaoumlTciW/IDDgIpweF/qiCWKlP02QKg5PPcgY6xY2WCt5y2tpYow==}
+ '@module-federation/runtime@0.1.21':
+ resolution: {integrity: sha512-/p4BhZ0SnjJuiL0wwu+FebFgIUJ9vM+oCY7CyprUHImyi/Y23ulI61WNWMVrKQGgdMoXQDQCL8RH4EnrVP2ZFw==}
+
+ '@module-federation/sdk@0.1.21':
+ resolution: {integrity: sha512-r7xPiAm+O4e+8Zvw+8b4ToeD0D0VJD004nHmt+Y8r/l98J2eA6di72Vn1FeyjtQbCrFtiMw3ts/dlqtcmIBipw==}
+
'@mongodb-js/saslprep@1.1.9':
resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==}
@@ -4925,53 +5410,53 @@ packages:
resolution: {integrity: sha512-cFh5LxXZrXb/ZAD1dkKeQxzhgRYFXreyFGmI7w/JQWwdl+/0FrHJBwaWyTmGxJ/6ZC9SlaOPOk63flN7DbUurg==}
engines: {node: '>=18'}
- '@next/env@15.0.3':
- resolution: {integrity: sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA==}
+ '@next/env@15.1.2':
+ resolution: {integrity: sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ==}
- '@next/swc-darwin-arm64@15.0.3':
- resolution: {integrity: sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw==}
+ '@next/swc-darwin-arm64@15.1.2':
+ resolution: {integrity: sha512-b9TN7q+j5/7+rGLhFAVZiKJGIASuo8tWvInGfAd8wsULjB1uNGRCj1z1WZwwPWzVQbIKWFYqc+9L7W09qwt52w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@15.0.3':
- resolution: {integrity: sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==}
+ '@next/swc-darwin-x64@15.1.2':
+ resolution: {integrity: sha512-caR62jNDUCU+qobStO6YJ05p9E+LR0EoXh1EEmyU69cYydsAy7drMcOlUlRtQihM6K6QfvNwJuLhsHcCzNpqtA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@15.0.3':
- resolution: {integrity: sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==}
+ '@next/swc-linux-arm64-gnu@15.1.2':
+ resolution: {integrity: sha512-fHHXBusURjBmN6VBUtu6/5s7cCeEkuGAb/ZZiGHBLVBXMBy4D5QpM8P33Or8JD1nlOjm/ZT9sEE5HouQ0F+hUA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-arm64-musl@15.0.3':
- resolution: {integrity: sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==}
+ '@next/swc-linux-arm64-musl@15.1.2':
+ resolution: {integrity: sha512-9CF1Pnivij7+M3G74lxr+e9h6o2YNIe7QtExWq1KUK4hsOLTBv6FJikEwCaC3NeYTflzrm69E5UfwEAbV2U9/g==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-x64-gnu@15.0.3':
- resolution: {integrity: sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==}
+ '@next/swc-linux-x64-gnu@15.1.2':
+ resolution: {integrity: sha512-tINV7WmcTUf4oM/eN3Yuu/f8jQ5C6AkueZPKeALs/qfdfX57eNv4Ij7rt0SA6iZ8+fMobVfcFVv664Op0caCCg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-linux-x64-musl@15.0.3':
- resolution: {integrity: sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==}
+ '@next/swc-linux-x64-musl@15.1.2':
+ resolution: {integrity: sha512-jf2IseC4WRsGkzeUw/cK3wci9pxR53GlLAt30+y+B+2qAQxMw6WAC3QrANIKxkcoPU3JFh/10uFfmoMDF9JXKg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-win32-arm64-msvc@15.0.3':
- resolution: {integrity: sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==}
+ '@next/swc-win32-arm64-msvc@15.1.2':
+ resolution: {integrity: sha512-wvg7MlfnaociP7k8lxLX4s2iBJm4BrNiNFhVUY+Yur5yhAJHfkS8qPPeDEUH8rQiY0PX3u/P7Q/wcg6Mv6GSAA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@15.0.3':
- resolution: {integrity: sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==}
+ '@next/swc-win32-x64-msvc@15.1.2':
+ resolution: {integrity: sha512-D3cNA8NoT3aWISWmo7HF5Eyko/0OdOO+VagkoJuiTk7pyX3P/b+n8XA/MYvyR+xSVcbKn68B1rY9fgqjNISqzQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -4986,6 +5471,9 @@ packages:
'@noble/curves@1.2.0':
resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==}
+ '@noble/curves@1.3.0':
+ resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==}
+
'@noble/curves@1.4.0':
resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==}
@@ -4996,6 +5484,10 @@ packages:
resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==}
engines: {node: ^14.21.3 || >=16}
+ '@noble/curves@1.7.0':
+ resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==}
+ engines: {node: ^14.21.3 || >=16}
+
'@noble/curves@1.8.0':
resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==}
engines: {node: ^14.21.3 || >=16}
@@ -5004,6 +5496,10 @@ packages:
resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==}
engines: {node: '>= 16'}
+ '@noble/hashes@1.3.3':
+ resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==}
+ engines: {node: '>= 16'}
+
'@noble/hashes@1.4.0':
resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==}
engines: {node: '>= 16'}
@@ -5012,6 +5508,14 @@ packages:
resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==}
engines: {node: ^14.21.3 || >=16}
+ '@noble/hashes@1.6.0':
+ resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==}
+ engines: {node: ^14.21.3 || >=16}
+
+ '@noble/hashes@1.6.1':
+ resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==}
+ engines: {node: ^14.21.3 || >=16}
+
'@noble/hashes@1.7.0':
resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==}
engines: {node: ^14.21.3 || >=16}
@@ -5336,6 +5840,9 @@ packages:
'@scure/bip32@1.5.0':
resolution: {integrity: sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==}
+ '@scure/bip32@1.6.0':
+ resolution: {integrity: sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==}
+
'@scure/bip32@1.6.1':
resolution: {integrity: sha512-jSO+5Ud1E588Y+LFo8TaB8JVPNAZw/lGGao+1SepHDeTs2dFLurdNIAgUuDlwezqEjRjElkCJajVrtrZaBxvaQ==}
@@ -5345,9 +5852,15 @@ packages:
'@scure/bip39@1.4.0':
resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==}
+ '@scure/bip39@1.5.0':
+ resolution: {integrity: sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==}
+
'@scure/bip39@1.5.1':
resolution: {integrity: sha512-GnlufVSP9UdAo/H2Patfv22VTtpNTyfi+I3qCKpvuB5l1KWzEYx+l2TNpBy9Ksh4xTs3Rn06tBlpWCi/1Vz8gw==}
+ '@scure/starknet@1.0.0':
+ resolution: {integrity: sha512-o5J57zY0f+2IL/mq8+AYJJ4Xpc1fOtDhr+mFQKbHnYFmm3WQrC+8zj2HEgxak1a+x86mhmBC1Kq305KUpVf0wg==}
+
'@selderee/plugin-htmlparser2@0.11.0':
resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==}
@@ -5765,6 +6278,9 @@ packages:
'@stablelib/x25519@1.0.3':
resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==}
+ '@starknet-io/types-js@0.7.10':
+ resolution: {integrity: sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w==}
+
'@suchipi/femver@1.0.0':
resolution: {integrity: sha512-bprE8+K5V+DPX7q2e2K57ImqNBdfGHDIWaGI5xHxZoxbKOuQZn4wzPiUxOAHnsUr3w3xHrWXwN7gnG/iIuEMIg==}
@@ -5840,9 +6356,6 @@ packages:
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
- '@swc/helpers@0.5.13':
- resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==}
-
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
@@ -5939,6 +6452,10 @@ packages:
'@types/diff-match-patch@1.0.36':
resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==}
+ '@types/dotenv@8.2.3':
+ resolution: {integrity: sha512-g2FXjlDX/cYuc5CiQvyU/6kkbP1JtmGzh0obW50zD7OKeILVL0NSpPWLXVfqoAGQjom2/SLLx9zHq0KXvD6mbw==}
+ deprecated: This is a stub types definition. dotenv provides its own type definitions, so you do not need this installed.
+
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
@@ -5981,9 +6498,15 @@ packages:
'@types/node@18.19.69':
resolution: {integrity: sha512-ECPdY1nlaiO/Y6GUnwgtAAhLNaQ53AyIVz+eILxpEo5OvuqE6yWkqWBIb5dU0DqhKQtMeny+FBD3PK6lm7L5xQ==}
+ '@types/node@18.19.74':
+ resolution: {integrity: sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==}
+
'@types/node@20.17.11':
resolution: {integrity: sha512-Ept5glCK35R8yeyIeYlRIZtX6SLRyqMhOFTgj5SOkMpLTdw3SEHI9fHx60xaUZ+V1aJxQJODE+7/j5ocZydYTg==}
+ '@types/node@22.10.10':
+ resolution: {integrity: sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==}
+
'@types/node@22.10.5':
resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==}
@@ -6378,6 +6901,10 @@ packages:
abbrev@1.1.1:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
+ abi-wan-kanabi@2.2.4:
+ resolution: {integrity: sha512-0aA81FScmJCPX+8UvkXLki3X1+yPQuWxEkqXBVKltgPAK79J+NB+Lp5DouMXa7L6f+zcRlIA/6XO7BN/q9fnvg==}
+ hasBin: true
+
abitype@1.0.5:
resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==}
peerDependencies:
@@ -6400,6 +6927,17 @@ packages:
zod:
optional: true
+ abitype@1.0.7:
+ resolution: {integrity: sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw==}
+ peerDependencies:
+ typescript: '>=5.0.4'
+ zod: ^3 >=3.22.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ zod:
+ optional: true
+
abitype@1.0.8:
resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==}
peerDependencies:
@@ -6561,6 +7099,9 @@ packages:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'}
+ ansicolors@0.3.2:
+ resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==}
+
anthropic-vertex-ai@1.0.2:
resolution: {integrity: sha512-4YuK04KMmBGkx6fi2UjnHkE4mhaIov7tnT5La9+DMn/gw/NSOLZoWNUx+13VY3mkcaseKBMEn1DBzdXXJFIP7A==}
engines: {node: '>=18'}
@@ -6955,8 +7496,8 @@ packages:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
- caniuse-lite@1.0.30001690:
- resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==}
+ caniuse-lite@1.0.30001695:
+ resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==}
canonicalize@2.0.0:
resolution: {integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==}
@@ -6969,6 +7510,10 @@ packages:
resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==}
engines: {node: '>=0.10.0'}
+ cardinal@2.1.1:
+ resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==}
+ hasBin: true
+
cbor-web@9.0.2:
resolution: {integrity: sha512-N6gU2GsJS8RR5gy1d9wQcSPgn9FGJFY7KNvdDRlwHfz6kCxrQr2TDnrjXHmr6TFSl6Fd0FC4zRnityEldjRGvQ==}
engines: {node: '>=16'}
@@ -7218,6 +7763,9 @@ packages:
core-js-compat@3.39.0:
resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==}
+ core-js-compat@3.40.0:
+ resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==}
+
core-util-is@1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
@@ -7263,6 +7811,9 @@ packages:
cross-fetch@2.2.6:
resolution: {integrity: sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==}
+ cross-fetch@3.1.5:
+ resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==}
+
cross-fetch@3.1.8:
resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==}
@@ -7361,6 +7912,9 @@ packages:
resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
engines: {node: '>=0.10.0'}
+ decimal.js-light@2.5.1:
+ resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
+
decimal.js@10.4.3:
resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
@@ -7650,6 +8204,11 @@ packages:
resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==}
engines: {node: '>=0.12'}
+ esbuild@0.17.19:
+ resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
+ engines: {node: '>=12'}
+ hasBin: true
+
esbuild@0.19.12:
resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
engines: {node: '>=12'}
@@ -7685,8 +8244,8 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
- esm-env@1.2.1:
- resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==}
+ esm-env@1.2.2:
+ resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==}
esniff@2.0.1:
resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==}
@@ -7697,8 +8256,8 @@ packages:
engines: {node: '>=4'}
hasBin: true
- esrap@1.3.2:
- resolution: {integrity: sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==}
+ esrap@1.4.3:
+ resolution: {integrity: sha512-Xddc1RsoFJ4z9nR7W7BFaEPIp4UXoeQ0+077UdWLxbafMQFyU79sQJMk7kxNgRwQ9/aVgaKacCHC2pUACGwmYw==}
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
@@ -7741,6 +8300,10 @@ packages:
resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==}
engines: {node: '>=14.0.0'}
+ ethers@6.13.5:
+ resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==}
+ engines: {node: '>=14.0.0'}
+
ethjs-unit@0.1.6:
resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==}
engines: {node: '>=6.5.0', npm: '>=3'}
@@ -7887,6 +8450,9 @@ packages:
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
engines: {node: ^12.20 || >= 14.13}
+ fetch-cookie@3.1.0:
+ resolution: {integrity: sha512-s/XhhreJpqH0ftkGVcQt8JE9bqk+zRn4jF5mPJXWZeQMCI5odV9K+wEWYbnzFPHgQZlvPSMjS4n4yawWE8RINw==}
+
fetch-h2@3.0.2:
resolution: {integrity: sha512-Lo6UPdMKKc9Ond7yjG2vq0mnocspOLh1oV6+XZdtfdexacvMSz5xm3WoQhTAdoR2+UqPlyMNqcqfecipoD+l/A==}
engines: {node: '>=12'}
@@ -8005,6 +8571,10 @@ packages:
fs-constants@1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
+ fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+
fs-extra@2.1.2:
resolution: {integrity: sha512-9ztMtDZtSKC78V8mev+k31qaTabbmuH5jatdvPBMikrFHvw5BqlYnQIn/WGK3WHeRooSTkRvLa2IPlaHjPq5Sg==}
@@ -8083,6 +8653,17 @@ packages:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
+ get-starknet-core@3.3.4:
+ resolution: {integrity: sha512-KEnzAMr4f7z7dMh4g5lWDZ+eXtOEl++VPN5Flmmj8HiPmRrPOINEIwwNL/dN+Ey1kBxQOtOMQwCxJ9qlkRIgFw==}
+ peerDependencies:
+ starknet: ^5.18.0
+
+ get-starknet-core@4.0.0:
+ resolution: {integrity: sha512-6pLmidQZkC3wZsrHY99grQHoGpuuXqkbSP65F8ov1/JsEI8DDLkhsAuLCKFzNOK56cJp+f1bWWfTJ57e9r5eqQ==}
+
+ get-starknet@3.3.3:
+ resolution: {integrity: sha512-SdxNGKFmynRRf3p2VtaBEc1P/VbQHIt8igZC4+xCkKipm/DtZ5jptLXWhqTMYF9vARAmUNZsj8HGujKpqGEBEA==}
+
get-stream@5.2.0:
resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
engines: {node: '>=8'}
@@ -8154,10 +8735,18 @@ packages:
resolution: {integrity: sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ==}
engines: {node: '>=14'}
+ google-auth-library@9.15.1:
+ resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==}
+ engines: {node: '>=14'}
+
gopd@1.2.0:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
+ got@11.8.5:
+ resolution: {integrity: sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==}
+ engines: {node: '>=10.19.0'}
+
got@11.8.6:
resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
engines: {node: '>=10.19.0'}
@@ -8718,6 +9307,9 @@ packages:
jsonfile@4.0.0:
resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+ jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
jsonparse@1.3.1:
resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
engines: {'0': node >= 0.2.0}
@@ -8900,6 +9492,10 @@ packages:
lighthouse-logger@1.4.2:
resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==}
+ lilconfig@2.1.0:
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+ engines: {node: '>=10'}
+
lilconfig@3.1.3:
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
engines: {node: '>=14'}
@@ -8964,6 +9560,9 @@ packages:
lodash.camelcase@4.3.0:
resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+ lodash.clonedeep@4.5.0:
+ resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
@@ -8975,6 +9574,7 @@ packages:
lodash.isequal@4.5.0:
resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+ deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
lodash.isinteger@4.0.4:
resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==}
@@ -9028,6 +9628,9 @@ packages:
lop@0.4.2:
resolution: {integrity: sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==}
+ lossless-json@4.0.2:
+ resolution: {integrity: sha512-+z0EaLi2UcWi8MZRxA5iTb6m4Ys4E80uftGY+yG5KNFJb5EceQXOhdW/pWJZ8m97s26u7yZZAYMcKWNztSZssA==}
+
loupe@2.3.7:
resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
@@ -9055,6 +9658,10 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ lru-cache@9.0.3:
+ resolution: {integrity: sha512-cyjNRew29d4kbgnz1sjDqxg7qg8NW4s+HQzCGjeon7DV5T2yDije16W9HaUFV1dhVEMh+SjrOcK0TomBmf3Egg==}
+ engines: {node: 14 || >=16.14}
+
lru-cache@9.1.2:
resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==}
engines: {node: 14 || >=16.14}
@@ -9312,6 +9919,9 @@ packages:
mlly@1.7.3:
resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==}
+ moment@2.30.1:
+ resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
+
mongodb-connection-string-url@3.0.1:
resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==}
@@ -9355,6 +9965,10 @@ packages:
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ ms@3.0.0-canary.1:
+ resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==}
+ engines: {node: '>=12.13'}
+
multiformats@11.0.2:
resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==}
engines: {node: '>=16.0.0', npm: '>=7.0.0'}
@@ -9411,16 +10025,16 @@ packages:
next-tick@1.1.0:
resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
- next@15.0.3:
- resolution: {integrity: sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==}
+ next@15.1.2:
+ resolution: {integrity: sha512-nLJDV7peNy+0oHlmY2JZjzMfJ8Aj0/dd3jCwSZS8ZiO5nkQfcZRqDrRN3U5rJtqVTQneIOGZzb6LCNrk7trMCQ==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.1.0
'@playwright/test': ^1.41.2
babel-plugin-react-compiler: '*'
- react: ^18.2.0 || 19.0.0-rc-66855b96-20241106
- react-dom: ^18.2.0 || 19.0.0-rc-66855b96-20241106
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
sass: ^1.3.0
peerDependenciesMeta:
'@opentelemetry/api':
@@ -9483,6 +10097,15 @@ packages:
resolution: {integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==}
engines: {node: 4.x || >=6.0.0}
+ node-fetch@2.6.7:
+ resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
node-fetch@2.7.0:
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
engines: {node: 4.x || >=6.0.0}
@@ -9729,6 +10352,14 @@ packages:
typescript:
optional: true
+ ox@0.6.5:
+ resolution: {integrity: sha512-vmnH8KvMDwFZDbNY1mq2CBRBWIgSliZB/dFV0xKp+DfF/dJkTENt6nmA+DzHSSAgL/GO2ydjkXWvlndJgSY4KQ==}
+ peerDependencies:
+ typescript: '>=5.4.0'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
p-cancelable@2.1.1:
resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
engines: {node: '>=8'}
@@ -10016,6 +10647,18 @@ packages:
peerDependencies:
postcss: ^8.4.21
+ postcss-load-config@3.1.4:
+ resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
+ engines: {node: '>= 10'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+
postcss-load-config@4.0.2:
resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
engines: {node: '>= 14'}
@@ -10067,6 +10710,10 @@ packages:
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
engines: {node: ^10 || ^12 || >=14}
+ postcss@8.5.1:
+ resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
postgres-array@3.0.2:
resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==}
engines: {node: '>=12'}
@@ -10418,6 +11065,9 @@ packages:
resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==}
engines: {node: '>= 4'}
+ redeyed@2.1.1:
+ resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==}
+
reflect-metadata@0.1.14:
resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==}
@@ -10538,6 +11188,11 @@ packages:
robot3@0.4.1:
resolution: {integrity: sha512-hzjy826lrxzx8eRgv80idkf8ua1JAepRc9Efdtj03N3KNJuznQCPlyCJ7gnUmDFwZCLQjxy567mQVKmdv2BsXQ==}
+ rollup@3.29.5:
+ resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==}
+ engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+ hasBin: true
+
rollup@4.29.1:
resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -10634,6 +11289,9 @@ packages:
set-blocking@2.0.0:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+ set-cookie-parser@2.7.1:
+ resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
+
set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
@@ -10832,6 +11490,9 @@ packages:
resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==}
engines: {node: '>=6'}
+ starknet@6.11.0:
+ resolution: {integrity: sha512-u50KrGDi9fbu1Ogu7ynwF/tSeFlp3mzOg1/Y5x50tYFICImo3OfY4lOz9OtYDk404HK4eUujKkhov9tG7GAKlg==}
+
statuses@1.5.0:
resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
engines: {node: '>= 0.6'}
@@ -11121,10 +11782,17 @@ packages:
tldts-core@6.1.70:
resolution: {integrity: sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg==}
+ tldts-core@6.1.73:
+ resolution: {integrity: sha512-k1g5eX87vxu3g//6XMn62y4qjayu4cYby/PF7Ksnh4F4uUK1Z1ze/mJ4a+y5OjdJ+cXRp+YTInZhH+FGdUWy1w==}
+
tldts@6.0.16:
resolution: {integrity: sha512-TkEq38COU640mzOKPk4D1oH3FFVvwEtMaKIfw/+F/umVsy7ONWu8PPQH0c11qJ/Jq/zbcQGprXGsT8GcaDSmJg==}
hasBin: true
+ tldts@6.1.73:
+ resolution: {integrity: sha512-/h4bVmuEMm57c2uCiAf1Q9mlQk7cA22m+1Bu0K92vUUtTVT9D4mOFWD9r4WQuTULcG9eeZtNKhLl0Il1LdKGog==}
+ hasBin: true
+
tmp@0.0.28:
resolution: {integrity: sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==}
engines: {node: '>=0.4.0'}
@@ -11160,6 +11828,10 @@ packages:
resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
engines: {node: '>=6'}
+ tough-cookie@5.1.0:
+ resolution: {integrity: sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==}
+ engines: {node: '>=16'}
+
tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
@@ -11191,6 +11863,9 @@ packages:
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+ ts-mixer@6.0.4:
+ resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==}
+
ts-node@10.9.2:
resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
hasBin: true
@@ -11224,6 +11899,22 @@ packages:
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+ tsup@6.7.0:
+ resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==}
+ engines: {node: '>=14.18'}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': ^1
+ postcss: ^8.4.12
+ typescript: '>=4.1.0'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ postcss:
+ optional: true
+ typescript:
+ optional: true
+
tsup@7.3.0:
resolution: {integrity: sha512-Ja1eaSRrE+QarmATlNO5fse2aOACYMBX+IZRKy1T+gpyH+jXgRrl5l4nHIQJQ1DoDgEjHDTw8cpE085UdBZuWQ==}
engines: {node: '>=18'}
@@ -11431,6 +12122,10 @@ packages:
resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
engines: {node: '>= 4.0.0'}
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
unorm@1.6.0:
resolution: {integrity: sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==}
engines: {node: '>= 0.4.0'}
@@ -11631,6 +12326,14 @@ packages:
typescript:
optional: true
+ viem@2.18.4:
+ resolution: {integrity: sha512-JGdN+PgBnZMbm7fc9o0SfHvL0CKyfrlhBUtaz27V+PeHO43Kgc9Zd4WyIbM8Brafq4TvVcnriRFW/FVGOzwEJw==}
+ peerDependencies:
+ typescript: '>=5.0.4'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
viem@2.21.49:
resolution: {integrity: sha512-NNItYfTv4+yGE5DDKc+S/g2S7KeJn047GwgEYG60FAJlK0FzwuP6lQKSeQ8k7Y4VasfuKPqiT+XiilcCtTRiDQ==}
peerDependencies:
@@ -11647,6 +12350,14 @@ packages:
typescript:
optional: true
+ viem@2.22.9:
+ resolution: {integrity: sha512-2yy46qYhcdo8GZggQ3Zoq9QCahI0goddzpVI/vSnTpcClQBSDxYRCuAqRzzLqjvJ7hS0UYgplC7eRkM2sYgflw==}
+ peerDependencies:
+ typescript: '>=5.0.4'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
vite-node@0.34.6:
resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==}
engines: {node: '>=v14.18.0'}
@@ -11834,6 +12545,9 @@ packages:
webauthn-p256@0.0.10:
resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==}
+ webauthn-p256@0.0.5:
+ resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==}
+
webextension-polyfill@0.10.0:
resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==}
@@ -12018,6 +12732,10 @@ packages:
resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
engines: {node: '>=18'}
+ yaml@1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+
yaml@2.7.0:
resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
engines: {node: '>= 14'}
@@ -12478,6 +13196,13 @@ snapshots:
transitivePeerDependencies:
- debug
+ '@avnu/avnu-sdk@3.0.0(ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10))(moment@2.30.1)(qs@6.13.0)(starknet@6.11.0(encoding@0.1.13))':
+ dependencies:
+ ethers: 6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ moment: 2.30.1
+ qs: 6.13.0
+ starknet: 6.11.0(encoding@0.1.13)
+
'@aws-crypto/crc32@3.0.0':
dependencies:
'@aws-crypto/util': 3.0.0
@@ -12989,7 +13714,7 @@ snapshots:
dependencies:
'@azure/abort-controller': 2.1.2
'@azure/core-auth': 1.9.0
- '@azure/core-rest-pipeline': 1.18.1
+ '@azure/core-rest-pipeline': 1.18.2
'@azure/core-tracing': 1.2.0
'@azure/core-util': 1.11.0
'@azure/logger': 1.1.4
@@ -12997,7 +13722,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@azure/core-rest-pipeline@1.18.1':
+ '@azure/core-rest-pipeline@1.18.2':
dependencies:
'@azure/abort-controller': 2.1.2
'@azure/core-auth': 1.9.0
@@ -13023,7 +13748,7 @@ snapshots:
dependencies:
'@azure/abort-controller': 2.1.2
'@azure/core-auth': 1.9.0
- '@azure/core-rest-pipeline': 1.18.1
+ '@azure/core-rest-pipeline': 1.18.2
'@azure/core-tracing': 1.2.0
'@azure/core-util': 1.11.0
fast-json-stable-stringify: 2.1.0
@@ -13039,11 +13764,11 @@ snapshots:
'@azure/abort-controller': 2.1.2
'@azure/core-auth': 1.9.0
'@azure/core-client': 1.9.2
- '@azure/core-rest-pipeline': 1.18.1
+ '@azure/core-rest-pipeline': 1.18.2
'@azure/core-tracing': 1.2.0
'@azure/core-util': 1.11.0
'@azure/logger': 1.1.4
- '@azure/msal-browser': 3.28.0
+ '@azure/msal-browser': 3.28.1
'@azure/msal-node': 2.16.2
events: 3.3.0
jws: 4.0.0
@@ -13057,7 +13782,7 @@ snapshots:
dependencies:
tslib: 2.8.1
- '@azure/msal-browser@3.28.0':
+ '@azure/msal-browser@3.28.1':
dependencies:
'@azure/msal-common': 14.16.0
@@ -13077,6 +13802,8 @@ snapshots:
'@babel/compat-data@7.26.3': {}
+ '@babel/compat-data@7.26.5': {}
+
'@babel/core@7.26.0':
dependencies:
'@ampproject/remapping': 2.3.0
@@ -13105,6 +13832,14 @@ snapshots:
'@jridgewell/trace-mapping': 0.3.25
jsesc: 3.1.0
+ '@babel/generator@7.26.5':
+ dependencies:
+ '@babel/parser': 7.26.7
+ '@babel/types': 7.26.7
+ '@jridgewell/gen-mapping': 0.3.8
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 3.1.0
+
'@babel/helper-annotate-as-pure@7.25.9':
dependencies:
'@babel/types': 7.26.3
@@ -13117,6 +13852,14 @@ snapshots:
lru-cache: 5.1.1
semver: 6.3.1
+ '@babel/helper-compilation-targets@7.26.5':
+ dependencies:
+ '@babel/compat-data': 7.26.5
+ '@babel/helper-validator-option': 7.25.9
+ browserslist: 4.24.3
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
'@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
@@ -13181,6 +13924,8 @@ snapshots:
'@babel/helper-plugin-utils@7.25.9': {}
+ '@babel/helper-plugin-utils@7.26.5': {}
+
'@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
@@ -13199,6 +13944,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-member-expression-to-functions': 7.25.9
+ '@babel/helper-optimise-call-expression': 7.25.9
+ '@babel/traverse': 7.26.7
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-skip-transparent-expression-wrappers@7.25.9':
dependencies:
'@babel/traverse': 7.26.4
@@ -13229,28 +13983,32 @@ snapshots:
dependencies:
'@babel/types': 7.26.3
+ '@babel/parser@7.26.7':
+ dependencies:
+ '@babel/types': 7.26.7
+
'@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
- '@babel/traverse': 7.26.4
+ '@babel/helper-plugin-utils': 7.26.5
+ '@babel/traverse': 7.26.7
transitivePeerDependencies:
- supports-color
'@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/helper-skip-transparent-expression-wrappers': 7.25.9
'@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0)
transitivePeerDependencies:
@@ -13259,8 +14017,8 @@ snapshots:
'@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
- '@babel/traverse': 7.26.4
+ '@babel/helper-plugin-utils': 7.26.5
+ '@babel/traverse': 7.26.7
transitivePeerDependencies:
- supports-color
@@ -13356,12 +14114,12 @@ snapshots:
'@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)':
dependencies:
@@ -13407,7 +14165,7 @@ snapshots:
dependencies:
'@babel/core': 7.26.0
'@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)':
dependencies:
@@ -13417,9 +14175,9 @@ snapshots:
'@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0)
- '@babel/traverse': 7.26.4
+ '@babel/traverse': 7.26.7
transitivePeerDependencies:
- supports-color
@@ -13432,10 +14190,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)':
+ '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)':
dependencies:
@@ -13446,7 +14204,7 @@ snapshots:
dependencies:
'@babel/core': 7.26.0
'@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
transitivePeerDependencies:
- supports-color
@@ -13454,7 +14212,7 @@ snapshots:
dependencies:
'@babel/core': 7.26.0
'@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
transitivePeerDependencies:
- supports-color
@@ -13485,33 +14243,33 @@ snapshots:
dependencies:
'@babel/core': 7.26.0
'@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-flow-strip-types@7.25.9(@babel/core@7.26.0)':
dependencies:
@@ -13522,7 +14280,7 @@ snapshots:
'@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/helper-skip-transparent-expression-wrappers': 7.25.9
transitivePeerDependencies:
- supports-color
@@ -13539,7 +14297,7 @@ snapshots:
'@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)':
dependencies:
@@ -13549,18 +14307,18 @@ snapshots:
'@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
transitivePeerDependencies:
- supports-color
@@ -13576,9 +14334,9 @@ snapshots:
dependencies:
'@babel/core': 7.26.0
'@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/helper-validator-identifier': 7.25.9
- '@babel/traverse': 7.26.4
+ '@babel/traverse': 7.26.7
transitivePeerDependencies:
- supports-color
@@ -13586,7 +14344,7 @@ snapshots:
dependencies:
'@babel/core': 7.26.0
'@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
transitivePeerDependencies:
- supports-color
@@ -13599,42 +14357,42 @@ snapshots:
'@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
- '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)':
+ '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-compilation-targets': 7.25.9
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-compilation-targets': 7.26.5
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
- '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.26.5
+ '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0)
transitivePeerDependencies:
- supports-color
'@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/helper-skip-transparent-expression-wrappers': 7.25.9
transitivePeerDependencies:
- supports-color
@@ -13664,7 +14422,7 @@ snapshots:
'@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)':
dependencies:
@@ -13695,19 +14453,19 @@ snapshots:
'@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
regenerator-transform: 0.15.2
'@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-runtime@7.25.9(@babel/core@7.26.0)':
dependencies:
@@ -13742,12 +14500,12 @@ snapshots:
'@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
- '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)':
+ '@babel/plugin-transform-typeof-symbol@7.26.7(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)':
dependencies:
@@ -13763,13 +14521,13 @@ snapshots:
'@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)':
dependencies:
@@ -13781,14 +14539,14 @@ snapshots:
dependencies:
'@babel/core': 7.26.0
'@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0)
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/preset-env@7.26.0(@babel/core@7.26.0)':
dependencies:
- '@babel/compat-data': 7.26.3
+ '@babel/compat-data': 7.26.5
'@babel/core': 7.26.0
- '@babel/helper-compilation-targets': 7.25.9
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-compilation-targets': 7.26.5
+ '@babel/helper-plugin-utils': 7.26.5
'@babel/helper-validator-option': 7.25.9
'@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0)
@@ -13802,7 +14560,7 @@ snapshots:
'@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0)
- '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.0)
'@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0)
@@ -13827,7 +14585,7 @@ snapshots:
'@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0)
- '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.0)
'@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0)
@@ -13844,7 +14602,7 @@ snapshots:
'@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0)
- '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-typeof-symbol': 7.26.7(@babel/core@7.26.0)
'@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0)
@@ -13853,7 +14611,7 @@ snapshots:
babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0)
babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0)
babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0)
- core-js-compat: 3.39.0
+ core-js-compat: 3.40.0
semver: 6.3.1
transitivePeerDependencies:
- supports-color
@@ -13868,8 +14626,8 @@ snapshots:
'@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
- '@babel/helper-plugin-utils': 7.25.9
- '@babel/types': 7.26.3
+ '@babel/helper-plugin-utils': 7.26.5
+ '@babel/types': 7.26.7
esutils: 2.0.3
'@babel/preset-typescript@7.26.0(@babel/core@7.26.0)':
@@ -13896,6 +14654,10 @@ snapshots:
dependencies:
regenerator-runtime: 0.14.1
+ '@babel/runtime@7.26.7':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
'@babel/template@7.25.9':
dependencies:
'@babel/code-frame': 7.26.2
@@ -13914,11 +14676,55 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/traverse@7.26.7':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.5
+ '@babel/parser': 7.26.7
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.7
+ debug: 4.4.0
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/types@7.26.3':
dependencies:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
+ '@babel/types@7.26.7':
+ dependencies:
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+
+ '@balancer/sdk@1.1.0(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)':
+ dependencies:
+ decimal.js-light: 2.5.1
+ lodash.clonedeep: 4.5.0
+ viem: 2.22.9(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ transitivePeerDependencies:
+ - bufferutil
+ - typescript
+ - utf-8-validate
+ - zod
+
+ '@balmy/sdk@0.6.1(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)':
+ dependencies:
+ cross-fetch: 3.1.5(encoding@0.1.13)
+ crypto-js: 4.2.0
+ deepmerge: 4.3.1
+ lru-cache: 9.0.3
+ ms: 3.0.0-canary.1
+ qs: 6.11.2
+ viem: 2.18.4(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - typescript
+ - utf-8-validate
+ - zod
+
'@biomejs/biome@1.9.4':
optionalDependencies:
'@biomejs/cli-darwin-arm64': 1.9.4
@@ -14270,6 +15076,30 @@ snapshots:
'@cosmjs/math': 0.32.4
'@cosmjs/utils': 0.32.4
+ '@cosmjs/amino@0.33.0':
+ dependencies:
+ '@cosmjs/crypto': 0.33.0
+ '@cosmjs/encoding': 0.33.0
+ '@cosmjs/math': 0.33.0
+ '@cosmjs/utils': 0.33.0
+
+ '@cosmjs/cosmwasm-stargate@0.33.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@cosmjs/amino': 0.33.0
+ '@cosmjs/crypto': 0.33.0
+ '@cosmjs/encoding': 0.33.0
+ '@cosmjs/math': 0.33.0
+ '@cosmjs/proto-signing': 0.33.0
+ '@cosmjs/stargate': 0.33.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@cosmjs/tendermint-rpc': 0.33.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@cosmjs/utils': 0.33.0
+ cosmjs-types: 0.9.0
+ pako: 2.1.0
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - utf-8-validate
+
'@cosmjs/crypto@0.32.4':
dependencies:
'@cosmjs/encoding': 0.32.4
@@ -14280,21 +15110,46 @@ snapshots:
elliptic: 6.6.1
libsodium-wrappers-sumo: 0.7.15
+ '@cosmjs/crypto@0.33.0':
+ dependencies:
+ '@cosmjs/encoding': 0.33.0
+ '@cosmjs/math': 0.33.0
+ '@cosmjs/utils': 0.33.0
+ '@noble/hashes': 1.7.0
+ bn.js: 5.2.1
+ elliptic: 6.6.1
+ libsodium-wrappers-sumo: 0.7.15
+
'@cosmjs/encoding@0.32.4':
dependencies:
base64-js: 1.5.1
bech32: 1.1.4
readonly-date: 1.0.0
+ '@cosmjs/encoding@0.33.0':
+ dependencies:
+ base64-js: 1.5.1
+ bech32: 1.1.4
+ readonly-date: 1.0.0
+
'@cosmjs/json-rpc@0.32.4':
dependencies:
'@cosmjs/stream': 0.32.4
xstream: 11.14.0
+ '@cosmjs/json-rpc@0.33.0':
+ dependencies:
+ '@cosmjs/stream': 0.33.0
+ xstream: 11.14.0
+
'@cosmjs/math@0.32.4':
dependencies:
bn.js: 5.2.1
+ '@cosmjs/math@0.33.0':
+ dependencies:
+ bn.js: 5.2.1
+
'@cosmjs/proto-signing@0.32.4':
dependencies:
'@cosmjs/amino': 0.32.4
@@ -14304,6 +15159,15 @@ snapshots:
'@cosmjs/utils': 0.32.4
cosmjs-types: 0.9.0
+ '@cosmjs/proto-signing@0.33.0':
+ dependencies:
+ '@cosmjs/amino': 0.33.0
+ '@cosmjs/crypto': 0.33.0
+ '@cosmjs/encoding': 0.33.0
+ '@cosmjs/math': 0.33.0
+ '@cosmjs/utils': 0.33.0
+ cosmjs-types: 0.9.0
+
'@cosmjs/socket@0.32.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
'@cosmjs/stream': 0.32.4
@@ -14314,6 +15178,16 @@ snapshots:
- bufferutil
- utf-8-validate
+ '@cosmjs/socket@0.33.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@cosmjs/stream': 0.33.0
+ isomorphic-ws: 4.0.1(ws@7.5.10)
+ ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ xstream: 11.14.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
'@cosmjs/stargate@0.32.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
'@confio/ics23': 0.6.8
@@ -14331,10 +15205,29 @@ snapshots:
- debug
- utf-8-validate
+ '@cosmjs/stargate@0.33.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@cosmjs/amino': 0.33.0
+ '@cosmjs/encoding': 0.33.0
+ '@cosmjs/math': 0.33.0
+ '@cosmjs/proto-signing': 0.33.0
+ '@cosmjs/stream': 0.33.0
+ '@cosmjs/tendermint-rpc': 0.33.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@cosmjs/utils': 0.33.0
+ cosmjs-types: 0.9.0
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - utf-8-validate
+
'@cosmjs/stream@0.32.4':
dependencies:
xstream: 11.14.0
+ '@cosmjs/stream@0.33.0':
+ dependencies:
+ xstream: 11.14.0
+
'@cosmjs/tendermint-rpc@0.32.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
'@cosmjs/crypto': 0.32.4
@@ -14352,8 +15245,27 @@ snapshots:
- debug
- utf-8-validate
+ '@cosmjs/tendermint-rpc@0.33.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@cosmjs/crypto': 0.33.0
+ '@cosmjs/encoding': 0.33.0
+ '@cosmjs/json-rpc': 0.33.0
+ '@cosmjs/math': 0.33.0
+ '@cosmjs/socket': 0.33.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@cosmjs/stream': 0.33.0
+ '@cosmjs/utils': 0.33.0
+ axios: 1.7.9
+ readonly-date: 1.0.0
+ xstream: 11.14.0
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - utf-8-validate
+
'@cosmjs/utils@0.32.4': {}
+ '@cosmjs/utils@0.33.0': {}
+
'@crossmint/client-sdk-base@1.4.4':
dependencies:
'@crossmint/client-sdk-window': 0.2.2
@@ -14848,6 +15760,9 @@ snapshots:
'@esbuild/aix-ppc64@0.24.2':
optional: true
+ '@esbuild/android-arm64@0.17.19':
+ optional: true
+
'@esbuild/android-arm64@0.19.12':
optional: true
@@ -14860,6 +15775,9 @@ snapshots:
'@esbuild/android-arm64@0.24.2':
optional: true
+ '@esbuild/android-arm@0.17.19':
+ optional: true
+
'@esbuild/android-arm@0.19.12':
optional: true
@@ -14872,6 +15790,9 @@ snapshots:
'@esbuild/android-arm@0.24.2':
optional: true
+ '@esbuild/android-x64@0.17.19':
+ optional: true
+
'@esbuild/android-x64@0.19.12':
optional: true
@@ -14884,6 +15805,9 @@ snapshots:
'@esbuild/android-x64@0.24.2':
optional: true
+ '@esbuild/darwin-arm64@0.17.19':
+ optional: true
+
'@esbuild/darwin-arm64@0.19.12':
optional: true
@@ -14896,6 +15820,9 @@ snapshots:
'@esbuild/darwin-arm64@0.24.2':
optional: true
+ '@esbuild/darwin-x64@0.17.19':
+ optional: true
+
'@esbuild/darwin-x64@0.19.12':
optional: true
@@ -14908,6 +15835,9 @@ snapshots:
'@esbuild/darwin-x64@0.24.2':
optional: true
+ '@esbuild/freebsd-arm64@0.17.19':
+ optional: true
+
'@esbuild/freebsd-arm64@0.19.12':
optional: true
@@ -14920,6 +15850,9 @@ snapshots:
'@esbuild/freebsd-arm64@0.24.2':
optional: true
+ '@esbuild/freebsd-x64@0.17.19':
+ optional: true
+
'@esbuild/freebsd-x64@0.19.12':
optional: true
@@ -14932,6 +15865,9 @@ snapshots:
'@esbuild/freebsd-x64@0.24.2':
optional: true
+ '@esbuild/linux-arm64@0.17.19':
+ optional: true
+
'@esbuild/linux-arm64@0.19.12':
optional: true
@@ -14944,6 +15880,9 @@ snapshots:
'@esbuild/linux-arm64@0.24.2':
optional: true
+ '@esbuild/linux-arm@0.17.19':
+ optional: true
+
'@esbuild/linux-arm@0.19.12':
optional: true
@@ -14956,6 +15895,9 @@ snapshots:
'@esbuild/linux-arm@0.24.2':
optional: true
+ '@esbuild/linux-ia32@0.17.19':
+ optional: true
+
'@esbuild/linux-ia32@0.19.12':
optional: true
@@ -14968,6 +15910,9 @@ snapshots:
'@esbuild/linux-ia32@0.24.2':
optional: true
+ '@esbuild/linux-loong64@0.17.19':
+ optional: true
+
'@esbuild/linux-loong64@0.19.12':
optional: true
@@ -14980,6 +15925,9 @@ snapshots:
'@esbuild/linux-loong64@0.24.2':
optional: true
+ '@esbuild/linux-mips64el@0.17.19':
+ optional: true
+
'@esbuild/linux-mips64el@0.19.12':
optional: true
@@ -14992,6 +15940,9 @@ snapshots:
'@esbuild/linux-mips64el@0.24.2':
optional: true
+ '@esbuild/linux-ppc64@0.17.19':
+ optional: true
+
'@esbuild/linux-ppc64@0.19.12':
optional: true
@@ -15004,6 +15955,9 @@ snapshots:
'@esbuild/linux-ppc64@0.24.2':
optional: true
+ '@esbuild/linux-riscv64@0.17.19':
+ optional: true
+
'@esbuild/linux-riscv64@0.19.12':
optional: true
@@ -15016,6 +15970,9 @@ snapshots:
'@esbuild/linux-riscv64@0.24.2':
optional: true
+ '@esbuild/linux-s390x@0.17.19':
+ optional: true
+
'@esbuild/linux-s390x@0.19.12':
optional: true
@@ -15028,6 +15985,9 @@ snapshots:
'@esbuild/linux-s390x@0.24.2':
optional: true
+ '@esbuild/linux-x64@0.17.19':
+ optional: true
+
'@esbuild/linux-x64@0.19.12':
optional: true
@@ -15043,6 +16003,9 @@ snapshots:
'@esbuild/netbsd-arm64@0.24.2':
optional: true
+ '@esbuild/netbsd-x64@0.17.19':
+ optional: true
+
'@esbuild/netbsd-x64@0.19.12':
optional: true
@@ -15061,6 +16024,9 @@ snapshots:
'@esbuild/openbsd-arm64@0.24.2':
optional: true
+ '@esbuild/openbsd-x64@0.17.19':
+ optional: true
+
'@esbuild/openbsd-x64@0.19.12':
optional: true
@@ -15073,6 +16039,9 @@ snapshots:
'@esbuild/openbsd-x64@0.24.2':
optional: true
+ '@esbuild/sunos-x64@0.17.19':
+ optional: true
+
'@esbuild/sunos-x64@0.19.12':
optional: true
@@ -15085,6 +16054,9 @@ snapshots:
'@esbuild/sunos-x64@0.24.2':
optional: true
+ '@esbuild/win32-arm64@0.17.19':
+ optional: true
+
'@esbuild/win32-arm64@0.19.12':
optional: true
@@ -15097,6 +16069,9 @@ snapshots:
'@esbuild/win32-arm64@0.24.2':
optional: true
+ '@esbuild/win32-ia32@0.17.19':
+ optional: true
+
'@esbuild/win32-ia32@0.19.12':
optional: true
@@ -15109,6 +16084,9 @@ snapshots:
'@esbuild/win32-ia32@0.24.2':
optional: true
+ '@esbuild/win32-x64@0.17.19':
+ optional: true
+
'@esbuild/win32-x64@0.19.12':
optional: true
@@ -15404,23 +16382,23 @@ snapshots:
'@fastify/busboy@2.1.1': {}
- '@fuel-ts/abi-coder@0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/abi-coder@0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
- '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/errors': 0.97.2
- '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/interfaces': 0.97.2
'@fuel-ts/math': 0.97.2
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
type-fest: 4.31.0
transitivePeerDependencies:
- vitest
- '@fuel-ts/abi-typegen@0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/abi-typegen@0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
'@fuel-ts/errors': 0.97.2
'@fuel-ts/interfaces': 0.97.2
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/versions': 0.97.2
commander: 12.1.0
glob: 10.4.5
@@ -15431,18 +16409,18 @@ snapshots:
transitivePeerDependencies:
- vitest
- '@fuel-ts/account@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/account@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
- '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/address': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/address': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/errors': 0.97.2
- '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/interfaces': 0.97.2
'@fuel-ts/math': 0.97.2
- '@fuel-ts/merkle': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/merkle': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/versions': 0.97.2
'@fuels/vm-asm': 0.58.2
'@noble/curves': 1.8.0
@@ -15455,30 +16433,30 @@ snapshots:
- encoding
- vitest
- '@fuel-ts/address@0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/address@0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
- '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/errors': 0.97.2
'@fuel-ts/interfaces': 0.97.2
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@noble/hashes': 1.7.0
bech32: 2.0.0
transitivePeerDependencies:
- vitest
- '@fuel-ts/contract@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/contract@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
- '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/account': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/account': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/errors': 0.97.2
- '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/interfaces': 0.97.2
'@fuel-ts/math': 0.97.2
- '@fuel-ts/merkle': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/program': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/merkle': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/program': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/versions': 0.97.2
'@fuels/vm-asm': 0.58.2
ramda: 0.30.1
@@ -15486,12 +16464,12 @@ snapshots:
- encoding
- vitest
- '@fuel-ts/crypto@0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/crypto@0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
'@fuel-ts/errors': 0.97.2
'@fuel-ts/interfaces': 0.97.2
'@fuel-ts/math': 0.97.2
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@noble/hashes': 1.7.0
transitivePeerDependencies:
- vitest
@@ -15500,11 +16478,11 @@ snapshots:
dependencies:
'@fuel-ts/versions': 0.97.2
- '@fuel-ts/hasher@0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/hasher@0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
- '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/interfaces': 0.97.2
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@noble/hashes': 1.7.0
transitivePeerDependencies:
- vitest
@@ -15517,78 +16495,78 @@ snapshots:
'@types/bn.js': 5.1.6
bn.js: 5.2.1
- '@fuel-ts/merkle@0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/merkle@0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
- '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/math': 0.97.2
transitivePeerDependencies:
- vitest
- '@fuel-ts/program@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/program@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
- '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/account': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/address': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/account': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/address': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/errors': 0.97.2
'@fuel-ts/interfaces': 0.97.2
'@fuel-ts/math': 0.97.2
- '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuels/vm-asm': 0.58.2
ramda: 0.30.1
transitivePeerDependencies:
- encoding
- vitest
- '@fuel-ts/recipes@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/recipes@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
- '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/abi-typegen': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/account': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/contract': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/abi-typegen': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/account': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/contract': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/interfaces': 0.97.2
- '@fuel-ts/program': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/program': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
transitivePeerDependencies:
- encoding
- vitest
- '@fuel-ts/script@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/script@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
- '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/account': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/address': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/account': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/address': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/errors': 0.97.2
'@fuel-ts/interfaces': 0.97.2
'@fuel-ts/math': 0.97.2
- '@fuel-ts/program': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/program': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
transitivePeerDependencies:
- encoding
- vitest
- '@fuel-ts/transactions@0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/transactions@0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
- '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/address': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/address': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/errors': 0.97.2
- '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/interfaces': 0.97.2
'@fuel-ts/math': 0.97.2
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
transitivePeerDependencies:
- vitest
- '@fuel-ts/utils@0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))':
+ '@fuel-ts/utils@0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))':
dependencies:
'@fuel-ts/errors': 0.97.2
'@fuel-ts/interfaces': 0.97.2
'@fuel-ts/math': 0.97.2
'@fuel-ts/versions': 0.97.2
fflate: 0.8.2
- vitest: 2.1.5(@types/node@22.10.5)(terser@5.37.0)
+ vitest: 2.1.5(@types/node@22.10.10)(terser@5.37.0)
'@fuel-ts/versions@0.97.2':
dependencies:
@@ -15599,7 +16577,7 @@ snapshots:
'@google-cloud/vertexai@1.9.0(encoding@0.1.13)':
dependencies:
- google-auth-library: 9.15.0(encoding@0.1.13)
+ google-auth-library: 9.15.1(encoding@0.1.13)
transitivePeerDependencies:
- encoding
- supports-color
@@ -17220,6 +18198,12 @@ snapshots:
raw-body: 3.0.0
zod: 3.24.1
+ '@module-federation/runtime@0.1.21':
+ dependencies:
+ '@module-federation/sdk': 0.1.21
+
+ '@module-federation/sdk@0.1.21': {}
+
'@mongodb-js/saslprep@1.1.9':
dependencies:
sparse-bitfield: 3.0.3
@@ -17296,30 +18280,30 @@ snapshots:
- '@gql.tada/vue-support'
- typescript
- '@next/env@15.0.3': {}
+ '@next/env@15.1.2': {}
- '@next/swc-darwin-arm64@15.0.3':
+ '@next/swc-darwin-arm64@15.1.2':
optional: true
- '@next/swc-darwin-x64@15.0.3':
+ '@next/swc-darwin-x64@15.1.2':
optional: true
- '@next/swc-linux-arm64-gnu@15.0.3':
+ '@next/swc-linux-arm64-gnu@15.1.2':
optional: true
- '@next/swc-linux-arm64-musl@15.0.3':
+ '@next/swc-linux-arm64-musl@15.1.2':
optional: true
- '@next/swc-linux-x64-gnu@15.0.3':
+ '@next/swc-linux-x64-gnu@15.1.2':
optional: true
- '@next/swc-linux-x64-musl@15.0.3':
+ '@next/swc-linux-x64-musl@15.1.2':
optional: true
- '@next/swc-win32-arm64-msvc@15.0.3':
+ '@next/swc-win32-arm64-msvc@15.1.2':
optional: true
- '@next/swc-win32-x64-msvc@15.0.3':
+ '@next/swc-win32-x64-msvc@15.1.2':
optional: true
'@noble/ciphers@0.5.3': {}
@@ -17330,6 +18314,10 @@ snapshots:
dependencies:
'@noble/hashes': 1.3.2
+ '@noble/curves@1.3.0':
+ dependencies:
+ '@noble/hashes': 1.3.3
+
'@noble/curves@1.4.0':
dependencies:
'@noble/hashes': 1.4.0
@@ -17342,15 +18330,25 @@ snapshots:
dependencies:
'@noble/hashes': 1.5.0
+ '@noble/curves@1.7.0':
+ dependencies:
+ '@noble/hashes': 1.6.0
+
'@noble/curves@1.8.0':
dependencies:
'@noble/hashes': 1.7.0
'@noble/hashes@1.3.2': {}
+ '@noble/hashes@1.3.3': {}
+
'@noble/hashes@1.4.0': {}
- '@noble/hashes@1.5.0': {}
+ '@noble/hashes@1.5.0': {}
+
+ '@noble/hashes@1.6.0': {}
+
+ '@noble/hashes@1.6.1': {}
'@noble/hashes@1.7.0': {}
@@ -17731,7 +18729,7 @@ snapshots:
'@rnx-kit/chromium-edge-launcher@1.0.0':
dependencies:
- '@types/node': 18.19.69
+ '@types/node': 18.19.74
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 1.4.2
@@ -17839,6 +18837,12 @@ snapshots:
'@noble/hashes': 1.5.0
'@scure/base': 1.1.9
+ '@scure/bip32@1.6.0':
+ dependencies:
+ '@noble/curves': 1.7.0
+ '@noble/hashes': 1.6.1
+ '@scure/base': 1.2.1
+
'@scure/bip32@1.6.1':
dependencies:
'@noble/curves': 1.8.0
@@ -17855,11 +18859,21 @@ snapshots:
'@noble/hashes': 1.5.0
'@scure/base': 1.1.9
+ '@scure/bip39@1.5.0':
+ dependencies:
+ '@noble/hashes': 1.6.1
+ '@scure/base': 1.2.1
+
'@scure/bip39@1.5.1':
dependencies:
'@noble/hashes': 1.7.0
'@scure/base': 1.2.1
+ '@scure/starknet@1.0.0':
+ dependencies:
+ '@noble/curves': 1.3.0
+ '@noble/hashes': 1.3.3
+
'@selderee/plugin-htmlparser2@0.11.0':
dependencies:
domhandler: 5.0.3
@@ -18568,6 +19582,8 @@ snapshots:
'@stablelib/random': 1.0.2
'@stablelib/wipe': 1.0.1
+ '@starknet-io/types-js@0.7.10': {}
+
'@suchipi/femver@1.0.0': {}
'@swc/core-darwin-arm64@1.10.1':
@@ -18619,10 +19635,6 @@ snapshots:
'@swc/counter@0.1.3': {}
- '@swc/helpers@0.5.13':
- dependencies:
- tslib: 2.8.1
-
'@swc/helpers@0.5.15':
dependencies:
tslib: 2.8.1
@@ -18767,13 +19779,13 @@ snapshots:
'@types/bn.js@5.1.6':
dependencies:
- '@types/node': 22.7.4
+ '@types/node': 20.17.11
'@types/cacheable-request@6.0.3':
dependencies:
'@types/http-cache-semantics': 4.0.4
'@types/keyv': 3.1.4
- '@types/node': 22.7.4
+ '@types/node': 20.17.11
'@types/responselike': 1.0.3
'@types/chai-subset@1.3.5':
@@ -18792,6 +19804,10 @@ snapshots:
'@types/diff-match-patch@1.0.36': {}
+ '@types/dotenv@8.2.3':
+ dependencies:
+ dotenv: 16.4.7
+
'@types/estree@1.0.6': {}
'@types/http-cache-semantics@4.0.4': {}
@@ -18810,7 +19826,7 @@ snapshots:
'@types/keyv@3.1.4':
dependencies:
- '@types/node': 22.7.4
+ '@types/node': 20.17.11
'@types/lodash@4.17.14': {}
@@ -18820,7 +19836,7 @@ snapshots:
'@types/node-fetch@2.6.12':
dependencies:
- '@types/node': 22.7.4
+ '@types/node': 20.17.11
form-data: 4.0.1
'@types/node-forge@1.3.11':
@@ -18833,10 +19849,18 @@ snapshots:
dependencies:
undici-types: 5.26.5
+ '@types/node@18.19.74':
+ dependencies:
+ undici-types: 5.26.5
+
'@types/node@20.17.11':
dependencies:
undici-types: 6.19.8
+ '@types/node@22.10.10':
+ dependencies:
+ undici-types: 6.20.0
+
'@types/node@22.10.5':
dependencies:
undici-types: 6.20.0
@@ -18868,7 +19892,7 @@ snapshots:
'@types/responselike@1.0.3':
dependencies:
- '@types/node': 22.7.4
+ '@types/node': 20.17.11
'@types/retry@0.12.0': {}
@@ -19023,7 +20047,7 @@ snapshots:
'@vue/compiler-core@3.5.13':
dependencies:
- '@babel/parser': 7.26.3
+ '@babel/parser': 7.26.7
'@vue/shared': 3.5.13
entities: 4.5.0
estree-walker: 2.0.2
@@ -19036,14 +20060,14 @@ snapshots:
'@vue/compiler-sfc@3.5.13':
dependencies:
- '@babel/parser': 7.26.3
+ '@babel/parser': 7.26.7
'@vue/compiler-core': 3.5.13
'@vue/compiler-dom': 3.5.13
'@vue/compiler-ssr': 3.5.13
'@vue/shared': 3.5.13
estree-walker: 2.0.2
magic-string: 0.30.17
- postcss: 8.4.49
+ postcss: 8.5.1
source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.13':
@@ -20094,6 +21118,13 @@ snapshots:
abbrev@1.1.1:
optional: true
+ abi-wan-kanabi@2.2.4:
+ dependencies:
+ ansicolors: 0.3.2
+ cardinal: 2.1.1
+ fs-extra: 10.1.0
+ yargs: 17.7.2
+
abitype@1.0.5(typescript@5.6.3)(zod@3.23.8):
optionalDependencies:
typescript: 5.6.3
@@ -20114,6 +21145,11 @@ snapshots:
typescript: 5.6.3
zod: 3.24.1
+ abitype@1.0.7(typescript@5.6.3)(zod@3.23.8):
+ optionalDependencies:
+ typescript: 5.6.3
+ zod: 3.23.8
+
abitype@1.0.8(typescript@5.6.3)(zod@3.23.8):
optionalDependencies:
typescript: 5.6.3
@@ -20282,6 +21318,8 @@ snapshots:
ansi-styles@6.2.1: {}
+ ansicolors@0.3.2: {}
+
anthropic-vertex-ai@1.0.2(encoding@0.1.13)(zod@3.23.8):
dependencies:
'@ai-sdk/provider': 0.0.24
@@ -20601,7 +21639,7 @@ snapshots:
browserslist@4.24.3:
dependencies:
- caniuse-lite: 1.0.30001690
+ caniuse-lite: 1.0.30001695
electron-to-chromium: 1.5.76
node-releases: 2.0.19
update-browserslist-db: 1.1.1(browserslist@4.24.3)
@@ -20659,6 +21697,11 @@ snapshots:
dependencies:
node-gyp-build: 4.8.4
+ bundle-require@4.2.1(esbuild@0.17.19):
+ dependencies:
+ esbuild: 0.17.19
+ load-tsconfig: 0.2.5
+
bundle-require@4.2.1(esbuild@0.19.12):
dependencies:
esbuild: 0.19.12
@@ -20728,7 +21771,7 @@ snapshots:
camelcase@6.3.0: {}
- caniuse-lite@1.0.30001690: {}
+ caniuse-lite@1.0.30001695: {}
canonicalize@2.0.0: {}
@@ -20744,6 +21787,11 @@ snapshots:
capture-stack-trace@1.0.2: {}
+ cardinal@2.1.1:
+ dependencies:
+ ansicolors: 0.3.2
+ redeyed: 2.1.1
+
cbor-web@9.0.2: {}
chai@4.5.0:
@@ -21012,6 +22060,10 @@ snapshots:
dependencies:
browserslist: 4.24.3
+ core-js-compat@3.40.0:
+ dependencies:
+ browserslist: 4.24.3
+
core-util-is@1.0.3: {}
cosmiconfig@5.2.1:
@@ -21071,6 +22123,12 @@ snapshots:
transitivePeerDependencies:
- encoding
+ cross-fetch@3.1.5(encoding@0.1.13):
+ dependencies:
+ node-fetch: 2.6.7(encoding@0.1.13)
+ transitivePeerDependencies:
+ - encoding
+
cross-fetch@3.1.8(encoding@0.1.13):
dependencies:
node-fetch: 2.7.0(encoding@0.1.13)
@@ -21159,6 +22217,8 @@ snapshots:
decamelize@1.2.0: {}
+ decimal.js-light@2.5.1: {}
+
decimal.js@10.4.3: {}
decode-uri-component@0.2.2: {}
@@ -21449,6 +22509,31 @@ snapshots:
d: 1.0.2
ext: 1.7.0
+ esbuild@0.17.19:
+ optionalDependencies:
+ '@esbuild/android-arm': 0.17.19
+ '@esbuild/android-arm64': 0.17.19
+ '@esbuild/android-x64': 0.17.19
+ '@esbuild/darwin-arm64': 0.17.19
+ '@esbuild/darwin-x64': 0.17.19
+ '@esbuild/freebsd-arm64': 0.17.19
+ '@esbuild/freebsd-x64': 0.17.19
+ '@esbuild/linux-arm': 0.17.19
+ '@esbuild/linux-arm64': 0.17.19
+ '@esbuild/linux-ia32': 0.17.19
+ '@esbuild/linux-loong64': 0.17.19
+ '@esbuild/linux-mips64el': 0.17.19
+ '@esbuild/linux-ppc64': 0.17.19
+ '@esbuild/linux-riscv64': 0.17.19
+ '@esbuild/linux-s390x': 0.17.19
+ '@esbuild/linux-x64': 0.17.19
+ '@esbuild/netbsd-x64': 0.17.19
+ '@esbuild/openbsd-x64': 0.17.19
+ '@esbuild/sunos-x64': 0.17.19
+ '@esbuild/win32-arm64': 0.17.19
+ '@esbuild/win32-ia32': 0.17.19
+ '@esbuild/win32-x64': 0.17.19
+
esbuild@0.19.12:
optionalDependencies:
'@esbuild/aix-ppc64': 0.19.12
@@ -21564,7 +22649,7 @@ snapshots:
escape-string-regexp@4.0.0: {}
- esm-env@1.2.1: {}
+ esm-env@1.2.2: {}
esniff@2.0.1:
dependencies:
@@ -21575,7 +22660,7 @@ snapshots:
esprima@4.0.1: {}
- esrap@1.3.2:
+ esrap@1.4.3:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
@@ -21676,6 +22761,19 @@ snapshots:
- bufferutil
- utf-8-validate
+ ethers@6.13.5(bufferutil@4.0.9)(utf-8-validate@5.0.10):
+ dependencies:
+ '@adraffy/ens-normalize': 1.10.1
+ '@noble/curves': 1.2.0
+ '@noble/hashes': 1.3.2
+ '@types/node': 22.7.5
+ aes-js: 4.0.0-beta.5
+ tslib: 2.7.0
+ ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
ethjs-unit@0.1.6:
dependencies:
bn.js: 4.11.6
@@ -21857,6 +22955,11 @@ snapshots:
node-domexception: 1.0.0
web-streams-polyfill: 3.3.3
+ fetch-cookie@3.1.0:
+ dependencies:
+ set-cookie-parser: 2.7.1
+ tough-cookie: 5.1.0
+
fetch-h2@3.0.2:
dependencies:
'@types/tough-cookie': 4.0.5
@@ -21988,6 +23091,12 @@ snapshots:
fs-constants@1.0.0: {}
+ fs-extra@10.1.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+
fs-extra@2.1.2:
dependencies:
graceful-fs: 4.2.11
@@ -22021,24 +23130,24 @@ snapshots:
fsevents@2.3.3:
optional: true
- fuels@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0)):
+ fuels@0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0)):
dependencies:
- '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/abi-typegen': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/account': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/address': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/contract': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/abi-coder': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/abi-typegen': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/account': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/address': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/contract': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/crypto': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/errors': 0.97.2
- '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/hasher': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/interfaces': 0.97.2
'@fuel-ts/math': 0.97.2
- '@fuel-ts/merkle': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/program': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/recipes': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/script': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
- '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0))
+ '@fuel-ts/merkle': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/program': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/recipes': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/script': 0.97.2(encoding@0.1.13)(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/transactions': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
+ '@fuel-ts/utils': 0.97.2(vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0))
'@fuel-ts/versions': 0.97.2
bundle-require: 5.1.0(esbuild@0.24.2)
chalk: 4.1.2
@@ -22124,6 +23233,22 @@ snapshots:
dunder-proto: 1.0.1
es-object-atoms: 1.0.0
+ get-starknet-core@3.3.4(starknet@6.11.0(encoding@0.1.13)):
+ dependencies:
+ '@module-federation/runtime': 0.1.21
+ starknet: 6.11.0(encoding@0.1.13)
+
+ get-starknet-core@4.0.0:
+ dependencies:
+ '@starknet-io/types-js': 0.7.10
+
+ get-starknet@3.3.3(starknet@6.11.0(encoding@0.1.13)):
+ dependencies:
+ bowser: 2.11.0
+ get-starknet-core: 3.3.4(starknet@6.11.0(encoding@0.1.13))
+ transitivePeerDependencies:
+ - starknet
+
get-stream@5.2.0:
dependencies:
pump: 3.0.2
@@ -22228,8 +23353,34 @@ snapshots:
- encoding
- supports-color
+ google-auth-library@9.15.1(encoding@0.1.13):
+ dependencies:
+ base64-js: 1.5.1
+ ecdsa-sig-formatter: 1.0.11
+ gaxios: 6.7.1(encoding@0.1.13)
+ gcp-metadata: 6.1.0(encoding@0.1.13)
+ gtoken: 7.1.0(encoding@0.1.13)
+ jws: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
gopd@1.2.0: {}
+ got@11.8.5:
+ dependencies:
+ '@sindresorhus/is': 4.6.0
+ '@szmarczak/http-timer': 4.0.6
+ '@types/cacheable-request': 6.0.3
+ '@types/responselike': 1.0.3
+ cacheable-lookup: 5.0.4
+ cacheable-request: 7.0.4
+ decompress-response: 6.0.0
+ http2-wrapper: 1.0.3
+ lowercase-keys: 2.0.0
+ p-cancelable: 2.1.1
+ responselike: 2.0.1
+
got@11.8.6:
dependencies:
'@sindresorhus/is': 4.6.0
@@ -22886,6 +24037,12 @@ snapshots:
optionalDependencies:
graceful-fs: 4.2.11
+ jsonfile@6.1.0:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
jsonparse@1.3.1: {}
jsonpointer@5.0.1: {}
@@ -23074,6 +24231,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ lilconfig@2.1.0: {}
+
lilconfig@3.1.3: {}
limit-it@3.2.10:
@@ -23203,6 +24362,8 @@ snapshots:
lodash.camelcase@4.3.0: {}
+ lodash.clonedeep@4.5.0: {}
+
lodash.debounce@4.0.8: {}
lodash.includes@4.3.0: {}
@@ -23263,6 +24424,8 @@ snapshots:
option: 0.2.4
underscore: 1.13.7
+ lossless-json@4.0.2: {}
+
loupe@2.3.7:
dependencies:
get-func-name: 2.0.2
@@ -23285,6 +24448,8 @@ snapshots:
dependencies:
yallist: 3.1.1
+ lru-cache@9.0.3: {}
+
lru-cache@9.1.2: {}
magic-bytes.js@1.10.0: {}
@@ -23630,6 +24795,8 @@ snapshots:
pkg-types: 1.3.0
ufo: 1.5.4
+ moment@2.30.1: {}
+
mongodb-connection-string-url@3.0.1:
dependencies:
'@types/whatwg-url': 11.0.5
@@ -23658,6 +24825,8 @@ snapshots:
ms@2.1.3: {}
+ ms@3.0.0-canary.1: {}
+
multiformats@11.0.2: {}
multiformats@9.9.0: {}
@@ -23692,26 +24861,26 @@ snapshots:
next-tick@1.1.0: {}
- next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ next@15.1.2(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@next/env': 15.0.3
+ '@next/env': 15.1.2
'@swc/counter': 0.1.3
- '@swc/helpers': 0.5.13
+ '@swc/helpers': 0.5.15
busboy: 1.6.0
- caniuse-lite: 1.0.30001690
+ caniuse-lite: 1.0.30001695
postcss: 8.4.31
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
styled-jsx: 5.1.6(@babel/core@7.26.0)(react@18.3.1)
optionalDependencies:
- '@next/swc-darwin-arm64': 15.0.3
- '@next/swc-darwin-x64': 15.0.3
- '@next/swc-linux-arm64-gnu': 15.0.3
- '@next/swc-linux-arm64-musl': 15.0.3
- '@next/swc-linux-x64-gnu': 15.0.3
- '@next/swc-linux-x64-musl': 15.0.3
- '@next/swc-win32-arm64-msvc': 15.0.3
- '@next/swc-win32-x64-msvc': 15.0.3
+ '@next/swc-darwin-arm64': 15.1.2
+ '@next/swc-darwin-x64': 15.1.2
+ '@next/swc-linux-arm64-gnu': 15.1.2
+ '@next/swc-linux-arm64-musl': 15.1.2
+ '@next/swc-linux-x64-gnu': 15.1.2
+ '@next/swc-linux-x64-musl': 15.1.2
+ '@next/swc-win32-arm64-msvc': 15.1.2
+ '@next/swc-win32-x64-msvc': 15.1.2
'@opentelemetry/api': 1.9.0
sharp: 0.33.5
transitivePeerDependencies:
@@ -23764,6 +24933,12 @@ snapshots:
node-fetch@2.6.1: {}
+ node-fetch@2.6.7(encoding@0.1.13):
+ dependencies:
+ whatwg-url: 5.0.0
+ optionalDependencies:
+ encoding: 0.1.13
+
node-fetch@2.7.0(encoding@0.1.13):
dependencies:
whatwg-url: 5.0.0
@@ -24068,6 +25243,20 @@ snapshots:
transitivePeerDependencies:
- zod
+ ox@0.6.5(typescript@5.6.3)(zod@3.23.8):
+ dependencies:
+ '@adraffy/ens-normalize': 1.11.0
+ '@noble/curves': 1.8.0
+ '@noble/hashes': 1.7.0
+ '@scure/bip32': 1.6.1
+ '@scure/bip39': 1.5.1
+ abitype: 1.0.8(typescript@5.6.3)(zod@3.23.8)
+ eventemitter3: 5.0.1
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - zod
+
p-cancelable@2.1.1: {}
p-filter@2.1.0:
@@ -24344,28 +25533,36 @@ snapshots:
camelcase-css: 2.0.1
postcss: 8.4.49
- postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.5)(typescript@5.6.3)):
+ postcss-load-config@3.1.4(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@18.19.69)(typescript@5.6.3)):
+ dependencies:
+ lilconfig: 2.1.0
+ yaml: 1.10.2
+ optionalDependencies:
+ postcss: 8.5.1
+ ts-node: 10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@18.19.69)(typescript@5.6.3)
+
+ postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.6.3)):
dependencies:
lilconfig: 3.1.3
yaml: 2.7.0
optionalDependencies:
postcss: 8.4.49
- ts-node: 10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.5)(typescript@5.6.3)
+ ts-node: 10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.6.3)
- postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.7.4)(typescript@5.6.3)):
+ postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.6.3)):
dependencies:
lilconfig: 3.1.3
yaml: 2.7.0
optionalDependencies:
- postcss: 8.4.49
- ts-node: 10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.7.4)(typescript@5.6.3)
+ postcss: 8.5.1
+ ts-node: 10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.6.3)
- postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.7.0):
+ postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.1)(tsx@4.19.2)(yaml@2.7.0):
dependencies:
lilconfig: 3.1.3
optionalDependencies:
jiti: 1.21.7
- postcss: 8.4.49
+ postcss: 8.5.1
tsx: 4.19.2
yaml: 2.7.0
@@ -24393,6 +25590,12 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
+ postcss@8.5.1:
+ dependencies:
+ nanoid: 3.3.8
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
postgres-array@3.0.2: {}
postgres-bytea@3.0.0:
@@ -24479,7 +25682,7 @@ snapshots:
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/long': 4.0.2
- '@types/node': 20.17.11
+ '@types/node': 22.10.10
long: 4.0.0
protobufjs@7.4.0:
@@ -24833,6 +26036,10 @@ snapshots:
source-map: 0.6.1
tslib: 2.8.1
+ redeyed@2.1.1:
+ dependencies:
+ esprima: 4.0.1
+
reflect-metadata@0.1.14: {}
reflect-metadata@0.2.2: {}
@@ -24849,7 +26056,7 @@ snapshots:
regenerator-transform@0.15.2:
dependencies:
- '@babel/runtime': 7.26.0
+ '@babel/runtime': 7.26.7
regexpu-core@6.2.0:
dependencies:
@@ -24942,6 +26149,10 @@ snapshots:
robot3@0.4.1: {}
+ rollup@3.29.5:
+ optionalDependencies:
+ fsevents: 2.3.3
+
rollup@4.29.1:
dependencies:
'@types/estree': 1.0.6
@@ -25091,6 +26302,8 @@ snapshots:
set-blocking@2.0.0: {}
+ set-cookie-parser@2.7.1: {}
+
set-function-length@1.2.2:
dependencies:
define-data-property: 1.1.4
@@ -25360,6 +26573,24 @@ snapshots:
dependencies:
type-fest: 0.7.1
+ starknet@6.11.0(encoding@0.1.13):
+ dependencies:
+ '@noble/curves': 1.4.2
+ '@noble/hashes': 1.7.0
+ '@scure/base': 1.1.9
+ '@scure/starknet': 1.0.0
+ abi-wan-kanabi: 2.2.4
+ fetch-cookie: 3.1.0
+ get-starknet-core: 4.0.0
+ isomorphic-fetch: 3.0.0(encoding@0.1.13)
+ lossless-json: 4.0.2
+ pako: 2.1.0
+ starknet-types-07: '@starknet-io/types-js@0.7.10'
+ ts-mixer: 6.0.4
+ url-join: 4.0.1
+ transitivePeerDependencies:
+ - encoding
+
statuses@1.5.0: {}
statuses@2.0.1: {}
@@ -25486,8 +26717,8 @@ snapshots:
aria-query: 5.3.2
axobject-query: 4.1.0
clsx: 2.1.1
- esm-env: 1.2.1
- esrap: 1.3.2
+ esm-env: 1.2.2
+ esrap: 1.4.3
is-reference: 3.0.3
locate-character: 3.0.0
magic-string: 0.30.17
@@ -25507,7 +26738,7 @@ snapshots:
symbol-observable@2.0.3: {}
- tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.5)(typescript@5.6.3)):
+ tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.6.3)):
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
@@ -25526,7 +26757,7 @@ snapshots:
postcss: 8.4.49
postcss-import: 15.1.0(postcss@8.4.49)
postcss-js: 4.0.1(postcss@8.4.49)
- postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.5)(typescript@5.6.3))
+ postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.6.3))
postcss-nested: 6.2.0(postcss@8.4.49)
postcss-selector-parser: 6.1.2
resolve: 1.22.10
@@ -25666,10 +26897,16 @@ snapshots:
tldts-core@6.1.70: {}
+ tldts-core@6.1.73: {}
+
tldts@6.0.16:
dependencies:
tldts-core: 6.1.70
+ tldts@6.1.73:
+ dependencies:
+ tldts-core: 6.1.73
+
tmp@0.0.28:
dependencies:
os-tmpdir: 1.0.2
@@ -25711,6 +26948,10 @@ snapshots:
universalify: 0.2.0
url-parse: 1.5.10
+ tough-cookie@5.1.0:
+ dependencies:
+ tldts: 6.1.73
+
tr46@0.0.3: {}
tr46@1.0.1:
@@ -25736,14 +26977,37 @@ snapshots:
ts-interface-checker@0.1.13: {}
- ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.5)(typescript@5.6.3):
+ ts-mixer@6.0.4: {}
+
+ ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@18.19.69)(typescript@5.6.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
- '@types/node': 22.10.5
+ '@types/node': 18.19.69
+ acorn: 8.14.0
+ acorn-walk: 8.3.4
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.6.3
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ optionalDependencies:
+ '@swc/core': 1.10.1(@swc/helpers@0.5.15)
+ optional: true
+
+ ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.6.3):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.11
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 22.10.10
acorn: 8.14.0
acorn-walk: 8.3.4
arg: 4.1.3
@@ -25796,7 +27060,31 @@ snapshots:
tslib@2.8.1: {}
- tsup@7.3.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.7.4)(typescript@5.6.3))(typescript@5.6.3):
+ tsup@6.7.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@18.19.69)(typescript@5.6.3))(typescript@5.6.3):
+ dependencies:
+ bundle-require: 4.2.1(esbuild@0.17.19)
+ cac: 6.7.14
+ chokidar: 3.6.0
+ debug: 4.4.0
+ esbuild: 0.17.19
+ execa: 5.1.1
+ globby: 11.1.0
+ joycon: 3.1.1
+ postcss-load-config: 3.1.4(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@18.19.69)(typescript@5.6.3))
+ resolve-from: 5.0.0
+ rollup: 3.29.5
+ source-map: 0.8.0-beta.0
+ sucrase: 3.35.0
+ tree-kill: 1.2.2
+ optionalDependencies:
+ '@swc/core': 1.10.1(@swc/helpers@0.5.15)
+ postcss: 8.5.1
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+ - ts-node
+
+ tsup@7.3.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.6.3))(typescript@5.6.3):
dependencies:
bundle-require: 4.2.1(esbuild@0.19.12)
cac: 6.7.14
@@ -25806,7 +27094,7 @@ snapshots:
execa: 5.1.1
globby: 11.1.0
joycon: 3.1.1
- postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.7.4)(typescript@5.6.3))
+ postcss-load-config: 4.0.2(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.6.3))
resolve-from: 5.0.0
rollup: 4.29.1
source-map: 0.8.0-beta.0
@@ -25814,13 +27102,13 @@ snapshots:
tree-kill: 1.2.2
optionalDependencies:
'@swc/core': 1.10.1(@swc/helpers@0.5.15)
- postcss: 8.4.49
+ postcss: 8.5.1
typescript: 5.6.3
transitivePeerDependencies:
- supports-color
- ts-node
- tsup@8.3.5(@swc/core@1.10.1(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.0):
+ tsup@8.3.5(@swc/core@1.10.1(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.1)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.0):
dependencies:
bundle-require: 5.1.0(esbuild@0.24.2)
cac: 6.7.14
@@ -25830,7 +27118,7 @@ snapshots:
esbuild: 0.24.2
joycon: 3.1.1
picocolors: 1.1.1
- postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.7.0)
+ postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.1)(tsx@4.19.2)(yaml@2.7.0)
resolve-from: 5.0.0
rollup: 4.29.1
source-map: 0.8.0-beta.0
@@ -25840,7 +27128,7 @@ snapshots:
tree-kill: 1.2.2
optionalDependencies:
'@swc/core': 1.10.1(@swc/helpers@0.5.15)
- postcss: 8.4.49
+ postcss: 8.5.1
typescript: 5.6.3
transitivePeerDependencies:
- jiti
@@ -25988,6 +27276,8 @@ snapshots:
universalify@0.2.0: {}
+ universalify@2.0.1: {}
+
unorm@1.6.0: {}
unpdf@0.12.1(encoding@0.1.13):
@@ -26145,6 +27435,24 @@ snapshots:
- utf-8-validate
- zod
+ viem@2.18.4(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8):
+ dependencies:
+ '@adraffy/ens-normalize': 1.10.0
+ '@noble/curves': 1.4.0
+ '@noble/hashes': 1.4.0
+ '@scure/bip32': 1.4.0
+ '@scure/bip39': 1.3.0
+ abitype: 1.0.5(typescript@5.6.3)(zod@3.23.8)
+ isows: 1.0.4(ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))
+ webauthn-p256: 0.0.5
+ ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ - zod
+
viem@2.21.49(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8):
dependencies:
'@noble/curves': 1.6.0
@@ -26199,14 +27507,31 @@ snapshots:
- utf-8-validate
- zod
- vite-node@0.34.6(@types/node@22.7.4)(terser@5.37.0):
+ viem@2.22.9(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8):
+ 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(typescript@5.6.3)(zod@3.23.8)
+ isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))
+ ox: 0.6.5(typescript@5.6.3)(zod@3.23.8)
+ ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ - zod
+
+ vite-node@0.34.6(@types/node@20.17.11)(terser@5.37.0):
dependencies:
cac: 6.7.14
debug: 4.4.0
mlly: 1.7.3
pathe: 1.1.2
picocolors: 1.1.1
- vite: 5.4.11(@types/node@22.7.4)(terser@5.37.0)
+ vite: 5.4.11(@types/node@20.17.11)(terser@5.37.0)
transitivePeerDependencies:
- '@types/node'
- less
@@ -26236,13 +27561,13 @@ snapshots:
- supports-color
- terser
- vite-node@2.1.5(@types/node@22.10.5)(terser@5.37.0):
+ vite-node@2.1.5(@types/node@22.10.10)(terser@5.37.0):
dependencies:
cac: 6.7.14
debug: 4.4.0
es-module-lexer: 1.6.0
pathe: 1.1.2
- vite: 5.4.11(@types/node@22.10.5)(terser@5.37.0)
+ vite: 5.4.11(@types/node@22.10.10)(terser@5.37.0)
transitivePeerDependencies:
- '@types/node'
- less
@@ -26275,27 +27600,27 @@ snapshots:
vite@5.4.11(@types/node@20.17.11)(terser@5.37.0):
dependencies:
esbuild: 0.21.5
- postcss: 8.4.49
+ postcss: 8.5.1
rollup: 4.29.1
optionalDependencies:
'@types/node': 20.17.11
fsevents: 2.3.3
terser: 5.37.0
- vite@5.4.11(@types/node@22.10.5)(terser@5.37.0):
+ vite@5.4.11(@types/node@22.10.10)(terser@5.37.0):
dependencies:
esbuild: 0.21.5
- postcss: 8.4.49
+ postcss: 8.5.1
rollup: 4.29.1
optionalDependencies:
- '@types/node': 22.10.5
+ '@types/node': 22.10.10
fsevents: 2.3.3
terser: 5.37.0
vite@5.4.11(@types/node@22.7.4)(terser@5.37.0):
dependencies:
esbuild: 0.21.5
- postcss: 8.4.49
+ postcss: 8.5.1
rollup: 4.29.1
optionalDependencies:
'@types/node': 22.7.4
@@ -26306,7 +27631,7 @@ snapshots:
dependencies:
'@types/chai': 4.3.20
'@types/chai-subset': 1.3.5
- '@types/node': 22.7.4
+ '@types/node': 20.17.11
'@vitest/expect': 0.34.6
'@vitest/runner': 0.34.6
'@vitest/snapshot': 0.34.6
@@ -26325,8 +27650,8 @@ snapshots:
strip-literal: 1.3.0
tinybench: 2.9.0
tinypool: 0.7.0
- vite: 5.4.11(@types/node@22.7.4)(terser@5.37.0)
- vite-node: 0.34.6(@types/node@22.7.4)(terser@5.37.0)
+ vite: 5.4.11(@types/node@20.17.11)(terser@5.37.0)
+ vite-node: 0.34.6(@types/node@20.17.11)(terser@5.37.0)
why-is-node-running: 2.3.0
transitivePeerDependencies:
- less
@@ -26372,7 +27697,7 @@ snapshots:
- supports-color
- terser
- vitest@2.1.5(@types/node@22.10.5)(terser@5.37.0):
+ vitest@2.1.5(@types/node@22.10.10)(terser@5.37.0):
dependencies:
'@vitest/expect': 2.1.5
'@vitest/mocker': 2.1.5(vite@5.4.11(@types/node@22.7.4)(terser@5.37.0))
@@ -26391,11 +27716,11 @@ snapshots:
tinyexec: 0.3.2
tinypool: 1.0.2
tinyrainbow: 1.2.0
- vite: 5.4.11(@types/node@22.10.5)(terser@5.37.0)
- vite-node: 2.1.5(@types/node@22.10.5)(terser@5.37.0)
+ vite: 5.4.11(@types/node@22.10.10)(terser@5.37.0)
+ vite-node: 2.1.5(@types/node@22.10.10)(terser@5.37.0)
why-is-node-running: 2.3.0
optionalDependencies:
- '@types/node': 22.10.5
+ '@types/node': 22.10.10
transitivePeerDependencies:
- less
- lightningcss
@@ -26541,6 +27866,11 @@ snapshots:
'@noble/curves': 1.8.0
'@noble/hashes': 1.7.0
+ webauthn-p256@0.0.5:
+ dependencies:
+ '@noble/curves': 1.8.0
+ '@noble/hashes': 1.7.0
+
webextension-polyfill@0.10.0: {}
webidl-conversions@3.0.1: {}
@@ -26712,6 +28042,8 @@ snapshots:
yallist@5.0.0: {}
+ yaml@1.10.2: {}
+
yaml@2.7.0: {}
yargs-parser@18.1.3: