diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..1f3564b --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +OPENAI_API_KEY= +RPC_URL= +SOLANA_PRIVATE_KEY= diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..6b14ea8 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,154 @@ +# Contributing to Solana Agent Kit + +First off, thank you for considering contributing to Solana Agent Kit! 🎉 Your contributions are **greatly appreciated**. + +## Table of Contents + +- [Contributing to Solana Agent Kit](#contributing-to-solana-agent-kit) + - [Table of Contents](#table-of-contents) + - [Code of Conduct](#code-of-conduct) + - [How Can I Contribute?](#how-can-i-contribute) + - [Reporting Bugs](#reporting-bugs) + - [Suggesting Enhancements](#suggesting-enhancements) + - [Your First Code Contribution](#your-first-code-contribution) + - [Pull Requests](#pull-requests) + - [Style Guides](#style-guides) + - [Code Style](#code-style) + - [Commit Messages](#commit-messages) + - [Naming Conventions](#naming-conventions) + - [Development Setup](#development-setup) + - [Prerequisites](#prerequisites) + - [Installation](#installation) + - [Building the Project](#building-the-project) + - [Running Tests](#running-tests) + - [Generating Documentation](#generating-documentation) + - [Security](#security) + - [License](#license) + +## Code of Conduct + +This project adheres to the [Contributor Covenant Code of Conduct](https://www.contributor-covenant.org/version/2/0/code_of_conduct/). By participating, you are expected to uphold this code. Please report unacceptable behavior to [aryan@sendai.fun](mailto:aryan@sendai.fun). + +## How Can I Contribute? + +### Reporting Bugs + +**Great**! Opening an issue is the best way to help us improve. Here's how you can report a bug: + +1. **Search** the [existing issues](https://github.com/sendaifun/solana-agent-kit/issues) to make sure it hasn't been reported. +2. **Open a new issue** and fill out the template with as much information as possible. +3. **Provide reproduction steps** if applicable. + +### Suggesting Enhancements + +We welcome your ideas for improving Solana Agent Kit! To suggest an enhancement: + +1. **Search** the [existing issues](https://github.com/sendaifun/solana-agent-kit/issues) to see if it's already been suggested. +2. **Open a new issue** and describe your idea in detail. + +### Your First Code Contribution + +Unsure where to start? You can help out by: + +- Fixing simple bugs. +- Improving documentation. +- Adding tests. + +Check out the [Good First Issues](https://github.com/sendaifun/solana-agent-kit/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) to get started! + +### Pull Requests + +1. **Fork** the repository. +2. **Create** a new branch for your feature or bugfix. + ```bash + git checkout -b feature/your-feature-name + ``` +3. **Commit** your changes with clear and descriptive messages. +4. **Push** to your fork. + ```bash + git push origin feature/your-feature-name + ``` +5. **Open a Pull Request** against the `main` branch of this repository. + +## Style Guides + +### Code Style + +- **Language**: TypeScript +- **Formatting**: Follow the existing codebase formatting. Consider using [Prettier](https://prettier.io/) for consistent code formatting. +- **Linting**: Adhere to the linting rules defined in `.eslintrc`. Ensure all linting checks pass before submitting a PR. + +### Commit Messages + +Use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) for your commit messages. Examples: + +- `feat: add ability to deploy new SPL token` +- `fix: handle edge case when deploying collection` +- `docs: update README with new usage examples` + +### Naming Conventions + +- **Variables and Functions**: `camelCase` +- **Classes and Types**: `PascalCase` +- **Constants**: `UPPER_SNAKE_CASE` + +## Development Setup + +### Prerequisites + +- **Node.js**: v23.x or higher +- **npm**: v10.x or higher +- **Git**: Installed and configured + +### Installation + +1. **Clone** the repository: + ```bash + git clone https://github.com/yourusername/solana-agent-kit.git + ``` +2. **Navigate** to the project directory: + ```bash + cd solana-agent-kit + ``` +3. **Install** dependencies: + ```bash + pnpm install + ``` + +### Building the Project + +To compile the TypeScript code: + +```bash +pnpm run build +``` + +### Running Tests + +To execute the test suite: + +```bash +pnpm run test +``` + +### Generating Documentation + +To generate the project documentation using TypeDoc: + +```bash +npm run docs +``` + +The documentation will be available in the `docs/` directory. + +## Security + +This toolkit handles sensitive information such as private keys and API keys. **Ensure you never commit `.env` files or any sensitive data**. Review the `.gitignore` to confirm that sensitive files are excluded. + +For security vulnerabilities, please follow the [responsible disclosure](mailto:aryan@sendai.fun) process. + +## License + +This project is licensed under the [ISC License](LICENSE). + +--- diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..e887a9d --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 SendAI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 8b7ae7d..2013b60 100644 --- a/README.md +++ b/README.md @@ -5,21 +5,26 @@ A powerful toolkit for interacting with the Solana blockchain, providing easy-to ## Features - 🪙 Token Operations + - Deploy new SPL tokens - Transfer SOL and SPL tokens - Check token balances + - Stake SOL - 🖼️ NFT Management + - Deploy NFT collections - Mint NFTs to collections - Manage metadata and royalties - 💱 Trading + - Integrated Jupiter Exchange support - Token swaps with customizable slippage - Direct routing options - 🏦 Yield Farming + - Lend idle assets to earn interest with Lulo - 🔗 LangChain Integration @@ -35,12 +40,13 @@ npm install solana-agent-kit ## Quick Start ```typescript -import { SolanaAgentKit, createSolanaTools } from 'solana-agent-kit'; +import { SolanaAgentKit, createSolanaTools } from "solana-agent-kit"; // Initialize with private key and optional RPC URL const agent = new SolanaAgentKit( - 'your-private-key', - 'https://api.mainnet-beta.solana.com' + "your-wallet-private-key-as-base58", + "https://api.mainnet-beta.solana.com", + "your-openai-api-key" ); // Create LangChain tools @@ -52,7 +58,7 @@ const tools = createSolanaTools(agent); ### Deploy a New Token ```typescript -import { deploy_token } from 'solana-agent-kit'; +import { deploy_token } from "solana-agent-kit"; const result = await deploy_token( agent, @@ -60,13 +66,13 @@ const result = await deploy_token( 1000000 // initial supply ); -console.log('Token Mint Address:', result.mint.toString()); +console.log("Token Mint Address:", result.mint.toString()); ``` ### Create NFT Collection ```typescript -import { deploy_collection } from 'solana-agent-kit'; +import { deploy_collection } from "solana-agent-kit"; const collection = await deploy_collection(agent, { name: "My NFT Collection", @@ -75,23 +81,23 @@ const collection = await deploy_collection(agent, { creators: [ { address: "creator-wallet-address", - percentage: 100 - } - ] + percentage: 100, + }, + ], }); ``` ### Swap Tokens ```typescript -import { trade } from 'solana-agent-kit'; -import { PublicKey } from '@solana/web3.js'; +import { trade } from "solana-agent-kit"; +import { PublicKey } from "@solana/web3.js"; const signature = await trade( agent, - new PublicKey('target-token-mint'), + new PublicKey("target-token-mint"), 100, // amount - new PublicKey('source-token-mint'), + new PublicKey("source-token-mint"), 300 // 3% slippage ); ``` @@ -99,40 +105,110 @@ const signature = await trade( ### Lend Tokens ```typescript -import { lendAsset } from 'solana-agent-kit'; -import { PublicKey } from '@solana/web3.js'; +import { lendAsset } from "solana-agent-kit"; +import { PublicKey } from "@solana/web3.js"; const signature = await lendAsset( agent, - 100, // amount + 100 // amount ); ``` +### Stake SOL + +```typescript +import { stakeWithJup } from "solana-agent-kit"; + +const signature = await stakeWithJup( + agent, + 1 // amount in SOL +); +``` + +### Fetch Token Price + +```typescript +import { fetchPrice } from "solana-agent-kit"; + +const price = await fetchPrice( + agent, + "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN" // Token mint address +); + +console.log("Price in USDC:", price); +``` + +### Send an SPL Token Airdrop via ZK Compression + +```typescript +import { + sendCompressedAirdrop, + getAirdropCostEstimate, +} from "solana-agent-kit"; +import { PublicKey } from "@solana/web3.js"; + +(async () => { + console.log( + "~Airdrop cost estimate:", + getAirdropCostEstimate( + 1000, // recipients + 30_000 // priority fee in lamports + ) + ); + + const signature = await sendCompressedAirdrop( + agent, + new PublicKey("JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN"), // mint + 42, // amount per recipient + [ + new PublicKey("1nc1nerator11111111111111111111111111111111"), + // ... add more recipients + ], + 30_000 // priority fee in lamports + ); +})(); +``` + ## API Reference ### Core Functions -#### `deploy_token(agent, decimals?, initialSupply?)` -Deploy a new SPL token with optional initial supply. +#### `deploy_token(agent, decimals?, name, uri, symbol, initialSupply?)` + +Deploy a new SPL token with optional initial supply. If not specified, decimals default to 9. #### `deploy_collection(agent, options)` + Create a new NFT collection with customizable metadata and royalties. #### `mintCollectionNFT(agent, collectionMint, metadata, recipient?)` + Mint a new NFT as part of an existing collection. #### `transfer(agent, to, amount, mint?)` + Transfer SOL or SPL tokens to a recipient. #### `trade(agent, outputMint, inputAmount, inputMint?, slippageBps?)` + Swap tokens using Jupiter Exchange integration. #### `get_balance(agent, token_address)` + Check SOL or token balance for the agent's wallet. #### `lendAsset(agent, assetMint, amount, apiKey)` + Lend idle assets to earn interest with Lulo. +#### `stakeWithJup(agent, amount)` + +Stake SOL with Jupiter to earn rewards. + +#### `sendCompressedAirdrop(agent, mintAddress, amount, recipients, priorityFeeInLamports?, shouldLog?)` + +Send an SPL token airdrop to many recipients at low cost via ZK Compression. + ## Dependencies The toolkit relies on several key Solana and Metaplex libraries: @@ -140,7 +216,10 @@ The toolkit relies on several key Solana and Metaplex libraries: - @solana/web3.js - @solana/spl-token - @metaplex-foundation/mpl-token-metadata +- @metaplex-foundation/mpl-core - @metaplex-foundation/umi +- @lightprotocol/compressed-token +- @lightprotocol/stateless.js ## Contributing diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index 2708636..0000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -solanaagentkit.xyz \ No newline at end of file diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 42ae6d9..73cf8f1 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE4XSTUsDQQwG4P+S8+Ji0SJ7K5ZerB/o3sTDMGbdodlk2GRAkf53qRXt4nR6mUveeUJInj/B8N2ggSchx27xhmw3waCC6KyHBjw5VdR6Wj/rbSCoYBP4FZrz2dW2+pWuhQi9BeElRpKPAfnAC2w4ds6j1rngFJ5dzrPwfdy9ekL9SRXJEZ3JmIf2tdL3dSJZeC+JbYnmAukjahRWzIrH46Umt4Htb6i7VVvscTRdavGQhtglXrvEvi/y2eQpepW4lQ0W15bJlVi/Ww7uj7IVoQO0S/w9u9b/QlNxfrF9+QJeMbLbAQMAAA==" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE4XTQUvDMBTA8e+Sc7E4dEhvw9KDzm1ob+IhxNc1LH0vJC+gyL67bBNdXfZ26SX//l4T0tcvxfDBqlIv5DTq2RqQHy2rQnnNvaqUcTpGiOV4/arnwalCbSy+q+p6crctfqV7cg4MW8IavKPPAfDIs8gQOm0glrlwDE9up1l46XfPeEH9qUQygGYKeeiwJr3eAJt+FayBZ4ieMEJWOs0k9CF5yxBa2gDWmnWW/B9J4Dw5mhlDCbkG1tZF8WvP59KQJ4v8d/SLphVnnK2lEas0+C7hXCc0vchny0t0k3B/nNLlynQSa3ZXCA6/TkvkjtAu4X7vsTyJxuL0Zvv2DYU9ByOnAwAA" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 6172d55..3e255a2 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAE7WbXW/jthKG/wt9K2TNDzmO77LdE6DonnbRzemNEQSMRHuFlSVVojYnCPLfC+rDGpojh7K2Vy1izjsvyUdDSuS+kjJ/rshm+0q+J1lMNpStA5LJgyIb8jVPZSZv9yrTvyWaBKQuU7IhUSqrSlUf7J+vvulDSoL+V7Ih5C3oVUPKjqpRnlW6rCOdlz6SC7s9kA9IIUuVadfpkJgumYCZMxXpJM98Ew/N5+R9lmmqvMZvcWw6P9+jjONSVdWEvCBkTv68UJlMHmWRPH5XL175nZCJ+dlSDNyW6u9aVfpO1pHSd3UW+40BGjbHR6yKNH+5z78rP+Ds9vMz/5Kn6QTekaA5HvZKf5SpzCLlld1qPifvIcn073f3XkmHtnMy6lJm1U75lTPQeB7j+6TSqvyUH2TiN79OyMw+x34T27ecky1VWXxbVUr7PclW85kM33/56stv23RWP2WdRd++1Ifirs78CwcaNtHHCqyTpZJatS3v8zwdBn1XZ01pqD44bc6u/yxcHdV/MZFg7U8yrcqdjFT1ofvprJS10pwucSNai/fWtd7TSJpClZHKtNyrdzNZTX2TWcNzrL9/FM1QoylPG/kPWfMfb8lF13ykJ47XkaR1mUzI2baembLMX2SqXz7KKqm+5EmmJwzkAg2eaShqp32KDRAyPTkO1admkT+Y8LM+hnb+aEXH6Nszz+VYigUW/l63QXdGTFXJPpO6Lt+B/tQMDLvIBBz+/yaZHpr/fnf/p6qKPKtQT6ON/SfCbGumSy+6MLy7430YM6G0jKWWlxgZQi83AycALo1nyirSzH/Q9XOitULXtTHdxRCD9xPzPZZepWpfysO0/EPQbAPP6qlKNIr0aP4hZnb6JEt0ItPPyd91Eif65esfnydZweNn26rSpCjkXn0sJhG3sONm2yjKJC8T/XKnpk2QHXeJjdPHcFdnn5vt6rkaiDb0fxTP1vxxbY+ij/dgYhk+4+BsCZ6WvKuh/8O3Xuc8WJE/wYoqS3y/f8ZEH3NZegjd5zrNb6MorzP9SWmZpNU58sZbT1gJci3Tv2RaX5JhYUXj3T/TpdHqqFWpKv0fWWYqvsSWo/CzrJVKpjo5qNvi5RJfdvjPMlUprZNsj9bs9xyB2Bl2VmHIB4gfH/VLcRFOvZuro8RUU1fHDo19733O8H3PRG9XvdDFDvtOjn0uSNP8WcVfylznEfyuMcMzovlv2f+WH9STvKhuObaB1r9l95BkyaE+/CnxTeFUx7bcfNMPAUmyWP2fbF7JD1VW5ov3hrArfnVDArJLVBqbg7H+g0mUH7q35jiP6uZ/H7pmf6moeUvfbNvWH5Yk2C4Dvrpa0puHh2DbBzc/NH/oNYa/NIGUBFuKBVInkFqBjARbhgUyJ5BZgZwEW44FcieQW4GCBFuBBQonUFiBIQm2IRYYOoGhFbgiwXaFBa6cwJUVeE2C7TUWeO0EXluBaxJs11jg2glcW4E3JNjeYIE3TuCNDYDhgaLsUBceekJPgw/ODwKQTRA1XFCUIepCRG2KqGGDohxRFyRqk0QNHxRlibowUZsmahihKE/UBYraRFHDCUWZoi5U1KaKGlYoyhV1waI2WdTwQlG2qAsXtemihhmK8kVdwKhNGDPMMJQw5hLGbMKYYYahhDGXMHZSo5oihVcppEzZhDHDDEMJYy5hzCaMGWYYShhzCWM2Ycwww1DCmEsYswljhhmGEsZcwphNGDPMMJQw5hLGbMKYYYatA768uqF2rAsYswFjBhmGAsZcwJgNGDfI8CWSmLt8cZsvbojhKF/c5YvbfHFDDEf54i5f/GQdbBZCfCVElkKbL26I4Shf3OWL23xxQwxH+eIuX9zmixtiOMoXd/niNl/cEMNRvrjLF7f54gYZjlYw7gLGbcC4QYajgHEXMG4DJpZjZAsXMGEDJugYnMLlS9h8CUOMQCuncPkSNl/CECNQsoXLlzjZazWbLZRsgWy3bL6EIUagZAuXL2HzJQwxAt/nuXwJmy9hiBEo2cLlS9h8CUOMQMkWLl/C5ksYYgRKtnD5EjZfoUFGoGSHLmChDVhomBEo2aFLWGgTFhpmQpSw0CUstAkLDTMhSljoEtb9qXkJ+qFKreJf25eh7fb4seGVPHZvSOK6f6t7JeKGbF7f3oY3os3rG3gpMr+ZTMcj90GF3gwq1FOlfbsuhrdrYArIhdRLbjhiROwx0El2PVEvBueqQHIFJFcTJfP+oAroUaDn2+XhFiMQAjq+MsMtTDClYEb9dJp7I1Vzb0TnJzNKwQxQzxnob5MAlTVQWU9Rscc6BGMUesm0EETgBt0gB0z5eWrFdHubZ9ABQ+Q3Qt2XdPDcgEkT3Etjr/RTfzlvEALPn9/TvFdaF/aMg0GmfoM8fLkaZMIlKAV+QHfnfWl/3lflKVTk4Mnlfk9u/4VcdV/IwYgLMOJ+Yu2VrqI953AgoMAd9RRUWSy7O3FACDijwk+oTnPZfmOL229s5fE8BXQZVBjhJzyc+oNpAKxyvwrTyzS3iIAhgIjwQ6T74lg2XxwBbMBT6Pf8tMd6oFvADF+2QcKze0mmhwqT7TQ2+gw8mszv2TS62c5ySYFLuvRSaT+WAiNwofEb9dOr4GDgwbj7SbXnCQACUIVDvx7BC32gX2BomKdQd5S+U5YSB5a438rQVYW2RGDTz8H0c7/ph5UG2XhwMI/cbx77gzlZWJMowCwKvxWsv7gcdxeXAaHAFvW11dzy3zW3/HftLf9BENRVv7La3RR8MjcFi+6mIMAElFfmVwWH00MwZsCW8GMEXGUAdgBrbN2VHT96+/soT/b6zcF2hPvNZrv3k+YG8vfEqjfgmfIzNVxfAo7AkHO/IW9O3H+0J+5g0DkYdL960111B3wCDeq3VAz/PgDIwG223zJxvFkGRgaY4X5mTtZQBhSYn0L/D5qADeBigsQj8sYGt1V+Uv19M2AH1CPuMc0PASmSQqVJpshm+/D29g++b5eFQzcAAA=="; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAE7WcbXOcOBLHvwt+O+VYj9h+l4dzVe5yu6l1du/FVMqFQZ5wZoAFTbK+VL77lRgYWqNm3Jjsq6Q86n+3pJ9aQkh8j5rqWxtdr79Hj3mZRdeMX66iMtma6Dq6rYqkTF5vTGn/ldtoFe2aIrqO0iJpW9O+8n8+/2K3RbQafo2uo+jHalBVjB9U06psbbNLbdVQJM/88kB+FdVJY0obRjo6ZhdcQs+lSW1elVTHY/Elfr8lRWFI7Xd2KLrc312SZY1p2xl+gckS/1VtyiS/S+r87tE8kfwHJjP98ws5ctuYP3emtTfJLjX2ZldmtDZAzZbEkZm6qJ4+VY+GBpxffrnnt1VRzOAdMVoSw8bYN0mRlKkhefeKL/G7zUv7y80nktOx7BKPtknK9sHQ0hkovIzxTd5a07yrtklO69/AZJn/tiq+mtuqmBVBYLSQsI9Nvk2apxkxIEYL+z6jAT6UXOKtMGX2um2NpWU0r/jClv708ZbavvuiS/25NPguscmbp9czJrIpy58Xzac8fSSO9QnDRQQkuzL98nG3rW92JX1qQc2WxNHa5JHG/VBykTdTZm+rbe0602Sv8yZrqprmfcJySTRpYxJrfm3S5DYvN4W5zTOT/edL3hR1VRW0teVzEjPj0/Ioun3JT1VVjOPmYVd2E3v7KihzcvXOlT6ov3WWYOWel9Y0D0lq2lf9TyelvHXi8QJ1QuvsuVXpENOEm9o0qSltsjHPevKKUp15zXNYPf1ad02NujwuRG+y7h+y5FlffKImQawTTndNPsPnvvRCl031lBT26U3S5u3HKi/tjIY8Q40XBpTuu31OGMBkvnMcqnfdEn3rzE/GMZajo5UerI/nW4qLM8z8uWqD6kwE1eabMrG75hnoj4OBZi8KAjb/v/PSjsV/ufn0m2nrqmzRmCYL0zvCPZTMlz7rzfDqTtdhKghjkyyxyUsCGU1fHgzsALhsOZFWkWL0RrffcmsNOq9N6Z6NNng9sbin3JvCbJpkO8//aLQ4gG/mvs0tivSk/9Fmsfu8zG2eFB/yP3d5ltun218/zAoFt18cVlvkdZ1szJt6FnFnvt3iMOomr5rcPt2YeR3k270kjONh+LArP3SPEqdyIFqQPhRP5vxpbULSx2swMw2fiOBkCp7nvM+hv+NLr1MxeJY/IRTTNPh6/0QQg83L3EPoPuyK6nWaVrvSvjM2yYv2FHnTpWfMBJVNij+SYvcSD2eeNV79E1WazI7WNKa1/0ia0mQvCStQ+FmhNSYpbL41r+unl8Tlm/+soFpjbV5u0Jz9XETAdkE4WikxQnx3Z5/qF+E0RHN+kJgb1PmhQlNva76V+LpnZmzng9CLIxwqObVdUBTVN5N9bCpbpXBfY0HMiObfFf6XamvukxflrSBsoPV3hbvNy3y72/6W4IvCuRH7cj8xaDhZ/HNX59Y0hz1XLPDjMj9luwoVfXbfKgh35qYP7vXkng/VZfu0vQdbmc86PZRf5jYzab5N8KGNOwYWy1zbBJ8vcLd96WUui2pT/f7be7rX0WBhMyd58XT3tSp2c8A6sloWwkNjzP/MXbKzX7pHFHoYiOWyUNyq/SWBBHbLwqhNs01KU9q7zD3XT+RdPBTUdlk45i9rynZqrwUPw7OZ7Z66ZnrO93NrpcAehD25N5qXG5M+Vu/R1TcxonNfZnZ0pye/G2PTLx+bPDWnnpDCUjMezG1idygOE6pnBwu8rkjIkw9lj6bEG3/K92iy1HntCr0vf79993ZOAL7Z0iC2pm0nXmFNBTCaLHWeVtksz315utvPqygvM/NXdP09+moah3t0HfFzcX4VraKH3BSZO6U4LIXSatu/BMmqdNf993Nf7A+Tdi9drtf70q8uotX6YiUvzi+Y+Px5tR6Mux+6Pwwa4186Qxat1gwzZIEh8wx5tFpzzJAHhtwzFNFqLTBDERgKz1BGq7XEDGVgKD1DFa3WCjNUgaHyDHW0WmvMUAeG2jOMo9U6xgzjwDD2DC+j1foSM7wMDC89w6totb7CDK8CwysfAMcDQ9lhITzsiJ4OH5wfBCCfIOa4YChDLISI+RQxxwZDOWIhSMwniTk+GMoSC2FiPk3MMcJQnlgIFPOJYo4ThjLFQqiYTxVzrDCUKxaCxXyymOOFoWyxEC7m08UcMwzli4WAMZ8w7pjhKGE8JIz7hHHHDEcJ4yFh/ChHdUkKz1JImvIJ444ZjhLGQ8K4Txh3zHCUMB4Sxn3CuGOGo4TxkDDuE8YdM1yvhDy/upC+cUgY9wnjjhmOEsZDwrhPGHfMcJQwHhLGfcK4Y4ZfoWGHhHGfMOGYEShhIiRM+IQJx4xACRMhYcInTDhmBEqYCAkTRzNhNxXicyEyGfqECceMQAkTIWHCJ0w4ZoTCWluEhAmfMOGYEWgOEyFhwidMOGZEjHoOCRM+YcIxI1DCREiY8AkTjhmB5jAREiZ8wqRjRqKEyZAw6RMmHTMSJUyGhEmfMOmYkShhMiRM+oRJx4xECZMhYfJovdUtuPAVF7Lk8gmTjhmJ5jAZEiZ9wqRjRqKEyZAw6RMm40m2ZUiY9AmTl5N4ypAw6RMmHTMSzZ4yJEz6hKmOMJRtFRKmfMJURxjKtgoJUz5hyjGjULZVSJjyCVOOGYWyrULClE+YcswolG0VEqaOVvXdsh5lWyELe58w5ZhREutnFRKmfMKUY0bhTxQhYconTDlmFMq2CglTPmHKMaNQwlRImPIJ044ZhRKmQ8K0T5h2zCiUMB0Spn3CNJ9ck+iQMO0TpsXkykCHhGmfMO2Y0SjbOiRM+4Rpx4xG2dYhYfro2bF7eETZ1sjjo0+YdsxolG0dEqZ9wrRjRqN5W4eEaZ8w7ZjRKNs6JEz7hMWOGY2yHYeExT5hsWNG40/NIWGxT1jsmNEo23FIWOwTFovJZBCHhMU+YXFHGDow4pCw2CcsdszEKJ5xSFjsExY7ZmIUzzgkLD7aoei2KFA8Y2STwicsdszEKJ5xSFjsExY7ZmIUzzgkLPYJu3TMxCielyFh/Z+6fbevprEme7/ff1uvD1vv36O7flNOHbYCv0dKR9fff6yiWLh/f4ybcd1fD/tx7jfn8fASdFTjelTjvZrmNLX9+/p6fF8PggSy6pIkt9+nHCViNUpcXhAl+j39PINK+mpUiiVRaTgSi7SZAD0g5upl4Ng4kBRAktaZo2Q1nMMF3XoJupXa/uMVayAEdKgy4xXxUYeNOoym012LqZo0abtbOa27lfNtvJUDQgRtx4lt14m33Z0bWx2xy0H3cmL3DjdxgArAl6s5Kj5roAMErQf8d8NgGIB6aRoT4xt9IAO6UtMqtmc+BbeZRzkAKjUmJ2b39+ZAugBjnKTTn4scFSQIRdESDnzJCloICMW0Pntw72G6l1TN4YUhqNsFEKQ1efhmHsQH0NRXJLmNsffDjfBRCORVsky9v/Cb9Rd+QYYAeDLasNsY23HgztjePyGZmoGeYDS8fE3b3xMFkqDSjFxrW/txAVoZDdfxmBmYZYGMosXSH84vhsP5rZ9LJcilkpZLh+Ospj/OCsIDmULRxP67f+N+6AFPDrS8pk0i+6u29f6Mc5AyOBhWnDbg3S3upL/FDboTrHaYpglVm6q7nQeGJWh7TYOi2BVVsj+ll+1P6WHpQ4KGU7SGO7yuBkkIjM+YBtt4+whMaGBICtqQHGSO2ksC+iUxoP3Jx6Y7lAPIAjFpGgj76wWgWiAYEe+NJLF6R2eXABGAq5ge1zjRlg8WA0IAXUHj1emWD16VGRg+jBbd/sgAGIGATH7VP33QMsXxV2pAbwLaaVL7w9JAAUrQRiK8rQzqB6jgZKHg+BggAi5zaEO5W1Xk5a7NUm84g2wT00AdrjA9GD+9gNaStBbvM/I+PaMpCxAqaYTCLI88EQmAmqBli+FCRFL7fIEluaItVIbPvSCrHiDGaGvF/ttID923kR7230YChIBURpTrPgTTVgUSHYCE0cZlf+H73l34rvsL36AXwJJA0Ph1X41ID1+NSIavRoBBBp9RaU04XiwB3QrqqmgYg1tuoIpgOAjVzwS0sT9cVbz3V4sSzLySBtz+0TZxH6d4zL2sDZI2LWf33wwB7Q36kBP7sD97CNIPEIlpoA7n2gHroDKa1jD7w+JAAsCjaXGMV31BF4HqSFqbdInK36iKQTAxDZnujtvX/R03wDJoGEUbEv0nkcDYBxwz2ngYv6cFZODOD7FlhrvcoH1BhSSN26PVogAKgqYwfAAQiACNGRJ3yKMpHNM0qeGGN9AAvEhCN39eRXVemyIvTXS9/vzjx/8BOAMW6XNSAAA="; \ No newline at end of file diff --git a/docs/classes/SolanaAgentKit.html b/docs/classes/SolanaAgentKit.html index 5117a69..df1cb99 100644 --- a/docs/classes/SolanaAgentKit.html +++ b/docs/classes/SolanaAgentKit.html @@ -1,23 +1,30 @@ SolanaAgentKit | solana-agent-kit

Class SolanaAgentKit

Main class for interacting with Solana blockchain Provides a unified interface for token operations, NFT management, and trading

SolanaAgentKit

-

Constructors

Constructors

  • Parameters

    • private_key: string
    • rpc_url: string = "https://api.mainnet-beta.solana.com"
    • openai_api_key: string

    Returns SolanaAgentKit

Properties

connection: Connection

Solana RPC connection

-
openai_api_key: string
wallet: Keypair

Wallet keypair for signing transactions

-
wallet_address: PublicKey

Public key of the wallet

-

Methods

  • Parameters

    • decimals: number = DEFAULT_OPTIONS.TOKEN_DECIMALS

    Returns Promise<{
        mint: PublicKey;
    }>

  • Parameters

    • Optionaltoken_address: PublicKey

    Returns Promise<null | number>

  • Parameters

    • tokenName: string
    • tokenTicker: string
    • description: string
    • imageUrl: string
    • Optionaloptions: PumpFunTokenOptions

    Returns Promise<{
        metadataUri: any;
        mint: string;
        signature: string;
    }>

  • Parameters

    • amount: number

    Returns Promise<string>

  • Parameters

    • collectionMint: PublicKey
    • metadata: {
          creators?: {
              address: string;
              share: number;
          }[];
          name: string;
          sellerFeeBasisPoints?: number;
          symbol: string;
          uri: string;
      }
      • Optionalcreators?: {
            address: string;
            share: number;
        }[]
      • name: string
      • OptionalsellerFeeBasisPoints?: number
      • symbol: string
      • uri: string
    • Optionalrecipient: PublicKey

    Returns Promise<MintCollectionNFTResponse>

  • Parameters

    • name: string
    • OptionalspaceKB: number

    Returns Promise<string>

  • Returns Promise<string>

  • Parameters

    • outputMint: PublicKey
    • inputAmount: number
    • OptionalinputMint: PublicKey
    • slippageBps: number = DEFAULT_OPTIONS.SLIPPAGE_BPS

    Returns Promise<string>

  • Parameters

    • to: PublicKey
    • amount: number
    • Optionalmint: PublicKey

    Returns Promise<string>

+

Constructors

  • Parameters

    • private_key: string
    • rpc_url: string = "https://api.mainnet-beta.solana.com"
    • openai_api_key: string

    Returns SolanaAgentKit

Properties

connection: Connection

Solana RPC connection

+
openai_api_key: string
wallet: Keypair

Wallet keypair for signing transactions

+
wallet_address: PublicKey

Public key of the wallet

+

Methods

  • Parameters

    • depositTokenAmount: BN
    • depositTokenMint: PublicKey
    • otherTokenMint: PublicKey
    • initialPrice: Decimal
    • maxPrice: Decimal
    • feeTier:
          | 0.01
          | 0.02
          | 0.04
          | 0.05
          | 0.16
          | 0.3
          | 0.65
          | 1
          | 2

    Returns Promise<string>

  • Parameters

    • name: string
    • uri: string
    • symbol: string
    • decimals: number = DEFAULT_OPTIONS.TOKEN_DECIMALS
    • OptionalinitialSupply: number

    Returns Promise<{
        mint: PublicKey;
    }>

  • Parameters

    • Optionaltoken_address: PublicKey

    Returns Promise<null | number>

  • Parameters

    • account: PublicKey

    Returns Promise<string>

  • Parameters

    • tokenName: string
    • tokenTicker: string
    • description: string
    • imageUrl: string
    • Optionaloptions: PumpFunTokenOptions

    Returns Promise<{
        metadataUri: any;
        mint: string;
        signature: string;
    }>

  • Parameters

    • amount: number

    Returns Promise<string>

  • Parameters

    • collectionMint: PublicKey
    • metadata: {
          creators?: {
              address: string;
              share: number;
          }[];
          name: string;
          sellerFeeBasisPoints?: number;
          uri: string;
      }
      • Optionalcreators?: {
            address: string;
            share: number;
        }[]
      • name: string
      • OptionalsellerFeeBasisPoints?: number
      • uri: string
    • Optionalrecipient: PublicKey

    Returns Promise<MintCollectionNFTResponse>

  • Parameters

    • name: string
    • OptionalspaceKB: number

    Returns Promise<string>

  • Returns Promise<string>

  • Parameters

    • domain: string

    Returns Promise<PublicKey>

  • Parameters

    • mintAddress: string
    • amount: number
    • decimals: number
    • recipients: string[]
    • priorityFeeInLamports: number
    • shouldLog: boolean

    Returns Promise<string[]>

  • Parameters

    • amount: number

    Returns Promise<string>

  • Parameters

    • outputMint: PublicKey
    • inputAmount: number
    • OptionalinputMint: PublicKey
    • slippageBps: number = DEFAULT_OPTIONS.SLIPPAGE_BPS

    Returns Promise<string>

  • Parameters

    • to: PublicKey
    • amount: number
    • Optionalmint: PublicKey

    Returns Promise<string>

diff --git a/docs/functions/createSolanaTools.html b/docs/functions/createSolanaTools.html index d9c0079..e8c4864 100644 --- a/docs/functions/createSolanaTools.html +++ b/docs/functions/createSolanaTools.html @@ -1 +1 @@ -createSolanaTools | solana-agent-kit

Function createSolanaTools

  • Parameters

    Returns (
        | SolanaBalanceTool
        | SolanaTransferTool
        | SolanaDeployTokenTool
        | SolanaDeployCollectionTool
        | SolanaMintNFTTool
        | SolanaTradeTool
        | SolanaRequestFundsTool
        | SolanaRegisterDomainTool
        | SolanaGetWalletAddressTool
        | SolanaPumpfunTokenLaunchTool
        | SolanaCreateImageTool
        | SolanaLendAssetTool
        | SolanaTPSCalculatorTool)[]

+createSolanaTools | solana-agent-kit

Function createSolanaTools

  • Parameters

    Returns (
        | SolanaBalanceTool
        | SolanaTransferTool
        | SolanaDeployTokenTool
        | SolanaDeployCollectionTool
        | SolanaMintNFTTool
        | SolanaTradeTool
        | SolanaRequestFundsTool
        | SolanaRegisterDomainTool
        | SolanaResolveDomainTool
        | SolanaGetDomainTool
        | SolanaGetWalletAddressTool
        | SolanaPumpfunTokenLaunchTool
        | SolanaCreateImageTool
        | SolanaLendAssetTool
        | SolanaTPSCalculatorTool
        | SolanaStakeTool
        | SolanaFetchPriceTool
        | SolanaTokenDataTool
        | SolanaTokenDataByTickerTool
        | SolanaCompressedAirdropTool)[]

diff --git a/docs/index.html b/docs/index.html index e4b3a2c..e7acd0e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -6,6 +6,7 @@
  • Deploy new SPL tokens
  • Transfer SOL and SPL tokens
  • Check token balances
  • +
  • Stake SOL
  • @@ -41,36 +42,50 @@
    npm install solana-agent-kit
     
    -
    import { SolanaAgentKit, createSolanaTools } from 'solana-agent-kit';

    // Initialize with private key and optional RPC URL
    const agent = new SolanaAgentKit(
    'your-private-key',
    'https://api.mainnet-beta.solana.com'
    );

    // Create LangChain tools
    const tools = createSolanaTools(agent); +
    import { SolanaAgentKit, createSolanaTools } from "solana-agent-kit";

    // Initialize with private key and optional RPC URL
    const agent = new SolanaAgentKit(
    "your-wallet-private-key-as-base58",
    "https://api.mainnet-beta.solana.com",
    "your-openai-api-key"
    );

    // Create LangChain tools
    const tools = createSolanaTools(agent);
    -
    import { deploy_token } from 'solana-agent-kit';

    const result = await deploy_token(
    agent,
    9, // decimals
    1000000 // initial supply
    );

    console.log('Token Mint Address:', result.mint.toString()); +
    import { deploy_token } from "solana-agent-kit";

    const result = await deploy_token(
    agent,
    9, // decimals
    1000000 // initial supply
    );

    console.log("Token Mint Address:", result.mint.toString());
    -
    import { deploy_collection } from 'solana-agent-kit';

    const collection = await deploy_collection(agent, {
    name: "My NFT Collection",
    uri: "https://arweave.net/metadata.json",
    royaltyBasisPoints: 500, // 5%
    creators: [
    {
    address: "creator-wallet-address",
    percentage: 100
    }
    ]
    }); +
    import { deploy_collection } from "solana-agent-kit";

    const collection = await deploy_collection(agent, {
    name: "My NFT Collection",
    uri: "https://arweave.net/metadata.json",
    royaltyBasisPoints: 500, // 5%
    creators: [
    {
    address: "creator-wallet-address",
    percentage: 100,
    },
    ],
    });
    -
    import { trade } from 'solana-agent-kit';
    import { PublicKey } from '@solana/web3.js';

    const signature = await trade(
    agent,
    new PublicKey('target-token-mint'),
    100, // amount
    new PublicKey('source-token-mint'),
    300 // 3% slippage
    ); +
    import { trade } from "solana-agent-kit";
    import { PublicKey } from "@solana/web3.js";

    const signature = await trade(
    agent,
    new PublicKey("target-token-mint"),
    100, // amount
    new PublicKey("source-token-mint"),
    300 // 3% slippage
    );
    -
    import { lendAsset } from 'solana-agent-kit';
    import { PublicKey } from '@solana/web3.js';

    const signature = await lendAsset(
    agent,
    100, // amount
    ); +
    import { lendAsset } from "solana-agent-kit";
    import { PublicKey } from "@solana/web3.js";

    const signature = await lendAsset(
    agent,
    100 // amount
    );
    -

    Deploy a new SPL token with optional initial supply.

    +
    import { stakeWithJup } from "solana-agent-kit";

    const signature = await stakeWithJup(
    agent,
    1 // amount in SOL
    ); +
    + +
    import { fetchPrice } from "solana-agent-kit";

    const price = await fetchPrice(
    agent,
    "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN" // Token mint address
    );

    console.log("Price in USDC:", price); +
    + +
    import {
    sendCompressedAirdrop,
    getAirdropCostEstimate,
    } from "solana-agent-kit";
    import { PublicKey } from "@solana/web3.js";

    (async () => {
    console.log(
    "~Airdrop cost estimate:",
    getAirdropCostEstimate(
    1000, // recipients
    30_000 // priority fee in lamports
    )
    );

    const signature = await sendCompressedAirdrop(
    agent,
    new PublicKey("JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN"), // mint
    42, // amount per recipient
    [
    new PublicKey("1nc1nerator11111111111111111111111111111111"),
    // ... add more recipients
    ],
    30_000 // priority fee in lamports
    );
    })(); +
    + +

    Deploy a new SPL token with optional initial supply. If not specified, decimals default to 9.

    Create a new NFT collection with customizable metadata and royalties.

    Mint a new NFT as part of an existing collection.

    Transfer SOL or SPL tokens to a recipient.

    Swap tokens using Jupiter Exchange integration.

    Check SOL or token balance for the agent's wallet.

    Lend idle assets to earn interest with Lulo.

    +

    Stake SOL with Jupiter to earn rewards.

    +

    Send an SPL token airdrop to many recipients at low cost via ZK Compression.

    The toolkit relies on several key Solana and Metaplex libraries:

    • @solana/web3.js
    • @solana/spl-token
    • @metaplex-foundation/mpl-token-metadata
    • +
    • @metaplex-foundation/mpl-core
    • @metaplex-foundation/umi
    • +
    • @lightprotocol/compressed-token
    • +
    • @lightprotocol/stateless.js

    Contributions are welcome! Please feel free to submit a Pull Request.

    ISC License

    This toolkit handles private keys and transactions. Always ensure you're using it in a secure environment and never share your private keys.

    -
    +
    diff --git a/docs/interfaces/CollectionDeployment.html b/docs/interfaces/CollectionDeployment.html index fd0080f..9f4dca5 100644 --- a/docs/interfaces/CollectionDeployment.html +++ b/docs/interfaces/CollectionDeployment.html @@ -1,3 +1,3 @@ -CollectionDeployment | solana-agent-kit

    Interface CollectionDeployment

    interface CollectionDeployment {
        collectionAddress: PublicKey;
        signature: Uint8Array;
    }

    Properties

    collectionAddress +CollectionDeployment | solana-agent-kit

    Interface CollectionDeployment

    interface CollectionDeployment {
        collectionAddress: PublicKey;
        signature: Uint8Array<ArrayBufferLike>;
    }

    Properties

    collectionAddress: PublicKey
    signature: Uint8Array
    +

    Properties

    collectionAddress: PublicKey
    signature: Uint8Array<ArrayBufferLike>
    diff --git a/docs/interfaces/CollectionOptions.html b/docs/interfaces/CollectionOptions.html index 3983a1d..b1b6cce 100644 --- a/docs/interfaces/CollectionOptions.html +++ b/docs/interfaces/CollectionOptions.html @@ -1,5 +1,5 @@ -CollectionOptions | solana-agent-kit

    Interface CollectionOptions

    interface CollectionOptions {
        creators?: Creator[];
        name: string;
        royaltyBasisPoints?: number;
        uri: string;
    }

    Properties

    creators? +CollectionOptions | solana-agent-kit

    Interface CollectionOptions

    interface CollectionOptions {
        creators?: Creator[];
        name: string;
        royaltyBasisPoints?: number;
        uri: string;
    }

    Properties

    creators?: Creator[]
    name: string
    royaltyBasisPoints?: number
    uri: string
    +

    Properties

    creators?: Creator[]
    name: string
    royaltyBasisPoints?: number
    uri: string
    diff --git a/docs/interfaces/Creator.html b/docs/interfaces/Creator.html index 45d7bc5..0b38a4d 100644 --- a/docs/interfaces/Creator.html +++ b/docs/interfaces/Creator.html @@ -1,3 +1,3 @@ -Creator | solana-agent-kit

    Interface Creator

    interface Creator {
        address: string;
        percentage: number;
    }

    Properties

    address +Creator | solana-agent-kit

    Interface Creator

    interface Creator {
        address: string;
        percentage: number;
    }

    Properties

    Properties

    address: string
    percentage: number
    +

    Properties

    address: string
    percentage: number
    diff --git a/docs/interfaces/FetchPriceResponse.html b/docs/interfaces/FetchPriceResponse.html new file mode 100644 index 0000000..a31c482 --- /dev/null +++ b/docs/interfaces/FetchPriceResponse.html @@ -0,0 +1,6 @@ +FetchPriceResponse | solana-agent-kit

    Interface FetchPriceResponse

    interface FetchPriceResponse {
        code?: string;
        message?: string;
        priceInUSDC?: string;
        status: "success" | "error";
        tokenId?: string;
    }

    Properties

    code?: string
    message?: string
    priceInUSDC?: string
    status: "success" | "error"
    tokenId?: string
    diff --git a/docs/interfaces/JupiterTokenData.html b/docs/interfaces/JupiterTokenData.html new file mode 100644 index 0000000..3bd0181 --- /dev/null +++ b/docs/interfaces/JupiterTokenData.html @@ -0,0 +1,12 @@ +JupiterTokenData | solana-agent-kit

    Interface JupiterTokenData

    interface JupiterTokenData {
        address: string;
        daily_volume: number;
        decimals: number;
        extensions: {
            coingeckoId?: string;
        };
        freeze_authority: null | string;
        logoURI: string;
        mint_authority: null | string;
        name: string;
        permanent_delegate: null | string;
        symbol: string;
        tags: string[];
    }

    Properties

    address: string
    daily_volume: number
    decimals: number
    extensions: {
        coingeckoId?: string;
    }
    freeze_authority: null | string
    logoURI: string
    mint_authority: null | string
    name: string
    permanent_delegate: null | string
    symbol: string
    tags: string[]
    diff --git a/docs/interfaces/LuloAccountDetailsResponse.html b/docs/interfaces/LuloAccountDetailsResponse.html index 0034242..2e2c80a 100644 --- a/docs/interfaces/LuloAccountDetailsResponse.html +++ b/docs/interfaces/LuloAccountDetailsResponse.html @@ -1,6 +1,6 @@ LuloAccountDetailsResponse | solana-agent-kit

    Interface LuloAccountDetailsResponse

    Lulo Account Details response format

    -
    interface LuloAccountDetailsResponse {
        interestEarned: number;
        realtimeApy: number;
        settings: {
            allowedProtocols: null | string;
            homebase: null | string;
            minimumRate: string;
            owner: string;
        };
        totalValue: number;
    }

    Properties

    interface LuloAccountDetailsResponse {
        interestEarned: number;
        realtimeApy: number;
        settings: {
            allowedProtocols: null | string;
            homebase: null | string;
            minimumRate: string;
            owner: string;
        };
        totalValue: number;
    }

    Properties

    interestEarned: number
    realtimeApy: number
    settings: {
        allowedProtocols: null | string;
        homebase: null | string;
        minimumRate: string;
        owner: string;
    }
    totalValue: number
    +

    Properties

    interestEarned: number
    realtimeApy: number
    settings: {
        allowedProtocols: null | string;
        homebase: null | string;
        minimumRate: string;
        owner: string;
    }
    totalValue: number
    diff --git a/docs/interfaces/MintCollectionNFTResponse.html b/docs/interfaces/MintCollectionNFTResponse.html index 2d0001a..f131d6c 100644 --- a/docs/interfaces/MintCollectionNFTResponse.html +++ b/docs/interfaces/MintCollectionNFTResponse.html @@ -1,3 +1,3 @@ -MintCollectionNFTResponse | solana-agent-kit

    Interface MintCollectionNFTResponse

    interface MintCollectionNFTResponse {
        metadata: PublicKey;
        mint: PublicKey;
    }

    Properties

    metadata +MintCollectionNFTResponse | solana-agent-kit

    Interface MintCollectionNFTResponse

    interface MintCollectionNFTResponse {
        metadata: PublicKey;
        mint: PublicKey;
    }

    Properties

    Properties

    metadata: PublicKey
    mint: PublicKey
    +

    Properties

    metadata: PublicKey
    mint: PublicKey
    diff --git a/docs/interfaces/PumpFunTokenOptions.html b/docs/interfaces/PumpFunTokenOptions.html index 81b6797..f7b200f 100644 --- a/docs/interfaces/PumpFunTokenOptions.html +++ b/docs/interfaces/PumpFunTokenOptions.html @@ -1,7 +1,7 @@ -PumpFunTokenOptions | solana-agent-kit

    Interface PumpFunTokenOptions

    interface PumpFunTokenOptions {
        initialLiquiditySOL?: number;
        priorityFee?: number;
        slippageBps?: number;
        telegram?: string;
        twitter?: string;
        website?: string;
    }

    Properties

    initialLiquiditySOL? +PumpFunTokenOptions | solana-agent-kit

    Interface PumpFunTokenOptions

    interface PumpFunTokenOptions {
        initialLiquiditySOL?: number;
        priorityFee?: number;
        slippageBps?: number;
        telegram?: string;
        twitter?: string;
        website?: string;
    }

    Properties

    initialLiquiditySOL?: number
    priorityFee?: number
    slippageBps?: number
    telegram?: string
    twitter?: string
    website?: string
    +

    Properties

    initialLiquiditySOL?: number
    priorityFee?: number
    slippageBps?: number
    telegram?: string
    twitter?: string
    website?: string
    diff --git a/docs/interfaces/PumpfunLaunchResponse.html b/docs/interfaces/PumpfunLaunchResponse.html index 9e25399..153244b 100644 --- a/docs/interfaces/PumpfunLaunchResponse.html +++ b/docs/interfaces/PumpfunLaunchResponse.html @@ -1,5 +1,5 @@ -PumpfunLaunchResponse | solana-agent-kit

    Interface PumpfunLaunchResponse

    interface PumpfunLaunchResponse {
        error?: string;
        metadataUri?: string;
        mint: string;
        signature: string;
    }

    Properties

    error? +PumpfunLaunchResponse | solana-agent-kit

    Interface PumpfunLaunchResponse

    interface PumpfunLaunchResponse {
        error?: string;
        metadataUri?: string;
        mint: string;
        signature: string;
    }

    Properties

    error?: string
    metadataUri?: string
    mint: string
    signature: string
    +

    Properties

    error?: string
    metadataUri?: string
    mint: string
    signature: string
    diff --git a/docs/modules.html b/docs/modules.html index 4d1e321..b5e59c9 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -2,6 +2,8 @@

    Interfaces

    CollectionDeployment CollectionOptions Creator +FetchPriceResponse +JupiterTokenData LuloAccountDetailsResponse MintCollectionNFTResponse PumpfunLaunchResponse diff --git a/guides/add_your_own_tool.md b/guides/add_your_own_tool.md new file mode 100644 index 0000000..63d1172 --- /dev/null +++ b/guides/add_your_own_tool.md @@ -0,0 +1,179 @@ +# How to Add Your Own Tool + +Extending the **Solana Agent Kit** with custom tools allows you to add specialized functionalities tailored to your needs. This guide walks you through creating and integrating a new tool into the existing framework. + +## Overview + +1. Create a new tool file +2. Implement the tool class +3. Implement supporting functions in SolanaAgentKit +4. Export the new tool +5. Integrate the tool into the agent +6. Use the custom tool + +## Implementation Guide + +### 1. Create a New Tool File + +Create a new TypeScript file in the `src/tools/` directory for your tool (e.g., `custom_tool.ts`). + +### 2. Implement the Tool Class + +```typescript:src/tools/custom_tool.ts +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../agent"; + +export class CustomTool extends Tool { + name = "custom_tool"; + description = "Description of what the custom tool does."; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const result = await this.solanaKit.customFunction(input); + return JSON.stringify({ + status: "success", + message: "Custom tool executed successfully", + data: result, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} +``` + +### 3. Add Supporting Functions to SolanaAgentKit + +```typescript:src/agent/index.ts +export class SolanaAgentKit { + // ... existing code ... + + async customFunction(input: string): Promise { + // Implement your custom functionality + return `Processed input: ${input}`; + } +} +``` + +### 4. Export the Tool + +```typescript:src/tools/index.ts +export * from "./request_faucet_funds"; +export * from "./deploy_token"; +export * from "./custom_tool"; // Add your new tool +``` + +### 5. Integrate with Agent + +```typescript:src/langchain/index.ts +import { CustomTool } from "../tools/custom_tool"; + +export function createSolanaTools(agent: SolanaAgentKit) { + return [ + // ... existing tools ... + new CustomTool(agent), + ]; +} +``` + +### 6. Usage Example + +```typescript +import { SolanaAgentKit, createSolanaTools } from "solana-agent-kit"; + +const agent = new SolanaAgentKit( + "your-wallet-private-key-as-base58", + "https://api.mainnet-beta.solana.com", + "your-openai-api-key" +); + +const tools = createSolanaTools(agent); +const customTool = tools.find(tool => tool.name === "custom_tool"); + +if (customTool) { + const result = await customTool._call("your-input"); + console.log(result); +} +``` + +## Best Practices + +- Implement robust error handling +- Add security checks for sensitive operations +- Document your tool's purpose and usage +- Write tests for reliability +- Keep tools focused on single responsibilities + +## Example: Token Price Fetching Tool + +Here's a complete example of implementing a tool to fetch token prices: + +```typescript:src/tools/fetch_token_price.ts +import { Tool } from "langchain/tools"; +import { SolanaAgentKit } from "../agent"; + +export class FetchTokenPriceTool extends Tool { + name = "fetch_token_price"; + description = "Fetches the current price of a specified token."; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(tokenSymbol: string): Promise { + try { + const price = await this.solanaKit.getTokenPrice(tokenSymbol); + return JSON.stringify({ + status: "success", + message: `Price fetched successfully for ${tokenSymbol}.`, + data: { token: tokenSymbol, price }, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} +``` + +Add the supporting function to SolanaAgentKit: + +```typescript:src/agent/index.ts +export class SolanaAgentKit { + async getTokenPrice(tokenSymbol: string): Promise { + const mockPrices: { [key: string]: number } = { + SOL: 150, + USDC: 1, + USDT: 1, + BONK: 0.5, + }; + + if (!mockPrices[tokenSymbol.toUpperCase()]) { + throw new Error(`Price for token symbol ${tokenSymbol} not found.`); + } + + return mockPrices[tokenSymbol.toUpperCase()]; + } +} +``` + +## Need Help? + +If you encounter any issues while implementing your custom tool: + +- Open an issue in the repository +- Contact the maintainer +- Check existing tools for implementation examples + +--- \ No newline at end of file diff --git a/guides/setup_locally.md b/guides/setup_locally.md new file mode 100644 index 0000000..8acfd1e --- /dev/null +++ b/guides/setup_locally.md @@ -0,0 +1,83 @@ +# How to Setup Locally + +Setting up the **Solana Agent Kit** on your local machine involves cloning the repository, installing dependencies, configuring environment variables, and building the project. Follow the steps below to get started. + +## Prerequisites + +- **Node**: Ensure you have Node version 23.x or higher installed. You can download it from [Node Official Website](https://nodejs.org/). +- **Package Manager**: Node's package manager comes bundled with Node. Verify installation by running `npm -v`. +- **Git**: Ensure Git is installed and configured. Download from [Git Official Website](https://git-scm.com/). + +## Step-by-Step Guide + +1. **Clone the Repository** + ```bash + git clone https://github.com/yourusername/solana-agent-kit.git + ``` + +2. **Navigate to the Project Directory** + ```bash + cd solana-agent-kit + ``` + +3. **Install Dependencies** + + The project uses `pnpm` for package management. Install all necessary dependencies by running: + ```bash + pnpm install + ``` + +4. **Configure Environment Variables** + + Create a `.env` file in the root directory of the project to store your environment variables securely. This file should include the following variables: + ```env + OPENAI_API_KEY=your_openai_api_key_here + RPC_URL=your_rpc_url + SOLANA_PRIVATE_KEY=your_solana_private_key_here + ``` + + - **OPENAI_API_KEY**: Your OpenAI API key for generating images and interacting with OpenAI services. + - **RPC_URL**: Your RPC_URL for Solana blockchain interactions. + - **SOLANA_PRIVATE_KEY**: Your Solana wallet's private key in base58 format. + + **Note:** Ensure that the `.env` file is added to `.gitignore` to prevent exposing sensitive information. + +5. **Build the Project** + + Compile the TypeScript code to JavaScript using the build script: + ```bash + pnpm run build + ``` + + This will generate the compiled files in the `dist/` directory. + +6. **Generate Documentation (Optional)** + + If you wish to generate the project documentation, use the following command: + ```bash + pnpm run docs + ``` + + The documentation will be available in the `docs/` directory. + +--- + +**Additional Information:** + +- **Git Configuration:** Ensure that Git is properly configured with your user name and email. You can set them using: + ```bash + git config --global user.name "Your Name" + git config --global user.email "your.email@example.com" + ``` + +- **Verifying Installation:** + + After installing dependencies and building the project, you can verify the installation by running: + ```bash + pnpm run build + pnpm run test + ``` + + Ensure that all tests pass successfully. + +--- \ No newline at end of file diff --git a/guides/test_it_out.md b/guides/test_it_out.md new file mode 100644 index 0000000..02f8151 --- /dev/null +++ b/guides/test_it_out.md @@ -0,0 +1,107 @@ +# How to Test It Out + +Testing the **Solana Agent Kit** ensures that all functionalities are working as expected. You can run automated tests or interact with the agent in different modes to verify its operations. + +## Running Automated Tests + +The project includes a test script located at `test/index.ts`. To execute the tests: + +1. **Ensure Dependencies are Installed** + - If you haven't installed the dependencies yet, refer to the [Setup Locally](./setup_locally.md) guide. + +2. **Run the Test Script** + ```bash + pnpm run test + ``` + This will run the `test/index.ts` script using `ts-node`. Ensure that your environment variables are correctly set in the `.env` file before running the tests. + +## Interactive Modes + +### Available Modes +1. **Chat Mode** + - Allows you to interact with the agent in a conversational manner. + +2. **Autonomous Mode** + - Enables the agent to perform actions on the blockchain autonomously at regular intervals. + +### Starting the Agent + +1. **Launch the Agent** + ```bash + pnpm start + ``` + +2. **Select Your Mode** + - For Chat Mode: Enter `1` or `chat` + - For Autonomous Mode: Enter `2` or `auto` + +### Using Each Mode + +#### Chat Mode +- Start chatting by entering prompts after the `Prompt:` indicator +- Type `exit` to end the chat session + +#### Autonomous Mode +- The agent executes predefined actions every 10 seconds +- Actions and outputs are displayed in the console + +## Code Examples + +### Token Deployment +```typescript +import { deploy_token } from "solana-agent-kit"; + +const result = await deploy_token( + agent, + 9, // decimals + 1000000 // initial supply +); + +console.log("Token Mint Address:", result.mint.toString()); +``` + +### NFT Collection Creation +```typescript +import { deploy_collection } from "solana-agent-kit"; + +const collection = await deploy_collection(agent, { + name: "My NFT Collection", + uri: "https://arweave.net/metadata.json", + royaltyBasisPoints: 500, // 5% + creators: [ + { + address: "creator-wallet-address", + percentage: 100, + }, + ], +}); +``` + +## Best Practices + +### Environment Setup +- Verify `.env` file contains correct and secure values +- Ensure all required environment variables are set + +### Testing +- Maintain comprehensive test coverage +- Monitor console logs during testing +- Clean up test assets after deployment + +## Troubleshooting + +### Test Failures + +#### Missing Environment Variables +- **Issue:** Tests fail due to missing environment variables +- **Solution:** Check `.env` file for all required variables + +#### Network Problems +- **Issue:** Network-related errors +- **Solution:** Verify internet connection and Solana RPC endpoint accessibility + +### Agent Issues + +#### Startup Problems +- **Issue:** Agent doesn't prompt for mode selection +- **Solution:** Verify successful build and dependency installation \ No newline at end of file diff --git a/package.json b/package.json index d5c3540..32d0411 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "solana-agent-kit", - "version": "1.1.0", + "version": "1.1.1", "description": "A toolkit for interacting with the Solana blockchain using LangChain", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -10,26 +10,35 @@ "test": "ts-node test/index.ts", "generate": "ts-node src/utils/keypair.ts" }, + "engines": { + "node": ">=23.1.0", + "pnpm": ">=8.0.0" + }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@raydium-io/raydium-sdk-v2": "0.1.95-alpha", "@bonfida/spl-name-service": "^3.0.7", + "@coral-xyz/anchor": "0.29", "@langchain/core": "^0.3.18", "@langchain/groq": "^0.1.2", "@langchain/langgraph": "^0.2.27", "@langchain/openai": "^0.3.13", + "@lightprotocol/compressed-token": "^0.17.1", + "@lightprotocol/stateless.js": "^0.17.1", "@metaplex-foundation/mpl-core": "^1.1.1", "@metaplex-foundation/mpl-token-metadata": "^3.3.0", "@metaplex-foundation/umi": "^0.9.2", "@metaplex-foundation/umi-bundle-defaults": "^0.9.2", "@metaplex-foundation/umi-web3js-adapters": "^0.9.2", + "@orca-so/common-sdk": "0.6.4", + "@orca-so/whirlpools-sdk": "^0.13.12", "@solana/spl-token": "^0.4.9", "@solana/web3.js": "^1.95.4", "bs58": "^6.0.0", - "bn.js": "^5.2.1", "decimal.js": "^10.4.3", + "bn.js": "^5.2.1", "dotenv": "^16.4.5", "form-data": "^4.0.1", "langchain": "^0.3.6", @@ -39,6 +48,7 @@ "devDependencies": { "@types/bn.js": "^5.1.5", "@types/node": "^22.9.0", - "ts-node": "^10.9.2" + "ts-node": "^10.9.2", + "typescript": "^5.7.2" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c7a1be5..7aa38c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,1206 +1,784 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@bonfida/spl-name-service': - specifier: ^3.0.7 - version: 3.0.7(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@langchain/core': - specifier: ^0.3.18 - version: 0.3.23(openai@4.76.3) - '@langchain/groq': - specifier: ^0.1.2 - version: 0.1.2(@langchain/core@0.3.23) - '@langchain/langgraph': - specifier: ^0.2.27 - version: 0.2.33(@langchain/core@0.3.23) - '@langchain/openai': - specifier: ^0.3.13 - version: 0.3.14(@langchain/core@0.3.23) - '@metaplex-foundation/mpl-core': - specifier: ^1.1.1 - version: 1.1.1(@metaplex-foundation/umi@0.9.2)(@noble/hashes@1.6.1) - '@metaplex-foundation/mpl-token-metadata': - specifier: ^3.3.0 - version: 3.3.0(@metaplex-foundation/umi@0.9.2) - '@metaplex-foundation/umi': - specifier: ^0.9.2 - version: 0.9.2 - '@metaplex-foundation/umi-bundle-defaults': - specifier: ^0.9.2 - version: 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8) - '@metaplex-foundation/umi-web3js-adapters': - specifier: ^0.9.2 - version: 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8) - '@raydium-io/raydium-sdk-v2': - specifier: 0.1.95-alpha - version: 0.1.95-alpha(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/spl-token': - specifier: ^0.4.9 - version: 0.4.9(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': - specifier: ^1.95.4 - version: 1.95.8 - bn.js: - specifier: ^5.2.1 - version: 5.2.1 - bs58: - specifier: ^6.0.0 - version: 6.0.0 - decimal.js: - specifier: ^10.4.3 - version: 10.4.3 - dotenv: - specifier: ^16.4.5 - version: 16.4.7 - form-data: - specifier: ^4.0.1 - version: 4.0.1 - langchain: - specifier: ^0.3.6 - version: 0.3.7(@langchain/core@0.3.23)(@langchain/groq@0.1.2)(openai@4.76.3) - openai: - specifier: ^4.75.0 - version: 4.76.3(zod@3.24.1) - typedoc: - specifier: ^0.26.11 - version: 0.26.11(typescript@5.6.3) +importers: -devDependencies: - '@types/bn.js': - specifier: ^5.1.5 - version: 5.1.6 - '@types/node': - specifier: ^22.9.0 - version: 22.10.2 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@22.10.2)(typescript@5.6.3) + .: + dependencies: + '@bonfida/spl-name-service': + specifier: ^3.0.7 + version: 3.0.7(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@coral-xyz/anchor': + specifier: '0.29' + version: 0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@langchain/core': + specifier: ^0.3.18 + version: 0.3.26(openai@4.77.0(zod@3.24.1)) + '@langchain/groq': + specifier: ^0.1.2 + version: 0.1.2(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))) + '@langchain/langgraph': + specifier: ^0.2.27 + version: 0.2.34(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))) + '@langchain/openai': + specifier: ^0.3.13 + version: 0.3.16(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))) + '@lightprotocol/compressed-token': + specifier: ^0.17.1 + version: 0.17.1(@lightprotocol/stateless.js@0.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@lightprotocol/stateless.js': + specifier: ^0.17.1 + version: 0.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@metaplex-foundation/mpl-core': + specifier: ^1.1.1 + version: 1.1.1(@metaplex-foundation/umi@0.9.2)(@noble/hashes@1.6.1) + '@metaplex-foundation/mpl-token-metadata': + specifier: ^3.3.0 + version: 3.3.0(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/umi': + specifier: ^0.9.2 + version: 0.9.2 + '@metaplex-foundation/umi-bundle-defaults': + specifier: ^0.9.2 + version: 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metaplex-foundation/umi-web3js-adapters': + specifier: ^0.9.2 + version: 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@orca-so/common-sdk': + specifier: 0.6.4 + version: 0.6.4(@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(decimal.js@10.4.3) + '@orca-so/whirlpools-sdk': + specifier: ^0.13.12 + version: 0.13.12(@coral-xyz/anchor@0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@orca-so/common-sdk@0.6.4(@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(decimal.js@10.4.3))(@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(decimal.js@10.4.3) + '@raydium-io/raydium-sdk-v2': + specifier: 0.1.95-alpha + version: 0.1.95-alpha(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@solana/spl-token': + specifier: ^0.4.9 + version: 0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@solana/web3.js': + specifier: ^1.95.4 + version: 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bn.js: + specifier: ^5.2.1 + version: 5.2.1 + bs58: + specifier: ^6.0.0 + version: 6.0.0 + decimal.js: + specifier: ^10.4.3 + version: 10.4.3 + dotenv: + specifier: ^16.4.5 + version: 16.4.7 + form-data: + specifier: ^4.0.1 + version: 4.0.1 + langchain: + specifier: ^0.3.6 + version: 0.3.7(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1)))(@langchain/groq@0.1.2(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))))(axios@1.7.9)(openai@4.77.0(zod@3.24.1)) + openai: + specifier: ^4.75.0 + version: 4.77.0(zod@3.24.1) + typedoc: + specifier: ^0.26.11 + version: 0.26.11(typescript@5.7.2) + devDependencies: + '@types/bn.js': + specifier: ^5.1.5 + version: 5.1.6 + '@types/node': + specifier: ^22.9.0 + version: 22.10.2 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.10.2)(typescript@5.7.2) + typescript: + specifier: ^5.7.2 + version: 5.7.2 packages: - /@babel/runtime@7.26.0: + '@babel/runtime@7.26.0': resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: false - /@bonfida/sns-records@0.0.1(@solana/web3.js@1.95.8): + '@bonfida/sns-records@0.0.1': resolution: {integrity: sha512-i28w9+BMFufhhpmLQCNx1CKKXTsEn+5RT18VFpPqdGO3sqaYlnUWC1m3wDpOvlzGk498dljgRpRo5wmcsnuEMg==} peerDependencies: '@solana/web3.js': ^1.87.3 - dependencies: - '@solana/web3.js': 1.95.8 - borsh: 1.0.0 - bs58: 5.0.0 - buffer: 6.0.3 - dev: false - /@bonfida/spl-name-service@3.0.7(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3): + '@bonfida/spl-name-service@3.0.7': resolution: {integrity: sha512-okOLXhy+fQoyQ/sZgMleO5RrIZfTkWEoHMxWgUqg6RP/MTBlrKxlhKC6ymKn4UUe0C5s3Nb8A+3Ams7vX0nMDg==} peerDependencies: '@solana/web3.js': ^1.87.3 - dependencies: - '@bonfida/sns-records': 0.0.1(@solana/web3.js@1.95.8) - '@noble/curves': 1.7.0 - '@scure/base': 1.2.1 - '@solana/spl-token': 0.4.6(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.95.8 - borsh: 2.0.0 - buffer: 6.0.3 - graphemesplit: 2.4.4 - ipaddr.js: 2.2.0 - punycode: 2.3.1 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - dev: false - /@cfworker/json-schema@4.0.3: + '@cfworker/json-schema@4.0.3': resolution: {integrity: sha512-ZykIcDTVv5UNmKWSTLAs3VukO6NDJkkSKxrgUTDPBkAlORVT3H9n5DbRjRl8xIotklscHdbLIa0b9+y3mQq73g==} - dev: false - /@cspotcode/source-map-support@0.8.1: + '@coral-xyz/anchor@0.29.0': + resolution: {integrity: sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==} + engines: {node: '>=11'} + + '@coral-xyz/borsh@0.29.0': + resolution: {integrity: sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.68.0 + + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - dev: true - /@jridgewell/resolve-uri@3.1.2: + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/sourcemap-codec@1.5.0: + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - dev: true - /@jridgewell/trace-mapping@0.3.9: + '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - dev: true - /@langchain/core@0.3.23(openai@4.76.3): - resolution: {integrity: sha512-Aut43dEJYH/ibccSErFOLQzymkBG4emlN16P0OHWwx02bDosOR9ilZly4JJiCSYcprn2X2H8nee6P/4VMg1oQA==} + '@langchain/core@0.3.26': + resolution: {integrity: sha512-6RUQHEp8wv+JwtYIIEBYBzbLlcAQZFc7EDOgAM0ukExjh9HiXoJzoWpgMRRCrr/koIbtwXPJUqBprZK1I1CXHQ==} engines: {node: '>=18'} - dependencies: - '@cfworker/json-schema': 4.0.3 - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.15 - langsmith: 0.2.13(openai@4.76.3) - mustache: 4.2.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 - zod: 3.24.1 - zod-to-json-schema: 3.24.1(zod@3.24.1) - transitivePeerDependencies: - - openai - dev: false - /@langchain/groq@0.1.2(@langchain/core@0.3.23): + '@langchain/groq@0.1.2': resolution: {integrity: sha512-bgQ9yGoNHOwG6LG2ngGvSNxF/1U1c1u3vKmFWmzecFIcBoQQOJY0jb0MrL3g1uTife0Sr3zxkWKXQg2aK/U4Sg==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.21 <0.4.0' - dependencies: - '@langchain/core': 0.3.23(openai@4.76.3) - '@langchain/openai': 0.3.14(@langchain/core@0.3.23) - groq-sdk: 0.5.0 - zod: 3.24.1 - zod-to-json-schema: 3.24.1(zod@3.24.1) - transitivePeerDependencies: - - encoding - dev: false - /@langchain/langgraph-checkpoint@0.0.13(@langchain/core@0.3.23): + '@langchain/langgraph-checkpoint@0.0.13': resolution: {integrity: sha512-amdmBcNT8a9xP2VwcEWxqArng4gtRDcnVyVI4DsQIo1Aaz8e8+hH17zSwrUF3pt1pIYztngIfYnBOim31mtKMg==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.31 <0.4.0' - dependencies: - '@langchain/core': 0.3.23(openai@4.76.3) - uuid: 10.0.0 - dev: false - /@langchain/langgraph-sdk@0.0.32: + '@langchain/langgraph-sdk@0.0.32': resolution: {integrity: sha512-KQyM9kLO7T6AxwNrceajH7JOybP3pYpvUPnhiI2rrVndI1WyZUJ1eVC1e722BVRAPi6o+WcoTT4uMSZVinPOtA==} - dependencies: - '@types/json-schema': 7.0.15 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 9.0.1 - dev: false - /@langchain/langgraph@0.2.33(@langchain/core@0.3.23): - resolution: {integrity: sha512-Tx2eU98XicIOoZzRkzQqLxZrF93B9xONYmWSq3kfDUoC0nzQbkydpygF1MTcUM9hKPQsSGMBrxgXht5+sNXzYg==} + '@langchain/langgraph@0.2.34': + resolution: {integrity: sha512-fSlmLYre+Skh5XJgBGe5YRtXaHyGMTlhu5UN3LzIgA3E9CmGODvH+Ydyk5vJzhXMjnPpLr8icqlKxKrYmZ3gTw==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.36 <0.3.0 || >=0.3.9 < 0.4.0' - dependencies: - '@langchain/core': 0.3.23(openai@4.76.3) - '@langchain/langgraph-checkpoint': 0.0.13(@langchain/core@0.3.23) - '@langchain/langgraph-sdk': 0.0.32 - uuid: 10.0.0 - zod: 3.24.1 - dev: false - /@langchain/openai@0.3.14(@langchain/core@0.3.23): - resolution: {integrity: sha512-lNWjUo1tbvsss45IF7UQtMu1NJ6oUKvhgPYWXnX9f/d6OmuLu7D99HQ3Y88vLcUo9XjjOy417olYHignMduMjA==} + '@langchain/openai@0.3.16': + resolution: {integrity: sha512-Om9HRlTeI0Ou6D4pfxbWHop4WGfkCdV/7v1W/+Jr7NSf0BNoA9jk5GqGms8ZtOYSGgPvizDu3i0TrM3B4cN4NA==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.26 <0.4.0' - dependencies: - '@langchain/core': 0.3.23(openai@4.76.3) - js-tiktoken: 1.0.15 - openai: 4.76.3(zod@3.24.1) - zod: 3.24.1 - zod-to-json-schema: 3.24.1(zod@3.24.1) - transitivePeerDependencies: - - encoding - dev: false - /@langchain/textsplitters@0.1.0(@langchain/core@0.3.23): + '@langchain/textsplitters@0.1.0': resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.2.21 <0.4.0' - dependencies: - '@langchain/core': 0.3.23(openai@4.76.3) - js-tiktoken: 1.0.15 - dev: false - /@metaplex-foundation/mpl-core@1.1.1(@metaplex-foundation/umi@0.9.2)(@noble/hashes@1.6.1): + '@lightprotocol/compressed-token@0.17.1': + resolution: {integrity: sha512-493KCmZGw1BcHVRJaeRm8EEs+L7gX8dwY7JG13w2pfgOMtZXZ7Wxt261jFJxQJzRLTrUSlrbRJOmfW1+S1Y8SQ==} + peerDependencies: + '@lightprotocol/stateless.js': 0.17.1 + + '@lightprotocol/stateless.js@0.17.1': + resolution: {integrity: sha512-EjId1n33A6dBwpce33Wsa/fs/CDKtMtRrkxbApH0alXrnEXmbW6QhIViXOrKYXjZ4uJQM1xsBtsKe0vqJ4nbtQ==} + + '@metaplex-foundation/mpl-core@1.1.1': resolution: {integrity: sha512-h1kLw+cGaV8SiykoHDb1/G01+VYqtJXAt0uGuO5+2Towsdtc6ET4M62iqUnh4EacTVMIW1yYHsKsG/LYWBCKaA==} peerDependencies: '@metaplex-foundation/umi': '>=0.8.2 < 1' '@noble/hashes': ^1.3.1 - dependencies: - '@metaplex-foundation/umi': 0.9.2 - '@msgpack/msgpack': 3.0.0-beta2 - '@noble/hashes': 1.6.1 - dev: false - /@metaplex-foundation/mpl-token-metadata@3.3.0(@metaplex-foundation/umi@0.9.2): + '@metaplex-foundation/mpl-token-metadata@3.3.0': resolution: {integrity: sha512-t5vO8Wr3ZZZPGrVrGNcosX5FMkwQSgBiVMQMRNDG2De7voYFJmIibD5jdG05EoQ4Y5kZVEiwhYaO+wJB3aO5AA==} peerDependencies: '@metaplex-foundation/umi': '>= 0.8.2 < 1' - dependencies: - '@metaplex-foundation/mpl-toolbox': 0.9.4(@metaplex-foundation/umi@0.9.2) - '@metaplex-foundation/umi': 0.9.2 - dev: false - /@metaplex-foundation/mpl-toolbox@0.9.4(@metaplex-foundation/umi@0.9.2): + '@metaplex-foundation/mpl-toolbox@0.9.4': resolution: {integrity: sha512-fd6JxfoLbj/MM8FG2x91KYVy1U6AjBQw4qjt7+Da3trzQaWnSaYHDcYRG/53xqfvZ9qofY1T2t53GXPlD87lnQ==} peerDependencies: '@metaplex-foundation/umi': '>= 0.8.2 < 1' - dependencies: - '@metaplex-foundation/umi': 0.9.2 - dev: false - /@metaplex-foundation/umi-bundle-defaults@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8): + '@metaplex-foundation/umi-bundle-defaults@0.9.2': resolution: {integrity: sha512-kV3tfvgvRjVP1p9OFOtH+ibOtN9omVJSwKr0We4/9r45e5LTj+32su0V/rixZUkG1EZzzOYBsxhtIE0kIw/Hrw==} peerDependencies: '@metaplex-foundation/umi': ^0.9.2 '@solana/web3.js': ^1.72.0 - dependencies: - '@metaplex-foundation/umi': 0.9.2 - '@metaplex-foundation/umi-downloader-http': 0.9.2(@metaplex-foundation/umi@0.9.2) - '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8) - '@metaplex-foundation/umi-http-fetch': 0.9.2(@metaplex-foundation/umi@0.9.2) - '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) - '@metaplex-foundation/umi-rpc-chunk-get-accounts': 0.9.2(@metaplex-foundation/umi@0.9.2) - '@metaplex-foundation/umi-rpc-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8) - '@metaplex-foundation/umi-serializer-data-view': 0.9.2(@metaplex-foundation/umi@0.9.2) - '@metaplex-foundation/umi-transaction-factory-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8) - '@solana/web3.js': 1.95.8 - transitivePeerDependencies: - - encoding - dev: false - /@metaplex-foundation/umi-downloader-http@0.9.2(@metaplex-foundation/umi@0.9.2): + '@metaplex-foundation/umi-downloader-http@0.9.2': resolution: {integrity: sha512-tzPT9hBwenzTzAQg07rmsrqZfgguAXELbcJrsYMoASp5VqWFXYIP00g94KET6XLjWUXH4P1J2zoa6hGennPXHA==} peerDependencies: '@metaplex-foundation/umi': ^0.9.2 - dependencies: - '@metaplex-foundation/umi': 0.9.2 - dev: false - /@metaplex-foundation/umi-eddsa-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8): + '@metaplex-foundation/umi-eddsa-web3js@0.9.2': resolution: {integrity: sha512-hhPCxXbYIp4BC4z9gK78sXpWLkNSrfv4ndhF5ruAkdIp7GcRVYKj0QnOUO6lGYGiIkNlw20yoTwOe1CT//OfTQ==} peerDependencies: '@metaplex-foundation/umi': ^0.9.2 '@solana/web3.js': ^1.72.0 - dependencies: - '@metaplex-foundation/umi': 0.9.2 - '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8) - '@noble/curves': 1.7.0 - '@solana/web3.js': 1.95.8 - dev: false - /@metaplex-foundation/umi-http-fetch@0.9.2(@metaplex-foundation/umi@0.9.2): + '@metaplex-foundation/umi-http-fetch@0.9.2': resolution: {integrity: sha512-YCZuBu24T9ZzEDe4+w12LEZm/fO9pkyViZufGgASC5NX93814Lvf6Ssjn/hZzjfA7CvZbvLFbmujc6CV3Q/m9Q==} peerDependencies: '@metaplex-foundation/umi': ^0.9.2 - dependencies: - '@metaplex-foundation/umi': 0.9.2 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - /@metaplex-foundation/umi-options@0.8.9: + '@metaplex-foundation/umi-options@0.8.9': resolution: {integrity: sha512-jSQ61sZMPSAk/TXn8v8fPqtz3x8d0/blVZXLLbpVbo2/T5XobiI6/MfmlUosAjAUaQl6bHRF8aIIqZEFkJiy4A==} - dev: false - /@metaplex-foundation/umi-program-repository@0.9.2(@metaplex-foundation/umi@0.9.2): + '@metaplex-foundation/umi-program-repository@0.9.2': resolution: {integrity: sha512-g3+FPqXEmYsBa8eETtUE2gb2Oe3mqac0z3/Ur1TvAg5TtIy3mzRzOy/nza+sgzejnfcxcVg835rmpBaxpBnjDA==} peerDependencies: '@metaplex-foundation/umi': ^0.9.2 - dependencies: - '@metaplex-foundation/umi': 0.9.2 - dev: false - /@metaplex-foundation/umi-public-keys@0.8.9: + '@metaplex-foundation/umi-public-keys@0.8.9': resolution: {integrity: sha512-CxMzN7dgVGOq9OcNCJe2casKUpJ3RmTVoOvDFyeoTQuK+vkZ1YSSahbqC1iGuHEtKTLSjtWjKvUU6O7zWFTw3Q==} - dependencies: - '@metaplex-foundation/umi-serializers-encodings': 0.8.9 - dev: false - /@metaplex-foundation/umi-rpc-chunk-get-accounts@0.9.2(@metaplex-foundation/umi@0.9.2): + '@metaplex-foundation/umi-rpc-chunk-get-accounts@0.9.2': resolution: {integrity: sha512-YRwVf6xH0jPBAUgMhEPi+UbjioAeqTXmjsN2TnmQCPAmHbrHrMRj0rlWYwFLWAgkmoxazYrXP9lqOFRrfOGAEA==} peerDependencies: '@metaplex-foundation/umi': ^0.9.2 - dependencies: - '@metaplex-foundation/umi': 0.9.2 - dev: false - /@metaplex-foundation/umi-rpc-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8): + '@metaplex-foundation/umi-rpc-web3js@0.9.2': resolution: {integrity: sha512-MqcsBz8B4wGl6jxsf2Jo/rAEpYReU9VCSR15QSjhvADHMmdFxCIZCCAgE+gDE2Vuanfl437VhOcP3g5Uw8C16Q==} peerDependencies: '@metaplex-foundation/umi': ^0.9.2 '@solana/web3.js': ^1.72.0 - dependencies: - '@metaplex-foundation/umi': 0.9.2 - '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8) - '@solana/web3.js': 1.95.8 - dev: false - /@metaplex-foundation/umi-serializer-data-view@0.9.2(@metaplex-foundation/umi@0.9.2): + '@metaplex-foundation/umi-serializer-data-view@0.9.2': resolution: {integrity: sha512-5vGptadJxUxvUcyrwFZxXlEc6Q7AYySBesizCtrBFUY8w8PnF2vzmS45CP1MLySEATNH6T9mD4Rs0tLb87iQyA==} peerDependencies: '@metaplex-foundation/umi': ^0.9.2 - dependencies: - '@metaplex-foundation/umi': 0.9.2 - dev: false - /@metaplex-foundation/umi-serializers-core@0.8.9: + '@metaplex-foundation/umi-serializers-core@0.8.9': resolution: {integrity: sha512-WT82tkiYJ0Qmscp7uTj1Hz6aWQPETwaKLAENAUN5DeWghkuBKtuxyBKVvEOuoXerJSdhiAk0e8DWA4cxcTTQ/w==} - dev: false - /@metaplex-foundation/umi-serializers-encodings@0.8.9: + '@metaplex-foundation/umi-serializers-encodings@0.8.9': resolution: {integrity: sha512-N3VWLDTJ0bzzMKcJDL08U3FaqRmwlN79FyE4BHj6bbAaJ9LEHjDQ9RJijZyWqTm0jE7I750fU7Ow5EZL38Xi6Q==} - dependencies: - '@metaplex-foundation/umi-serializers-core': 0.8.9 - dev: false - /@metaplex-foundation/umi-serializers-numbers@0.8.9: + '@metaplex-foundation/umi-serializers-numbers@0.8.9': resolution: {integrity: sha512-NtBf1fnVNQJHFQjLFzRu2i9GGnigb9hOm/Gfrk628d0q0tRJB7BOM3bs5C61VAs7kJs4yd+pDNVAERJkknQ7Lg==} - dependencies: - '@metaplex-foundation/umi-serializers-core': 0.8.9 - dev: false - /@metaplex-foundation/umi-serializers@0.9.0: + '@metaplex-foundation/umi-serializers@0.9.0': resolution: {integrity: sha512-hAOW9Djl4w4ioKeR4erDZl5IG4iJdP0xA19ZomdaCbMhYAAmG/FEs5khh0uT2mq53/MnzWcXSUPoO8WBN4Q+Vg==} - dependencies: - '@metaplex-foundation/umi-options': 0.8.9 - '@metaplex-foundation/umi-public-keys': 0.8.9 - '@metaplex-foundation/umi-serializers-core': 0.8.9 - '@metaplex-foundation/umi-serializers-encodings': 0.8.9 - '@metaplex-foundation/umi-serializers-numbers': 0.8.9 - dev: false - /@metaplex-foundation/umi-transaction-factory-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8): + '@metaplex-foundation/umi-transaction-factory-web3js@0.9.2': resolution: {integrity: sha512-fR1Kf21uylMFd1Smkltmj4jTNxhqSWf416owsJ+T+cvJi2VCOcOwq/3UFzOrpz78fA0RhsajKYKj0HYsRnQI1g==} peerDependencies: '@metaplex-foundation/umi': ^0.9.2 '@solana/web3.js': ^1.72.0 - dependencies: - '@metaplex-foundation/umi': 0.9.2 - '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8) - '@solana/web3.js': 1.95.8 - dev: false - /@metaplex-foundation/umi-web3js-adapters@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.95.8): + '@metaplex-foundation/umi-web3js-adapters@0.9.2': resolution: {integrity: sha512-RQqUTtHYY9fmEMnq7s3Hiv/81flGaoI0ZVVoafnFVaQLnxU6QBKxtboRZHk43XtD9CiFh5f9izrMJX7iK7KlOA==} peerDependencies: '@metaplex-foundation/umi': ^0.9.2 '@solana/web3.js': ^1.72.0 - dependencies: - '@metaplex-foundation/umi': 0.9.2 - '@solana/web3.js': 1.95.8 - buffer: 6.0.3 - dev: false - /@metaplex-foundation/umi@0.9.2: + '@metaplex-foundation/umi@0.9.2': resolution: {integrity: sha512-9i4Acm4pruQfJcpRrc2EauPBwkfDN0I9QTvJyZocIlKgoZwD6A6wH0PViH1AjOVG5CQCd1YI3tJd5XjYE1ElBw==} - dependencies: - '@metaplex-foundation/umi-options': 0.8.9 - '@metaplex-foundation/umi-public-keys': 0.8.9 - '@metaplex-foundation/umi-serializers': 0.9.0 - dev: false - /@msgpack/msgpack@3.0.0-beta2: + '@msgpack/msgpack@3.0.0-beta2': resolution: {integrity: sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==} engines: {node: '>= 14'} - dev: false - /@noble/curves@1.7.0: + '@noble/curves@1.7.0': resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} engines: {node: ^14.21.3 || >=16} - dependencies: - '@noble/hashes': 1.6.0 - dev: false - /@noble/hashes@1.6.0: + '@noble/hashes@1.5.0': + 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} - dev: false - /@noble/hashes@1.6.1: + '@noble/hashes@1.6.1': resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} engines: {node: ^14.21.3 || >=16} - dev: false - /@raydium-io/raydium-sdk-v2@0.1.95-alpha(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3): + '@orca-so/common-sdk@0.6.4': + resolution: {integrity: sha512-iOiC6exTA9t2CEOaUPoWlNP3soN/1yZFjoz1mSf7NvOqo/PJZeIdWpB7BRXwU0mGGatjxU4SFgMGQ8NrSx+ONw==} + peerDependencies: + '@solana/spl-token': ^0.4.1 + '@solana/web3.js': ^1.90.0 + decimal.js: ^10.4.3 + + '@orca-so/whirlpools-sdk@0.13.12': + resolution: {integrity: sha512-+LOqGTe0DYUsYwemltOU4WQIviqoICQlIcAmmEX/WnBh6wntpcLDcXkPV6dBHW7NA2/J8WEVAZ50biLJb4subg==} + peerDependencies: + '@coral-xyz/anchor': ~0.29.0 + '@orca-so/common-sdk': 0.6.4 + '@solana/spl-token': ^0.4.8 + '@solana/web3.js': ^1.90.0 + decimal.js: ^10.4.3 + + '@raydium-io/raydium-sdk-v2@0.1.95-alpha': resolution: {integrity: sha512-+u7yxo/R1JDysTCzOuAlh90ioBe2DlM2Hbcz/tFsxP/YzmnYQzShvNjcmc0361a4zJhmlrEJfpFXW0J3kkX5vA==} - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/spl-token': 0.4.9(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.95.8 - axios: 1.7.9 - big.js: 6.2.2 - bn.js: 5.2.1 - dayjs: 1.11.13 - decimal.js-light: 2.5.1 - jsonfile: 6.1.0 - lodash: 4.17.21 - toformat: 2.0.0 - tsconfig-paths: 4.2.0 - transitivePeerDependencies: - - bufferutil - - debug - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - dev: false - /@scure/base@1.2.1: + '@scure/base@1.2.1': resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} - dev: false - /@shikijs/core@1.24.2: - resolution: {integrity: sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==} - dependencies: - '@shikijs/engine-javascript': 1.24.2 - '@shikijs/engine-oniguruma': 1.24.2 - '@shikijs/types': 1.24.2 - '@shikijs/vscode-textmate': 9.3.1 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.4 - dev: false + '@shikijs/core@1.24.3': + resolution: {integrity: sha512-VRcf4GYUIkxIchGM9DrapRcxtgojg4IWKUtX5EtW+4PJiGzF2xQqZSv27PJt+WLc18KT3CNLpNWow9JYV5n+Rg==} - /@shikijs/engine-javascript@1.24.2: - resolution: {integrity: sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==} - dependencies: - '@shikijs/types': 1.24.2 - '@shikijs/vscode-textmate': 9.3.1 - oniguruma-to-es: 0.7.0 - dev: false + '@shikijs/engine-javascript@1.24.3': + resolution: {integrity: sha512-De8tNLvYjeK6V0Gb47jIH2M+OKkw+lWnSV1j3HVDFMlNIglmVcTMG2fASc29W0zuFbfEEwKjO8Fe4KYSO6Ce3w==} - /@shikijs/engine-oniguruma@1.24.2: - resolution: {integrity: sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==} - dependencies: - '@shikijs/types': 1.24.2 - '@shikijs/vscode-textmate': 9.3.1 - dev: false + '@shikijs/engine-oniguruma@1.24.3': + resolution: {integrity: sha512-iNnx950gs/5Nk+zrp1LuF+S+L7SKEhn8k9eXgFYPGhVshKppsYwRmW8tpmAMvILIMSDfrgqZ0w+3xWVQB//1Xw==} - /@shikijs/types@1.24.2: - resolution: {integrity: sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==} - dependencies: - '@shikijs/vscode-textmate': 9.3.1 - '@types/hast': 3.0.4 - dev: false + '@shikijs/types@1.24.3': + resolution: {integrity: sha512-FPMrJ69MNxhRtldRk69CghvaGlbbN3pKRuvko0zvbfa2dXp4pAngByToqS5OY5jvN8D7LKR4RJE8UvzlCOuViw==} - /@shikijs/vscode-textmate@9.3.1: + '@shikijs/vscode-textmate@9.3.1': resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} - dev: false - /@solana/buffer-layout-utils@0.2.0: + '@solana/buffer-layout-utils@0.2.0': resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} engines: {node: '>= 10'} - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.95.8 - bigint-buffer: 1.1.5 - bignumber.js: 9.1.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - /@solana/buffer-layout@4.0.1: + '@solana/buffer-layout@4.0.1': resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} engines: {node: '>=5.10'} - dependencies: - buffer: 6.0.3 - dev: false - /@solana/codecs-core@2.0.0-preview.2: + '@solana/codecs-core@2.0.0-preview.2': resolution: {integrity: sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==} - dependencies: - '@solana/errors': 2.0.0-preview.2 - dev: false - /@solana/codecs-core@2.0.0-rc.1(typescript@5.6.3): + '@solana/codecs-core@2.0.0-preview.4': + resolution: {integrity: sha512-A0VVuDDA5kNKZUinOqHxJQK32aKTucaVbvn31YenGzHX1gPqq+SOnFwgaEY6pq4XEopSmaK16w938ZQS8IvCnw==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-core@2.0.0-rc.1': resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} peerDependencies: typescript: '>=5' - dependencies: - '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) - typescript: 5.6.3 - dev: false - /@solana/codecs-data-structures@2.0.0-preview.2: + '@solana/codecs-data-structures@2.0.0-preview.2': resolution: {integrity: sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==} - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - dev: false - /@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.6.3): + '@solana/codecs-data-structures@2.0.0-preview.4': + resolution: {integrity: sha512-nt2k2eTeyzlI/ccutPcG36M/J8NAYfxBPI9h/nQjgJ+M+IgOKi31JV8StDDlG/1XvY0zyqugV3I0r3KAbZRJpA==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-data-structures@2.0.0-rc.1': resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} peerDependencies: typescript: '>=5' - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) - typescript: 5.6.3 - dev: false - /@solana/codecs-numbers@2.0.0-preview.2: + '@solana/codecs-numbers@2.0.0-preview.2': resolution: {integrity: sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==} - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - dev: false - /@solana/codecs-numbers@2.0.0-rc.1(typescript@5.6.3): + '@solana/codecs-numbers@2.0.0-preview.4': + resolution: {integrity: sha512-Q061rLtMadsO7uxpguT+Z7G4UHnjQ6moVIxAQxR58nLxDPCC7MB1Pk106/Z7NDhDLHTcd18uO6DZ7ajHZEn2XQ==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-numbers@2.0.0-rc.1': resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} peerDependencies: typescript: '>=5' - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) - typescript: 5.6.3 - dev: false - /@solana/codecs-strings@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22): + '@solana/codecs-strings@2.0.0-preview.2': resolution: {integrity: sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==} peerDependencies: fastestsmallesttextencoderdecoder: ^1.0.22 - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/errors': 2.0.0-preview.2 - fastestsmallesttextencoderdecoder: 1.0.22 - dev: false - /@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3): + '@solana/codecs-strings@2.0.0-preview.4': + resolution: {integrity: sha512-YDbsQePRWm+xnrfS64losSGRg8Wb76cjK1K6qfR8LPmdwIC3787x9uW5/E4icl/k+9nwgbIRXZ65lpF+ucZUnw==} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5' + + '@solana/codecs-strings@2.0.0-rc.1': resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} peerDependencies: fastestsmallesttextencoderdecoder: ^1.0.22 typescript: '>=5' - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) - fastestsmallesttextencoderdecoder: 1.0.22 - typescript: 5.6.3 - dev: false - /@solana/codecs@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22): + '@solana/codecs@2.0.0-preview.2': resolution: {integrity: sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==} - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-data-structures': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - '@solana/codecs-strings': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/options': 2.0.0-preview.2 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - dev: false - /@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3): + '@solana/codecs@2.0.0-preview.4': + resolution: {integrity: sha512-gLMupqI4i+G4uPi2SGF/Tc1aXcviZF2ybC81x7Q/fARamNSgNOCUUoSCg9nWu1Gid6+UhA7LH80sWI8XjKaRog==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs@2.0.0-rc.1': resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} peerDependencies: typescript: '>=5' - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - dev: false - /@solana/errors@2.0.0-preview.2: + '@solana/errors@2.0.0-preview.2': resolution: {integrity: sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==} hasBin: true - dependencies: - chalk: 5.3.0 - commander: 12.1.0 - dev: false - /@solana/errors@2.0.0-rc.1(typescript@5.6.3): + '@solana/errors@2.0.0-preview.4': + resolution: {integrity: sha512-kadtlbRv2LCWr8A9V22On15Us7Nn8BvqNaOB4hXsTB3O0fU40D1ru2l+cReqLcRPij4znqlRzW9Xi0m6J5DIhA==} + hasBin: true + peerDependencies: + typescript: '>=5' + + '@solana/errors@2.0.0-rc.1': resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} hasBin: true peerDependencies: typescript: '>=5' - dependencies: - chalk: 5.3.0 - commander: 12.1.0 - typescript: 5.6.3 - dev: false - /@solana/options@2.0.0-preview.2: + '@solana/options@2.0.0-preview.2': resolution: {integrity: sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==} - dependencies: - '@solana/codecs-core': 2.0.0-preview.2 - '@solana/codecs-numbers': 2.0.0-preview.2 - dev: false - /@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3): + '@solana/options@2.0.0-preview.4': + resolution: {integrity: sha512-tv2O/Frxql/wSe3jbzi5nVicIWIus/BftH+5ZR+r9r3FO0/htEllZS5Q9XdbmSboHu+St87584JXeDx3xm4jaA==} + peerDependencies: + typescript: '>=5' + + '@solana/options@2.0.0-rc.1': resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} peerDependencies: typescript: '>=5' - dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - dev: false - /@solana/spl-token-group@0.0.4(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22): + '@solana/spl-token-group@0.0.4': resolution: {integrity: sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==} engines: {node: '>=16'} peerDependencies: '@solana/web3.js': ^1.91.6 - dependencies: - '@solana/codecs': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/spl-type-length-value': 0.1.0 - '@solana/web3.js': 1.95.8 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - dev: false - /@solana/spl-token-group@0.0.7(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3): + '@solana/spl-token-group@0.0.5': + resolution: {integrity: sha512-CLJnWEcdoUBpQJfx9WEbX3h6nTdNiUzswfFdkABUik7HVwSNA98u5AYvBVK2H93d9PGMOHAak2lHW9xr+zAJGQ==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.94.0 + + '@solana/spl-token-group@0.0.7': resolution: {integrity: sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==} engines: {node: '>=16'} peerDependencies: '@solana/web3.js': ^1.95.3 - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.95.8 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - dev: false - /@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3): + '@solana/spl-token-metadata@0.1.6': resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} engines: {node: '>=16'} peerDependencies: '@solana/web3.js': ^1.95.3 - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.95.8 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - dev: false - /@solana/spl-token@0.4.6(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3): + '@solana/spl-token@0.4.6': resolution: {integrity: sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==} engines: {node: '>=16'} peerDependencies: '@solana/web3.js': ^1.91.6 - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0 - '@solana/spl-token-group': 0.0.4(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.95.8 - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - dev: false - /@solana/spl-token@0.4.9(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3): + '@solana/spl-token@0.4.8': + resolution: {integrity: sha512-RO0JD9vPRi4LsAbMUdNbDJ5/cv2z11MGhtAvFeRzT4+hAGE/FUzRi0tkkWtuCfSIU3twC6CtmAihRp/+XXjWsA==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.94.0 + + '@solana/spl-token@0.4.9': resolution: {integrity: sha512-g3wbj4F4gq82YQlwqhPB0gHFXfgsC6UmyGMxtSLf/BozT/oKd59465DbnlUK8L8EcimKMavxsVAMoLcEdeCicg==} engines: {node: '>=16'} peerDependencies: '@solana/web3.js': ^1.95.3 - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0 - '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) - '@solana/web3.js': 1.95.8 - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - dev: false - /@solana/spl-type-length-value@0.1.0: + '@solana/spl-type-length-value@0.1.0': resolution: {integrity: sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==} engines: {node: '>=16'} - dependencies: - buffer: 6.0.3 - dev: false - /@solana/web3.js@1.95.8: - resolution: {integrity: sha512-sBHzNh7dHMrmNS5xPD1d0Xa2QffW/RXaxu/OysRXBfwTp+LYqGGmMtCYYwrHPrN5rjAmJCsQRNAwv4FM0t3B6g==} - dependencies: - '@babel/runtime': 7.26.0 - '@noble/curves': 1.7.0 - '@noble/hashes': 1.6.1 - '@solana/buffer-layout': 4.0.1 - agentkeepalive: 4.5.0 - bigint-buffer: 1.1.5 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.1.3 - node-fetch: 2.7.0 - rpc-websockets: 9.0.4 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false + '@solana/web3.js@1.95.3': + resolution: {integrity: sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==} - /@swc/helpers@0.5.15: + '@solana/web3.js@1.98.0': + resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} + + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - dependencies: - tslib: 2.8.1 - dev: false - /@tsconfig/node10@1.0.11: + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - dev: true - /@tsconfig/node12@1.0.11: + '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true - /@tsconfig/node14@1.0.3: + '@tsconfig/node14@1.0.3': resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true - /@tsconfig/node16@1.0.4: + '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: true - /@types/bn.js@5.1.6: + '@types/bn.js@5.1.6': resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} - dependencies: - '@types/node': 22.10.2 - dev: true - /@types/connect@3.4.38: + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - dependencies: - '@types/node': 22.10.2 - dev: false - /@types/hast@3.0.4: + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - dependencies: - '@types/unist': 3.0.3 - dev: false - /@types/json-schema@7.0.15: + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: false - /@types/mdast@4.0.4: + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - dependencies: - '@types/unist': 3.0.3 - dev: false - /@types/node-fetch@2.6.12: + '@types/node-fetch@2.6.12': resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} - dependencies: - '@types/node': 22.10.2 - form-data: 4.0.1 - dev: false - /@types/node@12.20.55: + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: false - /@types/node@18.19.68: + '@types/node@18.19.68': resolution: {integrity: sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==} - dependencies: - undici-types: 5.26.5 - dev: false - /@types/node@22.10.2: + '@types/node@22.10.2': resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} - dependencies: - undici-types: 6.20.0 - /@types/retry@0.12.0: + '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: false - /@types/unist@3.0.3: + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - dev: false - /@types/uuid@10.0.0: + '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - dev: false - /@types/uuid@8.3.4: + '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - dev: false - /@types/ws@7.4.7: + '@types/ws@7.4.7': resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - dependencies: - '@types/node': 22.10.2 - dev: false - /@types/ws@8.5.13: + '@types/ws@8.5.13': resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} - dependencies: - '@types/node': 22.10.2 - dev: false - /@ungap/structured-clone@1.2.1: + '@ungap/structured-clone@1.2.1': resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} - dev: false - /JSONStream@1.3.5: + JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: false - /abort-controller@3.0.0: + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: false - /acorn-walk@8.3.4: + acorn-walk@8.3.4: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - dependencies: - acorn: 8.14.0 - dev: true - /acorn@8.14.0: + acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true - dev: true - /agentkeepalive@4.5.0: + agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} - dependencies: - humanize-ms: 1.2.1 - dev: false - /ansi-styles@5.2.0: + ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - dev: false - /arg@4.1.3: + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true - /argparse@2.0.1: + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: false - /asynckit@0.4.0: + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - /axios@1.7.9: + axios@1.7.9: resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.1 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - /balanced-match@1.0.2: + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false - /base-x@3.0.10: + base-x@3.0.10: resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} - dependencies: - safe-buffer: 5.2.1 - dev: false - /base-x@4.0.0: + base-x@4.0.0: resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - dev: false - /base-x@5.0.0: + base-x@5.0.0: resolution: {integrity: sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==} - dev: false - /base64-js@1.5.1: + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - /big.js@6.2.2: + big.js@6.2.2: resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} - dev: false - /bigint-buffer@1.1.5: + bigint-buffer@1.1.5: resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} engines: {node: '>= 10.0.0'} - requiresBuild: true - dependencies: - bindings: 1.5.0 - dev: false - /bignumber.js@9.1.2: + bignumber.js@9.1.2: resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - dev: false - /bindings@1.5.0: + bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - dependencies: - file-uri-to-path: 1.0.0 - dev: false - /bn.js@5.2.1: + bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: false - /borsh@0.7.0: + borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - dev: false - /borsh@1.0.0: + borsh@1.0.0: resolution: {integrity: sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ==} - dev: false - /borsh@2.0.0: + borsh@2.0.0: resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - dev: false - /brace-expansion@2.0.1: + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: false - /bs58@4.0.1: + bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - dependencies: - base-x: 3.0.10 - dev: false - /bs58@5.0.0: + bs58@5.0.0: resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - dependencies: - base-x: 4.0.0 - dev: false - /bs58@6.0.0: + bs58@6.0.0: resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} - dependencies: - base-x: 5.0.0 - dev: false - /buffer@6.0.3: + buffer-layout@1.2.2: + resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} + engines: {node: '>=4.5'} + + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - /bufferutil@4.0.8: + bufferutil@4.0.8: resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.8.4 - dev: false - /camelcase@6.3.0: + camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - dev: false - /ccount@2.0.1: + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: false - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + chalk@5.4.0: + resolution: {integrity: sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false - /character-entities-html4@2.1.0: + character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: false - /character-entities-legacy@3.0.0: + character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: false - /combined-stream@1.0.8: + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - /comma-separated-tokens@2.0.3: + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false - /commander@10.0.1: + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - dev: false - /commander@12.1.0: + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - dev: false - /commander@2.20.3: + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: false - /create-require@1.1.1: + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - /dayjs@1.11.13: + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + + crypto-hash@1.3.0: + resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==} + engines: {node: '>=8'} + + dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - dev: false - /decamelize@1.2.0: + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - dev: false - /decimal.js-light@2.5.1: + decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - dev: false - /decimal.js@10.4.3: + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: false - /delay@5.0.0: + delay@5.0.0: resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} engines: {node: '>=10'} - dev: false - /delayed-stream@1.0.0: + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: false - /dequal@2.0.3: + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: false - /devlop@1.1.0: + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dependencies: - dequal: 2.0.3 - dev: false - /diff@4.0.2: + diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - dev: true - /dotenv@16.4.7: + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - dev: false - /emoji-regex-xs@1.0.0: + emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - dev: false - /entities@4.5.0: + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: false - /es6-promise@4.2.8: + es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: false - /es6-promisify@5.0.0: + es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - dependencies: - es6-promise: 4.2.8 - dev: false - /event-target-shim@5.0.1: + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - dev: false - /eventemitter3@4.0.7: + eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: false - /eventemitter3@5.0.1: + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: false - /eyes@0.1.8: + eyes@0.1.8: resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} engines: {node: '> 0.1.90'} - dev: false - /fast-stable-stringify@1.0.0: + fast-stable-stringify@1.0.0: resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - dev: false - /fastestsmallesttextencoderdecoder@1.0.22: + fastestsmallesttextencoderdecoder@1.0.22: resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - dev: false - /file-uri-to-path@1.0.0: + file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: false - /follow-redirects@1.15.9: + follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: @@ -1208,174 +786,86 @@ packages: peerDependenciesMeta: debug: optional: true - dev: false - /form-data-encoder@1.7.2: + form-data-encoder@1.7.2: resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} - dev: false - /form-data@4.0.1: + form-data@4.0.1: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - /formdata-node@4.4.1: + formdata-node@4.4.1: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 - dev: false - /graceful-fs@4.2.11: + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - requiresBuild: true - dev: false - optional: true - /graphemesplit@2.4.4: + graphemesplit@2.4.4: resolution: {integrity: sha512-lKrpp1mk1NH26USxC/Asw4OHbhSQf5XfrWZ+CDv/dFVvd1j17kFgMotdJvOesmHkbFX9P9sBfpH8VogxOWLg8w==} - dependencies: - js-base64: 3.7.7 - unicode-trie: 2.0.0 - dev: false - /groq-sdk@0.5.0: + groq-sdk@0.5.0: resolution: {integrity: sha512-RVmhW7qZ+XZoy5fIuSdx/LGQJONpL8MHgZEW7dFwTdgkzStub2XQx6OKv28CHogijdwH41J+Npj/z2jBPu3vmw==} - dependencies: - '@types/node': 18.19.68 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - web-streams-polyfill: 3.3.3 - transitivePeerDependencies: - - encoding - dev: false - /hast-util-to-html@9.0.4: + hast-util-to-html@9.0.4: resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - dev: false - /hast-util-whitespace@3.0.0: + hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - dependencies: - '@types/hast': 3.0.4 - dev: false - /html-void-elements@3.0.0: + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - dev: false - /humanize-ms@1.2.1: + humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - dependencies: - ms: 2.1.3 - dev: false - /ieee754@1.2.1: + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false - /ipaddr.js@2.2.0: + ipaddr.js@2.2.0: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} - dev: false - /isomorphic-ws@4.0.1(ws@7.5.10): + isomorphic-ws@4.0.1: resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} peerDependencies: ws: '*' - dependencies: - ws: 7.5.10 - dev: false - /jayson@4.1.3: + jayson@4.1.3: resolution: {integrity: sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==} engines: {node: '>=8'} hasBin: true - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - JSONStream: 1.3.5 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10) - json-stringify-safe: 5.0.1 - uuid: 8.3.2 - ws: 7.5.10 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - /js-base64@3.7.7: + js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} - dev: false - /js-tiktoken@1.0.15: - resolution: {integrity: sha512-65ruOWWXDEZHHbAo7EjOcNxOGasQKbL4Fq3jEr2xsCqSsoOo6VVSqzWQb6PRIqypFSDcma4jO90YP0w5X8qVXQ==} - dependencies: - base64-js: 1.5.1 - dev: false + js-tiktoken@1.0.16: + resolution: {integrity: sha512-nUVdO5k/M9llWpiaZlBBDdtmr6qWXwSD6fgaDu2zM8UP+OXxx9V37lFkI6w0/1IuaDx7WffZ37oYd9KvcWKElg==} - /js-yaml@4.1.0: + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - dependencies: - argparse: 2.0.1 - dev: false - /json-stringify-safe@5.0.1: + json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: false - /json5@2.2.3: + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - dev: false - /jsonfile@6.1.0: + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - dev: false - /jsonparse@1.3.1: + jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - dev: false - /jsonpointer@5.0.1: + jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - dev: false - /langchain@0.3.7(@langchain/core@0.3.23)(@langchain/groq@0.1.2)(openai@4.76.3): + langchain@0.3.7: resolution: {integrity: sha512-6/Gkk9Zez3HkbsETFxZVo1iKLmaK3OzkDseC5MYFKVmYFDXFAOyJR3srJ9P61xF8heVdsPixqYIsejBn7/9dXg==} engines: {node: '>=18'} peerDependencies: @@ -1420,156 +910,85 @@ packages: optional: true typeorm: optional: true - dependencies: - '@langchain/core': 0.3.23(openai@4.76.3) - '@langchain/groq': 0.1.2(@langchain/core@0.3.23) - '@langchain/openai': 0.3.14(@langchain/core@0.3.23) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.23) - js-tiktoken: 1.0.15 - js-yaml: 4.1.0 - jsonpointer: 5.0.1 - langsmith: 0.2.13(openai@4.76.3) - openapi-types: 12.1.3 - p-retry: 4.6.2 - uuid: 10.0.0 - yaml: 2.6.1 - zod: 3.24.1 - zod-to-json-schema: 3.24.1(zod@3.24.1) - transitivePeerDependencies: - - encoding - - openai - dev: false - /langsmith@0.2.13(openai@4.76.3): + langsmith@0.2.13: resolution: {integrity: sha512-16EOM5nhU6GlMCKGm5sgBIAKOKzS2d30qcDZmF21kSLZJiUhUNTROwvYdqgZLrGfIIzmSMJHCKA7RFd5qf50uw==} peerDependencies: openai: '*' peerDependenciesMeta: openai: optional: true - dependencies: - '@types/uuid': 10.0.0 - commander: 10.0.1 - openai: 4.76.3(zod@3.24.1) - p-queue: 6.6.2 - p-retry: 4.6.2 - semver: 7.6.3 - uuid: 10.0.0 - dev: false - /linkify-it@5.0.0: + linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - dependencies: - uc.micro: 2.1.0 - dev: false - /lodash@4.17.21: + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - /lunr@2.3.9: + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - dev: false - /make-error@1.3.6: + make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - /markdown-it@14.1.0: + markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.0 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - dev: false - /mdast-util-to-hast@13.2.0: + mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.1 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - dev: false - /mdurl@2.0.0: + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - dev: false - /micromark-util-character@2.1.1: + micromark-util-character@2.1.1: resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 - dev: false - /micromark-util-encode@2.0.1: + micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - dev: false - /micromark-util-sanitize-uri@2.0.1: + micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - dev: false - /micromark-util-symbol@2.0.1: + micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - dev: false - /micromark-util-types@2.0.1: + micromark-util-types@2.0.1: resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} - dev: false - /mime-db@1.52.0: + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - dev: false - /mime-types@2.1.35: + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - /minimatch@9.0.5: + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: false - /minimist@1.2.8: + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - /ms@2.1.3: + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false - /mustache@4.2.0: + mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true - dev: false - /node-domexception@1.0.0: + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} - dev: false - /node-fetch@2.7.0: + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -1577,206 +996,137 @@ packages: peerDependenciesMeta: encoding: optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - /node-gyp-build@4.8.4: + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - requiresBuild: true - dev: false - /oniguruma-to-es@0.7.0: - resolution: {integrity: sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==} - dependencies: - emoji-regex-xs: 1.0.0 - regex: 5.0.2 - regex-recursion: 4.3.0 - dev: false + oniguruma-to-es@0.8.0: + resolution: {integrity: sha512-rY+/a6b+uCgoYIL9itjY0x99UUDHXmGaw7Jjk5ZvM/3cxDJifyxFr/Zm4tTmF6Tre18gAakJo7AzhKUeMNLgHA==} - /openai@4.76.3(zod@3.24.1): - resolution: {integrity: sha512-BISkI90m8zT7BAMljK0j00TzOoLvmc7AulPxv6EARa++3+hhIK5G6z4xkITurEaA9bvDhQ09kSNKA3DL+rDMwA==} + openai@4.77.0: + resolution: {integrity: sha512-WWacavtns/7pCUkOWvQIjyOfcdr9X+9n9Vvb0zFeKVDAqwCMDHB+iSr24SVaBAhplvSG6JrRXFpcNM9gWhOGIw==} hasBin: true peerDependencies: zod: ^3.23.8 peerDependenciesMeta: zod: optional: true - dependencies: - '@types/node': 18.19.68 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - zod: 3.24.1 - transitivePeerDependencies: - - encoding - dev: false - /openapi-types@12.1.3: + openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} - dev: false - /p-finally@1.0.0: + p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} - dev: false - /p-queue@6.6.2: + p-queue@6.6.2: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - dev: false - /p-retry@4.6.2: + p-retry@4.6.2: resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} engines: {node: '>=8'} - dependencies: - '@types/retry': 0.12.0 - retry: 0.13.1 - dev: false - /p-timeout@3.2.0: + p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} - dependencies: - p-finally: 1.0.0 - dev: false - /pako@0.2.9: + pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - dev: false - /property-information@6.5.0: + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - dev: false - /proxy-from-env@1.1.0: + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false - /punycode.js@2.3.1: + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - dev: false - /punycode@2.3.1: + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - dev: false - /regenerator-runtime@0.14.1: + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: false - /regex-recursion@4.3.0: - resolution: {integrity: sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==} - dependencies: - regex-utilities: 2.3.0 - dev: false + regex-recursion@5.0.0: + resolution: {integrity: sha512-UwyOqeobrCCqTXPcsSqH4gDhOjD5cI/b8kjngWgSZbxYh5yVjAwTjO5+hAuPRNiuR70+5RlWSs+U9PVcVcW9Lw==} - /regex-utilities@2.3.0: + regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - dev: false - /regex@5.0.2: + regex@5.0.2: resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} - dependencies: - regex-utilities: 2.3.0 - dev: false - /retry@0.13.1: + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} - dev: false - /rpc-websockets@9.0.4: + rpc-websockets@9.0.4: resolution: {integrity: sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==} - dependencies: - '@swc/helpers': 0.5.15 - '@types/uuid': 8.3.4 - '@types/ws': 8.5.13 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - dev: false - /safe-buffer@5.2.1: + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - /semver@7.6.3: + semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - dev: false - /shiki@1.24.2: - resolution: {integrity: sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==} - dependencies: - '@shikijs/core': 1.24.2 - '@shikijs/engine-javascript': 1.24.2 - '@shikijs/engine-oniguruma': 1.24.2 - '@shikijs/types': 1.24.2 - '@shikijs/vscode-textmate': 9.3.1 - '@types/hast': 3.0.4 - dev: false + shiki@1.24.3: + resolution: {integrity: sha512-eMeX/ehE2IDKVs71kB4zVcDHjutNcOtm+yIRuR4sA6ThBbdFI0DffGJiyoKCodj0xRGxIoWC3pk/Anmm5mzHmA==} - /space-separated-tokens@2.0.2: + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false - /stringify-entities@4.0.4: + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: false - /strip-bom@3.0.0: + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: false - /superstruct@2.0.2: + superstruct@0.15.5: + resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} + + superstruct@2.0.2: resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} engines: {node: '>=14.0.0'} - dev: false - /text-encoding-utf-8@1.0.2: + text-encoding-utf-8@1.0.2: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - dev: false - /through@2.3.8: + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false - /tiny-inflate@1.0.3: + tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - dev: false - /toformat@2.0.0: + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + toformat@2.0.0: resolution: {integrity: sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==} - dev: false - /tr46@0.0.3: + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - /trim-lines@3.0.1: + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false - /ts-node@10.9.2(@types/node@22.10.2)(typescript@5.6.3): + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -1789,6 +1139,1390 @@ packages: optional: true '@swc/wasm': optional: true + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + typedoc@0.26.11: + resolution: {integrity: sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==} + engines: {node: '>= 18'} + hasBin: true + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x + + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + zod-to-json-schema@3.24.1: + resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + peerDependencies: + zod: ^3.24.1 + + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@bonfida/sns-records@0.0.1(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + borsh: 1.0.0 + bs58: 5.0.0 + buffer: 6.0.3 + + '@bonfida/spl-name-service@3.0.7(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@bonfida/sns-records': 0.0.1(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@noble/curves': 1.7.0 + '@scure/base': 1.2.1 + '@solana/spl-token': 0.4.6(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + borsh: 2.0.0 + buffer: 6.0.3 + graphemesplit: 2.4.4 + ipaddr.js: 2.2.0 + punycode: 2.3.1 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@cfworker/json-schema@4.0.3': {} + + '@coral-xyz/anchor@0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/borsh': 0.29.0(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@noble/hashes': 1.6.1 + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + bs58: 4.0.1 + buffer-layout: 1.2.2 + camelcase: 6.3.0 + cross-fetch: 3.1.8 + crypto-hash: 1.3.0 + eventemitter3: 4.0.7 + pako: 2.1.0 + snake-case: 3.0.4 + superstruct: 0.15.5 + toml: 3.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@coral-xyz/borsh@0.29.0(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + buffer-layout: 1.2.2 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))': + dependencies: + '@cfworker/json-schema': 4.0.3 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.16 + langsmith: 0.2.13(openai@4.77.0(zod@3.24.1)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + transitivePeerDependencies: + - openai + + '@langchain/groq@0.1.2(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1)))': + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0(zod@3.24.1)) + '@langchain/openai': 0.3.16(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))) + groq-sdk: 0.5.0 + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + transitivePeerDependencies: + - encoding + + '@langchain/langgraph-checkpoint@0.0.13(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1)))': + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0(zod@3.24.1)) + uuid: 10.0.0 + + '@langchain/langgraph-sdk@0.0.32': + dependencies: + '@types/json-schema': 7.0.15 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + + '@langchain/langgraph@0.2.34(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1)))': + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0(zod@3.24.1)) + '@langchain/langgraph-checkpoint': 0.0.13(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))) + '@langchain/langgraph-sdk': 0.0.32 + uuid: 10.0.0 + zod: 3.24.1 + + '@langchain/openai@0.3.16(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1)))': + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0(zod@3.24.1)) + js-tiktoken: 1.0.16 + openai: 4.77.0(zod@3.24.1) + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + transitivePeerDependencies: + - encoding + + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1)))': + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0(zod@3.24.1)) + js-tiktoken: 1.0.16 + + '@lightprotocol/compressed-token@0.17.1(@lightprotocol/stateless.js@0.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@lightprotocol/stateless.js': 0.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.4.8(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + buffer: 6.0.3 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@lightprotocol/stateless.js@0.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@noble/hashes': 1.5.0 + '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + buffer: 6.0.3 + superstruct: 2.0.2 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@metaplex-foundation/mpl-core@1.1.1(@metaplex-foundation/umi@0.9.2)(@noble/hashes@1.6.1)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + '@msgpack/msgpack': 3.0.0-beta2 + '@noble/hashes': 1.6.1 + + '@metaplex-foundation/mpl-token-metadata@3.3.0(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/mpl-toolbox': 0.9.4(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/umi': 0.9.2 + + '@metaplex-foundation/mpl-toolbox@0.9.4(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + + '@metaplex-foundation/umi-bundle-defaults@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + '@metaplex-foundation/umi-downloader-http': 0.9.2(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/umi-eddsa-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metaplex-foundation/umi-http-fetch': 0.9.2(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/umi-program-repository': 0.9.2(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/umi-rpc-chunk-get-accounts': 0.9.2(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/umi-rpc-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@metaplex-foundation/umi-serializer-data-view': 0.9.2(@metaplex-foundation/umi@0.9.2) + '@metaplex-foundation/umi-transaction-factory-web3js': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - encoding + + '@metaplex-foundation/umi-downloader-http@0.9.2(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + + '@metaplex-foundation/umi-eddsa-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@noble/curves': 1.7.0 + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + '@metaplex-foundation/umi-http-fetch@0.9.2(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@metaplex-foundation/umi-options@0.8.9': {} + + '@metaplex-foundation/umi-program-repository@0.9.2(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + + '@metaplex-foundation/umi-public-keys@0.8.9': + dependencies: + '@metaplex-foundation/umi-serializers-encodings': 0.8.9 + + '@metaplex-foundation/umi-rpc-chunk-get-accounts@0.9.2(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + + '@metaplex-foundation/umi-rpc-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + '@metaplex-foundation/umi-serializer-data-view@0.9.2(@metaplex-foundation/umi@0.9.2)': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + + '@metaplex-foundation/umi-serializers-core@0.8.9': {} + + '@metaplex-foundation/umi-serializers-encodings@0.8.9': + dependencies: + '@metaplex-foundation/umi-serializers-core': 0.8.9 + + '@metaplex-foundation/umi-serializers-numbers@0.8.9': + dependencies: + '@metaplex-foundation/umi-serializers-core': 0.8.9 + + '@metaplex-foundation/umi-serializers@0.9.0': + dependencies: + '@metaplex-foundation/umi-options': 0.8.9 + '@metaplex-foundation/umi-public-keys': 0.8.9 + '@metaplex-foundation/umi-serializers-core': 0.8.9 + '@metaplex-foundation/umi-serializers-encodings': 0.8.9 + '@metaplex-foundation/umi-serializers-numbers': 0.8.9 + + '@metaplex-foundation/umi-transaction-factory-web3js@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + '@metaplex-foundation/umi-web3js-adapters': 0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + '@metaplex-foundation/umi-web3js-adapters@0.9.2(@metaplex-foundation/umi@0.9.2)(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@metaplex-foundation/umi': 0.9.2 + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + buffer: 6.0.3 + + '@metaplex-foundation/umi@0.9.2': + dependencies: + '@metaplex-foundation/umi-options': 0.8.9 + '@metaplex-foundation/umi-public-keys': 0.8.9 + '@metaplex-foundation/umi-serializers': 0.9.0 + + '@msgpack/msgpack@3.0.0-beta2': {} + + '@noble/curves@1.7.0': + dependencies: + '@noble/hashes': 1.6.0 + + '@noble/hashes@1.5.0': {} + + '@noble/hashes@1.6.0': {} + + '@noble/hashes@1.6.1': {} + + '@orca-so/common-sdk@0.6.4(@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(decimal.js@10.4.3)': + dependencies: + '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + decimal.js: 10.4.3 + tiny-invariant: 1.3.3 + + '@orca-so/whirlpools-sdk@0.13.12(@coral-xyz/anchor@0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@orca-so/common-sdk@0.6.4(@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(decimal.js@10.4.3))(@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(decimal.js@10.4.3)': + dependencies: + '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@orca-so/common-sdk': 0.6.4(@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10))(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(decimal.js@10.4.3) + '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + decimal.js: 10.4.3 + tiny-invariant: 1.3.3 + + '@raydium-io/raydium-sdk-v2@0.1.95-alpha(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/spl-token': 0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + axios: 1.7.9 + big.js: 6.2.2 + bn.js: 5.2.1 + dayjs: 1.11.13 + decimal.js-light: 2.5.1 + jsonfile: 6.1.0 + lodash: 4.17.21 + toformat: 2.0.0 + tsconfig-paths: 4.2.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@scure/base@1.2.1': {} + + '@shikijs/core@1.24.3': + dependencies: + '@shikijs/engine-javascript': 1.24.3 + '@shikijs/engine-oniguruma': 1.24.3 + '@shikijs/types': 1.24.3 + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.4 + + '@shikijs/engine-javascript@1.24.3': + dependencies: + '@shikijs/types': 1.24.3 + '@shikijs/vscode-textmate': 9.3.1 + oniguruma-to-es: 0.8.0 + + '@shikijs/engine-oniguruma@1.24.3': + dependencies: + '@shikijs/types': 1.24.3 + '@shikijs/vscode-textmate': 9.3.1 + + '@shikijs/types@1.24.3': + dependencies: + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@9.3.1': {} + + '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bigint-buffer: 1.1.5 + bignumber.js: 9.1.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/codecs-core@2.0.0-preview.2': + dependencies: + '@solana/errors': 2.0.0-preview.2 + + '@solana/codecs-core@2.0.0-preview.4(typescript@5.7.2)': + dependencies: + '@solana/errors': 2.0.0-preview.4(typescript@5.7.2) + typescript: 5.7.2 + + '@solana/codecs-core@2.0.0-rc.1(typescript@5.7.2)': + dependencies: + '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) + typescript: 5.7.2 + + '@solana/codecs-data-structures@2.0.0-preview.2': + dependencies: + '@solana/codecs-core': 2.0.0-preview.2 + '@solana/codecs-numbers': 2.0.0-preview.2 + '@solana/errors': 2.0.0-preview.2 + + '@solana/codecs-data-structures@2.0.0-preview.4(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.7.2) + '@solana/errors': 2.0.0-preview.4(typescript@5.7.2) + typescript: 5.7.2 + + '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.7.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) + typescript: 5.7.2 + + '@solana/codecs-numbers@2.0.0-preview.2': + dependencies: + '@solana/codecs-core': 2.0.0-preview.2 + '@solana/errors': 2.0.0-preview.2 + + '@solana/codecs-numbers@2.0.0-preview.4(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.7.2) + '@solana/errors': 2.0.0-preview.4(typescript@5.7.2) + typescript: 5.7.2 + + '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.7.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) + typescript: 5.7.2 + + '@solana/codecs-strings@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': + dependencies: + '@solana/codecs-core': 2.0.0-preview.2 + '@solana/codecs-numbers': 2.0.0-preview.2 + '@solana/errors': 2.0.0-preview.2 + fastestsmallesttextencoderdecoder: 1.0.22 + + '@solana/codecs-strings@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.7.2) + '@solana/errors': 2.0.0-preview.4(typescript@5.7.2) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.7.2 + + '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.7.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.7.2 + + '@solana/codecs@2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22)': + dependencies: + '@solana/codecs-core': 2.0.0-preview.2 + '@solana/codecs-data-structures': 2.0.0-preview.2 + '@solana/codecs-numbers': 2.0.0-preview.2 + '@solana/codecs-strings': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) + '@solana/options': 2.0.0-preview.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/codecs@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-data-structures': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-strings': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/options': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@2.0.0-preview.2': + dependencies: + chalk: 5.4.0 + commander: 12.1.0 + + '@solana/errors@2.0.0-preview.4(typescript@5.7.2)': + dependencies: + chalk: 5.4.0 + commander: 12.1.0 + typescript: 5.7.2 + + '@solana/errors@2.0.0-rc.1(typescript@5.7.2)': + dependencies: + chalk: 5.4.0 + commander: 12.1.0 + typescript: 5.7.2 + + '@solana/options@2.0.0-preview.2': + dependencies: + '@solana/codecs-core': 2.0.0-preview.2 + '@solana/codecs-numbers': 2.0.0-preview.2 + + '@solana/options@2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-data-structures': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-preview.4(typescript@5.7.2) + '@solana/codecs-strings': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/errors': 2.0.0-preview.4(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.7.2) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/errors': 2.0.0-rc.1(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/spl-token-group@0.0.4(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)': + dependencies: + '@solana/codecs': 2.0.0-preview.2(fastestsmallesttextencoderdecoder@1.0.22) + '@solana/spl-type-length-value': 0.1.0 + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/spl-token-group@0.0.5(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs': 2.0.0-preview.4(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/spl-type-length-value': 0.1.0 + '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token@0.4.6(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/spl-token-group': 0.0.4(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana/spl-token@0.4.8(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/spl-token-group': 0.0.5(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana/spl-token@0.4.9(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2) + '@solana/web3.js': 1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana/spl-type-length-value@0.1.0': + dependencies: + buffer: 6.0.3 + + '@solana/web3.js@1.95.3(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.26.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.5.0 + bigint-buffer: 1.1.5 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.1.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 9.0.4 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@solana/web3.js@1.98.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.26.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.5.0 + bigint-buffer: 1.1.5 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.1.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 9.0.4 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/bn.js@5.1.6': + dependencies: + '@types/node': 22.10.2 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.10.2 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/node-fetch@2.6.12': + dependencies: + '@types/node': 22.10.2 + form-data: 4.0.1 + + '@types/node@12.20.55': {} + + '@types/node@18.19.68': + dependencies: + undici-types: 5.26.5 + + '@types/node@22.10.2': + dependencies: + undici-types: 6.20.0 + + '@types/retry@0.12.0': {} + + '@types/unist@3.0.3': {} + + '@types/uuid@10.0.0': {} + + '@types/uuid@8.3.4': {} + + '@types/ws@7.4.7': + dependencies: + '@types/node': 22.10.2 + + '@types/ws@8.5.13': + dependencies: + '@types/node': 22.10.2 + + '@ungap/structured-clone@1.2.1': {} + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + agentkeepalive@4.5.0: + dependencies: + humanize-ms: 1.2.1 + + ansi-styles@5.2.0: {} + + arg@4.1.3: {} + + argparse@2.0.1: {} + + asynckit@0.4.0: {} + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base-x@3.0.10: + dependencies: + safe-buffer: 5.2.1 + + base-x@4.0.0: {} + + base-x@5.0.0: {} + + base64-js@1.5.1: {} + + big.js@6.2.2: {} + + bigint-buffer@1.1.5: + dependencies: + bindings: 1.5.0 + + bignumber.js@9.1.2: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bn.js@5.2.1: {} + + borsh@0.7.0: + dependencies: + bn.js: 5.2.1 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + + borsh@1.0.0: {} + + borsh@2.0.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + bs58@4.0.1: + dependencies: + base-x: 3.0.10 + + bs58@5.0.0: + dependencies: + base-x: 4.0.0 + + bs58@6.0.0: + dependencies: + base-x: 5.0.0 + + buffer-layout@1.2.2: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.0.8: + dependencies: + node-gyp-build: 4.8.4 + optional: true + + camelcase@6.3.0: {} + + ccount@2.0.1: {} + + chalk@5.4.0: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@10.0.1: {} + + commander@12.1.0: {} + + commander@2.20.3: {} + + create-require@1.1.1: {} + + cross-fetch@3.1.8: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + crypto-hash@1.3.0: {} + + dayjs@1.11.13: {} + + decamelize@1.2.0: {} + + decimal.js-light@2.5.1: {} + + decimal.js@10.4.3: {} + + delay@5.0.0: {} + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@4.0.2: {} + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dotenv@16.4.7: {} + + emoji-regex-xs@1.0.0: {} + + entities@4.5.0: {} + + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: + dependencies: + es6-promise: 4.2.8 + + event-target-shim@5.0.1: {} + + eventemitter3@4.0.7: {} + + eventemitter3@5.0.1: {} + + eyes@0.1.8: {} + + fast-stable-stringify@1.0.0: {} + + fastestsmallesttextencoderdecoder@1.0.22: {} + + file-uri-to-path@1.0.0: {} + + follow-redirects@1.15.9: {} + + form-data-encoder@1.7.2: {} + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + + graceful-fs@4.2.11: + optional: true + + graphemesplit@2.4.4: + dependencies: + js-base64: 3.7.7 + unicode-trie: 2.0.0 + + groq-sdk@0.5.0: + dependencies: + '@types/node': 18.19.68 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + + hast-util-to-html@9.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + html-void-elements@3.0.0: {} + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + ieee754@1.2.1: {} + + ipaddr.js@2.2.0: {} + + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + dependencies: + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + jayson@4.1.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + JSONStream: 1.3.5 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + json-stringify-safe: 5.0.1 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + js-base64@3.7.7: {} + + js-tiktoken@1.0.16: + dependencies: + base64-js: 1.5.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-stringify-safe@5.0.1: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + jsonpointer@5.0.1: {} + + langchain@0.3.7(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1)))(@langchain/groq@0.1.2(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))))(axios@1.7.9)(openai@4.77.0(zod@3.24.1)): + dependencies: + '@langchain/core': 0.3.26(openai@4.77.0(zod@3.24.1)) + '@langchain/openai': 0.3.16(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))) + js-tiktoken: 1.0.16 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langsmith: 0.2.13(openai@4.77.0(zod@3.24.1)) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.6.1 + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + optionalDependencies: + '@langchain/groq': 0.1.2(@langchain/core@0.3.26(openai@4.77.0(zod@3.24.1))) + axios: 1.7.9 + transitivePeerDependencies: + - encoding + - openai + + langsmith@0.2.13(openai@4.77.0(zod@3.24.1)): + dependencies: + '@types/uuid': 10.0.0 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.6.3 + uuid: 10.0.0 + optionalDependencies: + openai: 4.77.0(zod@3.24.1) + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + lodash@4.17.21: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lunr@2.3.9: {} + + make-error@1.3.6: {} + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdurl@2.0.0: {} + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + ms@2.1.3: {} + + mustache@4.2.0: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-domexception@1.0.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: + optional: true + + oniguruma-to-es@0.8.0: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.0.2 + regex-recursion: 5.0.0 + + openai@4.77.0(zod@3.24.1): + dependencies: + '@types/node': 18.19.68 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + zod: 3.24.1 + transitivePeerDependencies: + - encoding + + openapi-types@12.1.3: {} + + p-finally@1.0.0: {} + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + pako@0.2.9: {} + + pako@2.1.0: {} + + property-information@6.5.0: {} + + proxy-from-env@1.1.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + regenerator-runtime@0.14.1: {} + + regex-recursion@5.0.0: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.0.2: + dependencies: + regex-utilities: 2.3.0 + + retry@0.13.1: {} + + rpc-websockets@9.0.4: + dependencies: + '@swc/helpers': 0.5.15 + '@types/uuid': 8.3.4 + '@types/ws': 8.5.13 + buffer: 6.0.3 + eventemitter3: 5.0.1 + uuid: 8.3.2 + ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + safe-buffer@5.2.1: {} + + semver@7.6.3: {} + + shiki@1.24.3: + dependencies: + '@shikijs/core': 1.24.3 + '@shikijs/engine-javascript': 1.24.3 + '@shikijs/engine-oniguruma': 1.24.3 + '@shikijs/types': 1.24.3 + '@shikijs/vscode-textmate': 9.3.1 + '@types/hast': 3.0.4 + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + space-separated-tokens@2.0.2: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-bom@3.0.0: {} + + superstruct@0.15.5: {} + + superstruct@2.0.2: {} + + text-encoding-utf-8@1.0.2: {} + + through@2.3.8: {} + + tiny-inflate@1.0.3: {} + + tiny-invariant@1.3.3: {} + + toformat@2.0.0: {} + + toml@3.0.0: {} + + tr46@0.0.3: {} + + trim-lines@3.0.1: {} + + ts-node@10.9.2(@types/node@22.10.2)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -1802,214 +2536,119 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.3 + typescript: 5.7.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: false - /tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - dev: false + tslib@2.8.1: {} - /typedoc@0.26.11(typescript@5.6.3): - resolution: {integrity: sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==} - engines: {node: '>= 18'} - hasBin: true - peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x + tweetnacl@1.0.3: {} + + typedoc@0.26.11(typescript@5.7.2): dependencies: lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - shiki: 1.24.2 - typescript: 5.6.3 + shiki: 1.24.3 + typescript: 5.7.2 yaml: 2.6.1 - dev: false - /typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.7.2: {} - /uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - dev: false + uc.micro@2.1.0: {} - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: false + undici-types@5.26.5: {} - /undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@6.20.0: {} - /unicode-trie@2.0.0: - resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + unicode-trie@2.0.0: dependencies: pako: 0.2.9 tiny-inflate: 1.0.3 - dev: false - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 - dev: false - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.3 - dev: false - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 - dev: false - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 - dev: false - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - dev: false - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: false + universalify@2.0.1: {} - /utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - requiresBuild: true + utf-8-validate@5.0.10: dependencies: node-gyp-build: 4.8.4 - dev: false + optional: true - /uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - dev: false + uuid@10.0.0: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: false + uuid@8.3.2: {} - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false + uuid@9.0.1: {} - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true + v8-compile-cache-lib@3.0.1: {} - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 - dev: false - /vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vfile@6.0.3: dependencies: '@types/unist': 3.0.3 vfile-message: 4.0.2 - dev: false - /web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - dev: false + web-streams-polyfill@3.3.3: {} - /web-streams-polyfill@4.0.0-beta.3: - resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} - engines: {node: '>= 14'} - dev: false + web-streams-polyfill@4.0.0-beta.3: {} - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false + webidl-conversions@3.0.1: {} - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: false - /ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - - /ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: + ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 5.0.10 - dev: false - /yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} - engines: {node: '>= 14'} - hasBin: true - dev: false + ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true + yaml@2.6.1: {} - /zod-to-json-schema@3.24.1(zod@3.24.1): - resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} - peerDependencies: - zod: ^3.24.1 + yn@3.1.1: {} + + zod-to-json-schema@3.24.1(zod@3.24.1): dependencies: zod: 3.24.1 - dev: false - /zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} - dev: false + zod@3.24.1: {} - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: false + zwitch@2.0.4: {} diff --git a/src/agent/index.ts b/src/agent/index.ts index 85eac42..721e464 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -1,5 +1,4 @@ -import { Connection, Keypair, PublicKey } from "@solana/web3.js"; -import BN from "bn.js"; +import { Connection, Keypair, PublicKey } from "@solana/web3.js";; import bs58 from "bs58"; import Decimal from "decimal.js"; import { DEFAULT_OPTIONS } from "../constants"; @@ -8,6 +7,8 @@ import { deploy_token, get_balance, getTPS, + resolveSolDomain, + getPrimaryDomain, launchPumpFunToken, lendAsset, mintCollectionNFT, @@ -19,8 +20,15 @@ import { request_faucet_funds, trade, transfer, + getTokenDataByAddress, + getTokenDataByTicker, + stakeWithJup, + sendCompressedAirdrop, + createOrcaSingleSidedWhirlpool, + FEE_TIERS } from "../tools"; import { CollectionOptions, PumpFunTokenOptions } from "../types"; +import { BN } from "@coral-xyz/anchor"; /** * Main class for interacting with Solana blockchain @@ -40,7 +48,7 @@ export class SolanaAgentKit { constructor( private_key: string, rpc_url = "https://api.mainnet-beta.solana.com", - openai_api_key: string, + openai_api_key: string ) { this.connection = new Connection(rpc_url); this.wallet = Keypair.fromSecretKey(bs58.decode(private_key)); @@ -54,10 +62,13 @@ export class SolanaAgentKit { } async deployToken( + name: string, + uri: string, + symbol: string, decimals: number = DEFAULT_OPTIONS.TOKEN_DECIMALS, - // initialSupply?: number + initialSupply?: number ) { - return deploy_token(this, decimals); + return deploy_token(this, name, uri, symbol, decimals, initialSupply); } async deployCollection(options: CollectionOptions) { @@ -71,7 +82,7 @@ export class SolanaAgentKit { async mintNFT( collectionMint: PublicKey, metadata: Parameters[2], - recipient?: PublicKey, + recipient?: PublicKey ) { return mintCollectionNFT(this, collectionMint, metadata, recipient); } @@ -84,11 +95,19 @@ export class SolanaAgentKit { return registerDomain(this, name, spaceKB); } + async resolveSolDomain(domain: string) { + return resolveSolDomain(this, domain); + } + + async getPrimaryDomain(account: PublicKey) { + return getPrimaryDomain(this, account); + } + async trade( outputMint: PublicKey, inputAmount: number, inputMint?: PublicKey, - slippageBps: number = DEFAULT_OPTIONS.SLIPPAGE_BPS, + slippageBps: number = DEFAULT_OPTIONS.SLIPPAGE_BPS ) { return trade(this, outputMint, inputAmount, inputMint, slippageBps); } @@ -101,12 +120,20 @@ export class SolanaAgentKit { return getTPS(this); } + async getTokenDataByAddress(mint: string) { + return getTokenDataByAddress(new PublicKey(mint)); + } + + async getTokenDataByTicker(ticker: string) { + return getTokenDataByTicker(ticker); + } + async launchPumpFunToken( tokenName: string, tokenTicker: string, description: string, imageUrl: string, - options?: PumpFunTokenOptions, + options?: PumpFunTokenOptions ) { return launchPumpFunToken( this, @@ -114,10 +141,52 @@ export class SolanaAgentKit { tokenTicker, description, imageUrl, - options, + options ); } + async stake(amount: number) { + return stakeWithJup(this, amount); + } + + async sendCompressedAirdrop( + mintAddress: string, + amount: number, + decimals: number, + recipients: string[], + priorityFeeInLamports: number, + shouldLog: boolean + ): Promise { + return await sendCompressedAirdrop( + this, + new PublicKey(mintAddress), + amount, + decimals, + recipients.map((recipient) => new PublicKey(recipient)), + priorityFeeInLamports, + shouldLog + ); + } + + async createOrcaSingleSidedWhirlpool( + depositTokenAmount: BN, + depositTokenMint: PublicKey, + otherTokenMint: PublicKey, + initialPrice: Decimal, + maxPrice: Decimal, + feeTier: keyof typeof FEE_TIERS, + ) { + return createOrcaSingleSidedWhirlpool( + this, + depositTokenAmount, + depositTokenMint, + otherTokenMint, + initialPrice, + maxPrice, + feeTier + ) + } + async raydiumCreateAmmV4( marketId: PublicKey, diff --git a/src/langchain/index.ts b/src/langchain/index.ts index 0b85b1d..930b0bf 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -1,9 +1,11 @@ import { PublicKey } from "@solana/web3.js"; -import { BN } from "bn.js"; import Decimal from "decimal.js"; import { Tool } from "langchain/tools"; import { SolanaAgentKit } from "../index"; import { create_image } from "../tools/create_image"; +import { fetchPrice } from "../tools/fetch_price"; +import { BN } from "@coral-xyz/anchor"; +import { FEE_TIERS } from "../tools"; import { toJSON } from "../utils/toJSON"; export class SolanaBalanceTool extends Tool { @@ -56,7 +58,6 @@ export class SolanaTransferTool extends Tool { protected async _call(input: string): Promise { try { const parsedInput = JSON.parse(input); - console.log(parsedInput); const recipient = new PublicKey(parsedInput.to); const mintAddress = parsedInput.mint @@ -89,38 +90,30 @@ export class SolanaTransferTool extends Tool { export class SolanaDeployTokenTool extends Tool { name = "solana_deploy_token"; - description = - "Deploy a new SPL token. Input should be JSON string with: {decimals?: number, initialSupply?: number}"; + description = `Deploy a new token on Solana blockchain. + + Inputs (input is a JSON string): + name: string, eg "My Token" (required) + uri: string, eg "https://example.com/token.json" (required) + symbol: string, eg "MTK" (required) + decimals?: number, eg 9 (optional, defaults to 9) + initialSupply?: number, eg 1000000 (optional)`; constructor(private solanaKit: SolanaAgentKit) { super(); } - private validateInput(input: any): void { - if ( - input.decimals !== undefined && - (typeof input.decimals !== "number" || - input.decimals < 0 || - input.decimals > 9) - ) { - throw new Error( - "decimals must be a number between 0 and 9 when provided" - ); - } - if ( - input.initialSupply !== undefined && - (typeof input.initialSupply !== "number" || input.initialSupply <= 0) - ) { - throw new Error("initialSupply must be a positive number when provided"); - } - } - protected async _call(input: string): Promise { try { - const parsedInput = toJSON(input); - this.validateInput(parsedInput); + const parsedInput = JSON.parse(input); - const result = await this.solanaKit.deployToken(parsedInput.decimals); + const result = await this.solanaKit.deployToken( + parsedInput.name, + parsedInput.uri, + parsedInput.symbol, + parsedInput.decimals, + parsedInput.initialSupply + ); return JSON.stringify({ status: "success", @@ -140,57 +133,20 @@ export class SolanaDeployTokenTool extends Tool { export class SolanaDeployCollectionTool extends Tool { name = "solana_deploy_collection"; - description = - "Deploy a new NFT collection. Input should be JSON with: {name: string, uri: string, royaltyBasisPoints?: number, creators?: Array<{address: string, percentage: number}>}"; + description = `Deploy a new NFT collection on Solana blockchain. + + Inputs (input is a JSON string): + name: string, eg "My Collection" (required) + uri: string, eg "https://example.com/collection.json" (required) + royaltyBasisPoints?: number, eg 500 for 5% (optional)`; constructor(private solanaKit: SolanaAgentKit) { super(); } - private validateInput(input: any): void { - if (!input.name || typeof input.name !== "string") { - throw new Error("name is required and must be a string"); - } - if (!input.uri || typeof input.uri !== "string") { - throw new Error("uri is required and must be a string"); - } - if ( - input.royaltyBasisPoints !== undefined && - (typeof input.royaltyBasisPoints !== "number" || - input.royaltyBasisPoints < 0 || - input.royaltyBasisPoints > 10000) - ) { - throw new Error( - "royaltyBasisPoints must be a number between 0 and 10000 when provided" - ); - } - if (input.creators) { - if (!Array.isArray(input.creators)) { - throw new Error("creators must be an array when provided"); - } - input.creators.forEach((creator: any, index: number) => { - if (!creator.address || typeof creator.address !== "string") { - throw new Error( - `creator[${index}].address is required and must be a string` - ); - } - if ( - typeof creator.percentage !== "number" || - creator.percentage < 0 || - creator.percentage > 100 - ) { - throw new Error( - `creator[${index}].percentage must be a number between 0 and 100` - ); - } - }); - } - } - protected async _call(input: string): Promise { try { - const parsedInput = toJSON(input); - this.validateInput(parsedInput); + const parsedInput = JSON.parse(input); const result = await this.solanaKit.deployCollection(parsedInput); @@ -212,50 +168,42 @@ export class SolanaDeployCollectionTool extends Tool { export class SolanaMintNFTTool extends Tool { name = "solana_mint_nft"; - description = - "Mint a new NFT in a collection. Input should be JSON with: {collectionMint: string, metadata: {name: string, symbol: string, uri: string}, recipient?: string}"; + description = `Mint a new NFT in a collection on Solana blockchain. + + Inputs (input is a JSON string): + collectionMint: string, eg "J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w" (required) - The address of the collection to mint into + name: string, eg "My NFT" (required) + uri: string, eg "https://example.com/nft.json" (required) + recipient?: string, eg "9aUn5swQzUTRanaaTwmszxiv89cvFwUCjEBv1vZCoT1u" (optional) - The wallet to receive the NFT, defaults to agent's wallet which is ${this.solanaKit.wallet_address.toString()}`; constructor(private solanaKit: SolanaAgentKit) { super(); } - private validateInput(input: any): void { - if (!input.collectionMint || typeof input.collectionMint !== "string") { - throw new Error("collectionMint is required and must be a string"); - } - if (!input.metadata || typeof input.metadata !== "object") { - throw new Error("metadata is required and must be an object"); - } - if (!input.metadata.name || typeof input.metadata.name !== "string") { - throw new Error("metadata.name is required and must be a string"); - } - if (!input.metadata.symbol || typeof input.metadata.symbol !== "string") { - throw new Error("metadata.symbol is required and must be a string"); - } - if (!input.metadata.uri || typeof input.metadata.uri !== "string") { - throw new Error("metadata.uri is required and must be a string"); - } - if (input.recipient !== undefined && typeof input.recipient !== "string") { - throw new Error("recipient must be a string when provided"); - } - } - protected async _call(input: string): Promise { try { - const parsedInput = toJSON(input); - this.validateInput(parsedInput); + const parsedInput = JSON.parse(input); const result = await this.solanaKit.mintNFT( new PublicKey(parsedInput.collectionMint), - parsedInput.metadata, - parsedInput.recipient ? new PublicKey(parsedInput.recipient) : undefined + { + name: parsedInput.name, + uri: parsedInput.uri, + }, + parsedInput.recipient + ? new PublicKey(parsedInput.recipient) + : this.solanaKit.wallet_address ); return JSON.stringify({ status: "success", message: "NFT minted successfully", mintAddress: result.mint.toString(), - name: parsedInput.metadata.name, + metadata: { + name: parsedInput.name, + symbol: parsedInput.symbol, + uri: parsedInput.uri, + }, recipient: parsedInput.recipient || result.mint.toString(), }); } catch (error: any) { @@ -304,7 +252,6 @@ export class SolanaTradeTool extends Tool { outputToken: parsedInput.outputMint, }); } catch (error: any) { - console.log(error); return JSON.stringify({ status: "error", message: error.message, @@ -393,6 +340,70 @@ export class SolanaRegisterDomainTool extends Tool { } } +export class SolanaResolveDomainTool extends Tool { + name = "solana_resolve_domain"; + description = `Resolve a .sol domain to a Solana PublicKey. + + Inputs: + domain: string, eg "pumpfun.sol" or "pumpfun"(required) + `; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const domain = input.trim(); + const publicKey = await this.solanaKit.resolveSolDomain(domain); + + return JSON.stringify({ + status: "success", + message: "Domain resolved successfully", + publicKey: publicKey.toBase58(), + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +export class SolanaGetDomainTool extends Tool { + name = "solana_get_domain"; + description = `Retrieve the .sol domain associated for a given account address. + + Inputs: + account: string, eg "4Be9CvxqHW6BYiRAxW9Q3xu1ycTMWaL5z8NX4HR3ha7t" (required) + `; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const account = new PublicKey(input.trim()); + const domain = await this.solanaKit.getPrimaryDomain(account); + + return JSON.stringify({ + status: "success", + message: "Primary domain retrieved successfully", + domain, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + export class SolanaGetWalletAddressTool extends Tool { name = "solana_get_wallet_address"; description = `Get the wallet address of the agent`; @@ -425,7 +436,6 @@ export class SolanaPumpfunTokenLaunchTool extends Tool { } private validateInput(input: any): void { - console.log(input); if (!input.tokenName || typeof input.tokenName !== "string") { throw new Error("tokenName is required and must be a string"); } @@ -570,6 +580,230 @@ export class SolanaTPSCalculatorTool extends Tool { } } +export class SolanaStakeTool extends Tool { + name = "solana_stake"; + description = `This tool can be used to stake your SOL (Solana), also called as SOL staking or liquid staking. + + Inputs ( input is a JSON string ): + amount: number, eg 1 or 0.01 (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input) || Number(input); + + const tx = await this.solanaKit.stake(parsedInput.amount); + + return JSON.stringify({ + status: "success", + message: "Staked successfully", + transaction: tx, + amount: parsedInput.amount, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +/** + * Tool to fetch the price of a token in USDC + */ +export class SolanaFetchPriceTool extends Tool { + name = "solana_fetch_price"; + description = `Fetch the price of a given token in USDC. + + Inputs: + - tokenId: string, the mint address of the token, e.g., "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN"`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + async _call(input: string): Promise { + try { + const price = await fetchPrice(this.solanaKit, input.trim()); + return JSON.stringify({ + status: "success", + tokenId: input.trim(), + priceInUSDC: price, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +export class SolanaTokenDataTool extends Tool { + name = "solana_token_data"; + description = `Get the token data for a given token mint address + + Inputs: mintAddress is required. + mintAddress: string, eg "So11111111111111111111111111111111111111112" (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = input.trim(); + + const tokenData = await this.solanaKit.getTokenDataByAddress(parsedInput); + + return JSON.stringify({ + status: "success", + tokenData: tokenData, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +export class SolanaTokenDataByTickerTool extends Tool { + name = "solana_token_data_by_ticker"; + description = `Get the token data for a given token ticker + + Inputs: ticker is required. + ticker: string, eg "USDC" (required)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const ticker = input.trim(); + const tokenData = await this.solanaKit.getTokenDataByTicker(ticker); + return JSON.stringify({ + status: "success", + tokenData: tokenData, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +export class SolanaCompressedAirdropTool extends Tool { + name = "solana_compressed_airdrop"; + description = `Airdrop SPL tokens with ZK Compression (also called as airdropping tokens) + + Inputs (input is a JSON string): + mintAddress: string, the mint address of the token, e.g., "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN" (required) + amount: number, the amount of tokens to airdrop per recipient, e.g., 42 (required) + decimals: number, the decimals of the token, e.g., 6 (required) + recipients: string[], the recipient addresses, e.g., ["1nc1nerator11111111111111111111111111111111"] (required) + priorityFeeInLamports: number, the priority fee in lamports. Default is 30_000. (optional) + shouldLog: boolean, whether to log progress to stdout. Default is false. (optional)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + + const txs = await this.solanaKit.sendCompressedAirdrop( + parsedInput.mintAddress, + parsedInput.amount, + parsedInput.decimals, + parsedInput.recipients, + parsedInput.priorityFeeInLamports || 30_000, + parsedInput.shouldLog || false + ); + + return JSON.stringify({ + status: "success", + message: `Airdropped ${parsedInput.amount} tokens to ${parsedInput.recipients.length} recipients.`, + transactionHashes: txs, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + +export class SolanaCreateSingleSidedWhirlpoolTool extends Tool { + name = "create_orca_single_sided_whirlpool"; + description = `Create a single-sided Whirlpool with liquidity. + + Inputs (input is a JSON string): + - depositTokenAmount: number, eg: 1000000000 (required, in units of deposit token including decimals) + - depositTokenMint: string, eg: "DepositTokenMintAddress" (required, mint address of deposit token) + - otherTokenMint: string, eg: "OtherTokenMintAddress" (required, mint address of other token) + - initialPrice: number, eg: 0.001 (required, initial price of deposit token in terms of other token) + - maxPrice: number, eg: 5.0 (required, maximum price at which liquidity is added) + - feeTier: number, eg: 0.30 (required, fee tier for the pool)`; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + async _call(input: string): Promise { + try { + const inputFormat = JSON.parse(input); + const depositTokenAmount = new BN(inputFormat.depositTokenAmount); + const depositTokenMint = new PublicKey(inputFormat.depositTokenMint); + const otherTokenMint = new PublicKey(inputFormat.otherTokenMint); + const initialPrice = new Decimal(inputFormat.initialPrice); + const maxPrice = new Decimal(inputFormat.maxPrice); + const feeTier = inputFormat.feeTier; + + if (!feeTier || !(feeTier in FEE_TIERS)) { + throw new Error(`Invalid feeTier. Available options: ${Object.keys(FEE_TIERS).join(", ")}`); + } + + const txId = await this.solanaKit.createOrcaSingleSidedWhirlpool( + depositTokenAmount, + depositTokenMint, + otherTokenMint, + initialPrice, + maxPrice, + feeTier, + ); + + return JSON.stringify({ + status: "success", + message: "Single-sided Whirlpool created successfully", + transaction: txId, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + + export class SolanaRaydiumCreateAmmV4 extends Tool { name = "raydium_create_ammV4"; description = `Raydium's Legacy AMM that requiers an OpenBook marketID @@ -761,9 +995,17 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaCreateImageTool(solanaKit), new SolanaLendAssetTool(solanaKit), new SolanaTPSCalculatorTool(solanaKit), + new SolanaStakeTool(solanaKit), + new SolanaFetchPriceTool(solanaKit), + new SolanaResolveDomainTool(solanaKit), + new SolanaGetDomainTool(solanaKit), + new SolanaTokenDataTool(solanaKit), + new SolanaTokenDataByTickerTool(solanaKit), + new SolanaCompressedAirdropTool(solanaKit), new SolanaRaydiumCreateAmmV4(solanaKit), new SolanaRaydiumCreateClmm(solanaKit), new SolanaRaydiumCreateCpmm(solanaKit), new SolanaOpenbookCreateMarket(solanaKit), + new SolanaCreateSingleSidedWhirlpoolTool(solanaKit), ]; } diff --git a/src/tools/create_orca_single_sided_whirlpool.ts b/src/tools/create_orca_single_sided_whirlpool.ts new file mode 100644 index 0000000..61bfa8e --- /dev/null +++ b/src/tools/create_orca_single_sided_whirlpool.ts @@ -0,0 +1,385 @@ +import { Keypair, PublicKey } from "@solana/web3.js"; +import { SolanaAgentKit } from "../agent"; +import { BN, Wallet } from "@coral-xyz/anchor"; +import { Decimal } from "decimal.js"; +import { + PDAUtil, + ORCA_WHIRLPOOL_PROGRAM_ID, + ORCA_WHIRLPOOLS_CONFIG, + WhirlpoolContext, + TickUtil, + PriceMath, + PoolUtil, + TokenExtensionContextForPool, + NO_TOKEN_EXTENSION_CONTEXT, + TokenExtensionUtil, + WhirlpoolIx, + IncreaseLiquidityQuoteParam, + increaseLiquidityQuoteByInputTokenWithParams, +} from "@orca-so/whirlpools-sdk"; +import { + Percentage, + resolveOrCreateATAs, + TransactionBuilder, +} from "@orca-so/common-sdk"; +import { + increaseLiquidityIx, + increaseLiquidityV2Ix, + initTickArrayIx, + openPositionWithTokenExtensionsIx, +} from "@orca-so/whirlpools-sdk/dist/instructions"; +import { + getAssociatedTokenAddressSync, + TOKEN_2022_PROGRAM_ID, +} from "@solana/spl-token"; + +/** + * Maps fee tier percentages to their corresponding tick spacing values in the Orca Whirlpool protocol. + * + * @remarks + * Fee tiers determine the percentage of fees collected on swaps, while tick spacing affects + * the granularity of price ranges for liquidity positions. + * + * For more details, refer to: + * - [Whirlpool Fees](https://orca-so.github.io/whirlpools/Architecture%20Overview/Whirlpool%20Fees) + * - [Whirlpool Parameters](https://orca-so.github.io/whirlpools/Architecture%20Overview/Whirlpool%20Parameters) + * + * @example + * const tickSpacing = FEE_TIERS[0.30]; // Returns 64 + */ +export const FEE_TIERS = { + 0.01: 1, + 0.02: 2, + 0.04: 4, + 0.05: 8, + 0.16: 16, + 0.30: 64, + 0.65: 96, + 1.00: 128, + 2.00: 256, +} as const; + +/** + * # Creates a single-sided Whirlpool. + * + * This function initializes a new Whirlpool (liquidity pool) on Orca and seeds it with liquidity from a single token. + * + * ## Example Usage: + * You created a new token called SHARK, and you want to set the initial price to 0.001 USDC. + * You set `depositTokenMint` to SHARK's mint address and `otherTokenMint` to USDC's mint address. + * You can minimize price impact for buyers in a few ways: + * 1. Increase the amount of tokens you deposit + * 2. Set the initial price very low + * 3. Set the maximum price closer to the initial price + * + * ### Note for experts: + * The Wrhirlpool program initializes the Whirlpool with the in a specific order. This might not be + * the order you expect, so the function checks the order and adjusts the inverts the prices. This means that + * on-chain the Whirlpool might be configured as USDC/SHARK instead of SHARK/USDC, and the on-chain price will + * be 1/`initialPrice`. This will not affect the price of the token as you intended it to be. + * + * @param agent - The `SolanaAgentKit` instance representing the wallet and connection details. + * @param depositTokenAmount - The amount of the deposit token (including the decimals) to contribute to the pool. + * @param depositTokenMint - The mint address of the token being deposited into the pool, eg. SHARK. + * @param otherTokenMint - The mint address of the other token in the pool, eg. USDC. + * @param initialPrice - The initial price of the deposit token in terms of the other token. + * @param maxPrice - The maximum price at which liquidity is added. + * @param feeTier - The fee tier percentage for the pool, determining tick spacing and fee collection rates. + * + * @returns A promise that resolves to a transaction ID (`string`) of the transaction creating the pool. + * + * @throws Will throw an error if: + * - Mint accounts for the tokens cannot be fetched. + * - Prices are out of bounds. + * + * @remarks + * This function is designed for single-sided deposits where users only contribute one type of token, + * and the function manages mint order and necessary calculations. + * + * @example + * ```typescript + * import { SolanaAgentKit } from "your-sdk"; + * import { PublicKey } from "@solana/web3.js"; + * import { BN } from "@coral-xyz/anchor"; + * import Decimal from "decimal.js"; + * + * const agent = new SolanaAgentKit(wallet, connection); + * const depositAmount = new BN(1_000_000_000_000); // 1 million SHARK if SHARK has 6 decimals + * const depositTokenMint = new PublicKey("DEPOSTI_TOKEN_ADDRESS"); + * const otherTokenMint = new PublicKey("OTHER_TOKEN_ADDRESS"); + * const initialPrice = new Decimal(0.001); + * const maxPrice = new Decimal(5.0); + * const feeTier = 0.30; + * + * const txId = await createOrcaSingleSidedWhirlpool( + * agent, + * depositAmount, + * depositTokenMint, + * otherTokenMint, + * initialPrice, + * maxPrice, + * feeTier, + * ); + * console.log(`Single sided whirlpool created in transaction: ${txId}`); + * ``` + */ +export async function createOrcaSingleSidedWhirlpool( + agent: SolanaAgentKit, + depositTokenAmount: BN, + depositTokenMint: PublicKey, + otherTokenMint: PublicKey, + initialPrice: Decimal, + maxPrice: Decimal, + feeTier: keyof typeof FEE_TIERS, +): Promise { + const wallet = new Wallet(agent.wallet); + const ctx = WhirlpoolContext.from(agent.connection, wallet, ORCA_WHIRLPOOL_PROGRAM_ID); + const fetcher = ctx.fetcher; + + const correctTokenOrder = PoolUtil.orderMints(otherTokenMint, depositTokenMint).map( + (addr) => addr.toString(), + ); + const isCorrectMintOrder = correctTokenOrder[0] === depositTokenMint.toString(); + let mintA, mintB; + if (isCorrectMintOrder) { + [mintA, mintB] = [depositTokenMint, otherTokenMint]; + } else { + [mintA, mintB] = [otherTokenMint, depositTokenMint]; + initialPrice = new Decimal(1 / initialPrice.toNumber()); + maxPrice = new Decimal(1 / maxPrice.toNumber()); + } + const mintAAccount = await fetcher.getMintInfo(mintA); + const mintBAccount = await fetcher.getMintInfo(mintB); + if (mintAAccount === null || mintBAccount === null) throw Error('Mint account not found'); + const tickSpacing = FEE_TIERS[feeTier]; + const tickIndex = PriceMath.priceToTickIndex(initialPrice, mintAAccount.decimals, mintBAccount.decimals); + const initialTick = TickUtil.getInitializableTickIndex(tickIndex, tickSpacing); + + const tokenExtensionCtx: TokenExtensionContextForPool = { + ...NO_TOKEN_EXTENSION_CONTEXT, + tokenMintWithProgramA: mintAAccount, + tokenMintWithProgramB: mintBAccount, + }; + const feeTierKey = PDAUtil.getFeeTier( + ORCA_WHIRLPOOL_PROGRAM_ID, + ORCA_WHIRLPOOLS_CONFIG, + tickSpacing, + ).publicKey; + const initSqrtPrice = PriceMath.tickIndexToSqrtPriceX64(initialTick); + const tokenVaultAKeypair = Keypair.generate(); + const tokenVaultBKeypair = Keypair.generate(); + const whirlpoolPda = PDAUtil.getWhirlpool( + ORCA_WHIRLPOOL_PROGRAM_ID, + ORCA_WHIRLPOOLS_CONFIG, + mintA, + mintB, + FEE_TIERS[feeTier], + ); + const tokenBadgeA = PDAUtil.getTokenBadge( + ORCA_WHIRLPOOL_PROGRAM_ID, + ORCA_WHIRLPOOLS_CONFIG, + mintA, + ).publicKey; + const tokenBadgeB = PDAUtil.getTokenBadge( + ORCA_WHIRLPOOL_PROGRAM_ID, + ORCA_WHIRLPOOLS_CONFIG, + mintB, + ).publicKey; + const baseParamsPool = { + initSqrtPrice, + whirlpoolsConfig: ORCA_WHIRLPOOLS_CONFIG, + whirlpoolPda, + tokenMintA: mintA, + tokenMintB: mintB, + tokenVaultAKeypair, + tokenVaultBKeypair, + feeTierKey, + tickSpacing: tickSpacing, + funder: wallet.publicKey + }; + const initPoolIx = !TokenExtensionUtil.isV2IxRequiredPool(tokenExtensionCtx) + ? WhirlpoolIx.initializePoolIx(ctx.program, baseParamsPool) + : WhirlpoolIx.initializePoolV2Ix(ctx.program, { + ...baseParamsPool, + tokenProgramA: tokenExtensionCtx.tokenMintWithProgramA.tokenProgram, + tokenProgramB: tokenExtensionCtx.tokenMintWithProgramB.tokenProgram, + tokenBadgeA, + tokenBadgeB, + }); + const initialTickArrayStartTick = TickUtil.getStartTickIndex( + initialTick, + tickSpacing, + ); + const initialTickArrayPda = PDAUtil.getTickArray( + ctx.program.programId, + whirlpoolPda.publicKey, + initialTickArrayStartTick, + ); + + const txBuilder = new TransactionBuilder( + ctx.provider.connection, + ctx.provider.wallet, + ctx.txBuilderOpts, + ); + txBuilder.addInstruction(initPoolIx); + txBuilder.addInstruction( + initTickArrayIx(ctx.program, { + startTick: initialTickArrayStartTick, + tickArrayPda: initialTickArrayPda, + whirlpool: whirlpoolPda.publicKey, + funder: wallet.publicKey, + }), + ); + + let tickLowerIndex, tickUpperIndex; + if (isCorrectMintOrder) { + tickLowerIndex = initialTick; + tickUpperIndex = PriceMath.priceToTickIndex(maxPrice, mintAAccount.decimals, mintBAccount.decimals); + } else { + tickLowerIndex = PriceMath.priceToTickIndex(maxPrice, mintAAccount.decimals, mintBAccount.decimals); + tickUpperIndex = initialTick; + } + const tickLowerInitializableIndex = TickUtil.getInitializableTickIndex(tickLowerIndex, tickSpacing); + const tickUpperInitializableIndex = TickUtil.getInitializableTickIndex(tickUpperIndex, tickSpacing); + if (!TickUtil.checkTickInBounds(tickLowerInitializableIndex) || !TickUtil.checkTickInBounds(tickUpperInitializableIndex)) throw Error('Prices out of bounds'); + const increasLiquidityQuoteParam: IncreaseLiquidityQuoteParam = { + inputTokenAmount: new BN(depositTokenAmount), + inputTokenMint: depositTokenMint, + tokenMintA: mintA, + tokenMintB: mintB, + tickCurrentIndex: initialTick, + sqrtPrice: initSqrtPrice, + tickLowerIndex: tickLowerInitializableIndex, + tickUpperIndex: tickUpperInitializableIndex, + tokenExtensionCtx: tokenExtensionCtx, + slippageTolerance: Percentage.fromFraction(0, 100) + } + const liquidityInput = increaseLiquidityQuoteByInputTokenWithParams( + increasLiquidityQuoteParam + ) + const { liquidityAmount: liquidity, tokenMaxA, tokenMaxB } = liquidityInput; + + const positionMintKeypair = Keypair.generate(); + const positionMintPubkey = positionMintKeypair.publicKey; + const positionPda = PDAUtil.getPosition( + ORCA_WHIRLPOOL_PROGRAM_ID, + positionMintPubkey, + ); + const positionTokenAccountAddress = getAssociatedTokenAddressSync( + positionMintPubkey, + wallet.publicKey, + ctx.accountResolverOpts.allowPDAOwnerAddress, + TOKEN_2022_PROGRAM_ID, + ); + const params = { + funder: wallet.publicKey, + owner: wallet.publicKey, + positionPda, + positionTokenAccount: positionTokenAccountAddress, + whirlpool: whirlpoolPda.publicKey, + tickLowerIndex: tickLowerInitializableIndex, + tickUpperIndex: tickUpperInitializableIndex, + }; + const positionIx = openPositionWithTokenExtensionsIx(ctx.program, { + ...params, + positionMint: positionMintPubkey, + withTokenMetadataExtension: true, + }) + + txBuilder.addInstruction(positionIx); + txBuilder.addSigner(positionMintKeypair); + + const [ataA, ataB] = await resolveOrCreateATAs( + ctx.connection, + wallet.publicKey, + [ + { tokenMint: mintA, wrappedSolAmountIn: tokenMaxA }, + { tokenMint: mintB, wrappedSolAmountIn: tokenMaxB }, + ], + () => ctx.fetcher.getAccountRentExempt(), + wallet.publicKey, + undefined, + ctx.accountResolverOpts.allowPDAOwnerAddress, + ctx.accountResolverOpts.createWrappedSolAccountMethod, + ); + const { address: tokenOwnerAccountA, ...tokenOwnerAccountAIx } = ataA; + const { address: tokenOwnerAccountB, ...tokenOwnerAccountBIx } = ataB; + + txBuilder.addInstruction(tokenOwnerAccountAIx); + txBuilder.addInstruction(tokenOwnerAccountBIx); + + const tickArrayLowerStartIndex = TickUtil.getStartTickIndex( + tickLowerInitializableIndex, + tickSpacing, + ); + const tickArrayUpperStartIndex = TickUtil.getStartTickIndex( + tickUpperInitializableIndex, + tickSpacing, + ); + const tickArrayLowerPda = PDAUtil.getTickArray( + ctx.program.programId, + whirlpoolPda.publicKey, + tickArrayLowerStartIndex, + ); + const tickArrayUpperPda = PDAUtil.getTickArray( + ctx.program.programId, + whirlpoolPda.publicKey, + tickArrayUpperStartIndex, + ); + if (tickArrayUpperStartIndex !== tickArrayLowerStartIndex) { + if (isCorrectMintOrder) { + txBuilder.addInstruction( + initTickArrayIx(ctx.program, { + startTick: tickArrayUpperStartIndex, + tickArrayPda: tickArrayUpperPda, + whirlpool: whirlpoolPda.publicKey, + funder: wallet.publicKey, + }), + ); + } else { + txBuilder.addInstruction( + initTickArrayIx(ctx.program, { + startTick: tickArrayLowerStartIndex, + tickArrayPda: tickArrayLowerPda, + whirlpool: whirlpoolPda.publicKey, + funder: wallet.publicKey, + }), + ); + } + } + + const baseParamsLiquidity = { + liquidityAmount: liquidity, + tokenMaxA, + tokenMaxB, + whirlpool: whirlpoolPda.publicKey, + positionAuthority: wallet.publicKey, + position: positionPda.publicKey, + positionTokenAccount: positionTokenAccountAddress, + tokenOwnerAccountA, + tokenOwnerAccountB, + tokenVaultA: tokenVaultAKeypair.publicKey, + tokenVaultB: tokenVaultBKeypair.publicKey, + tickArrayLower: tickArrayLowerPda.publicKey, + tickArrayUpper: tickArrayUpperPda.publicKey, + }; + + const liquidityIx = !TokenExtensionUtil.isV2IxRequiredPool( + tokenExtensionCtx, + ) + ? increaseLiquidityIx(ctx.program, baseParamsLiquidity) + : increaseLiquidityV2Ix(ctx.program, { + ...baseParamsLiquidity, + tokenMintA: mintA, + tokenMintB: mintB, + tokenProgramA: tokenExtensionCtx.tokenMintWithProgramA.tokenProgram, + tokenProgramB: tokenExtensionCtx.tokenMintWithProgramB.tokenProgram, + }); + txBuilder.addInstruction(liquidityIx); + + const txId = await txBuilder.buildAndExecute({ + maxSupportedTransactionVersion: "legacy" + }); + + return txId; +} diff --git a/src/tools/deploy_collection.ts b/src/tools/deploy_collection.ts index 9317348..4528b92 100644 --- a/src/tools/deploy_collection.ts +++ b/src/tools/deploy_collection.ts @@ -1,9 +1,9 @@ import { SolanaAgentKit } from "../index"; -import { createUmi, generateSigner, publicKey } from "@metaplex-foundation/umi"; -import { createCollection, ruleSet } from "@metaplex-foundation/mpl-core"; -import { mplTokenMetadata } from "@metaplex-foundation/mpl-token-metadata"; +import { generateSigner, keypairIdentity, publicKey } from "@metaplex-foundation/umi"; +import { createCollection, mplCore, ruleSet } from "@metaplex-foundation/mpl-core"; import { CollectionOptions, CollectionDeployment } from "../types"; -import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters"; +import { fromWeb3JsKeypair, toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters"; +import { createUmi } from "@metaplex-foundation/umi-bundle-defaults"; /** * Deploy a new NFT collection @@ -17,7 +17,8 @@ export async function deploy_collection( ): Promise { try { // Initialize Umi - const umi = createUmi().use(mplTokenMetadata()); + const umi = createUmi(agent.connection.rpcEndpoint).use(mplCore()); + umi.use(keypairIdentity(fromWeb3JsKeypair(agent.wallet))); // Generate collection signer const collectionSigner = generateSigner(umi); @@ -27,11 +28,11 @@ export async function deploy_collection( address: publicKey(creator.address), percentage: creator.percentage, })) || [ - { - address: publicKey(agent.wallet_address.toString()), - percentage: 100, - }, - ]; + { + address: publicKey(agent.wallet_address.toString()), + percentage: 100, + }, + ]; // Create collection const tx = await createCollection(umi, { diff --git a/src/tools/deploy_token.ts b/src/tools/deploy_token.ts index 65d537a..a36d5de 100644 --- a/src/tools/deploy_token.ts +++ b/src/tools/deploy_token.ts @@ -1,68 +1,66 @@ import { SolanaAgentKit } from "../index"; -import { - createInitializeMint2Instruction, - MINT_SIZE, - getMinimumBalanceForRentExemptAccount, - TOKEN_PROGRAM_ID, -} from "@solana/spl-token"; -import { Keypair, SystemProgram, Transaction } from "@solana/web3.js"; -import { sendTx } from "../utils/send_tx"; +import { PublicKey } from "@solana/web3.js"; +import { createUmi } from "@metaplex-foundation/umi-bundle-defaults"; +import { generateSigner, keypairIdentity } from "@metaplex-foundation/umi"; +import { createFungible, mintV1, TokenStandard } from "@metaplex-foundation/mpl-token-metadata"; +import { fromWeb3JsKeypair, fromWeb3JsPublicKey, toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters"; /** * Deploy a new SPL token * @param agent SolanaAgentKit instance + * @param name Name of the token + * @param uri URI for the token metadata + * @param symbol Symbol of the token * @param decimals Number of decimals for the token (default: 9) * @param initialSupply Initial supply to mint (optional) * @returns Object containing token mint address and initial account (if supply was minted) */ export async function deploy_token( agent: SolanaAgentKit, - decimals: number = 9 - // initialSupply?: number -) { + name: string, + uri: string, + symbol: string, + decimals: number = 9, + initialSupply?: number +): Promise<{ mint: PublicKey }> { try { + // Create UMI instance from agent + const umi = createUmi(agent.connection.rpcEndpoint) + umi.use(keypairIdentity(fromWeb3JsKeypair(agent.wallet))); + // Create new token mint - const lamports = await getMinimumBalanceForRentExemptAccount( - agent.connection - ); + const mint = generateSigner(umi); - const mint = Keypair.generate(); - - console.log("Mint address: ", mint.publicKey.toString()); - console.log("Agent address: ", agent.wallet_address.toString()); - - let account_create_ix = SystemProgram.createAccount({ - fromPubkey: agent.wallet_address, - newAccountPubkey: mint.publicKey, - lamports, - space: MINT_SIZE, - programId: TOKEN_PROGRAM_ID, + let builder = createFungible(umi, { + name, + uri, + symbol, + sellerFeeBasisPoints: { + basisPoints: 0n, + identifier: "%", + decimals: 2, + }, + decimals, + mint, }); - let create_mint_ix = createInitializeMint2Instruction( - mint.publicKey, - decimals, - agent.wallet_address, - agent.wallet_address, - TOKEN_PROGRAM_ID - ); + if (initialSupply) { + builder = builder.add( + mintV1(umi, { + mint: mint.publicKey, + tokenStandard: TokenStandard.Fungible, + tokenOwner: fromWeb3JsPublicKey(agent.wallet_address), + amount: initialSupply, + }) + ); + } - let tx = new Transaction().add(account_create_ix, create_mint_ix); - - let hash = await sendTx(agent, tx, [mint]); - - console.log("Transaction hash: ", hash); - - console.log( - "Token deployed successfully. Mint address: ", - mint.publicKey.toString() - ); + builder.sendAndConfirm(umi, { confirm: { commitment: 'finalized' } }); return { - mint: mint.publicKey, + mint: toWeb3JsPublicKey(mint.publicKey), }; } catch (error: any) { - console.log(error); throw new Error(`Token deployment failed: ${error.message}`); } } diff --git a/src/tools/fetch_price.ts b/src/tools/fetch_price.ts new file mode 100644 index 0000000..764e8e6 --- /dev/null +++ b/src/tools/fetch_price.ts @@ -0,0 +1,35 @@ +import { SolanaAgentKit } from "../index"; +import { Tool } from "langchain/tools"; + +/** + * Fetch the price of a given token in USDC using Jupiter API + * @param agent SolanaAgentKit instance + * @param tokenId The token mint address + * @returns The price of the token in USDC + */ +export async function fetchPrice( + agent: SolanaAgentKit, + tokenId: string +): Promise { + try { + const response = await fetch( + `https://api.jup.ag/price/v2?ids=${tokenId}` + ); + + if (!response.ok) { + throw new Error(`Failed to fetch price: ${response.statusText}`); + } + + const data = await response.json(); + + const price = data.data[tokenId]?.price; + + if (!price) { + throw new Error("Price data not available for the given token."); + } + + return price; + } catch (error: any) { + throw new Error(`Price fetch failed: ${error.message}`); + } +} \ No newline at end of file diff --git a/src/tools/get_primary_domain.ts b/src/tools/get_primary_domain.ts new file mode 100644 index 0000000..775af4b --- /dev/null +++ b/src/tools/get_primary_domain.ts @@ -0,0 +1,37 @@ +import { getPrimaryDomain as _getPrimaryDomain } from "@bonfida/spl-name-service"; +import { PublicKey } from "@solana/web3.js"; +import { SolanaAgentKit } from "../index"; + +/** + * Retrieves the primary .sol domain associated with a given Solana public key. + * + * This function queries the Bonfida SPL Name Service to get the primary .sol domain for + * a specified Solana public key. If the primary domain is stale or an error occurs during + * the resolution, it throws an error. + * + * @param agent SolanaAgentKit instance + * @param account The Solana public key for which to retrieve the primary domain + * @returns A promise that resolves to the primary .sol domain as a string + * @throws Error if the domain is stale or if the domain resolution fails + */ +export async function getPrimaryDomain( + agent: SolanaAgentKit, + account: PublicKey +): Promise { + try { + const { reverse, stale } = await _getPrimaryDomain( + agent.connection, + account + ); + if (stale) { + throw new Error( + `Primary domain is stale for account: ${account.toBase58()}` + ); + } + return reverse; + } catch (error) { + throw new Error( + `Failed to get primary domain for account: ${account.toBase58()}` + ); + } +} diff --git a/src/tools/get_token_data.ts b/src/tools/get_token_data.ts new file mode 100644 index 0000000..110a801 --- /dev/null +++ b/src/tools/get_token_data.ts @@ -0,0 +1,68 @@ +import { PublicKey } from "@solana/web3.js"; +import { JupiterTokenData } from "../types"; + +export async function getTokenDataByAddress( + mint: PublicKey, +): Promise { + try { + if (!mint) { + throw new Error("Mint address is required"); + } + + const response = await fetch("https://tokens.jup.ag/tokens?tags=verified", { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + + const data = (await response.json()) as JupiterTokenData[]; + const token = data.find((token: JupiterTokenData) => { + return token.address === mint.toBase58(); + }); + return token; + } catch (error: any) { + throw new Error(`Error fetching token data: ${error.message}`); + } +} + +export async function getTokenAddressFromTicker( + ticker: string +): Promise { + try { + const response = await fetch( + `https://api.dexscreener.com/latest/dex/search?q=${ticker}` + ); + const data = await response.json(); + + if (!data.pairs || data.pairs.length === 0) { + return null; + } + + // Filter for Solana pairs only and sort by FDV + let solanaPairs = data.pairs + .filter((pair: any) => pair.chainId === "solana") + .sort((a: any, b: any) => (b.fdv || 0) - (a.fdv || 0)); + + solanaPairs = solanaPairs.filter( + (pair: any) => + pair.baseToken.symbol.toLowerCase() === ticker.toLowerCase() + ); + + // Return the address of the highest FDV Solana pair + return solanaPairs[0].baseToken.address; + } catch (error) { + console.error("Error fetching token address from DexScreener:", error); + return null; + } +} + +export async function getTokenDataByTicker( + ticker: string +): Promise { + const address = await getTokenAddressFromTicker(ticker); + if (!address) { + throw new Error(`Token address not found for ticker: ${ticker}`); + } + return getTokenDataByAddress(new PublicKey(address)); +} \ No newline at end of file diff --git a/src/tools/index.ts b/src/tools/index.ts index a0673df..303cde2 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -6,10 +6,17 @@ export * from "./mint_nft"; export * from "./transfer"; export * from "./trade"; export * from "./register_domain"; +export * from "./resolve_sol_domain"; +export * from "./get_primary_domain"; export * from "./launch_pumpfun_token"; export * from "./lend"; export * from "./get_tps"; -export * from "./raydium_create_ammV4"; +export * from "./get_token_data"; +export * from "./stake_with_jup"; +export * from "./fetch_price"; +export * from "./send_compressed_airdrop"; + +export * from "./create_orca_single_sided_whirlpool";export * from "./raydium_create_ammV4"; export * from "./raydium_create_clmm"; export * from "./raydium_create_cpmm"; export * from "./openbook_create_market"; \ No newline at end of file diff --git a/src/tools/launch_pumpfun_token.ts b/src/tools/launch_pumpfun_token.ts index 42c9ee0..397a177 100644 --- a/src/tools/launch_pumpfun_token.ts +++ b/src/tools/launch_pumpfun_token.ts @@ -38,7 +38,6 @@ async function uploadMetadata( finalFormData.append('file', files.file); } - console.log("Final form data:", finalFormData); const metadataResponse = await fetch("https://pump.fun/api/ipfs", { method: "POST", @@ -46,7 +45,6 @@ async function uploadMetadata( }); if (!metadataResponse.ok) { - console.log("Metadata response:", await metadataResponse.json()); throw new Error(`Metadata upload failed: ${metadataResponse.statusText}`); } @@ -152,30 +150,14 @@ export async function launchPumpFunToken( options?: PumpFunTokenOptions ) { try { - // TBD : Remove clgs after approval - console.log("Starting token launch process..."); - // Generate mint keypair const mintKeypair = Keypair.generate(); - console.log("Mint public key:", mintKeypair.publicKey.toBase58()); - - // Upload metadata - console.log("Uploading metadata to IPFS..."); const metadataResponse = await uploadMetadata(tokenName, tokenTicker, description, imageUrl, options); - console.log("Metadata response:", metadataResponse); - - // Create token transaction - console.log("Creating token transaction..."); const response = await createTokenTransaction(agent, mintKeypair, metadataResponse, options); - const transactionData = await response.arrayBuffer(); const tx = VersionedTransaction.deserialize(new Uint8Array(transactionData)); - - // Send transaction with proper blockhash handling - console.log("Sending transaction..."); const signature = await signAndSendTransaction(agent, tx, mintKeypair); - console.log("Token launch successful!"); return { signature, mint: mintKeypair.publicKey.toBase58(), diff --git a/src/tools/mint_nft.ts b/src/tools/mint_nft.ts index bf3e68a..09bfe32 100644 --- a/src/tools/mint_nft.ts +++ b/src/tools/mint_nft.ts @@ -1,9 +1,9 @@ import { SolanaAgentKit } from "../index"; -import { generateSigner } from '@metaplex-foundation/umi'; -import { create } from '@metaplex-foundation/mpl-core'; +import { generateSigner, keypairIdentity } from '@metaplex-foundation/umi'; +import { create, mplCore } from '@metaplex-foundation/mpl-core'; import { fetchCollection } from '@metaplex-foundation/mpl-core'; import { PublicKey } from "@solana/web3.js"; -import { fromWeb3JsPublicKey, toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters"; +import { fromWeb3JsKeypair, fromWeb3JsPublicKey, toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters"; import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'; import { MintCollectionNFTResponse } from '../types'; @@ -20,7 +20,6 @@ export async function mintCollectionNFT( collectionMint: PublicKey, metadata: { name: string; - symbol: string; uri: string; sellerFeeBasisPoints?: number; creators?: Array<{ @@ -32,11 +31,12 @@ export async function mintCollectionNFT( ): Promise { try { // Create UMI instance from agent - const umi = createUmi(agent.connection) + const umi = createUmi(agent.connection.rpcEndpoint).use(mplCore()); + umi.use(keypairIdentity(fromWeb3JsKeypair(agent.wallet))); // Convert collection mint to UMI format const umiCollectionMint = fromWeb3JsPublicKey(collectionMint); - + // Fetch the existing collection const collection = await fetchCollection(umi, umiCollectionMint); @@ -48,8 +48,8 @@ export async function mintCollectionNFT( asset: assetSigner, collection: collection, name: metadata.name, - uri: metadata.uri, - owner: fromWeb3JsPublicKey(recipient!) + uri: metadata.uri, + owner: fromWeb3JsPublicKey(recipient ?? agent.wallet.publicKey) }).sendAndConfirm(umi); return { diff --git a/src/tools/resolve_sol_domain.ts b/src/tools/resolve_sol_domain.ts new file mode 100644 index 0000000..d8764cc --- /dev/null +++ b/src/tools/resolve_sol_domain.ts @@ -0,0 +1,30 @@ +import { resolve } from "@bonfida/spl-name-service"; +import { PublicKey } from "@solana/web3.js"; +import { SolanaAgentKit } from "../index"; + +/** + * Resolves a .sol domain to a Solana PublicKey. + * + * This function uses the Bonfida SPL Name Service to resolve a given .sol domain + * to the corresponding Solana PublicKey. The domain can be provided with or without + * the .sol suffix. + * + * @param agent SolanaAgentKit instance + * @param domain The .sol domain to resolve. This can be provided with or without the .sol TLD suffix + * @returns A promise that resolves to the corresponding Solana PublicKey + * @throws Error if the domain resolution fails + */ +export async function resolveSolDomain( + agent: SolanaAgentKit, + domain: string +): Promise { + if (!domain || typeof domain !== "string") { + throw new Error("Invalid domain. Expected a non-empty string."); + } + + try { + return await resolve(agent.connection, domain); + } catch (error) { + throw new Error(`Failed to resolve domain: ${domain}`); + } +} diff --git a/src/tools/send_compressed_airdrop.ts b/src/tools/send_compressed_airdrop.ts new file mode 100644 index 0000000..313bbdb --- /dev/null +++ b/src/tools/send_compressed_airdrop.ts @@ -0,0 +1,306 @@ +import { + AddressLookupTableAccount, + ComputeBudgetProgram, + Connection, + Keypair, + PublicKey, + TransactionInstruction, +} from "@solana/web3.js"; +import { SolanaAgentKit } from "../agent/index.js"; +import { + buildAndSignTx, + calculateComputeUnitPrice, + createRpc, + Rpc, + sendAndConfirmTx, + sleep, +} from "@lightprotocol/stateless.js"; +import { + CompressedTokenProgram, + createTokenPool, +} from "@lightprotocol/compressed-token"; +import { Account, getOrCreateAssociatedTokenAccount } from "@solana/spl-token"; + +// arbitrary +const MAX_AIRDROP_RECIPIENTS = 1000; +const MAX_CONCURRENT_TXS = 30; + +/** + * Estimate the cost of an airdrop in lamports. + * @param numberOfRecipients Number of recipients + * @param priorityFeeInLamports Priority fee in lamports + * @returns Estimated cost in lamports + */ +export const getAirdropCostEstimate = ( + numberOfRecipients: number, + priorityFeeInLamports: number +) => { + const baseFee = 5000; + const perRecipientCompressedStateFee = 300; + + const txsNeeded = Math.ceil(numberOfRecipients / 15); + const totalPriorityFees = txsNeeded * (baseFee + priorityFeeInLamports); + + return ( + perRecipientCompressedStateFee * numberOfRecipients + totalPriorityFees + ); +}; + +/** + * Send airdrop with ZK Compressed Tokens. + * @param agent Agent + * @param mintAddress SPL Mint address + * @param amount Amount to send per recipient + * @param decimals Decimals of the token + * @param recipients Recipient wallet addresses (no ATAs) + * @param priorityFeeInLamports Priority fee in lamports + * @param shouldLog Whether to log progress to stdout. Defaults to false. + */ +export async function sendCompressedAirdrop( + agent: SolanaAgentKit, + mintAddress: PublicKey, + amount: number, + decimals: number, + recipients: PublicKey[], + priorityFeeInLamports: number, + shouldLog: boolean = false +): Promise { + if (recipients.length > MAX_AIRDROP_RECIPIENTS) { + throw new Error( + `Max airdrop can be ${MAX_AIRDROP_RECIPIENTS} recipients at a time. For more scale, use open source ZK Compression airdrop tools such as https://github.com/helius-labs/airship.` + ); + } + + + const url = agent.connection.rpcEndpoint; + if (url.includes("devnet")) { + throw new Error("Devnet is not supported for airdrop. Please use mainnet."); + } + if (!url.includes("helius")) { + console.warn( + "Warning: Must use RPC with ZK Compression support. Double check with your RPC provider if in doubt." + ); + } + + let sourceTokenAccount: Account; + try { + sourceTokenAccount = await getOrCreateAssociatedTokenAccount( + agent.connection, + agent.wallet, + mintAddress, + agent.wallet.publicKey + ); + } catch (error) { + throw new Error( + "Source token account not found and failed to create it. Please add funds to your wallet and try again." + ); + } + + try { + await createTokenPool( + agent.connection as unknown as Rpc, + agent.wallet, + mintAddress + ); + } catch (error: any) { + if (error.message.includes("already in use")) { + // skip + } else { + throw error; + } + } + + return await processAll( + agent, + amount * 10 ** decimals, + mintAddress, + recipients, + priorityFeeInLamports, + shouldLog + ); +} + +async function processAll( + agent: SolanaAgentKit, + amount: number, + mint: PublicKey, + recipients: PublicKey[], + priorityFeeInLamports: number, + shouldLog: boolean +): Promise { + const mintAddress = mint; + const payer = agent.wallet; + + const sourceTokenAccount = await getOrCreateAssociatedTokenAccount( + agent.connection, + agent.wallet, + mintAddress, + agent.wallet.publicKey + ); + + const maxRecipientsPerInstruction = 5; + const maxIxs = 3; // empirically determined (as of 12/15/2024) + const lookupTableAddress = new PublicKey( + "9NYFyEqPkyXUhkerbGHXUXkvb4qpzeEdHuGpgbgpH1NJ" + ); + + const lookupTableAccount = ( + await agent.connection.getAddressLookupTable(lookupTableAddress) + ).value!; + + const batches: PublicKey[][] = []; + for ( + let i = 0; + i < recipients.length; + i += maxRecipientsPerInstruction * maxIxs + ) { + batches.push(recipients.slice(i, i + maxRecipientsPerInstruction * maxIxs)); + } + + const instructionSets = await Promise.all( + batches.map(async (recipientBatch) => { + const instructions: TransactionInstruction[] = [ + ComputeBudgetProgram.setComputeUnitLimit({ units: 500_000 }), + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: calculateComputeUnitPrice( + priorityFeeInLamports, + 500_000 + ), + }), + ]; + + const compressIxPromises = []; + for ( + let i = 0; + i < recipientBatch.length; + i += maxRecipientsPerInstruction + ) { + const batch = recipientBatch.slice(i, i + maxRecipientsPerInstruction); + compressIxPromises.push( + CompressedTokenProgram.compress({ + payer: payer.publicKey, + owner: payer.publicKey, + source: sourceTokenAccount.address, + toAddress: batch, + amount: batch.map(() => amount), + mint: mintAddress, + }) + ); + } + + const compressIxs = await Promise.all(compressIxPromises); + return [...instructions, ...compressIxs]; + }) + ); + + const url = agent.connection.rpcEndpoint; + const rpc = createRpc(url, url, url); + + const results = []; + let confirmedCount = 0; + const totalBatches = instructionSets.length; + + const renderProgressBar = (current: number, total: number) => { + const percentage = Math.floor((current / total) * 100); + const filled = Math.floor((percentage / 100) * 20); + const empty = 20 - filled; + const bar = "█".repeat(filled) + "░".repeat(empty); + return `Airdropped to ${Math.min(current * 15, recipients.length)}/${ + recipients.length + } recipients [${bar}] ${percentage}%`; + }; + + const log = (message: string) => { + if (shouldLog && typeof process !== "undefined" && process.stdout) { + process.stdout.write(message); + } + }; + + for (let i = 0; i < instructionSets.length; i += MAX_CONCURRENT_TXS) { + const batchPromises = instructionSets + .slice(i, i + MAX_CONCURRENT_TXS) + .map((instructions, idx) => + sendTransactionWithRetry( + rpc, + instructions, + payer, + lookupTableAccount, + i + idx + ).then((signature) => { + confirmedCount++; + log("\r" + renderProgressBar(confirmedCount, totalBatches)); + return signature; + }) + ); + + const batchResults = await Promise.allSettled(batchPromises); + results.push(...batchResults); + } + + log("\n"); + + const failures = results + .filter((r) => r.status === "rejected") + .map((r, idx) => ({ + index: idx, + error: (r as PromiseRejectedResult).reason, + })); + + if (failures.length > 0) { + throw new Error( + `Failed to process ${failures.length} batches: ${failures + .map((f) => f.error) + .join(", ")}` + ); + } + + return results.map((r) => (r as PromiseFulfilledResult).value); +} + +async function sendTransactionWithRetry( + connection: Rpc, + instructions: TransactionInstruction[], + payer: Keypair, + lookupTableAccount: AddressLookupTableAccount, + batchIndex: number +): Promise { + const MAX_RETRIES = 3; + const INITIAL_BACKOFF = 500; // ms + + for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { + try { + const { blockhash } = await connection.getLatestBlockhash(); + const tx = buildAndSignTx( + instructions, + payer, + blockhash, + [], + [lookupTableAccount] + ); + + const signature = await sendAndConfirmTx(connection, tx); + + return signature; + } catch (error: any) { + const isRetryable = + error.message?.includes("blockhash not found") || + error.message?.includes("timeout") || + error.message?.includes("rate limit") || + error.message?.includes("too many requests"); + + if (!isRetryable || attempt === MAX_RETRIES - 1) { + throw new Error( + `Batch ${batchIndex} failed after ${attempt + 1} attempts: ${ + error.message + }` + ); + } + + const backoff = + INITIAL_BACKOFF * Math.pow(2, attempt) * (0.5 + Math.random()); + await sleep(backoff); + } + } + + throw new Error("Unreachable"); +} diff --git a/src/tools/stake_with_jup.ts b/src/tools/stake_with_jup.ts new file mode 100644 index 0000000..e152532 --- /dev/null +++ b/src/tools/stake_with_jup.ts @@ -0,0 +1,56 @@ +import { VersionedTransaction } from "@solana/web3.js"; +import { SolanaAgentKit } from "../agent"; + +/** + * Stake SOL with Jup validator + * @param agent SolanaAgentKit instance + * @param amount Amount of SOL to stake + * @returns Transaction signature + */ +export async function stakeWithJup( + agent: SolanaAgentKit, + amount: number, +): Promise { + try { + const res = await fetch( + `https://worker.jup.ag/blinks/swap/So11111111111111111111111111111111111111112/jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v/${amount}`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + account: agent.wallet.publicKey.toBase58(), + }), + }, + ); + + const data = await res.json(); + + const txn = VersionedTransaction.deserialize( + Buffer.from(data.transaction, "base64"), + ); + + const { blockhash } = await agent.connection.getLatestBlockhash(); + txn.message.recentBlockhash = blockhash; + + // Sign and send transaction + txn.sign([agent.wallet]); + const signature = await agent.connection.sendTransaction(txn, { + preflightCommitment: "confirmed", + maxRetries: 3, + }); + + const latestBlockhash = await agent.connection.getLatestBlockhash(); + await agent.connection.confirmTransaction({ + signature, + blockhash: latestBlockhash.blockhash, + lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, + }); + + return signature; + } catch (error: any) { + console.error(error); + throw new Error(`jupSOL staking failed: ${error.message}`); + } +} diff --git a/src/tools/trade.ts b/src/tools/trade.ts index d31055d..b17bc41 100644 --- a/src/tools/trade.ts +++ b/src/tools/trade.ts @@ -19,8 +19,6 @@ export async function trade( slippageBps: number = DEFAULT_OPTIONS.SLIPPAGE_BPS, ): Promise { try { - // Get quote for the swap - console.log(inputMint.toString(), outputMint.toString(), inputAmount, slippageBps); const quoteResponse = await ( await fetch( `${JUP_API}/quote?` + diff --git a/src/types/index.ts b/src/types/index.ts index e5c591e..28d64cb 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -39,7 +39,6 @@ export interface PumpfunLaunchResponse { error?: string; } - /** * Lulo Account Details response format */ @@ -54,3 +53,27 @@ export interface LuloAccountDetailsResponse { minimumRate: string; }; } + +export interface JupiterTokenData { + address: string; + name: string; + symbol: string; + decimals: number; + tags: string[]; + logoURI: string; + daily_volume: number; + freeze_authority: string | null; + mint_authority: string | null; + permanent_delegate: string | null; + extensions: { + coingeckoId?: string; + }; +} + +export interface FetchPriceResponse { + status: "success" | "error"; + tokenId?: string; + priceInUSDC?: string; + message?: string; + code?: string; +} diff --git a/src/utils/send_tx.ts b/src/utils/send_tx.ts index 593cbc8..903ddd5 100644 --- a/src/utils/send_tx.ts +++ b/src/utils/send_tx.ts @@ -41,7 +41,7 @@ export async function getPriorityFees(connection: Connection): Promise<{ const median = sortedFees.length % 2 === 0 ? ((sortedFees[mid - 1] ?? 0) + (sortedFees[mid] ?? 0)) / 2 - : (sortedFees[mid] ?? 0); + : sortedFees[mid] ?? 0; // Helper to create priority fee IX based on chosen strategy const createPriorityFeeIx = (fee: number) => { @@ -76,7 +76,7 @@ export async function getPriorityFees(connection: Connection): Promise<{ export async function sendTx( agent: SolanaAgentKit, tx: Transaction, - otherKeypairs?: Keypair[], + otherKeypairs?: Keypair[] ) { tx.recentBlockhash = (await agent.connection.getLatestBlockhash()).blockhash; tx.feePayer = agent.wallet_address; @@ -90,8 +90,9 @@ export async function sendTx( await agent.connection.confirmTransaction({ signature: txid, blockhash: (await agent.connection.getLatestBlockhash()).blockhash, - lastValidBlockHeight: (await agent.connection.getLatestBlockhash()) - .lastValidBlockHeight, + lastValidBlockHeight: ( + await agent.connection.getLatestBlockhash() + ).lastValidBlockHeight, }); return txid; } diff --git a/test/index.ts b/test/index.ts index c1d76de..9522c23 100644 --- a/test/index.ts +++ b/test/index.ts @@ -12,8 +12,8 @@ dotenv.config(); function validateEnvironment(): void { const missingVars: string[] = []; - const requiredVars = ["OPENAI_API_KEY", "HELIUS_API_KEY", "SOLANA_PRIVATE_KEY"]; - + const requiredVars = ["OPENAI_API_KEY", "RPC_URL", "SOLANA_PRIVATE_KEY"]; + requiredVars.forEach(varName => { if (!process.env[varName]) { missingVars.push(varName); @@ -52,7 +52,7 @@ async function initializeAgent() { const solanaKit = new SolanaAgentKit( process.env.SOLANA_PRIVATE_KEY!, - `https://mainnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`, + process.env.RPC_URL, process.env.OPENAI_API_KEY! ); @@ -176,7 +176,7 @@ async function chooseMode(): Promise<"chat" | "auto"> { .trim(); rl.close(); - + if (choice === "1" || choice === "chat") { return "chat"; } else if (choice === "2" || choice === "auto") {